xref: /dpdk/app/test/test_cryptodev.c (revision 8b8036a66e3d59ffa58afb8d96fa2c73262155a7)
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 
213 	ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
214 	if (ctx_service_size < 0) {
215 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
216 		return;
217 	}
218 
219 	ctx = malloc(ctx_service_size);
220 	if (!ctx) {
221 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
222 		return;
223 	}
224 
225 	/* Both are enums, setting crypto_sess will suit any session type */
226 	sess.crypto_sess = op->sym->session;
227 
228 	if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
229 			op->sess_type, sess, 0) < 0) {
230 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
231 		goto exit;
232 	}
233 
234 	cipher_iv.iova = 0;
235 	cipher_iv.va = NULL;
236 	aad_auth_iv.iova = 0;
237 	aad_auth_iv.va = NULL;
238 	digest.iova = 0;
239 	digest.va = NULL;
240 	sgl.vec = data_vec;
241 	vec.num = 1;
242 	vec.src_sgl = &sgl;
243 	vec.iv = &cipher_iv;
244 	vec.digest = &digest;
245 	vec.aad = &aad_auth_iv;
246 	vec.status = &status;
247 
248 	ofs.raw = 0;
249 
250 	if (is_cipher && is_auth) {
251 		cipher_offset = sop->cipher.data.offset;
252 		cipher_len = sop->cipher.data.length;
253 		auth_offset = sop->auth.data.offset;
254 		auth_len = sop->auth.data.length;
255 		max_len = RTE_MAX(cipher_offset + cipher_len,
256 				auth_offset + auth_len);
257 		if (len_in_bits) {
258 			max_len = max_len >> 3;
259 			cipher_offset = cipher_offset >> 3;
260 			auth_offset = auth_offset >> 3;
261 			cipher_len = cipher_len >> 3;
262 			auth_len = auth_len >> 3;
263 		}
264 		ofs.ofs.cipher.head = cipher_offset;
265 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
266 		ofs.ofs.auth.head = auth_offset;
267 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
268 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
269 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
270 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
271 				op, void *, IV_OFFSET + cipher_iv_len);
272 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
273 				cipher_iv_len);
274 		digest.va = (void *)sop->auth.digest.data;
275 		digest.iova = sop->auth.digest.phys_addr;
276 
277 		if (is_sgl) {
278 			uint32_t remaining_off = auth_offset + auth_len;
279 			struct rte_mbuf *sgl_buf = sop->m_src;
280 
281 			while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)
282 					&& sgl_buf->next != NULL) {
283 				remaining_off -= rte_pktmbuf_data_len(sgl_buf);
284 				sgl_buf = sgl_buf->next;
285 			}
286 
287 			auth_end_iova = (uint64_t)rte_pktmbuf_iova_offset(
288 				sgl_buf, remaining_off);
289 		} else {
290 			auth_end_iova = rte_pktmbuf_iova(op->sym->m_src) +
291 							 auth_offset + auth_len;
292 		}
293 		/* Then check if digest-encrypted conditions are met */
294 		if ((auth_offset + auth_len < cipher_offset + cipher_len) &&
295 				(digest.iova == auth_end_iova) && is_sgl)
296 			max_len = RTE_MAX(max_len, auth_offset + auth_len +
297 				ut_params->auth_xform.auth.digest_length);
298 
299 	} else if (is_cipher) {
300 		cipher_offset = sop->cipher.data.offset;
301 		cipher_len = sop->cipher.data.length;
302 		max_len = cipher_len + cipher_offset;
303 		if (len_in_bits) {
304 			max_len = max_len >> 3;
305 			cipher_offset = cipher_offset >> 3;
306 			cipher_len = cipher_len >> 3;
307 		}
308 		ofs.ofs.cipher.head = cipher_offset;
309 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
310 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
311 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
312 
313 	} else if (is_auth) {
314 		auth_offset = sop->auth.data.offset;
315 		auth_len = sop->auth.data.length;
316 		max_len = auth_len + auth_offset;
317 		if (len_in_bits) {
318 			max_len = max_len >> 3;
319 			auth_offset = auth_offset >> 3;
320 			auth_len = auth_len >> 3;
321 		}
322 		ofs.ofs.auth.head = auth_offset;
323 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
324 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
325 				op, void *, IV_OFFSET + cipher_iv_len);
326 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
327 				cipher_iv_len);
328 		digest.va = (void *)sop->auth.digest.data;
329 		digest.iova = sop->auth.digest.phys_addr;
330 
331 	} else { /* aead */
332 		cipher_offset = sop->aead.data.offset;
333 		cipher_len = sop->aead.data.length;
334 		max_len = cipher_len + cipher_offset;
335 		if (len_in_bits) {
336 			max_len = max_len >> 3;
337 			cipher_offset = cipher_offset >> 3;
338 			cipher_len = cipher_len >> 3;
339 		}
340 		ofs.ofs.cipher.head = cipher_offset;
341 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
342 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
343 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
344 		aad_auth_iv.va = (void *)sop->aead.aad.data;
345 		aad_auth_iv.iova = sop->aead.aad.phys_addr;
346 		digest.va = (void *)sop->aead.digest.data;
347 		digest.iova = sop->aead.digest.phys_addr;
348 	}
349 
350 	n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
351 			data_vec, RTE_DIM(data_vec));
352 	if (n < 0 || n > sop->m_src->nb_segs) {
353 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
354 		goto exit;
355 	}
356 
357 	sgl.num = n;
358 	/* Out of place */
359 	if (sop->m_dst != NULL) {
360 		dest_sgl.vec = dest_data_vec;
361 		vec.dest_sgl = &dest_sgl;
362 		n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
363 				dest_data_vec, RTE_DIM(dest_data_vec));
364 		if (n < 0 || n > sop->m_dst->nb_segs) {
365 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
366 			goto exit;
367 		}
368 		dest_sgl.num = n;
369 	} else
370 		vec.dest_sgl = NULL;
371 
372 	if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
373 			&enqueue_status) < 1) {
374 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
375 		goto exit;
376 	}
377 
378 	if (enqueue_status == 0) {
379 		status = rte_cryptodev_raw_enqueue_done(ctx, 1);
380 		if (status < 0) {
381 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
382 			goto exit;
383 		}
384 	} else if (enqueue_status < 0) {
385 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
386 		goto exit;
387 	}
388 
389 	n = n_success = 0;
390 	while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
391 		n = rte_cryptodev_raw_dequeue_burst(ctx,
392 			NULL, 1, post_process_raw_dp_op,
393 				(void **)&ret_op, 0, &n_success,
394 				&dequeue_status);
395 		if (dequeue_status < 0) {
396 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
397 			goto exit;
398 		}
399 		if (n == 0)
400 			rte_pause();
401 	}
402 
403 	if (n == 1 && dequeue_status == 0) {
404 		if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
405 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
406 			goto exit;
407 		}
408 	}
409 
410 	op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
411 			ret_op->status == RTE_CRYPTO_OP_STATUS_ERROR ||
412 			n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
413 					RTE_CRYPTO_OP_STATUS_SUCCESS;
414 
415 exit:
416 	free(ctx);
417 }
418 
419 static void
420 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
421 {
422 	int32_t n, st;
423 	struct rte_crypto_sym_op *sop;
424 	union rte_crypto_sym_ofs ofs;
425 	struct rte_crypto_sgl sgl;
426 	struct rte_crypto_sym_vec symvec;
427 	struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
428 	struct rte_crypto_vec vec[UINT8_MAX];
429 
430 	sop = op->sym;
431 
432 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
433 		sop->aead.data.length, vec, RTE_DIM(vec));
434 
435 	if (n < 0 || n != sop->m_src->nb_segs) {
436 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
437 		return;
438 	}
439 
440 	sgl.vec = vec;
441 	sgl.num = n;
442 	symvec.src_sgl = &sgl;
443 	symvec.iv = &iv_ptr;
444 	symvec.digest = &digest_ptr;
445 	symvec.aad = &aad_ptr;
446 	symvec.status = &st;
447 	symvec.num = 1;
448 
449 	/* for CPU crypto the IOVA address is not required */
450 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
451 	digest_ptr.va = (void *)sop->aead.digest.data;
452 	aad_ptr.va = (void *)sop->aead.aad.data;
453 
454 	ofs.raw = 0;
455 
456 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
457 		&symvec);
458 
459 	if (n != 1)
460 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
461 	else
462 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
463 }
464 
465 static void
466 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
467 {
468 	int32_t n, st;
469 	struct rte_crypto_sym_op *sop;
470 	union rte_crypto_sym_ofs ofs;
471 	struct rte_crypto_sgl sgl;
472 	struct rte_crypto_sym_vec symvec;
473 	struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
474 	struct rte_crypto_vec vec[UINT8_MAX];
475 
476 	sop = op->sym;
477 
478 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
479 		sop->auth.data.length, vec, RTE_DIM(vec));
480 
481 	if (n < 0 || n != sop->m_src->nb_segs) {
482 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
483 		return;
484 	}
485 
486 	sgl.vec = vec;
487 	sgl.num = n;
488 	symvec.src_sgl = &sgl;
489 	symvec.iv = &iv_ptr;
490 	symvec.digest = &digest_ptr;
491 	symvec.status = &st;
492 	symvec.num = 1;
493 
494 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
495 	digest_ptr.va = (void *)sop->auth.digest.data;
496 
497 	ofs.raw = 0;
498 	ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
499 	ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
500 		(sop->cipher.data.offset + sop->cipher.data.length);
501 
502 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
503 		&symvec);
504 
505 	if (n != 1)
506 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
507 	else
508 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
509 }
510 
511 static struct rte_crypto_op *
512 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
513 {
514 
515 	RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
516 
517 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
518 		RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
519 		return NULL;
520 	}
521 
522 	op = NULL;
523 
524 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
525 		rte_pause();
526 
527 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
528 		RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
529 		return NULL;
530 	}
531 
532 	return op;
533 }
534 
535 static int
536 testsuite_setup(void)
537 {
538 	struct crypto_testsuite_params *ts_params = &testsuite_params;
539 	struct rte_cryptodev_info info;
540 	uint32_t i = 0, nb_devs, dev_id;
541 	uint16_t qp_id;
542 
543 	memset(ts_params, 0, sizeof(*ts_params));
544 
545 	ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
546 	if (ts_params->mbuf_pool == NULL) {
547 		/* Not already created so create */
548 		ts_params->mbuf_pool = rte_pktmbuf_pool_create(
549 				"CRYPTO_MBUFPOOL",
550 				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
551 				rte_socket_id());
552 		if (ts_params->mbuf_pool == NULL) {
553 			RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
554 			return TEST_FAILED;
555 		}
556 	}
557 
558 	ts_params->large_mbuf_pool = rte_mempool_lookup(
559 			"CRYPTO_LARGE_MBUFPOOL");
560 	if (ts_params->large_mbuf_pool == NULL) {
561 		/* Not already created so create */
562 		ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
563 				"CRYPTO_LARGE_MBUFPOOL",
564 				1, 0, 0, UINT16_MAX,
565 				rte_socket_id());
566 		if (ts_params->large_mbuf_pool == NULL) {
567 			RTE_LOG(ERR, USER1,
568 				"Can't create CRYPTO_LARGE_MBUFPOOL\n");
569 			return TEST_FAILED;
570 		}
571 	}
572 
573 	ts_params->op_mpool = rte_crypto_op_pool_create(
574 			"MBUF_CRYPTO_SYM_OP_POOL",
575 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
576 			NUM_MBUFS, MBUF_CACHE_SIZE,
577 			DEFAULT_NUM_XFORMS *
578 			sizeof(struct rte_crypto_sym_xform) +
579 			MAXIMUM_IV_LENGTH,
580 			rte_socket_id());
581 	if (ts_params->op_mpool == NULL) {
582 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
583 		return TEST_FAILED;
584 	}
585 
586 	nb_devs = rte_cryptodev_count();
587 	if (nb_devs < 1) {
588 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
589 		return TEST_SKIPPED;
590 	}
591 
592 	if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
593 		RTE_LOG(WARNING, USER1, "No %s devices found?\n",
594 				rte_cryptodev_driver_name_get(gbl_driver_id));
595 		return TEST_SKIPPED;
596 	}
597 
598 	/* Create list of valid crypto devs */
599 	for (i = 0; i < nb_devs; i++) {
600 		rte_cryptodev_info_get(i, &info);
601 		if (info.driver_id == gbl_driver_id)
602 			ts_params->valid_devs[ts_params->valid_dev_count++] = i;
603 	}
604 
605 	if (ts_params->valid_dev_count < 1)
606 		return TEST_FAILED;
607 
608 	/* Set up all the qps on the first of the valid devices found */
609 
610 	dev_id = ts_params->valid_devs[0];
611 
612 	rte_cryptodev_info_get(dev_id, &info);
613 
614 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
615 	ts_params->conf.socket_id = SOCKET_ID_ANY;
616 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
617 
618 	unsigned int session_size =
619 		rte_cryptodev_sym_get_private_session_size(dev_id);
620 
621 #ifdef RTE_LIB_SECURITY
622 	unsigned int security_session_size = rte_security_session_get_size(
623 			rte_cryptodev_get_sec_ctx(dev_id));
624 
625 	if (session_size < security_session_size)
626 		session_size = security_session_size;
627 #endif
628 	/*
629 	 * Create mempool with maximum number of sessions.
630 	 */
631 	if (info.sym.max_nb_sessions != 0 &&
632 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
633 		RTE_LOG(ERR, USER1, "Device does not support "
634 				"at least %u sessions\n",
635 				MAX_NB_SESSIONS);
636 		return TEST_FAILED;
637 	}
638 
639 	ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
640 			"test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
641 			SOCKET_ID_ANY);
642 	TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
643 			"session mempool allocation failed");
644 
645 	ts_params->session_priv_mpool = rte_mempool_create(
646 			"test_sess_mp_priv",
647 			MAX_NB_SESSIONS,
648 			session_size,
649 			0, 0, NULL, NULL, NULL,
650 			NULL, SOCKET_ID_ANY,
651 			0);
652 	TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
653 			"session mempool allocation failed");
654 
655 
656 
657 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
658 			&ts_params->conf),
659 			"Failed to configure cryptodev %u with %u qps",
660 			dev_id, ts_params->conf.nb_queue_pairs);
661 
662 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
663 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
664 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
665 
666 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
667 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
668 			dev_id, qp_id, &ts_params->qp_conf,
669 			rte_cryptodev_socket_id(dev_id)),
670 			"Failed to setup queue pair %u on cryptodev %u",
671 			qp_id, dev_id);
672 	}
673 
674 	return TEST_SUCCESS;
675 }
676 
677 static void
678 testsuite_teardown(void)
679 {
680 	struct crypto_testsuite_params *ts_params = &testsuite_params;
681 	int res;
682 
683 	if (ts_params->mbuf_pool != NULL) {
684 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
685 		rte_mempool_avail_count(ts_params->mbuf_pool));
686 	}
687 
688 	if (ts_params->op_mpool != NULL) {
689 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
690 		rte_mempool_avail_count(ts_params->op_mpool));
691 	}
692 
693 	/* Free session mempools */
694 	if (ts_params->session_priv_mpool != NULL) {
695 		rte_mempool_free(ts_params->session_priv_mpool);
696 		ts_params->session_priv_mpool = NULL;
697 	}
698 
699 	if (ts_params->session_mpool != NULL) {
700 		rte_mempool_free(ts_params->session_mpool);
701 		ts_params->session_mpool = NULL;
702 	}
703 
704 	res = rte_cryptodev_close(ts_params->valid_devs[0]);
705 	if (res)
706 		RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
707 }
708 
709 static int
710 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
711 		const int *algs, uint16_t num_algs)
712 {
713 	uint8_t dev_id = testsuite_params.valid_devs[0];
714 	bool some_alg_supported = FALSE;
715 	uint16_t i;
716 
717 	for (i = 0; i < num_algs && !some_alg_supported; i++) {
718 		struct rte_cryptodev_sym_capability_idx alg = {
719 			type, {algs[i]}
720 		};
721 		if (rte_cryptodev_sym_capability_get(dev_id,
722 				&alg) != NULL)
723 			some_alg_supported = TRUE;
724 	}
725 	if (!some_alg_supported)
726 		return TEST_SKIPPED;
727 
728 	return 0;
729 }
730 
731 int
732 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
733 		uint16_t num_ciphers)
734 {
735 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
736 			(const int *) ciphers, num_ciphers);
737 }
738 
739 int
740 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
741 		uint16_t num_auths)
742 {
743 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
744 			(const int *) auths, num_auths);
745 }
746 
747 int
748 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
749 		uint16_t num_aeads)
750 {
751 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
752 			(const int *) aeads, num_aeads);
753 }
754 
755 static int
756 null_testsuite_setup(void)
757 {
758 	struct crypto_testsuite_params *ts_params = &testsuite_params;
759 	uint8_t dev_id = ts_params->valid_devs[0];
760 	struct rte_cryptodev_info dev_info;
761 	const enum rte_crypto_cipher_algorithm ciphers[] = {
762 		RTE_CRYPTO_CIPHER_NULL
763 	};
764 	const enum rte_crypto_auth_algorithm auths[] = {
765 		RTE_CRYPTO_AUTH_NULL
766 	};
767 
768 	rte_cryptodev_info_get(dev_id, &dev_info);
769 
770 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
771 		RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
772 				"testsuite not met\n");
773 		return TEST_SKIPPED;
774 	}
775 
776 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
777 			&& check_auth_capabilities_supported(auths,
778 			RTE_DIM(auths)) != 0) {
779 		RTE_LOG(INFO, USER1, "Capability requirements for NULL "
780 				"testsuite not met\n");
781 		return TEST_SKIPPED;
782 	}
783 
784 	return 0;
785 }
786 
787 static int
788 crypto_gen_testsuite_setup(void)
789 {
790 	struct crypto_testsuite_params *ts_params = &testsuite_params;
791 	uint8_t dev_id = ts_params->valid_devs[0];
792 	struct rte_cryptodev_info dev_info;
793 
794 	rte_cryptodev_info_get(dev_id, &dev_info);
795 
796 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
797 		RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
798 				"testsuite not met\n");
799 		return TEST_SKIPPED;
800 	}
801 
802 	return 0;
803 }
804 
805 #ifdef RTE_LIB_SECURITY
806 static int
807 ipsec_proto_testsuite_setup(void)
808 {
809 	struct crypto_testsuite_params *ts_params = &testsuite_params;
810 	struct crypto_unittest_params *ut_params = &unittest_params;
811 	struct rte_cryptodev_info dev_info;
812 	int ret = 0;
813 
814 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
815 
816 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
817 		RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto "
818 				"testsuite not met\n");
819 		return TEST_SKIPPED;
820 	}
821 
822 	/* Reconfigure to enable security */
823 	ret = dev_configure_and_start(0);
824 	if (ret != TEST_SUCCESS)
825 		return ret;
826 
827 	/* Set action type */
828 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
829 
830 	if (security_proto_supported(
831 			RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
832 			RTE_SECURITY_PROTOCOL_IPSEC) < 0) {
833 		RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto "
834 				"test not met\n");
835 		ret = TEST_SKIPPED;
836 	}
837 
838 	/*
839 	 * Stop the device. Device would be started again by individual test
840 	 * case setup routine.
841 	 */
842 	rte_cryptodev_stop(ts_params->valid_devs[0]);
843 
844 	return ret;
845 }
846 
847 static int
848 pdcp_proto_testsuite_setup(void)
849 {
850 	struct crypto_testsuite_params *ts_params = &testsuite_params;
851 	uint8_t dev_id = ts_params->valid_devs[0];
852 	struct rte_cryptodev_info dev_info;
853 	const enum rte_crypto_cipher_algorithm ciphers[] = {
854 		RTE_CRYPTO_CIPHER_NULL,
855 		RTE_CRYPTO_CIPHER_AES_CTR,
856 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
857 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
858 	};
859 	const enum rte_crypto_auth_algorithm auths[] = {
860 		RTE_CRYPTO_AUTH_NULL,
861 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
862 		RTE_CRYPTO_AUTH_AES_CMAC,
863 		RTE_CRYPTO_AUTH_ZUC_EIA3
864 	};
865 
866 	rte_cryptodev_info_get(dev_id, &dev_info);
867 
868 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
869 			!(dev_info.feature_flags &
870 			RTE_CRYPTODEV_FF_SECURITY)) {
871 		RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
872 				"testsuite not met\n");
873 		return TEST_SKIPPED;
874 	}
875 
876 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
877 			&& check_auth_capabilities_supported(auths,
878 			RTE_DIM(auths)) != 0) {
879 		RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
880 				"testsuite not met\n");
881 		return TEST_SKIPPED;
882 	}
883 
884 	return 0;
885 }
886 
887 static int
888 docsis_proto_testsuite_setup(void)
889 {
890 	struct crypto_testsuite_params *ts_params = &testsuite_params;
891 	uint8_t dev_id = ts_params->valid_devs[0];
892 	struct rte_cryptodev_info dev_info;
893 	const enum rte_crypto_cipher_algorithm ciphers[] = {
894 		RTE_CRYPTO_CIPHER_AES_DOCSISBPI
895 	};
896 
897 	rte_cryptodev_info_get(dev_id, &dev_info);
898 
899 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
900 			!(dev_info.feature_flags &
901 			RTE_CRYPTODEV_FF_SECURITY)) {
902 		RTE_LOG(INFO, USER1, "Feature flag requirements for DOCSIS "
903 				"Proto testsuite not met\n");
904 		return TEST_SKIPPED;
905 	}
906 
907 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
908 		RTE_LOG(INFO, USER1, "Capability requirements for DOCSIS Proto "
909 				"testsuite not met\n");
910 		return TEST_SKIPPED;
911 	}
912 
913 	return 0;
914 }
915 #endif
916 
917 static int
918 aes_ccm_auth_testsuite_setup(void)
919 {
920 	struct crypto_testsuite_params *ts_params = &testsuite_params;
921 	uint8_t dev_id = ts_params->valid_devs[0];
922 	struct rte_cryptodev_info dev_info;
923 	const enum rte_crypto_aead_algorithm aeads[] = {
924 		RTE_CRYPTO_AEAD_AES_CCM
925 	};
926 
927 	rte_cryptodev_info_get(dev_id, &dev_info);
928 
929 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
930 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
931 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
932 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
933 				"testsuite not met\n");
934 		return TEST_SKIPPED;
935 	}
936 
937 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
938 		RTE_LOG(INFO, USER1, "Capability requirements for AES CCM "
939 				"testsuite not met\n");
940 		return TEST_SKIPPED;
941 	}
942 
943 	return 0;
944 }
945 
946 static int
947 aes_gcm_auth_testsuite_setup(void)
948 {
949 	struct crypto_testsuite_params *ts_params = &testsuite_params;
950 	uint8_t dev_id = ts_params->valid_devs[0];
951 	struct rte_cryptodev_info dev_info;
952 	const enum rte_crypto_aead_algorithm aeads[] = {
953 		RTE_CRYPTO_AEAD_AES_GCM
954 	};
955 
956 	rte_cryptodev_info_get(dev_id, &dev_info);
957 
958 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
959 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
960 				"testsuite not met\n");
961 		return TEST_SKIPPED;
962 	}
963 
964 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
965 		RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
966 				"testsuite not met\n");
967 		return TEST_SKIPPED;
968 	}
969 
970 	return 0;
971 }
972 
973 static int
974 aes_gmac_auth_testsuite_setup(void)
975 {
976 	struct crypto_testsuite_params *ts_params = &testsuite_params;
977 	uint8_t dev_id = ts_params->valid_devs[0];
978 	struct rte_cryptodev_info dev_info;
979 	const enum rte_crypto_auth_algorithm auths[] = {
980 		RTE_CRYPTO_AUTH_AES_GMAC
981 	};
982 
983 	rte_cryptodev_info_get(dev_id, &dev_info);
984 
985 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
986 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
987 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
988 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
989 				"testsuite not met\n");
990 		return TEST_SKIPPED;
991 	}
992 
993 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
994 		RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
995 				"testsuite not met\n");
996 		return TEST_SKIPPED;
997 	}
998 
999 	return 0;
1000 }
1001 
1002 static int
1003 chacha20_poly1305_testsuite_setup(void)
1004 {
1005 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1006 	uint8_t dev_id = ts_params->valid_devs[0];
1007 	struct rte_cryptodev_info dev_info;
1008 	const enum rte_crypto_aead_algorithm aeads[] = {
1009 		RTE_CRYPTO_AEAD_CHACHA20_POLY1305
1010 	};
1011 
1012 	rte_cryptodev_info_get(dev_id, &dev_info);
1013 
1014 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1015 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1016 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1017 		RTE_LOG(INFO, USER1, "Feature flag requirements for "
1018 				"Chacha20-Poly1305 testsuite not met\n");
1019 		return TEST_SKIPPED;
1020 	}
1021 
1022 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1023 		RTE_LOG(INFO, USER1, "Capability requirements for "
1024 				"Chacha20-Poly1305 testsuite not met\n");
1025 		return TEST_SKIPPED;
1026 	}
1027 
1028 	return 0;
1029 }
1030 
1031 static int
1032 snow3g_testsuite_setup(void)
1033 {
1034 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1035 	uint8_t dev_id = ts_params->valid_devs[0];
1036 	struct rte_cryptodev_info dev_info;
1037 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1038 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1039 
1040 	};
1041 	const enum rte_crypto_auth_algorithm auths[] = {
1042 		RTE_CRYPTO_AUTH_SNOW3G_UIA2
1043 	};
1044 
1045 	rte_cryptodev_info_get(dev_id, &dev_info);
1046 
1047 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1048 		RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
1049 				"testsuite not met\n");
1050 		return TEST_SKIPPED;
1051 	}
1052 
1053 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1054 			&& check_auth_capabilities_supported(auths,
1055 			RTE_DIM(auths)) != 0) {
1056 		RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
1057 				"testsuite not met\n");
1058 		return TEST_SKIPPED;
1059 	}
1060 
1061 	return 0;
1062 }
1063 
1064 static int
1065 zuc_testsuite_setup(void)
1066 {
1067 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1068 	uint8_t dev_id = ts_params->valid_devs[0];
1069 	struct rte_cryptodev_info dev_info;
1070 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1071 		RTE_CRYPTO_CIPHER_ZUC_EEA3
1072 	};
1073 	const enum rte_crypto_auth_algorithm auths[] = {
1074 		RTE_CRYPTO_AUTH_ZUC_EIA3
1075 	};
1076 
1077 	rte_cryptodev_info_get(dev_id, &dev_info);
1078 
1079 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1080 		RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
1081 				"testsuite not met\n");
1082 		return TEST_SKIPPED;
1083 	}
1084 
1085 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1086 			&& check_auth_capabilities_supported(auths,
1087 			RTE_DIM(auths)) != 0) {
1088 		RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
1089 				"testsuite not met\n");
1090 		return TEST_SKIPPED;
1091 	}
1092 
1093 	return 0;
1094 }
1095 
1096 static int
1097 hmac_md5_auth_testsuite_setup(void)
1098 {
1099 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1100 	uint8_t dev_id = ts_params->valid_devs[0];
1101 	struct rte_cryptodev_info dev_info;
1102 	const enum rte_crypto_auth_algorithm auths[] = {
1103 		RTE_CRYPTO_AUTH_MD5_HMAC
1104 	};
1105 
1106 	rte_cryptodev_info_get(dev_id, &dev_info);
1107 
1108 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1109 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1110 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1111 		RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1112 				"Auth testsuite not met\n");
1113 		return TEST_SKIPPED;
1114 	}
1115 
1116 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1117 		RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1118 				"testsuite not met\n");
1119 		return TEST_SKIPPED;
1120 	}
1121 
1122 	return 0;
1123 }
1124 
1125 static int
1126 kasumi_testsuite_setup(void)
1127 {
1128 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1129 	uint8_t dev_id = ts_params->valid_devs[0];
1130 	struct rte_cryptodev_info dev_info;
1131 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1132 		RTE_CRYPTO_CIPHER_KASUMI_F8
1133 	};
1134 	const enum rte_crypto_auth_algorithm auths[] = {
1135 		RTE_CRYPTO_AUTH_KASUMI_F9
1136 	};
1137 
1138 	rte_cryptodev_info_get(dev_id, &dev_info);
1139 
1140 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1141 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1142 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1143 		RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1144 				"testsuite not met\n");
1145 		return TEST_SKIPPED;
1146 	}
1147 
1148 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1149 			&& check_auth_capabilities_supported(auths,
1150 			RTE_DIM(auths)) != 0) {
1151 		RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1152 				"testsuite not met\n");
1153 		return TEST_SKIPPED;
1154 	}
1155 
1156 	return 0;
1157 }
1158 
1159 static int
1160 negative_aes_gcm_testsuite_setup(void)
1161 {
1162 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1163 	uint8_t dev_id = ts_params->valid_devs[0];
1164 	struct rte_cryptodev_info dev_info;
1165 	const enum rte_crypto_aead_algorithm aeads[] = {
1166 		RTE_CRYPTO_AEAD_AES_GCM
1167 	};
1168 
1169 	rte_cryptodev_info_get(dev_id, &dev_info);
1170 
1171 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1172 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1173 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1174 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1175 				"AES GCM testsuite not met\n");
1176 		return TEST_SKIPPED;
1177 	}
1178 
1179 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1180 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1181 				"AES GCM testsuite not met\n");
1182 		return TEST_SKIPPED;
1183 	}
1184 
1185 	return 0;
1186 }
1187 
1188 static int
1189 negative_aes_gmac_testsuite_setup(void)
1190 {
1191 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1192 	uint8_t dev_id = ts_params->valid_devs[0];
1193 	struct rte_cryptodev_info dev_info;
1194 	const enum rte_crypto_auth_algorithm auths[] = {
1195 		RTE_CRYPTO_AUTH_AES_GMAC
1196 	};
1197 
1198 	rte_cryptodev_info_get(dev_id, &dev_info);
1199 
1200 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1201 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1202 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1203 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1204 				"AES GMAC testsuite not met\n");
1205 		return TEST_SKIPPED;
1206 	}
1207 
1208 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1209 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1210 				"AES GMAC testsuite not met\n");
1211 		return TEST_SKIPPED;
1212 	}
1213 
1214 	return 0;
1215 }
1216 
1217 static int
1218 mixed_cipher_hash_testsuite_setup(void)
1219 {
1220 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1221 	uint8_t dev_id = ts_params->valid_devs[0];
1222 	struct rte_cryptodev_info dev_info;
1223 	uint64_t feat_flags;
1224 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1225 		RTE_CRYPTO_CIPHER_NULL,
1226 		RTE_CRYPTO_CIPHER_AES_CTR,
1227 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
1228 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1229 	};
1230 	const enum rte_crypto_auth_algorithm auths[] = {
1231 		RTE_CRYPTO_AUTH_NULL,
1232 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1233 		RTE_CRYPTO_AUTH_AES_CMAC,
1234 		RTE_CRYPTO_AUTH_ZUC_EIA3
1235 	};
1236 
1237 	rte_cryptodev_info_get(dev_id, &dev_info);
1238 	feat_flags = dev_info.feature_flags;
1239 
1240 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1241 			(global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1242 		RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1243 				"Cipher Hash testsuite not met\n");
1244 		return TEST_SKIPPED;
1245 	}
1246 
1247 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1248 			&& check_auth_capabilities_supported(auths,
1249 			RTE_DIM(auths)) != 0) {
1250 		RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1251 				"Cipher Hash testsuite not met\n");
1252 		return TEST_SKIPPED;
1253 	}
1254 
1255 	return 0;
1256 }
1257 
1258 static int
1259 esn_testsuite_setup(void)
1260 {
1261 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1262 	uint8_t dev_id = ts_params->valid_devs[0];
1263 	struct rte_cryptodev_info dev_info;
1264 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1265 		RTE_CRYPTO_CIPHER_AES_CBC
1266 	};
1267 	const enum rte_crypto_auth_algorithm auths[] = {
1268 		RTE_CRYPTO_AUTH_SHA1_HMAC
1269 	};
1270 
1271 	rte_cryptodev_info_get(dev_id, &dev_info);
1272 
1273 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1274 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1275 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1276 		RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1277 				"testsuite not met\n");
1278 		return TEST_SKIPPED;
1279 	}
1280 
1281 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1282 			&& check_auth_capabilities_supported(auths,
1283 			RTE_DIM(auths)) != 0) {
1284 		RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1285 				"testsuite not met\n");
1286 		return TEST_SKIPPED;
1287 	}
1288 
1289 	return 0;
1290 }
1291 
1292 static int
1293 multi_session_testsuite_setup(void)
1294 {
1295 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1296 	uint8_t dev_id = ts_params->valid_devs[0];
1297 	struct rte_cryptodev_info dev_info;
1298 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1299 		RTE_CRYPTO_CIPHER_AES_CBC
1300 	};
1301 	const enum rte_crypto_auth_algorithm auths[] = {
1302 		RTE_CRYPTO_AUTH_SHA512_HMAC
1303 	};
1304 
1305 	rte_cryptodev_info_get(dev_id, &dev_info);
1306 
1307 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1308 		RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1309 				"Session testsuite not met\n");
1310 		return TEST_SKIPPED;
1311 	}
1312 
1313 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1314 			&& check_auth_capabilities_supported(auths,
1315 			RTE_DIM(auths)) != 0) {
1316 		RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1317 				"Session testsuite not met\n");
1318 		return TEST_SKIPPED;
1319 	}
1320 
1321 	return 0;
1322 }
1323 
1324 static int
1325 negative_hmac_sha1_testsuite_setup(void)
1326 {
1327 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1328 	uint8_t dev_id = ts_params->valid_devs[0];
1329 	struct rte_cryptodev_info dev_info;
1330 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1331 		RTE_CRYPTO_CIPHER_AES_CBC
1332 	};
1333 	const enum rte_crypto_auth_algorithm auths[] = {
1334 		RTE_CRYPTO_AUTH_SHA1_HMAC
1335 	};
1336 
1337 	rte_cryptodev_info_get(dev_id, &dev_info);
1338 
1339 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1340 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1341 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1342 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1343 				"HMAC SHA1 testsuite not met\n");
1344 		return TEST_SKIPPED;
1345 	}
1346 
1347 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1348 			&& check_auth_capabilities_supported(auths,
1349 			RTE_DIM(auths)) != 0) {
1350 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1351 				"HMAC SHA1 testsuite not met\n");
1352 		return TEST_SKIPPED;
1353 	}
1354 
1355 	return 0;
1356 }
1357 
1358 static int
1359 dev_configure_and_start(uint64_t ff_disable)
1360 {
1361 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1362 	struct crypto_unittest_params *ut_params = &unittest_params;
1363 
1364 	uint16_t qp_id;
1365 
1366 	/* Clear unit test parameters before running test */
1367 	memset(ut_params, 0, sizeof(*ut_params));
1368 
1369 	/* Reconfigure device to default parameters */
1370 	ts_params->conf.socket_id = SOCKET_ID_ANY;
1371 	ts_params->conf.ff_disable = ff_disable;
1372 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1373 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
1374 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
1375 
1376 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1377 			&ts_params->conf),
1378 			"Failed to configure cryptodev %u",
1379 			ts_params->valid_devs[0]);
1380 
1381 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1382 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1383 			ts_params->valid_devs[0], qp_id,
1384 			&ts_params->qp_conf,
1385 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1386 			"Failed to setup queue pair %u on cryptodev %u",
1387 			qp_id, ts_params->valid_devs[0]);
1388 	}
1389 
1390 
1391 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1392 
1393 	/* Start the device */
1394 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1395 			"Failed to start cryptodev %u",
1396 			ts_params->valid_devs[0]);
1397 
1398 	return TEST_SUCCESS;
1399 }
1400 
1401 int
1402 ut_setup(void)
1403 {
1404 	/* Configure and start the device with security feature disabled */
1405 	return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1406 }
1407 
1408 static int
1409 ut_setup_security(void)
1410 {
1411 	/* Configure and start the device with no features disabled */
1412 	return dev_configure_and_start(0);
1413 }
1414 
1415 void
1416 ut_teardown(void)
1417 {
1418 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1419 	struct crypto_unittest_params *ut_params = &unittest_params;
1420 	struct rte_cryptodev_stats stats;
1421 
1422 	/* free crypto session structure */
1423 #ifdef RTE_LIB_SECURITY
1424 	if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1425 		if (ut_params->sec_session) {
1426 			rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1427 						(ts_params->valid_devs[0]),
1428 						ut_params->sec_session);
1429 			ut_params->sec_session = NULL;
1430 		}
1431 	} else
1432 #endif
1433 	{
1434 		if (ut_params->sess) {
1435 			rte_cryptodev_sym_session_clear(
1436 					ts_params->valid_devs[0],
1437 					ut_params->sess);
1438 			rte_cryptodev_sym_session_free(ut_params->sess);
1439 			ut_params->sess = NULL;
1440 		}
1441 	}
1442 
1443 	/* free crypto operation structure */
1444 	if (ut_params->op)
1445 		rte_crypto_op_free(ut_params->op);
1446 
1447 	/*
1448 	 * free mbuf - both obuf and ibuf are usually the same,
1449 	 * so check if they point at the same address is necessary,
1450 	 * to avoid freeing the mbuf twice.
1451 	 */
1452 	if (ut_params->obuf) {
1453 		rte_pktmbuf_free(ut_params->obuf);
1454 		if (ut_params->ibuf == ut_params->obuf)
1455 			ut_params->ibuf = 0;
1456 		ut_params->obuf = 0;
1457 	}
1458 	if (ut_params->ibuf) {
1459 		rte_pktmbuf_free(ut_params->ibuf);
1460 		ut_params->ibuf = 0;
1461 	}
1462 
1463 	if (ts_params->mbuf_pool != NULL)
1464 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1465 			rte_mempool_avail_count(ts_params->mbuf_pool));
1466 
1467 	rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
1468 
1469 	/* Stop the device */
1470 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1471 }
1472 
1473 static int
1474 test_device_configure_invalid_dev_id(void)
1475 {
1476 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1477 	uint16_t dev_id, num_devs = 0;
1478 
1479 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1480 			"Need at least %d devices for test", 1);
1481 
1482 	/* valid dev_id values */
1483 	dev_id = ts_params->valid_devs[0];
1484 
1485 	/* Stop the device in case it's started so it can be configured */
1486 	rte_cryptodev_stop(dev_id);
1487 
1488 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1489 			"Failed test for rte_cryptodev_configure: "
1490 			"invalid dev_num %u", dev_id);
1491 
1492 	/* invalid dev_id values */
1493 	dev_id = num_devs;
1494 
1495 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1496 			"Failed test for rte_cryptodev_configure: "
1497 			"invalid dev_num %u", dev_id);
1498 
1499 	dev_id = 0xff;
1500 
1501 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1502 			"Failed test for rte_cryptodev_configure:"
1503 			"invalid dev_num %u", dev_id);
1504 
1505 	return TEST_SUCCESS;
1506 }
1507 
1508 static int
1509 test_device_configure_invalid_queue_pair_ids(void)
1510 {
1511 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1512 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1513 
1514 	/* Stop the device in case it's started so it can be configured */
1515 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1516 
1517 	/* valid - max value queue pairs */
1518 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1519 
1520 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1521 			&ts_params->conf),
1522 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1523 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1524 
1525 	/* valid - one queue pairs */
1526 	ts_params->conf.nb_queue_pairs = 1;
1527 
1528 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1529 			&ts_params->conf),
1530 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1531 			ts_params->valid_devs[0],
1532 			ts_params->conf.nb_queue_pairs);
1533 
1534 
1535 	/* invalid - zero queue pairs */
1536 	ts_params->conf.nb_queue_pairs = 0;
1537 
1538 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1539 			&ts_params->conf),
1540 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1541 			" invalid qps: %u",
1542 			ts_params->valid_devs[0],
1543 			ts_params->conf.nb_queue_pairs);
1544 
1545 
1546 	/* invalid - max value supported by field queue pairs */
1547 	ts_params->conf.nb_queue_pairs = UINT16_MAX;
1548 
1549 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1550 			&ts_params->conf),
1551 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1552 			" invalid qps: %u",
1553 			ts_params->valid_devs[0],
1554 			ts_params->conf.nb_queue_pairs);
1555 
1556 
1557 	/* invalid - max value + 1 queue pairs */
1558 	ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1559 
1560 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1561 			&ts_params->conf),
1562 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1563 			" invalid qps: %u",
1564 			ts_params->valid_devs[0],
1565 			ts_params->conf.nb_queue_pairs);
1566 
1567 	/* revert to original testsuite value */
1568 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1569 
1570 	return TEST_SUCCESS;
1571 }
1572 
1573 static int
1574 test_queue_pair_descriptor_setup(void)
1575 {
1576 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1577 	struct rte_cryptodev_qp_conf qp_conf = {
1578 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
1579 	};
1580 	uint16_t qp_id;
1581 
1582 	/* Stop the device in case it's started so it can be configured */
1583 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1584 
1585 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1586 			&ts_params->conf),
1587 			"Failed to configure cryptodev %u",
1588 			ts_params->valid_devs[0]);
1589 
1590 	/*
1591 	 * Test various ring sizes on this device. memzones can't be
1592 	 * freed so are re-used if ring is released and re-created.
1593 	 */
1594 	qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1595 	qp_conf.mp_session = ts_params->session_mpool;
1596 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
1597 
1598 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1599 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1600 				ts_params->valid_devs[0], qp_id, &qp_conf,
1601 				rte_cryptodev_socket_id(
1602 						ts_params->valid_devs[0])),
1603 				"Failed test for "
1604 				"rte_cryptodev_queue_pair_setup: num_inflights "
1605 				"%u on qp %u on cryptodev %u",
1606 				qp_conf.nb_descriptors, qp_id,
1607 				ts_params->valid_devs[0]);
1608 	}
1609 
1610 	qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1611 
1612 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1613 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1614 				ts_params->valid_devs[0], qp_id, &qp_conf,
1615 				rte_cryptodev_socket_id(
1616 						ts_params->valid_devs[0])),
1617 				"Failed test for"
1618 				" rte_cryptodev_queue_pair_setup: num_inflights"
1619 				" %u on qp %u on cryptodev %u",
1620 				qp_conf.nb_descriptors, qp_id,
1621 				ts_params->valid_devs[0]);
1622 	}
1623 
1624 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1625 
1626 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1627 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1628 				ts_params->valid_devs[0], qp_id, &qp_conf,
1629 				rte_cryptodev_socket_id(
1630 						ts_params->valid_devs[0])),
1631 				"Failed test for "
1632 				"rte_cryptodev_queue_pair_setup: num_inflights"
1633 				" %u on qp %u on cryptodev %u",
1634 				qp_conf.nb_descriptors, qp_id,
1635 				ts_params->valid_devs[0]);
1636 	}
1637 
1638 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1639 
1640 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1641 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1642 				ts_params->valid_devs[0], qp_id, &qp_conf,
1643 				rte_cryptodev_socket_id(
1644 						ts_params->valid_devs[0])),
1645 				"Failed test for"
1646 				" rte_cryptodev_queue_pair_setup:"
1647 				"num_inflights %u on qp %u on cryptodev %u",
1648 				qp_conf.nb_descriptors, qp_id,
1649 				ts_params->valid_devs[0]);
1650 	}
1651 
1652 	/* test invalid queue pair id */
1653 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;	/*valid */
1654 
1655 	qp_id = ts_params->conf.nb_queue_pairs;		/*invalid */
1656 
1657 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1658 			ts_params->valid_devs[0],
1659 			qp_id, &qp_conf,
1660 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1661 			"Failed test for rte_cryptodev_queue_pair_setup:"
1662 			"invalid qp %u on cryptodev %u",
1663 			qp_id, ts_params->valid_devs[0]);
1664 
1665 	qp_id = 0xffff; /*invalid*/
1666 
1667 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1668 			ts_params->valid_devs[0],
1669 			qp_id, &qp_conf,
1670 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1671 			"Failed test for rte_cryptodev_queue_pair_setup:"
1672 			"invalid qp %u on cryptodev %u",
1673 			qp_id, ts_params->valid_devs[0]);
1674 
1675 	return TEST_SUCCESS;
1676 }
1677 
1678 /* ***** Plaintext data for tests ***** */
1679 
1680 const char catch_22_quote_1[] =
1681 		"There was only one catch and that was Catch-22, which "
1682 		"specified that a concern for one's safety in the face of "
1683 		"dangers that were real and immediate was the process of a "
1684 		"rational mind. Orr was crazy and could be grounded. All he "
1685 		"had to do was ask; and as soon as he did, he would no longer "
1686 		"be crazy and would have to fly more missions. Orr would be "
1687 		"crazy to fly more missions and sane if he didn't, but if he "
1688 		"was sane he had to fly them. If he flew them he was crazy "
1689 		"and didn't have to; but if he didn't want to he was sane and "
1690 		"had to. Yossarian was moved very deeply by the absolute "
1691 		"simplicity of this clause of Catch-22 and let out a "
1692 		"respectful whistle. \"That's some catch, that Catch-22\", he "
1693 		"observed. \"It's the best there is,\" Doc Daneeka agreed.";
1694 
1695 const char catch_22_quote[] =
1696 		"What a lousy earth! He wondered how many people were "
1697 		"destitute that same night even in his own prosperous country, "
1698 		"how many homes were shanties, how many husbands were drunk "
1699 		"and wives socked, and how many children were bullied, abused, "
1700 		"or abandoned. How many families hungered for food they could "
1701 		"not afford to buy? How many hearts were broken? How many "
1702 		"suicides would take place that same night, how many people "
1703 		"would go insane? How many cockroaches and landlords would "
1704 		"triumph? How many winners were losers, successes failures, "
1705 		"and rich men poor men? How many wise guys were stupid? How "
1706 		"many happy endings were unhappy endings? How many honest men "
1707 		"were liars, brave men cowards, loyal men traitors, how many "
1708 		"sainted men were corrupt, how many people in positions of "
1709 		"trust had sold their souls to bodyguards, how many had never "
1710 		"had souls? How many straight-and-narrow paths were crooked "
1711 		"paths? How many best families were worst families and how "
1712 		"many good people were bad people? When you added them all up "
1713 		"and then subtracted, you might be left with only the children, "
1714 		"and perhaps with Albert Einstein and an old violinist or "
1715 		"sculptor somewhere.";
1716 
1717 #define QUOTE_480_BYTES		(480)
1718 #define QUOTE_512_BYTES		(512)
1719 #define QUOTE_768_BYTES		(768)
1720 #define QUOTE_1024_BYTES	(1024)
1721 
1722 
1723 
1724 /* ***** SHA1 Hash Tests ***** */
1725 
1726 #define HMAC_KEY_LENGTH_SHA1	(DIGEST_BYTE_LENGTH_SHA1)
1727 
1728 static uint8_t hmac_sha1_key[] = {
1729 	0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1730 	0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1731 	0xDE, 0xF4, 0xDE, 0xAD };
1732 
1733 /* ***** SHA224 Hash Tests ***** */
1734 
1735 #define HMAC_KEY_LENGTH_SHA224	(DIGEST_BYTE_LENGTH_SHA224)
1736 
1737 
1738 /* ***** AES-CBC Cipher Tests ***** */
1739 
1740 #define CIPHER_KEY_LENGTH_AES_CBC	(16)
1741 #define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
1742 
1743 static uint8_t aes_cbc_key[] = {
1744 	0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1745 	0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1746 
1747 static uint8_t aes_cbc_iv[] = {
1748 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1749 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1750 
1751 
1752 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1753 
1754 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1755 	0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1756 	0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1757 	0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1758 	0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1759 	0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1760 	0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1761 	0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1762 	0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1763 	0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1764 	0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1765 	0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1766 	0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1767 	0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1768 	0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1769 	0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1770 	0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1771 	0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1772 	0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1773 	0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1774 	0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1775 	0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1776 	0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1777 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1778 	0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1779 	0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1780 	0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1781 	0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1782 	0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1783 	0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1784 	0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1785 	0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1786 	0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1787 	0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1788 	0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1789 	0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1790 	0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1791 	0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1792 	0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1793 	0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1794 	0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1795 	0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1796 	0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1797 	0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1798 	0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1799 	0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1800 	0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1801 	0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1802 	0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1803 	0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1804 	0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1805 	0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1806 	0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1807 	0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1808 	0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1809 	0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1810 	0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1811 	0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1812 	0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1813 	0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1814 	0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1815 	0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1816 	0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1817 	0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1818 	0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1819 };
1820 
1821 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1822 	0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1823 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1824 	0x18, 0x8c, 0x1d, 0x32
1825 };
1826 
1827 
1828 /* Multisession Vector context Test */
1829 /*Begin Session 0 */
1830 static uint8_t ms_aes_cbc_key0[] = {
1831 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1832 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1833 };
1834 
1835 static uint8_t ms_aes_cbc_iv0[] = {
1836 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1837 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1838 };
1839 
1840 static const uint8_t ms_aes_cbc_cipher0[] = {
1841 		0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1842 		0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1843 		0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1844 		0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1845 		0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1846 		0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1847 		0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1848 		0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1849 		0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1850 		0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1851 		0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1852 		0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1853 		0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1854 		0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1855 		0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1856 		0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1857 		0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1858 		0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1859 		0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1860 		0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1861 		0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1862 		0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1863 		0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1864 		0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1865 		0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1866 		0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1867 		0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1868 		0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1869 		0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1870 		0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1871 		0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1872 		0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1873 		0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1874 		0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1875 		0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1876 		0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1877 		0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1878 		0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1879 		0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1880 		0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1881 		0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1882 		0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1883 		0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1884 		0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1885 		0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1886 		0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1887 		0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1888 		0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1889 		0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1890 		0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1891 		0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1892 		0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1893 		0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1894 		0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1895 		0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1896 		0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1897 		0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1898 		0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1899 		0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1900 		0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1901 		0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1902 		0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1903 		0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1904 		0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1905 };
1906 
1907 
1908 static  uint8_t ms_hmac_key0[] = {
1909 		0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1910 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1911 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1912 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1913 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1914 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1915 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1916 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1917 };
1918 
1919 static const uint8_t ms_hmac_digest0[] = {
1920 		0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1921 		0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1922 		0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1923 		0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1924 		0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1925 		0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1926 		0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1927 		0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1928 		};
1929 
1930 /* End Session 0 */
1931 /* Begin session 1 */
1932 
1933 static  uint8_t ms_aes_cbc_key1[] = {
1934 		0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1935 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1936 };
1937 
1938 static  uint8_t ms_aes_cbc_iv1[] = {
1939 	0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1940 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1941 };
1942 
1943 static const uint8_t ms_aes_cbc_cipher1[] = {
1944 		0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1945 		0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1946 		0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1947 		0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1948 		0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1949 		0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1950 		0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1951 		0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1952 		0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1953 		0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1954 		0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1955 		0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1956 		0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1957 		0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1958 		0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1959 		0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1960 		0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1961 		0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1962 		0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1963 		0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1964 		0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1965 		0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1966 		0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1967 		0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1968 		0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1969 		0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1970 		0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1971 		0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1972 		0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1973 		0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1974 		0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1975 		0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1976 		0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1977 		0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1978 		0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1979 		0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1980 		0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1981 		0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1982 		0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1983 		0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1984 		0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1985 		0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1986 		0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1987 		0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1988 		0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1989 		0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1990 		0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1991 		0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1992 		0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1993 		0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1994 		0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1995 		0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1996 		0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1997 		0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1998 		0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1999 		0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
2000 		0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
2001 		0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
2002 		0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
2003 		0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
2004 		0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
2005 		0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
2006 		0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
2007 		0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
2008 
2009 };
2010 
2011 static uint8_t ms_hmac_key1[] = {
2012 		0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2013 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2014 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2015 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2016 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2017 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2018 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2019 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2020 };
2021 
2022 static const uint8_t ms_hmac_digest1[] = {
2023 		0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
2024 		0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
2025 		0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
2026 		0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
2027 		0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
2028 		0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
2029 		0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
2030 		0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
2031 };
2032 /* End Session 1  */
2033 /* Begin Session 2 */
2034 static  uint8_t ms_aes_cbc_key2[] = {
2035 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2036 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2037 };
2038 
2039 static  uint8_t ms_aes_cbc_iv2[] = {
2040 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2041 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2042 };
2043 
2044 static const uint8_t ms_aes_cbc_cipher2[] = {
2045 		0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
2046 		0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
2047 		0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
2048 		0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
2049 		0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
2050 		0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
2051 		0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
2052 		0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
2053 		0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
2054 		0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
2055 		0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
2056 		0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
2057 		0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
2058 		0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
2059 		0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
2060 		0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
2061 		0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
2062 		0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
2063 		0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
2064 		0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
2065 		0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
2066 		0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
2067 		0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
2068 		0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
2069 		0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
2070 		0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
2071 		0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
2072 		0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
2073 		0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
2074 		0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
2075 		0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
2076 		0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
2077 		0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
2078 		0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
2079 		0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
2080 		0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
2081 		0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
2082 		0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
2083 		0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
2084 		0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
2085 		0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
2086 		0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
2087 		0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
2088 		0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
2089 		0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
2090 		0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
2091 		0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2092 		0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2093 		0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2094 		0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2095 		0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2096 		0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2097 		0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2098 		0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2099 		0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2100 		0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2101 		0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2102 		0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2103 		0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2104 		0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2105 		0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2106 		0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2107 		0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2108 		0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2109 };
2110 
2111 static  uint8_t ms_hmac_key2[] = {
2112 		0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2113 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2114 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2115 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2116 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2117 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2118 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2119 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2120 };
2121 
2122 static const uint8_t ms_hmac_digest2[] = {
2123 		0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2124 		0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2125 		0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2126 		0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2127 		0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2128 		0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2129 		0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2130 		0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2131 };
2132 
2133 /* End Session 2 */
2134 
2135 
2136 static int
2137 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2138 {
2139 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2140 	struct crypto_unittest_params *ut_params = &unittest_params;
2141 
2142 	/* Verify the capabilities */
2143 	struct rte_cryptodev_sym_capability_idx cap_idx;
2144 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2145 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2146 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2147 			&cap_idx) == NULL)
2148 		return TEST_SKIPPED;
2149 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2150 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2151 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2152 			&cap_idx) == NULL)
2153 		return TEST_SKIPPED;
2154 
2155 	/* Generate test mbuf data and space for digest */
2156 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2157 			catch_22_quote,	QUOTE_512_BYTES, 0);
2158 
2159 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2160 			DIGEST_BYTE_LENGTH_SHA1);
2161 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2162 
2163 	/* Setup Cipher Parameters */
2164 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2165 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2166 
2167 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2168 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2169 	ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2170 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2171 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2172 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2173 
2174 	/* Setup HMAC Parameters */
2175 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2176 
2177 	ut_params->auth_xform.next = NULL;
2178 
2179 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2180 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2181 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2182 	ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2183 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2184 
2185 	ut_params->sess = rte_cryptodev_sym_session_create(
2186 			ts_params->session_mpool);
2187 
2188 	/* Create crypto session*/
2189 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
2190 			ut_params->sess, &ut_params->cipher_xform,
2191 			ts_params->session_priv_mpool);
2192 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2193 
2194 	/* Generate crypto op data structure */
2195 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2196 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2197 	TEST_ASSERT_NOT_NULL(ut_params->op,
2198 			"Failed to allocate symmetric crypto operation struct");
2199 
2200 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2201 
2202 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2203 
2204 	/* set crypto operation source mbuf */
2205 	sym_op->m_src = ut_params->ibuf;
2206 
2207 	/* Set crypto operation authentication parameters */
2208 	sym_op->auth.digest.data = ut_params->digest;
2209 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2210 			ut_params->ibuf, QUOTE_512_BYTES);
2211 
2212 	sym_op->auth.data.offset = 0;
2213 	sym_op->auth.data.length = QUOTE_512_BYTES;
2214 
2215 	/* Copy IV at the end of the crypto operation */
2216 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2217 			aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2218 
2219 	/* Set crypto operation cipher parameters */
2220 	sym_op->cipher.data.offset = 0;
2221 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2222 
2223 	/* Process crypto operation */
2224 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2225 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2226 			ut_params->op);
2227 	else
2228 		TEST_ASSERT_NOT_NULL(
2229 			process_crypto_request(ts_params->valid_devs[0],
2230 				ut_params->op),
2231 				"failed to process sym crypto op");
2232 
2233 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2234 			"crypto op processing failed");
2235 
2236 	/* Validate obuf */
2237 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2238 			uint8_t *);
2239 
2240 	TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2241 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2242 			QUOTE_512_BYTES,
2243 			"ciphertext data not as expected");
2244 
2245 	uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2246 
2247 	TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2248 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2249 			gbl_driver_id == rte_cryptodev_driver_id_get(
2250 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2251 					TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2252 					DIGEST_BYTE_LENGTH_SHA1,
2253 			"Generated digest data not as expected");
2254 
2255 	return TEST_SUCCESS;
2256 }
2257 
2258 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2259 
2260 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
2261 
2262 static uint8_t hmac_sha512_key[] = {
2263 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2264 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2265 	0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2266 	0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2267 	0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2268 	0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2269 	0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2270 	0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2271 
2272 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2273 	0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2274 	0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2275 	0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2276 	0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2277 	0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2278 	0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2279 	0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2280 	0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2281 
2282 
2283 
2284 static int
2285 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2286 		struct crypto_unittest_params *ut_params,
2287 		uint8_t *cipher_key,
2288 		uint8_t *hmac_key);
2289 
2290 static int
2291 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2292 		struct crypto_unittest_params *ut_params,
2293 		struct crypto_testsuite_params *ts_params,
2294 		const uint8_t *cipher,
2295 		const uint8_t *digest,
2296 		const uint8_t *iv);
2297 
2298 
2299 static int
2300 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2301 		struct crypto_unittest_params *ut_params,
2302 		uint8_t *cipher_key,
2303 		uint8_t *hmac_key)
2304 {
2305 
2306 	/* Setup Cipher Parameters */
2307 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2308 	ut_params->cipher_xform.next = NULL;
2309 
2310 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2311 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2312 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2313 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2314 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2315 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2316 
2317 	/* Setup HMAC Parameters */
2318 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2319 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2320 
2321 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2322 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2323 	ut_params->auth_xform.auth.key.data = hmac_key;
2324 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2325 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2326 
2327 	return TEST_SUCCESS;
2328 }
2329 
2330 
2331 static int
2332 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2333 		struct crypto_unittest_params *ut_params,
2334 		struct crypto_testsuite_params *ts_params,
2335 		const uint8_t *cipher,
2336 		const uint8_t *digest,
2337 		const uint8_t *iv)
2338 {
2339 	/* Generate test mbuf data and digest */
2340 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2341 			(const char *)
2342 			cipher,
2343 			QUOTE_512_BYTES, 0);
2344 
2345 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2346 			DIGEST_BYTE_LENGTH_SHA512);
2347 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2348 
2349 	rte_memcpy(ut_params->digest,
2350 			digest,
2351 			DIGEST_BYTE_LENGTH_SHA512);
2352 
2353 	/* Generate Crypto op data structure */
2354 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2355 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2356 	TEST_ASSERT_NOT_NULL(ut_params->op,
2357 			"Failed to allocate symmetric crypto operation struct");
2358 
2359 	rte_crypto_op_attach_sym_session(ut_params->op, sess);
2360 
2361 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2362 
2363 	/* set crypto operation source mbuf */
2364 	sym_op->m_src = ut_params->ibuf;
2365 
2366 	sym_op->auth.digest.data = ut_params->digest;
2367 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2368 			ut_params->ibuf, QUOTE_512_BYTES);
2369 
2370 	sym_op->auth.data.offset = 0;
2371 	sym_op->auth.data.length = QUOTE_512_BYTES;
2372 
2373 	/* Copy IV at the end of the crypto operation */
2374 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2375 			iv, CIPHER_IV_LENGTH_AES_CBC);
2376 
2377 	sym_op->cipher.data.offset = 0;
2378 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2379 
2380 	/* Process crypto operation */
2381 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2382 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2383 			ut_params->op);
2384 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2385 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2386 				ut_params->op, 1, 1, 0, 0);
2387 	else
2388 		TEST_ASSERT_NOT_NULL(
2389 				process_crypto_request(ts_params->valid_devs[0],
2390 					ut_params->op),
2391 					"failed to process sym crypto op");
2392 
2393 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2394 			"crypto op processing failed");
2395 
2396 	ut_params->obuf = ut_params->op->sym->m_src;
2397 
2398 	/* Validate obuf */
2399 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2400 			rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2401 			catch_22_quote,
2402 			QUOTE_512_BYTES,
2403 			"Plaintext data not as expected");
2404 
2405 	/* Validate obuf */
2406 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2407 			"Digest verification failed");
2408 
2409 	return TEST_SUCCESS;
2410 }
2411 
2412 /* ***** SNOW 3G Tests ***** */
2413 static int
2414 create_wireless_algo_hash_session(uint8_t dev_id,
2415 	const uint8_t *key, const uint8_t key_len,
2416 	const uint8_t iv_len, const uint8_t auth_len,
2417 	enum rte_crypto_auth_operation op,
2418 	enum rte_crypto_auth_algorithm algo)
2419 {
2420 	uint8_t hash_key[key_len];
2421 	int status;
2422 
2423 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2424 	struct crypto_unittest_params *ut_params = &unittest_params;
2425 
2426 	memcpy(hash_key, key, key_len);
2427 
2428 	debug_hexdump(stdout, "key:", key, key_len);
2429 
2430 	/* Setup Authentication Parameters */
2431 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2432 	ut_params->auth_xform.next = NULL;
2433 
2434 	ut_params->auth_xform.auth.op = op;
2435 	ut_params->auth_xform.auth.algo = algo;
2436 	ut_params->auth_xform.auth.key.length = key_len;
2437 	ut_params->auth_xform.auth.key.data = hash_key;
2438 	ut_params->auth_xform.auth.digest_length = auth_len;
2439 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2440 	ut_params->auth_xform.auth.iv.length = iv_len;
2441 	ut_params->sess = rte_cryptodev_sym_session_create(
2442 			ts_params->session_mpool);
2443 
2444 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2445 			&ut_params->auth_xform,
2446 			ts_params->session_priv_mpool);
2447 	if (status == -ENOTSUP)
2448 		return TEST_SKIPPED;
2449 
2450 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2451 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2452 	return 0;
2453 }
2454 
2455 static int
2456 create_wireless_algo_cipher_session(uint8_t dev_id,
2457 			enum rte_crypto_cipher_operation op,
2458 			enum rte_crypto_cipher_algorithm algo,
2459 			const uint8_t *key, const uint8_t key_len,
2460 			uint8_t iv_len)
2461 {
2462 	uint8_t cipher_key[key_len];
2463 	int status;
2464 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2465 	struct crypto_unittest_params *ut_params = &unittest_params;
2466 
2467 	memcpy(cipher_key, key, key_len);
2468 
2469 	/* Setup Cipher Parameters */
2470 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2471 	ut_params->cipher_xform.next = NULL;
2472 
2473 	ut_params->cipher_xform.cipher.algo = algo;
2474 	ut_params->cipher_xform.cipher.op = op;
2475 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2476 	ut_params->cipher_xform.cipher.key.length = key_len;
2477 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2478 	ut_params->cipher_xform.cipher.iv.length = iv_len;
2479 
2480 	debug_hexdump(stdout, "key:", key, key_len);
2481 
2482 	/* Create Crypto session */
2483 	ut_params->sess = rte_cryptodev_sym_session_create(
2484 			ts_params->session_mpool);
2485 
2486 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2487 			&ut_params->cipher_xform,
2488 			ts_params->session_priv_mpool);
2489 	if (status == -ENOTSUP)
2490 		return TEST_SKIPPED;
2491 
2492 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2493 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2494 	return 0;
2495 }
2496 
2497 static int
2498 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2499 			unsigned int cipher_len,
2500 			unsigned int cipher_offset)
2501 {
2502 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2503 	struct crypto_unittest_params *ut_params = &unittest_params;
2504 
2505 	/* Generate Crypto op data structure */
2506 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2507 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2508 	TEST_ASSERT_NOT_NULL(ut_params->op,
2509 				"Failed to allocate pktmbuf offload");
2510 
2511 	/* Set crypto operation data parameters */
2512 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2513 
2514 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2515 
2516 	/* set crypto operation source mbuf */
2517 	sym_op->m_src = ut_params->ibuf;
2518 
2519 	/* iv */
2520 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2521 			iv, iv_len);
2522 	sym_op->cipher.data.length = cipher_len;
2523 	sym_op->cipher.data.offset = cipher_offset;
2524 	return 0;
2525 }
2526 
2527 static int
2528 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2529 			unsigned int cipher_len,
2530 			unsigned int cipher_offset)
2531 {
2532 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2533 	struct crypto_unittest_params *ut_params = &unittest_params;
2534 
2535 	/* Generate Crypto op data structure */
2536 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2537 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2538 	TEST_ASSERT_NOT_NULL(ut_params->op,
2539 				"Failed to allocate pktmbuf offload");
2540 
2541 	/* Set crypto operation data parameters */
2542 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2543 
2544 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2545 
2546 	/* set crypto operation source mbuf */
2547 	sym_op->m_src = ut_params->ibuf;
2548 	sym_op->m_dst = ut_params->obuf;
2549 
2550 	/* iv */
2551 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2552 			iv, iv_len);
2553 	sym_op->cipher.data.length = cipher_len;
2554 	sym_op->cipher.data.offset = cipher_offset;
2555 	return 0;
2556 }
2557 
2558 static int
2559 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2560 		enum rte_crypto_cipher_operation cipher_op,
2561 		enum rte_crypto_auth_operation auth_op,
2562 		enum rte_crypto_auth_algorithm auth_algo,
2563 		enum rte_crypto_cipher_algorithm cipher_algo,
2564 		const uint8_t *key, uint8_t key_len,
2565 		uint8_t auth_iv_len, uint8_t auth_len,
2566 		uint8_t cipher_iv_len)
2567 
2568 {
2569 	uint8_t cipher_auth_key[key_len];
2570 	int status;
2571 
2572 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2573 	struct crypto_unittest_params *ut_params = &unittest_params;
2574 
2575 	memcpy(cipher_auth_key, key, key_len);
2576 
2577 	/* Setup Authentication Parameters */
2578 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2579 	ut_params->auth_xform.next = NULL;
2580 
2581 	ut_params->auth_xform.auth.op = auth_op;
2582 	ut_params->auth_xform.auth.algo = auth_algo;
2583 	ut_params->auth_xform.auth.key.length = key_len;
2584 	/* Hash key = cipher key */
2585 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2586 	ut_params->auth_xform.auth.digest_length = auth_len;
2587 	/* Auth IV will be after cipher IV */
2588 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2589 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2590 
2591 	/* Setup Cipher Parameters */
2592 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2593 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2594 
2595 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2596 	ut_params->cipher_xform.cipher.op = cipher_op;
2597 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2598 	ut_params->cipher_xform.cipher.key.length = key_len;
2599 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2600 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2601 
2602 	debug_hexdump(stdout, "key:", key, key_len);
2603 
2604 	/* Create Crypto session*/
2605 	ut_params->sess = rte_cryptodev_sym_session_create(
2606 			ts_params->session_mpool);
2607 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2608 
2609 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2610 			&ut_params->cipher_xform,
2611 			ts_params->session_priv_mpool);
2612 	if (status == -ENOTSUP)
2613 		return TEST_SKIPPED;
2614 
2615 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2616 	return 0;
2617 }
2618 
2619 static int
2620 create_wireless_cipher_auth_session(uint8_t dev_id,
2621 		enum rte_crypto_cipher_operation cipher_op,
2622 		enum rte_crypto_auth_operation auth_op,
2623 		enum rte_crypto_auth_algorithm auth_algo,
2624 		enum rte_crypto_cipher_algorithm cipher_algo,
2625 		const struct wireless_test_data *tdata)
2626 {
2627 	const uint8_t key_len = tdata->key.len;
2628 	uint8_t cipher_auth_key[key_len];
2629 	int status;
2630 
2631 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2632 	struct crypto_unittest_params *ut_params = &unittest_params;
2633 	const uint8_t *key = tdata->key.data;
2634 	const uint8_t auth_len = tdata->digest.len;
2635 	uint8_t cipher_iv_len = tdata->cipher_iv.len;
2636 	uint8_t auth_iv_len = tdata->auth_iv.len;
2637 
2638 	memcpy(cipher_auth_key, key, key_len);
2639 
2640 	/* Setup Authentication Parameters */
2641 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2642 	ut_params->auth_xform.next = NULL;
2643 
2644 	ut_params->auth_xform.auth.op = auth_op;
2645 	ut_params->auth_xform.auth.algo = auth_algo;
2646 	ut_params->auth_xform.auth.key.length = key_len;
2647 	/* Hash key = cipher key */
2648 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2649 	ut_params->auth_xform.auth.digest_length = auth_len;
2650 	/* Auth IV will be after cipher IV */
2651 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2652 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2653 
2654 	/* Setup Cipher Parameters */
2655 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2656 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2657 
2658 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2659 	ut_params->cipher_xform.cipher.op = cipher_op;
2660 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2661 	ut_params->cipher_xform.cipher.key.length = key_len;
2662 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2663 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2664 
2665 
2666 	debug_hexdump(stdout, "key:", key, key_len);
2667 
2668 	/* Create Crypto session*/
2669 	ut_params->sess = rte_cryptodev_sym_session_create(
2670 			ts_params->session_mpool);
2671 
2672 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2673 			&ut_params->cipher_xform,
2674 			ts_params->session_priv_mpool);
2675 	if (status == -ENOTSUP)
2676 		return TEST_SKIPPED;
2677 
2678 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2679 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2680 	return 0;
2681 }
2682 
2683 static int
2684 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2685 		const struct wireless_test_data *tdata)
2686 {
2687 	return create_wireless_cipher_auth_session(dev_id,
2688 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2689 		RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2690 		RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2691 }
2692 
2693 static int
2694 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2695 		enum rte_crypto_cipher_operation cipher_op,
2696 		enum rte_crypto_auth_operation auth_op,
2697 		enum rte_crypto_auth_algorithm auth_algo,
2698 		enum rte_crypto_cipher_algorithm cipher_algo,
2699 		const uint8_t *key, const uint8_t key_len,
2700 		uint8_t auth_iv_len, uint8_t auth_len,
2701 		uint8_t cipher_iv_len)
2702 {
2703 	uint8_t auth_cipher_key[key_len];
2704 	int status;
2705 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2706 	struct crypto_unittest_params *ut_params = &unittest_params;
2707 
2708 	memcpy(auth_cipher_key, key, key_len);
2709 
2710 	/* Setup Authentication Parameters */
2711 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2712 	ut_params->auth_xform.auth.op = auth_op;
2713 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2714 	ut_params->auth_xform.auth.algo = auth_algo;
2715 	ut_params->auth_xform.auth.key.length = key_len;
2716 	ut_params->auth_xform.auth.key.data = auth_cipher_key;
2717 	ut_params->auth_xform.auth.digest_length = auth_len;
2718 	/* Auth IV will be after cipher IV */
2719 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2720 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2721 
2722 	/* Setup Cipher Parameters */
2723 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2724 	ut_params->cipher_xform.next = NULL;
2725 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2726 	ut_params->cipher_xform.cipher.op = cipher_op;
2727 	ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2728 	ut_params->cipher_xform.cipher.key.length = key_len;
2729 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2730 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2731 
2732 	debug_hexdump(stdout, "key:", key, key_len);
2733 
2734 	/* Create Crypto session*/
2735 	ut_params->sess = rte_cryptodev_sym_session_create(
2736 			ts_params->session_mpool);
2737 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2738 
2739 	if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2740 		ut_params->auth_xform.next = NULL;
2741 		ut_params->cipher_xform.next = &ut_params->auth_xform;
2742 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2743 				&ut_params->cipher_xform,
2744 				ts_params->session_priv_mpool);
2745 
2746 	} else
2747 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2748 				&ut_params->auth_xform,
2749 				ts_params->session_priv_mpool);
2750 
2751 	if (status == -ENOTSUP)
2752 		return TEST_SKIPPED;
2753 
2754 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2755 
2756 	return 0;
2757 }
2758 
2759 static int
2760 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2761 		unsigned int auth_tag_len,
2762 		const uint8_t *iv, unsigned int iv_len,
2763 		unsigned int data_pad_len,
2764 		enum rte_crypto_auth_operation op,
2765 		unsigned int auth_len, unsigned int auth_offset)
2766 {
2767 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2768 
2769 	struct crypto_unittest_params *ut_params = &unittest_params;
2770 
2771 	/* Generate Crypto op data structure */
2772 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2773 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2774 	TEST_ASSERT_NOT_NULL(ut_params->op,
2775 		"Failed to allocate pktmbuf offload");
2776 
2777 	/* Set crypto operation data parameters */
2778 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2779 
2780 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2781 
2782 	/* set crypto operation source mbuf */
2783 	sym_op->m_src = ut_params->ibuf;
2784 
2785 	/* iv */
2786 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2787 			iv, iv_len);
2788 	/* digest */
2789 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2790 					ut_params->ibuf, auth_tag_len);
2791 
2792 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2793 				"no room to append auth tag");
2794 	ut_params->digest = sym_op->auth.digest.data;
2795 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2796 			ut_params->ibuf, data_pad_len);
2797 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2798 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2799 	else
2800 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2801 
2802 	debug_hexdump(stdout, "digest:",
2803 		sym_op->auth.digest.data,
2804 		auth_tag_len);
2805 
2806 	sym_op->auth.data.length = auth_len;
2807 	sym_op->auth.data.offset = auth_offset;
2808 
2809 	return 0;
2810 }
2811 
2812 static int
2813 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2814 	enum rte_crypto_auth_operation op)
2815 {
2816 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2817 	struct crypto_unittest_params *ut_params = &unittest_params;
2818 
2819 	const uint8_t *auth_tag = tdata->digest.data;
2820 	const unsigned int auth_tag_len = tdata->digest.len;
2821 	unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2822 	unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2823 
2824 	const uint8_t *cipher_iv = tdata->cipher_iv.data;
2825 	const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2826 	const uint8_t *auth_iv = tdata->auth_iv.data;
2827 	const uint8_t auth_iv_len = tdata->auth_iv.len;
2828 	const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2829 	const unsigned int auth_len = tdata->validAuthLenInBits.len;
2830 
2831 	/* Generate Crypto op data structure */
2832 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2833 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2834 	TEST_ASSERT_NOT_NULL(ut_params->op,
2835 			"Failed to allocate pktmbuf offload");
2836 	/* Set crypto operation data parameters */
2837 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2838 
2839 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2840 
2841 	/* set crypto operation source mbuf */
2842 	sym_op->m_src = ut_params->ibuf;
2843 
2844 	/* digest */
2845 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2846 			ut_params->ibuf, auth_tag_len);
2847 
2848 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2849 			"no room to append auth tag");
2850 	ut_params->digest = sym_op->auth.digest.data;
2851 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2852 			ut_params->ibuf, data_pad_len);
2853 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2854 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2855 	else
2856 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2857 
2858 	debug_hexdump(stdout, "digest:",
2859 		sym_op->auth.digest.data,
2860 		auth_tag_len);
2861 
2862 	/* Copy cipher and auth IVs at the end of the crypto operation */
2863 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2864 						IV_OFFSET);
2865 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2866 	iv_ptr += cipher_iv_len;
2867 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2868 
2869 	sym_op->cipher.data.length = cipher_len;
2870 	sym_op->cipher.data.offset = 0;
2871 	sym_op->auth.data.length = auth_len;
2872 	sym_op->auth.data.offset = 0;
2873 
2874 	return 0;
2875 }
2876 
2877 static int
2878 create_zuc_cipher_hash_generate_operation(
2879 		const struct wireless_test_data *tdata)
2880 {
2881 	return create_wireless_cipher_hash_operation(tdata,
2882 		RTE_CRYPTO_AUTH_OP_GENERATE);
2883 }
2884 
2885 static int
2886 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2887 		const unsigned auth_tag_len,
2888 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2889 		unsigned data_pad_len,
2890 		enum rte_crypto_auth_operation op,
2891 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2892 		const unsigned cipher_len, const unsigned cipher_offset,
2893 		const unsigned auth_len, const unsigned auth_offset)
2894 {
2895 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2896 	struct crypto_unittest_params *ut_params = &unittest_params;
2897 
2898 	enum rte_crypto_cipher_algorithm cipher_algo =
2899 			ut_params->cipher_xform.cipher.algo;
2900 	enum rte_crypto_auth_algorithm auth_algo =
2901 			ut_params->auth_xform.auth.algo;
2902 
2903 	/* Generate Crypto op data structure */
2904 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2905 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2906 	TEST_ASSERT_NOT_NULL(ut_params->op,
2907 			"Failed to allocate pktmbuf offload");
2908 	/* Set crypto operation data parameters */
2909 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2910 
2911 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2912 
2913 	/* set crypto operation source mbuf */
2914 	sym_op->m_src = ut_params->ibuf;
2915 
2916 	/* digest */
2917 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2918 			ut_params->ibuf, auth_tag_len);
2919 
2920 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2921 			"no room to append auth tag");
2922 	ut_params->digest = sym_op->auth.digest.data;
2923 
2924 	if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2925 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2926 				ut_params->ibuf, data_pad_len);
2927 	} else {
2928 		struct rte_mbuf *m = ut_params->ibuf;
2929 		unsigned int offset = data_pad_len;
2930 
2931 		while (offset > m->data_len && m->next != NULL) {
2932 			offset -= m->data_len;
2933 			m = m->next;
2934 		}
2935 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2936 			m, offset);
2937 	}
2938 
2939 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2940 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2941 	else
2942 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2943 
2944 	debug_hexdump(stdout, "digest:",
2945 		sym_op->auth.digest.data,
2946 		auth_tag_len);
2947 
2948 	/* Copy cipher and auth IVs at the end of the crypto operation */
2949 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2950 						IV_OFFSET);
2951 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2952 	iv_ptr += cipher_iv_len;
2953 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2954 
2955 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2956 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2957 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2958 		sym_op->cipher.data.length = cipher_len;
2959 		sym_op->cipher.data.offset = cipher_offset;
2960 	} else {
2961 		sym_op->cipher.data.length = cipher_len >> 3;
2962 		sym_op->cipher.data.offset = cipher_offset >> 3;
2963 	}
2964 
2965 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2966 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2967 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2968 		sym_op->auth.data.length = auth_len;
2969 		sym_op->auth.data.offset = auth_offset;
2970 	} else {
2971 		sym_op->auth.data.length = auth_len >> 3;
2972 		sym_op->auth.data.offset = auth_offset >> 3;
2973 	}
2974 
2975 	return 0;
2976 }
2977 
2978 static int
2979 create_wireless_algo_auth_cipher_operation(
2980 		const uint8_t *auth_tag, unsigned int auth_tag_len,
2981 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2982 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2983 		unsigned int data_pad_len,
2984 		unsigned int cipher_len, unsigned int cipher_offset,
2985 		unsigned int auth_len, unsigned int auth_offset,
2986 		uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2987 {
2988 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2989 	struct crypto_unittest_params *ut_params = &unittest_params;
2990 
2991 	enum rte_crypto_cipher_algorithm cipher_algo =
2992 			ut_params->cipher_xform.cipher.algo;
2993 	enum rte_crypto_auth_algorithm auth_algo =
2994 			ut_params->auth_xform.auth.algo;
2995 
2996 	/* Generate Crypto op data structure */
2997 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2998 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2999 	TEST_ASSERT_NOT_NULL(ut_params->op,
3000 			"Failed to allocate pktmbuf offload");
3001 
3002 	/* Set crypto operation data parameters */
3003 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
3004 
3005 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
3006 
3007 	/* set crypto operation mbufs */
3008 	sym_op->m_src = ut_params->ibuf;
3009 	if (op_mode == OUT_OF_PLACE)
3010 		sym_op->m_dst = ut_params->obuf;
3011 
3012 	/* digest */
3013 	if (!do_sgl) {
3014 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
3015 			(op_mode == IN_PLACE ?
3016 				ut_params->ibuf : ut_params->obuf),
3017 			uint8_t *, data_pad_len);
3018 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
3019 			(op_mode == IN_PLACE ?
3020 				ut_params->ibuf : ut_params->obuf),
3021 			data_pad_len);
3022 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
3023 	} else {
3024 		uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
3025 		struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
3026 				sym_op->m_src : sym_op->m_dst);
3027 		while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
3028 			remaining_off -= rte_pktmbuf_data_len(sgl_buf);
3029 			sgl_buf = sgl_buf->next;
3030 		}
3031 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
3032 				uint8_t *, remaining_off);
3033 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
3034 				remaining_off);
3035 		memset(sym_op->auth.digest.data, 0, remaining_off);
3036 		while (sgl_buf->next != NULL) {
3037 			memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
3038 				0, rte_pktmbuf_data_len(sgl_buf));
3039 			sgl_buf = sgl_buf->next;
3040 		}
3041 	}
3042 
3043 	/* Copy digest for the verification */
3044 	if (verify)
3045 		memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
3046 
3047 	/* Copy cipher and auth IVs at the end of the crypto operation */
3048 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
3049 			ut_params->op, uint8_t *, IV_OFFSET);
3050 
3051 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3052 	iv_ptr += cipher_iv_len;
3053 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3054 
3055 	/* Only copy over the offset data needed from src to dst in OOP,
3056 	 * if the auth and cipher offsets are not aligned
3057 	 */
3058 	if (op_mode == OUT_OF_PLACE) {
3059 		if (cipher_offset > auth_offset)
3060 			rte_memcpy(
3061 				rte_pktmbuf_mtod_offset(
3062 					sym_op->m_dst,
3063 					uint8_t *, auth_offset >> 3),
3064 				rte_pktmbuf_mtod_offset(
3065 					sym_op->m_src,
3066 					uint8_t *, auth_offset >> 3),
3067 				((cipher_offset >> 3) - (auth_offset >> 3)));
3068 	}
3069 
3070 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3071 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3072 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3073 		sym_op->cipher.data.length = cipher_len;
3074 		sym_op->cipher.data.offset = cipher_offset;
3075 	} else {
3076 		sym_op->cipher.data.length = cipher_len >> 3;
3077 		sym_op->cipher.data.offset = cipher_offset >> 3;
3078 	}
3079 
3080 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3081 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3082 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3083 		sym_op->auth.data.length = auth_len;
3084 		sym_op->auth.data.offset = auth_offset;
3085 	} else {
3086 		sym_op->auth.data.length = auth_len >> 3;
3087 		sym_op->auth.data.offset = auth_offset >> 3;
3088 	}
3089 
3090 	return 0;
3091 }
3092 
3093 static int
3094 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
3095 {
3096 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3097 	struct crypto_unittest_params *ut_params = &unittest_params;
3098 
3099 	int retval;
3100 	unsigned plaintext_pad_len;
3101 	unsigned plaintext_len;
3102 	uint8_t *plaintext;
3103 	struct rte_cryptodev_info dev_info;
3104 
3105 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3106 	uint64_t feat_flags = dev_info.feature_flags;
3107 
3108 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3109 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3110 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3111 		return TEST_SKIPPED;
3112 	}
3113 
3114 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3115 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3116 		printf("Device doesn't support RAW data-path APIs.\n");
3117 		return TEST_SKIPPED;
3118 	}
3119 
3120 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3121 		return TEST_SKIPPED;
3122 
3123 	/* Verify the capabilities */
3124 	struct rte_cryptodev_sym_capability_idx cap_idx;
3125 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3126 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3127 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3128 			&cap_idx) == NULL)
3129 		return TEST_SKIPPED;
3130 
3131 	/* Create SNOW 3G session */
3132 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3133 			tdata->key.data, tdata->key.len,
3134 			tdata->auth_iv.len, tdata->digest.len,
3135 			RTE_CRYPTO_AUTH_OP_GENERATE,
3136 			RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3137 	if (retval < 0)
3138 		return retval;
3139 
3140 	/* alloc mbuf and set payload */
3141 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3142 
3143 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3144 	rte_pktmbuf_tailroom(ut_params->ibuf));
3145 
3146 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3147 	/* Append data which is padded to a multiple of */
3148 	/* the algorithms block size */
3149 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3150 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3151 				plaintext_pad_len);
3152 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3153 
3154 	/* Create SNOW 3G operation */
3155 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3156 			tdata->auth_iv.data, tdata->auth_iv.len,
3157 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3158 			tdata->validAuthLenInBits.len,
3159 			0);
3160 	if (retval < 0)
3161 		return retval;
3162 
3163 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3164 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3165 				ut_params->op, 0, 1, 1, 0);
3166 	else
3167 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3168 				ut_params->op);
3169 	ut_params->obuf = ut_params->op->sym->m_src;
3170 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3171 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3172 			+ plaintext_pad_len;
3173 
3174 	/* Validate obuf */
3175 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3176 	ut_params->digest,
3177 	tdata->digest.data,
3178 	DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3179 	"SNOW 3G Generated auth tag not as expected");
3180 
3181 	return 0;
3182 }
3183 
3184 static int
3185 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3186 {
3187 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3188 	struct crypto_unittest_params *ut_params = &unittest_params;
3189 
3190 	int retval;
3191 	unsigned plaintext_pad_len;
3192 	unsigned plaintext_len;
3193 	uint8_t *plaintext;
3194 	struct rte_cryptodev_info dev_info;
3195 
3196 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3197 	uint64_t feat_flags = dev_info.feature_flags;
3198 
3199 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3200 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3201 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3202 		return TEST_SKIPPED;
3203 	}
3204 
3205 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3206 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3207 		printf("Device doesn't support RAW data-path APIs.\n");
3208 		return TEST_SKIPPED;
3209 	}
3210 
3211 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3212 		return TEST_SKIPPED;
3213 
3214 	/* Verify the capabilities */
3215 	struct rte_cryptodev_sym_capability_idx cap_idx;
3216 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3217 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3218 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3219 			&cap_idx) == NULL)
3220 		return TEST_SKIPPED;
3221 
3222 	/* Create SNOW 3G session */
3223 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3224 				tdata->key.data, tdata->key.len,
3225 				tdata->auth_iv.len, tdata->digest.len,
3226 				RTE_CRYPTO_AUTH_OP_VERIFY,
3227 				RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3228 	if (retval < 0)
3229 		return retval;
3230 	/* alloc mbuf and set payload */
3231 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3232 
3233 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3234 	rte_pktmbuf_tailroom(ut_params->ibuf));
3235 
3236 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3237 	/* Append data which is padded to a multiple of */
3238 	/* the algorithms block size */
3239 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3240 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3241 				plaintext_pad_len);
3242 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3243 
3244 	/* Create SNOW 3G operation */
3245 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3246 			tdata->digest.len,
3247 			tdata->auth_iv.data, tdata->auth_iv.len,
3248 			plaintext_pad_len,
3249 			RTE_CRYPTO_AUTH_OP_VERIFY,
3250 			tdata->validAuthLenInBits.len,
3251 			0);
3252 	if (retval < 0)
3253 		return retval;
3254 
3255 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3256 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3257 				ut_params->op, 0, 1, 1, 0);
3258 	else
3259 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3260 				ut_params->op);
3261 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3262 	ut_params->obuf = ut_params->op->sym->m_src;
3263 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3264 				+ plaintext_pad_len;
3265 
3266 	/* Validate obuf */
3267 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3268 		return 0;
3269 	else
3270 		return -1;
3271 
3272 	return 0;
3273 }
3274 
3275 static int
3276 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3277 {
3278 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3279 	struct crypto_unittest_params *ut_params = &unittest_params;
3280 
3281 	int retval;
3282 	unsigned plaintext_pad_len;
3283 	unsigned plaintext_len;
3284 	uint8_t *plaintext;
3285 	struct rte_cryptodev_info dev_info;
3286 
3287 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3288 	uint64_t feat_flags = dev_info.feature_flags;
3289 
3290 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3291 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3292 		printf("Device doesn't support RAW data-path APIs.\n");
3293 		return TEST_SKIPPED;
3294 	}
3295 
3296 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3297 		return TEST_SKIPPED;
3298 
3299 	/* Verify the capabilities */
3300 	struct rte_cryptodev_sym_capability_idx cap_idx;
3301 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3302 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3303 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3304 			&cap_idx) == NULL)
3305 		return TEST_SKIPPED;
3306 
3307 	/* Create KASUMI session */
3308 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3309 			tdata->key.data, tdata->key.len,
3310 			0, tdata->digest.len,
3311 			RTE_CRYPTO_AUTH_OP_GENERATE,
3312 			RTE_CRYPTO_AUTH_KASUMI_F9);
3313 	if (retval < 0)
3314 		return retval;
3315 
3316 	/* alloc mbuf and set payload */
3317 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3318 
3319 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3320 	rte_pktmbuf_tailroom(ut_params->ibuf));
3321 
3322 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3323 	/* Append data which is padded to a multiple of */
3324 	/* the algorithms block size */
3325 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3326 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3327 				plaintext_pad_len);
3328 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3329 
3330 	/* Create KASUMI operation */
3331 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3332 			NULL, 0,
3333 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3334 			tdata->plaintext.len,
3335 			0);
3336 	if (retval < 0)
3337 		return retval;
3338 
3339 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3340 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3341 			ut_params->op);
3342 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3343 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3344 				ut_params->op, 0, 1, 1, 0);
3345 	else
3346 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3347 			ut_params->op);
3348 
3349 	ut_params->obuf = ut_params->op->sym->m_src;
3350 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3351 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3352 			+ plaintext_pad_len;
3353 
3354 	/* Validate obuf */
3355 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3356 	ut_params->digest,
3357 	tdata->digest.data,
3358 	DIGEST_BYTE_LENGTH_KASUMI_F9,
3359 	"KASUMI Generated auth tag not as expected");
3360 
3361 	return 0;
3362 }
3363 
3364 static int
3365 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3366 {
3367 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3368 	struct crypto_unittest_params *ut_params = &unittest_params;
3369 
3370 	int retval;
3371 	unsigned plaintext_pad_len;
3372 	unsigned plaintext_len;
3373 	uint8_t *plaintext;
3374 	struct rte_cryptodev_info dev_info;
3375 
3376 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3377 	uint64_t feat_flags = dev_info.feature_flags;
3378 
3379 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3380 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3381 		printf("Device doesn't support RAW data-path APIs.\n");
3382 		return TEST_SKIPPED;
3383 	}
3384 
3385 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3386 		return TEST_SKIPPED;
3387 
3388 	/* Verify the capabilities */
3389 	struct rte_cryptodev_sym_capability_idx cap_idx;
3390 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3391 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3392 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3393 			&cap_idx) == NULL)
3394 		return TEST_SKIPPED;
3395 
3396 	/* Create KASUMI session */
3397 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3398 				tdata->key.data, tdata->key.len,
3399 				0, tdata->digest.len,
3400 				RTE_CRYPTO_AUTH_OP_VERIFY,
3401 				RTE_CRYPTO_AUTH_KASUMI_F9);
3402 	if (retval < 0)
3403 		return retval;
3404 	/* alloc mbuf and set payload */
3405 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3406 
3407 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3408 	rte_pktmbuf_tailroom(ut_params->ibuf));
3409 
3410 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3411 	/* Append data which is padded to a multiple */
3412 	/* of the algorithms block size */
3413 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3414 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3415 				plaintext_pad_len);
3416 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3417 
3418 	/* Create KASUMI operation */
3419 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3420 			tdata->digest.len,
3421 			NULL, 0,
3422 			plaintext_pad_len,
3423 			RTE_CRYPTO_AUTH_OP_VERIFY,
3424 			tdata->plaintext.len,
3425 			0);
3426 	if (retval < 0)
3427 		return retval;
3428 
3429 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3430 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3431 				ut_params->op, 0, 1, 1, 0);
3432 	else
3433 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3434 				ut_params->op);
3435 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3436 	ut_params->obuf = ut_params->op->sym->m_src;
3437 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3438 				+ plaintext_pad_len;
3439 
3440 	/* Validate obuf */
3441 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3442 		return 0;
3443 	else
3444 		return -1;
3445 
3446 	return 0;
3447 }
3448 
3449 static int
3450 test_snow3g_hash_generate_test_case_1(void)
3451 {
3452 	return test_snow3g_authentication(&snow3g_hash_test_case_1);
3453 }
3454 
3455 static int
3456 test_snow3g_hash_generate_test_case_2(void)
3457 {
3458 	return test_snow3g_authentication(&snow3g_hash_test_case_2);
3459 }
3460 
3461 static int
3462 test_snow3g_hash_generate_test_case_3(void)
3463 {
3464 	return test_snow3g_authentication(&snow3g_hash_test_case_3);
3465 }
3466 
3467 static int
3468 test_snow3g_hash_generate_test_case_4(void)
3469 {
3470 	return test_snow3g_authentication(&snow3g_hash_test_case_4);
3471 }
3472 
3473 static int
3474 test_snow3g_hash_generate_test_case_5(void)
3475 {
3476 	return test_snow3g_authentication(&snow3g_hash_test_case_5);
3477 }
3478 
3479 static int
3480 test_snow3g_hash_generate_test_case_6(void)
3481 {
3482 	return test_snow3g_authentication(&snow3g_hash_test_case_6);
3483 }
3484 
3485 static int
3486 test_snow3g_hash_verify_test_case_1(void)
3487 {
3488 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3489 
3490 }
3491 
3492 static int
3493 test_snow3g_hash_verify_test_case_2(void)
3494 {
3495 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3496 }
3497 
3498 static int
3499 test_snow3g_hash_verify_test_case_3(void)
3500 {
3501 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3502 }
3503 
3504 static int
3505 test_snow3g_hash_verify_test_case_4(void)
3506 {
3507 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3508 }
3509 
3510 static int
3511 test_snow3g_hash_verify_test_case_5(void)
3512 {
3513 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3514 }
3515 
3516 static int
3517 test_snow3g_hash_verify_test_case_6(void)
3518 {
3519 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3520 }
3521 
3522 static int
3523 test_kasumi_hash_generate_test_case_1(void)
3524 {
3525 	return test_kasumi_authentication(&kasumi_hash_test_case_1);
3526 }
3527 
3528 static int
3529 test_kasumi_hash_generate_test_case_2(void)
3530 {
3531 	return test_kasumi_authentication(&kasumi_hash_test_case_2);
3532 }
3533 
3534 static int
3535 test_kasumi_hash_generate_test_case_3(void)
3536 {
3537 	return test_kasumi_authentication(&kasumi_hash_test_case_3);
3538 }
3539 
3540 static int
3541 test_kasumi_hash_generate_test_case_4(void)
3542 {
3543 	return test_kasumi_authentication(&kasumi_hash_test_case_4);
3544 }
3545 
3546 static int
3547 test_kasumi_hash_generate_test_case_5(void)
3548 {
3549 	return test_kasumi_authentication(&kasumi_hash_test_case_5);
3550 }
3551 
3552 static int
3553 test_kasumi_hash_generate_test_case_6(void)
3554 {
3555 	return test_kasumi_authentication(&kasumi_hash_test_case_6);
3556 }
3557 
3558 static int
3559 test_kasumi_hash_verify_test_case_1(void)
3560 {
3561 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3562 }
3563 
3564 static int
3565 test_kasumi_hash_verify_test_case_2(void)
3566 {
3567 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3568 }
3569 
3570 static int
3571 test_kasumi_hash_verify_test_case_3(void)
3572 {
3573 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3574 }
3575 
3576 static int
3577 test_kasumi_hash_verify_test_case_4(void)
3578 {
3579 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3580 }
3581 
3582 static int
3583 test_kasumi_hash_verify_test_case_5(void)
3584 {
3585 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3586 }
3587 
3588 static int
3589 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3590 {
3591 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3592 	struct crypto_unittest_params *ut_params = &unittest_params;
3593 
3594 	int retval;
3595 	uint8_t *plaintext, *ciphertext;
3596 	unsigned plaintext_pad_len;
3597 	unsigned plaintext_len;
3598 	struct rte_cryptodev_info dev_info;
3599 
3600 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3601 	uint64_t feat_flags = dev_info.feature_flags;
3602 
3603 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3604 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3605 		printf("Device doesn't support RAW data-path APIs.\n");
3606 		return TEST_SKIPPED;
3607 	}
3608 
3609 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3610 		return TEST_SKIPPED;
3611 
3612 	/* Verify the capabilities */
3613 	struct rte_cryptodev_sym_capability_idx cap_idx;
3614 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3615 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3616 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3617 			&cap_idx) == NULL)
3618 		return TEST_SKIPPED;
3619 
3620 	/* Create KASUMI session */
3621 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3622 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3623 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3624 					tdata->key.data, tdata->key.len,
3625 					tdata->cipher_iv.len);
3626 	if (retval < 0)
3627 		return retval;
3628 
3629 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3630 
3631 	/* Clear mbuf payload */
3632 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3633 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3634 
3635 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3636 	/* Append data which is padded to a multiple */
3637 	/* of the algorithms block size */
3638 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3639 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3640 				plaintext_pad_len);
3641 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3642 
3643 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3644 
3645 	/* Create KASUMI operation */
3646 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3647 				tdata->cipher_iv.len,
3648 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3649 				tdata->validCipherOffsetInBits.len);
3650 	if (retval < 0)
3651 		return retval;
3652 
3653 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3654 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3655 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3656 	else
3657 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3658 				ut_params->op);
3659 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3660 
3661 	ut_params->obuf = ut_params->op->sym->m_dst;
3662 	if (ut_params->obuf)
3663 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3664 	else
3665 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3666 
3667 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3668 
3669 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3670 				(tdata->validCipherOffsetInBits.len >> 3);
3671 	/* Validate obuf */
3672 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3673 		ciphertext,
3674 		reference_ciphertext,
3675 		tdata->validCipherLenInBits.len,
3676 		"KASUMI Ciphertext data not as expected");
3677 	return 0;
3678 }
3679 
3680 static int
3681 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3682 {
3683 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3684 	struct crypto_unittest_params *ut_params = &unittest_params;
3685 
3686 	int retval;
3687 
3688 	unsigned int plaintext_pad_len;
3689 	unsigned int plaintext_len;
3690 
3691 	uint8_t buffer[10000];
3692 	const uint8_t *ciphertext;
3693 
3694 	struct rte_cryptodev_info dev_info;
3695 
3696 	/* Verify the capabilities */
3697 	struct rte_cryptodev_sym_capability_idx cap_idx;
3698 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3699 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3700 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3701 			&cap_idx) == NULL)
3702 		return TEST_SKIPPED;
3703 
3704 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3705 
3706 	uint64_t feat_flags = dev_info.feature_flags;
3707 
3708 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3709 		printf("Device doesn't support in-place scatter-gather. "
3710 				"Test Skipped.\n");
3711 		return TEST_SKIPPED;
3712 	}
3713 
3714 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3715 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3716 		printf("Device doesn't support RAW data-path APIs.\n");
3717 		return TEST_SKIPPED;
3718 	}
3719 
3720 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3721 		return TEST_SKIPPED;
3722 
3723 	/* Create KASUMI session */
3724 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3725 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3726 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3727 					tdata->key.data, tdata->key.len,
3728 					tdata->cipher_iv.len);
3729 	if (retval < 0)
3730 		return retval;
3731 
3732 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3733 
3734 
3735 	/* Append data which is padded to a multiple */
3736 	/* of the algorithms block size */
3737 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3738 
3739 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3740 			plaintext_pad_len, 10, 0);
3741 
3742 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3743 
3744 	/* Create KASUMI operation */
3745 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3746 				tdata->cipher_iv.len,
3747 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3748 				tdata->validCipherOffsetInBits.len);
3749 	if (retval < 0)
3750 		return retval;
3751 
3752 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3753 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3754 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3755 	else
3756 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3757 						ut_params->op);
3758 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3759 
3760 	ut_params->obuf = ut_params->op->sym->m_dst;
3761 
3762 	if (ut_params->obuf)
3763 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3764 				plaintext_len, buffer);
3765 	else
3766 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3767 				tdata->validCipherOffsetInBits.len >> 3,
3768 				plaintext_len, buffer);
3769 
3770 	/* Validate obuf */
3771 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3772 
3773 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3774 				(tdata->validCipherOffsetInBits.len >> 3);
3775 	/* Validate obuf */
3776 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3777 		ciphertext,
3778 		reference_ciphertext,
3779 		tdata->validCipherLenInBits.len,
3780 		"KASUMI Ciphertext data not as expected");
3781 	return 0;
3782 }
3783 
3784 static int
3785 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3786 {
3787 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3788 	struct crypto_unittest_params *ut_params = &unittest_params;
3789 
3790 	int retval;
3791 	uint8_t *plaintext, *ciphertext;
3792 	unsigned plaintext_pad_len;
3793 	unsigned plaintext_len;
3794 
3795 	/* Verify the capabilities */
3796 	struct rte_cryptodev_sym_capability_idx cap_idx;
3797 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3798 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3799 	/* Data-path service does not support OOP */
3800 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3801 			&cap_idx) == NULL)
3802 		return TEST_SKIPPED;
3803 
3804 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3805 		return TEST_SKIPPED;
3806 
3807 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3808 		return TEST_SKIPPED;
3809 
3810 	/* Create KASUMI session */
3811 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3812 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3813 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3814 					tdata->key.data, tdata->key.len,
3815 					tdata->cipher_iv.len);
3816 	if (retval < 0)
3817 		return retval;
3818 
3819 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3820 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3821 
3822 	/* Clear mbuf payload */
3823 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3824 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3825 
3826 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3827 	/* Append data which is padded to a multiple */
3828 	/* of the algorithms block size */
3829 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3830 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3831 				plaintext_pad_len);
3832 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3833 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3834 
3835 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3836 
3837 	/* Create KASUMI operation */
3838 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3839 				tdata->cipher_iv.len,
3840 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3841 				tdata->validCipherOffsetInBits.len);
3842 	if (retval < 0)
3843 		return retval;
3844 
3845 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3846 						ut_params->op);
3847 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3848 
3849 	ut_params->obuf = ut_params->op->sym->m_dst;
3850 	if (ut_params->obuf)
3851 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3852 	else
3853 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3854 
3855 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3856 
3857 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3858 				(tdata->validCipherOffsetInBits.len >> 3);
3859 	/* Validate obuf */
3860 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3861 		ciphertext,
3862 		reference_ciphertext,
3863 		tdata->validCipherLenInBits.len,
3864 		"KASUMI Ciphertext data not as expected");
3865 	return 0;
3866 }
3867 
3868 static int
3869 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3870 {
3871 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3872 	struct crypto_unittest_params *ut_params = &unittest_params;
3873 
3874 	int retval;
3875 	unsigned int plaintext_pad_len;
3876 	unsigned int plaintext_len;
3877 
3878 	const uint8_t *ciphertext;
3879 	uint8_t buffer[2048];
3880 
3881 	struct rte_cryptodev_info dev_info;
3882 
3883 	/* Verify the capabilities */
3884 	struct rte_cryptodev_sym_capability_idx cap_idx;
3885 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3886 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3887 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3888 			&cap_idx) == NULL)
3889 		return TEST_SKIPPED;
3890 
3891 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3892 		return TEST_SKIPPED;
3893 
3894 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3895 		return TEST_SKIPPED;
3896 
3897 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3898 
3899 	uint64_t feat_flags = dev_info.feature_flags;
3900 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3901 		printf("Device doesn't support out-of-place scatter-gather "
3902 				"in both input and output mbufs. "
3903 				"Test Skipped.\n");
3904 		return TEST_SKIPPED;
3905 	}
3906 
3907 	/* Create KASUMI session */
3908 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3909 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3910 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3911 					tdata->key.data, tdata->key.len,
3912 					tdata->cipher_iv.len);
3913 	if (retval < 0)
3914 		return retval;
3915 
3916 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3917 	/* Append data which is padded to a multiple */
3918 	/* of the algorithms block size */
3919 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3920 
3921 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3922 			plaintext_pad_len, 10, 0);
3923 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3924 			plaintext_pad_len, 3, 0);
3925 
3926 	/* Append data which is padded to a multiple */
3927 	/* of the algorithms block size */
3928 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3929 
3930 	/* Create KASUMI operation */
3931 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3932 				tdata->cipher_iv.len,
3933 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3934 				tdata->validCipherOffsetInBits.len);
3935 	if (retval < 0)
3936 		return retval;
3937 
3938 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3939 						ut_params->op);
3940 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3941 
3942 	ut_params->obuf = ut_params->op->sym->m_dst;
3943 	if (ut_params->obuf)
3944 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3945 				plaintext_pad_len, buffer);
3946 	else
3947 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3948 				tdata->validCipherOffsetInBits.len >> 3,
3949 				plaintext_pad_len, buffer);
3950 
3951 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3952 				(tdata->validCipherOffsetInBits.len >> 3);
3953 	/* Validate obuf */
3954 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3955 		ciphertext,
3956 		reference_ciphertext,
3957 		tdata->validCipherLenInBits.len,
3958 		"KASUMI Ciphertext data not as expected");
3959 	return 0;
3960 }
3961 
3962 
3963 static int
3964 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3965 {
3966 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3967 	struct crypto_unittest_params *ut_params = &unittest_params;
3968 
3969 	int retval;
3970 	uint8_t *ciphertext, *plaintext;
3971 	unsigned ciphertext_pad_len;
3972 	unsigned ciphertext_len;
3973 
3974 	/* Verify the capabilities */
3975 	struct rte_cryptodev_sym_capability_idx cap_idx;
3976 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3977 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3978 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3979 			&cap_idx) == NULL)
3980 		return TEST_SKIPPED;
3981 
3982 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3983 		return TEST_SKIPPED;
3984 
3985 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3986 		return TEST_SKIPPED;
3987 
3988 	/* Create KASUMI session */
3989 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3990 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3991 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3992 					tdata->key.data, tdata->key.len,
3993 					tdata->cipher_iv.len);
3994 	if (retval < 0)
3995 		return retval;
3996 
3997 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3998 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3999 
4000 	/* Clear mbuf payload */
4001 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4002 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4003 
4004 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4005 	/* Append data which is padded to a multiple */
4006 	/* of the algorithms block size */
4007 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4008 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4009 				ciphertext_pad_len);
4010 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4011 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4012 
4013 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4014 
4015 	/* Create KASUMI operation */
4016 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4017 				tdata->cipher_iv.len,
4018 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4019 				tdata->validCipherOffsetInBits.len);
4020 	if (retval < 0)
4021 		return retval;
4022 
4023 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4024 						ut_params->op);
4025 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4026 
4027 	ut_params->obuf = ut_params->op->sym->m_dst;
4028 	if (ut_params->obuf)
4029 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4030 	else
4031 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4032 
4033 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4034 
4035 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4036 				(tdata->validCipherOffsetInBits.len >> 3);
4037 	/* Validate obuf */
4038 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4039 		plaintext,
4040 		reference_plaintext,
4041 		tdata->validCipherLenInBits.len,
4042 		"KASUMI Plaintext data not as expected");
4043 	return 0;
4044 }
4045 
4046 static int
4047 test_kasumi_decryption(const struct kasumi_test_data *tdata)
4048 {
4049 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4050 	struct crypto_unittest_params *ut_params = &unittest_params;
4051 
4052 	int retval;
4053 	uint8_t *ciphertext, *plaintext;
4054 	unsigned ciphertext_pad_len;
4055 	unsigned ciphertext_len;
4056 	struct rte_cryptodev_info dev_info;
4057 
4058 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4059 	uint64_t feat_flags = dev_info.feature_flags;
4060 
4061 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4062 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4063 		printf("Device doesn't support RAW data-path APIs.\n");
4064 		return TEST_SKIPPED;
4065 	}
4066 
4067 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4068 		return TEST_SKIPPED;
4069 
4070 	/* Verify the capabilities */
4071 	struct rte_cryptodev_sym_capability_idx cap_idx;
4072 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4073 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4074 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4075 			&cap_idx) == NULL)
4076 		return TEST_SKIPPED;
4077 
4078 	/* Create KASUMI session */
4079 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4080 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4081 					RTE_CRYPTO_CIPHER_KASUMI_F8,
4082 					tdata->key.data, tdata->key.len,
4083 					tdata->cipher_iv.len);
4084 	if (retval < 0)
4085 		return retval;
4086 
4087 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4088 
4089 	/* Clear mbuf payload */
4090 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4091 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4092 
4093 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4094 	/* Append data which is padded to a multiple */
4095 	/* of the algorithms block size */
4096 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4097 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4098 				ciphertext_pad_len);
4099 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4100 
4101 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4102 
4103 	/* Create KASUMI operation */
4104 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4105 					tdata->cipher_iv.len,
4106 					tdata->ciphertext.len,
4107 					tdata->validCipherOffsetInBits.len);
4108 	if (retval < 0)
4109 		return retval;
4110 
4111 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4112 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4113 				ut_params->op, 1, 0, 1, 0);
4114 	else
4115 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4116 						ut_params->op);
4117 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4118 
4119 	ut_params->obuf = ut_params->op->sym->m_dst;
4120 	if (ut_params->obuf)
4121 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4122 	else
4123 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4124 
4125 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4126 
4127 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4128 				(tdata->validCipherOffsetInBits.len >> 3);
4129 	/* Validate obuf */
4130 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4131 		plaintext,
4132 		reference_plaintext,
4133 		tdata->validCipherLenInBits.len,
4134 		"KASUMI Plaintext data not as expected");
4135 	return 0;
4136 }
4137 
4138 static int
4139 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4140 {
4141 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4142 	struct crypto_unittest_params *ut_params = &unittest_params;
4143 
4144 	int retval;
4145 	uint8_t *plaintext, *ciphertext;
4146 	unsigned plaintext_pad_len;
4147 	unsigned plaintext_len;
4148 	struct rte_cryptodev_info dev_info;
4149 
4150 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4151 	uint64_t feat_flags = dev_info.feature_flags;
4152 
4153 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4154 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4155 		printf("Device doesn't support RAW data-path APIs.\n");
4156 		return TEST_SKIPPED;
4157 	}
4158 
4159 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4160 		return TEST_SKIPPED;
4161 
4162 	/* Verify the capabilities */
4163 	struct rte_cryptodev_sym_capability_idx cap_idx;
4164 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4165 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4166 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4167 			&cap_idx) == NULL)
4168 		return TEST_SKIPPED;
4169 
4170 	/* Create SNOW 3G session */
4171 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4172 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4173 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4174 					tdata->key.data, tdata->key.len,
4175 					tdata->cipher_iv.len);
4176 	if (retval < 0)
4177 		return retval;
4178 
4179 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4180 
4181 	/* Clear mbuf payload */
4182 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4183 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4184 
4185 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4186 	/* Append data which is padded to a multiple of */
4187 	/* the algorithms block size */
4188 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4189 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4190 				plaintext_pad_len);
4191 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4192 
4193 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4194 
4195 	/* Create SNOW 3G operation */
4196 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4197 					tdata->cipher_iv.len,
4198 					tdata->validCipherLenInBits.len,
4199 					0);
4200 	if (retval < 0)
4201 		return retval;
4202 
4203 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4204 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4205 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4206 	else
4207 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4208 						ut_params->op);
4209 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4210 
4211 	ut_params->obuf = ut_params->op->sym->m_dst;
4212 	if (ut_params->obuf)
4213 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4214 	else
4215 		ciphertext = plaintext;
4216 
4217 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4218 
4219 	/* Validate obuf */
4220 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4221 		ciphertext,
4222 		tdata->ciphertext.data,
4223 		tdata->validDataLenInBits.len,
4224 		"SNOW 3G Ciphertext data not as expected");
4225 	return 0;
4226 }
4227 
4228 
4229 static int
4230 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4231 {
4232 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4233 	struct crypto_unittest_params *ut_params = &unittest_params;
4234 	uint8_t *plaintext, *ciphertext;
4235 
4236 	int retval;
4237 	unsigned plaintext_pad_len;
4238 	unsigned plaintext_len;
4239 	struct rte_cryptodev_info dev_info;
4240 
4241 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4242 	uint64_t feat_flags = dev_info.feature_flags;
4243 
4244 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4245 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4246 		printf("Device does not support RAW data-path APIs.\n");
4247 		return -ENOTSUP;
4248 	}
4249 
4250 	/* Verify the capabilities */
4251 	struct rte_cryptodev_sym_capability_idx cap_idx;
4252 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4253 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4254 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4255 			&cap_idx) == NULL)
4256 		return TEST_SKIPPED;
4257 
4258 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4259 		return TEST_SKIPPED;
4260 
4261 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4262 		return TEST_SKIPPED;
4263 
4264 	/* Create SNOW 3G session */
4265 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4266 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4267 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4268 					tdata->key.data, tdata->key.len,
4269 					tdata->cipher_iv.len);
4270 	if (retval < 0)
4271 		return retval;
4272 
4273 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4274 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4275 
4276 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4277 			"Failed to allocate input buffer in mempool");
4278 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4279 			"Failed to allocate output buffer in mempool");
4280 
4281 	/* Clear mbuf payload */
4282 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4283 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4284 
4285 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4286 	/* Append data which is padded to a multiple of */
4287 	/* the algorithms block size */
4288 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4289 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4290 				plaintext_pad_len);
4291 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4292 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4293 
4294 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4295 
4296 	/* Create SNOW 3G operation */
4297 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4298 					tdata->cipher_iv.len,
4299 					tdata->validCipherLenInBits.len,
4300 					0);
4301 	if (retval < 0)
4302 		return retval;
4303 
4304 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4305 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4306 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4307 	else
4308 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4309 						ut_params->op);
4310 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4311 
4312 	ut_params->obuf = ut_params->op->sym->m_dst;
4313 	if (ut_params->obuf)
4314 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4315 	else
4316 		ciphertext = plaintext;
4317 
4318 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4319 
4320 	/* Validate obuf */
4321 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4322 		ciphertext,
4323 		tdata->ciphertext.data,
4324 		tdata->validDataLenInBits.len,
4325 		"SNOW 3G Ciphertext data not as expected");
4326 	return 0;
4327 }
4328 
4329 static int
4330 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4331 {
4332 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4333 	struct crypto_unittest_params *ut_params = &unittest_params;
4334 
4335 	int retval;
4336 	unsigned int plaintext_pad_len;
4337 	unsigned int plaintext_len;
4338 	uint8_t buffer[10000];
4339 	const uint8_t *ciphertext;
4340 
4341 	struct rte_cryptodev_info dev_info;
4342 
4343 	/* Verify the capabilities */
4344 	struct rte_cryptodev_sym_capability_idx cap_idx;
4345 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4346 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4347 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4348 			&cap_idx) == NULL)
4349 		return TEST_SKIPPED;
4350 
4351 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4352 		return TEST_SKIPPED;
4353 
4354 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4355 		return TEST_SKIPPED;
4356 
4357 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4358 
4359 	uint64_t feat_flags = dev_info.feature_flags;
4360 
4361 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4362 		printf("Device doesn't support out-of-place scatter-gather "
4363 				"in both input and output mbufs. "
4364 				"Test Skipped.\n");
4365 		return TEST_SKIPPED;
4366 	}
4367 
4368 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4369 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4370 		printf("Device does not support RAW data-path APIs.\n");
4371 		return -ENOTSUP;
4372 	}
4373 
4374 	/* Create SNOW 3G session */
4375 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4376 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4377 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4378 					tdata->key.data, tdata->key.len,
4379 					tdata->cipher_iv.len);
4380 	if (retval < 0)
4381 		return retval;
4382 
4383 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4384 	/* Append data which is padded to a multiple of */
4385 	/* the algorithms block size */
4386 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4387 
4388 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4389 			plaintext_pad_len, 10, 0);
4390 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4391 			plaintext_pad_len, 3, 0);
4392 
4393 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4394 			"Failed to allocate input buffer in mempool");
4395 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4396 			"Failed to allocate output buffer in mempool");
4397 
4398 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4399 
4400 	/* Create SNOW 3G operation */
4401 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4402 					tdata->cipher_iv.len,
4403 					tdata->validCipherLenInBits.len,
4404 					0);
4405 	if (retval < 0)
4406 		return retval;
4407 
4408 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4409 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4410 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4411 	else
4412 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4413 						ut_params->op);
4414 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4415 
4416 	ut_params->obuf = ut_params->op->sym->m_dst;
4417 	if (ut_params->obuf)
4418 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4419 				plaintext_len, buffer);
4420 	else
4421 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4422 				plaintext_len, buffer);
4423 
4424 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4425 
4426 	/* Validate obuf */
4427 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4428 		ciphertext,
4429 		tdata->ciphertext.data,
4430 		tdata->validDataLenInBits.len,
4431 		"SNOW 3G Ciphertext data not as expected");
4432 
4433 	return 0;
4434 }
4435 
4436 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4437 static void
4438 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4439 {
4440 	uint8_t curr_byte, prev_byte;
4441 	uint32_t length_in_bytes = ceil_byte_length(length + offset);
4442 	uint8_t lower_byte_mask = (1 << offset) - 1;
4443 	unsigned i;
4444 
4445 	prev_byte = buffer[0];
4446 	buffer[0] >>= offset;
4447 
4448 	for (i = 1; i < length_in_bytes; i++) {
4449 		curr_byte = buffer[i];
4450 		buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4451 				(curr_byte >> offset);
4452 		prev_byte = curr_byte;
4453 	}
4454 }
4455 
4456 static int
4457 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4458 {
4459 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4460 	struct crypto_unittest_params *ut_params = &unittest_params;
4461 	uint8_t *plaintext, *ciphertext;
4462 	int retval;
4463 	uint32_t plaintext_len;
4464 	uint32_t plaintext_pad_len;
4465 	uint8_t extra_offset = 4;
4466 	uint8_t *expected_ciphertext_shifted;
4467 	struct rte_cryptodev_info dev_info;
4468 
4469 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4470 	uint64_t feat_flags = dev_info.feature_flags;
4471 
4472 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4473 			((tdata->validDataLenInBits.len % 8) != 0)) {
4474 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4475 		return TEST_SKIPPED;
4476 	}
4477 
4478 	/* Verify the capabilities */
4479 	struct rte_cryptodev_sym_capability_idx cap_idx;
4480 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4481 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4482 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4483 			&cap_idx) == NULL)
4484 		return TEST_SKIPPED;
4485 
4486 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4487 		return TEST_SKIPPED;
4488 
4489 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4490 		return TEST_SKIPPED;
4491 
4492 	/* Create SNOW 3G session */
4493 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4494 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4495 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4496 					tdata->key.data, tdata->key.len,
4497 					tdata->cipher_iv.len);
4498 	if (retval < 0)
4499 		return retval;
4500 
4501 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4502 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4503 
4504 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4505 			"Failed to allocate input buffer in mempool");
4506 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4507 			"Failed to allocate output buffer in mempool");
4508 
4509 	/* Clear mbuf payload */
4510 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4511 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4512 
4513 	plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4514 	/*
4515 	 * Append data which is padded to a
4516 	 * multiple of the algorithms block size
4517 	 */
4518 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4519 
4520 	plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4521 						plaintext_pad_len);
4522 
4523 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4524 
4525 	memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4526 	buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4527 
4528 #ifdef RTE_APP_TEST_DEBUG
4529 	rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4530 #endif
4531 	/* Create SNOW 3G operation */
4532 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4533 					tdata->cipher_iv.len,
4534 					tdata->validCipherLenInBits.len,
4535 					extra_offset);
4536 	if (retval < 0)
4537 		return retval;
4538 
4539 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4540 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4541 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4542 	else
4543 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4544 						ut_params->op);
4545 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4546 
4547 	ut_params->obuf = ut_params->op->sym->m_dst;
4548 	if (ut_params->obuf)
4549 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4550 	else
4551 		ciphertext = plaintext;
4552 
4553 #ifdef RTE_APP_TEST_DEBUG
4554 	rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4555 #endif
4556 
4557 	expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4558 
4559 	TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4560 			"failed to reserve memory for ciphertext shifted\n");
4561 
4562 	memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4563 			ceil_byte_length(tdata->ciphertext.len));
4564 	buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4565 			extra_offset);
4566 	/* Validate obuf */
4567 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4568 		ciphertext,
4569 		expected_ciphertext_shifted,
4570 		tdata->validDataLenInBits.len,
4571 		extra_offset,
4572 		"SNOW 3G Ciphertext data not as expected");
4573 	return 0;
4574 }
4575 
4576 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4577 {
4578 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4579 	struct crypto_unittest_params *ut_params = &unittest_params;
4580 
4581 	int retval;
4582 
4583 	uint8_t *plaintext, *ciphertext;
4584 	unsigned ciphertext_pad_len;
4585 	unsigned ciphertext_len;
4586 	struct rte_cryptodev_info dev_info;
4587 
4588 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4589 	uint64_t feat_flags = dev_info.feature_flags;
4590 
4591 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4592 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4593 		printf("Device doesn't support RAW data-path APIs.\n");
4594 		return TEST_SKIPPED;
4595 	}
4596 
4597 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4598 		return TEST_SKIPPED;
4599 
4600 	/* Verify the capabilities */
4601 	struct rte_cryptodev_sym_capability_idx cap_idx;
4602 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4603 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4604 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4605 			&cap_idx) == NULL)
4606 		return TEST_SKIPPED;
4607 
4608 	/* Create SNOW 3G session */
4609 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4610 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4611 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4612 					tdata->key.data, tdata->key.len,
4613 					tdata->cipher_iv.len);
4614 	if (retval < 0)
4615 		return retval;
4616 
4617 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4618 
4619 	/* Clear mbuf payload */
4620 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4621 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4622 
4623 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4624 	/* Append data which is padded to a multiple of */
4625 	/* the algorithms block size */
4626 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4627 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4628 				ciphertext_pad_len);
4629 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4630 
4631 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4632 
4633 	/* Create SNOW 3G operation */
4634 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4635 					tdata->cipher_iv.len,
4636 					tdata->validCipherLenInBits.len,
4637 					tdata->cipher.offset_bits);
4638 	if (retval < 0)
4639 		return retval;
4640 
4641 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4642 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4643 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4644 	else
4645 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4646 						ut_params->op);
4647 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4648 	ut_params->obuf = ut_params->op->sym->m_dst;
4649 	if (ut_params->obuf)
4650 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4651 	else
4652 		plaintext = ciphertext;
4653 
4654 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4655 
4656 	/* Validate obuf */
4657 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4658 				tdata->plaintext.data,
4659 				tdata->validDataLenInBits.len,
4660 				"SNOW 3G Plaintext data not as expected");
4661 	return 0;
4662 }
4663 
4664 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4665 {
4666 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4667 	struct crypto_unittest_params *ut_params = &unittest_params;
4668 
4669 	int retval;
4670 
4671 	uint8_t *plaintext, *ciphertext;
4672 	unsigned ciphertext_pad_len;
4673 	unsigned ciphertext_len;
4674 	struct rte_cryptodev_info dev_info;
4675 
4676 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4677 	uint64_t feat_flags = dev_info.feature_flags;
4678 
4679 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4680 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4681 		printf("Device does not support RAW data-path APIs.\n");
4682 		return -ENOTSUP;
4683 	}
4684 	/* Verify the capabilities */
4685 	struct rte_cryptodev_sym_capability_idx cap_idx;
4686 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4687 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4688 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4689 			&cap_idx) == NULL)
4690 		return TEST_SKIPPED;
4691 
4692 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4693 		return TEST_SKIPPED;
4694 
4695 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4696 		return TEST_SKIPPED;
4697 
4698 	/* Create SNOW 3G session */
4699 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4700 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4701 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4702 					tdata->key.data, tdata->key.len,
4703 					tdata->cipher_iv.len);
4704 	if (retval < 0)
4705 		return retval;
4706 
4707 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4708 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4709 
4710 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4711 			"Failed to allocate input buffer");
4712 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4713 			"Failed to allocate output buffer");
4714 
4715 	/* Clear mbuf payload */
4716 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4717 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4718 
4719 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4720 		       rte_pktmbuf_tailroom(ut_params->obuf));
4721 
4722 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4723 	/* Append data which is padded to a multiple of */
4724 	/* the algorithms block size */
4725 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4726 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4727 				ciphertext_pad_len);
4728 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4729 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4730 
4731 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4732 
4733 	/* Create SNOW 3G operation */
4734 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4735 					tdata->cipher_iv.len,
4736 					tdata->validCipherLenInBits.len,
4737 					0);
4738 	if (retval < 0)
4739 		return retval;
4740 
4741 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4742 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4743 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4744 	else
4745 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4746 						ut_params->op);
4747 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4748 	ut_params->obuf = ut_params->op->sym->m_dst;
4749 	if (ut_params->obuf)
4750 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4751 	else
4752 		plaintext = ciphertext;
4753 
4754 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4755 
4756 	/* Validate obuf */
4757 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4758 				tdata->plaintext.data,
4759 				tdata->validDataLenInBits.len,
4760 				"SNOW 3G Plaintext data not as expected");
4761 	return 0;
4762 }
4763 
4764 static int
4765 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4766 {
4767 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4768 	struct crypto_unittest_params *ut_params = &unittest_params;
4769 
4770 	int retval;
4771 
4772 	uint8_t *plaintext, *ciphertext;
4773 	unsigned int plaintext_pad_len;
4774 	unsigned int plaintext_len;
4775 
4776 	struct rte_cryptodev_info dev_info;
4777 	struct rte_cryptodev_sym_capability_idx cap_idx;
4778 
4779 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4780 	uint64_t feat_flags = dev_info.feature_flags;
4781 
4782 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4783 			((tdata->validAuthLenInBits.len % 8 != 0) ||
4784 			(tdata->validDataLenInBits.len % 8 != 0))) {
4785 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4786 		return TEST_SKIPPED;
4787 	}
4788 
4789 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4790 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4791 		printf("Device doesn't support RAW data-path APIs.\n");
4792 		return TEST_SKIPPED;
4793 	}
4794 
4795 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4796 		return TEST_SKIPPED;
4797 
4798 	/* Check if device supports ZUC EEA3 */
4799 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4800 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4801 
4802 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4803 			&cap_idx) == NULL)
4804 		return TEST_SKIPPED;
4805 
4806 	/* Check if device supports ZUC EIA3 */
4807 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4808 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4809 
4810 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4811 			&cap_idx) == NULL)
4812 		return TEST_SKIPPED;
4813 
4814 	/* Create ZUC session */
4815 	retval = create_zuc_cipher_auth_encrypt_generate_session(
4816 			ts_params->valid_devs[0],
4817 			tdata);
4818 	if (retval != 0)
4819 		return retval;
4820 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4821 
4822 	/* clear mbuf payload */
4823 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4824 			rte_pktmbuf_tailroom(ut_params->ibuf));
4825 
4826 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4827 	/* Append data which is padded to a multiple of */
4828 	/* the algorithms block size */
4829 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4830 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4831 				plaintext_pad_len);
4832 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4833 
4834 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4835 
4836 	/* Create ZUC operation */
4837 	retval = create_zuc_cipher_hash_generate_operation(tdata);
4838 	if (retval < 0)
4839 		return retval;
4840 
4841 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4842 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4843 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4844 	else
4845 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4846 			ut_params->op);
4847 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4848 	ut_params->obuf = ut_params->op->sym->m_src;
4849 	if (ut_params->obuf)
4850 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4851 	else
4852 		ciphertext = plaintext;
4853 
4854 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4855 	/* Validate obuf */
4856 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4857 			ciphertext,
4858 			tdata->ciphertext.data,
4859 			tdata->validDataLenInBits.len,
4860 			"ZUC Ciphertext data not as expected");
4861 
4862 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4863 	    + plaintext_pad_len;
4864 
4865 	/* Validate obuf */
4866 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4867 			ut_params->digest,
4868 			tdata->digest.data,
4869 			4,
4870 			"ZUC Generated auth tag not as expected");
4871 	return 0;
4872 }
4873 
4874 static int
4875 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4876 {
4877 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4878 	struct crypto_unittest_params *ut_params = &unittest_params;
4879 
4880 	int retval;
4881 
4882 	uint8_t *plaintext, *ciphertext;
4883 	unsigned plaintext_pad_len;
4884 	unsigned plaintext_len;
4885 	struct rte_cryptodev_info dev_info;
4886 
4887 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4888 	uint64_t feat_flags = dev_info.feature_flags;
4889 
4890 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4891 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4892 		printf("Device doesn't support RAW data-path APIs.\n");
4893 		return TEST_SKIPPED;
4894 	}
4895 
4896 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4897 		return TEST_SKIPPED;
4898 
4899 	/* Verify the capabilities */
4900 	struct rte_cryptodev_sym_capability_idx cap_idx;
4901 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4902 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4903 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4904 			&cap_idx) == NULL)
4905 		return TEST_SKIPPED;
4906 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4907 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4908 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4909 			&cap_idx) == NULL)
4910 		return TEST_SKIPPED;
4911 
4912 	/* Create SNOW 3G session */
4913 	retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4914 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4915 			RTE_CRYPTO_AUTH_OP_GENERATE,
4916 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4917 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4918 			tdata->key.data, tdata->key.len,
4919 			tdata->auth_iv.len, tdata->digest.len,
4920 			tdata->cipher_iv.len);
4921 	if (retval != 0)
4922 		return retval;
4923 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4924 
4925 	/* clear mbuf payload */
4926 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4927 			rte_pktmbuf_tailroom(ut_params->ibuf));
4928 
4929 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4930 	/* Append data which is padded to a multiple of */
4931 	/* the algorithms block size */
4932 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4933 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4934 				plaintext_pad_len);
4935 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4936 
4937 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4938 
4939 	/* Create SNOW 3G operation */
4940 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4941 			tdata->digest.len, tdata->auth_iv.data,
4942 			tdata->auth_iv.len,
4943 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4944 			tdata->cipher_iv.data, tdata->cipher_iv.len,
4945 			tdata->validCipherLenInBits.len,
4946 			0,
4947 			tdata->validAuthLenInBits.len,
4948 			0
4949 			);
4950 	if (retval < 0)
4951 		return retval;
4952 
4953 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4954 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4955 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4956 	else
4957 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4958 			ut_params->op);
4959 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4960 	ut_params->obuf = ut_params->op->sym->m_src;
4961 	if (ut_params->obuf)
4962 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4963 	else
4964 		ciphertext = plaintext;
4965 
4966 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4967 	/* Validate obuf */
4968 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4969 			ciphertext,
4970 			tdata->ciphertext.data,
4971 			tdata->validDataLenInBits.len,
4972 			"SNOW 3G Ciphertext data not as expected");
4973 
4974 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4975 	    + plaintext_pad_len;
4976 
4977 	/* Validate obuf */
4978 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4979 			ut_params->digest,
4980 			tdata->digest.data,
4981 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4982 			"SNOW 3G Generated auth tag not as expected");
4983 	return 0;
4984 }
4985 
4986 static int
4987 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4988 	uint8_t op_mode, uint8_t verify)
4989 {
4990 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4991 	struct crypto_unittest_params *ut_params = &unittest_params;
4992 
4993 	int retval;
4994 
4995 	uint8_t *plaintext = NULL, *ciphertext = NULL;
4996 	unsigned int plaintext_pad_len;
4997 	unsigned int plaintext_len;
4998 	unsigned int ciphertext_pad_len;
4999 	unsigned int ciphertext_len;
5000 
5001 	struct rte_cryptodev_info dev_info;
5002 
5003 	/* Verify the capabilities */
5004 	struct rte_cryptodev_sym_capability_idx cap_idx;
5005 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5006 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5007 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5008 			&cap_idx) == NULL)
5009 		return TEST_SKIPPED;
5010 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5011 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5012 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5013 			&cap_idx) == NULL)
5014 		return TEST_SKIPPED;
5015 
5016 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5017 		return TEST_SKIPPED;
5018 
5019 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5020 
5021 	uint64_t feat_flags = dev_info.feature_flags;
5022 
5023 	if (op_mode == OUT_OF_PLACE) {
5024 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5025 			printf("Device doesn't support digest encrypted.\n");
5026 			return TEST_SKIPPED;
5027 		}
5028 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5029 			return TEST_SKIPPED;
5030 	}
5031 
5032 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5033 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5034 		printf("Device doesn't support RAW data-path APIs.\n");
5035 		return TEST_SKIPPED;
5036 	}
5037 
5038 	/* Create SNOW 3G session */
5039 	retval = create_wireless_algo_auth_cipher_session(
5040 			ts_params->valid_devs[0],
5041 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5042 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5043 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5044 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5045 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5046 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5047 			tdata->key.data, tdata->key.len,
5048 			tdata->auth_iv.len, tdata->digest.len,
5049 			tdata->cipher_iv.len);
5050 	if (retval != 0)
5051 		return retval;
5052 
5053 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5054 	if (op_mode == OUT_OF_PLACE)
5055 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5056 
5057 	/* clear mbuf payload */
5058 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5059 		rte_pktmbuf_tailroom(ut_params->ibuf));
5060 	if (op_mode == OUT_OF_PLACE)
5061 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5062 			rte_pktmbuf_tailroom(ut_params->obuf));
5063 
5064 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5065 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5066 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5067 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5068 
5069 	if (verify) {
5070 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5071 					ciphertext_pad_len);
5072 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5073 		if (op_mode == OUT_OF_PLACE)
5074 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5075 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5076 			ciphertext_len);
5077 	} else {
5078 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5079 					plaintext_pad_len);
5080 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5081 		if (op_mode == OUT_OF_PLACE)
5082 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5083 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5084 	}
5085 
5086 	/* Create SNOW 3G operation */
5087 	retval = create_wireless_algo_auth_cipher_operation(
5088 		tdata->digest.data, tdata->digest.len,
5089 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5090 		tdata->auth_iv.data, tdata->auth_iv.len,
5091 		(tdata->digest.offset_bytes == 0 ?
5092 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5093 			: tdata->digest.offset_bytes),
5094 		tdata->validCipherLenInBits.len,
5095 		tdata->cipher.offset_bits,
5096 		tdata->validAuthLenInBits.len,
5097 		tdata->auth.offset_bits,
5098 		op_mode, 0, verify);
5099 
5100 	if (retval < 0)
5101 		return retval;
5102 
5103 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5104 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5105 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5106 	else
5107 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5108 			ut_params->op);
5109 
5110 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5111 
5112 	ut_params->obuf = (op_mode == IN_PLACE ?
5113 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5114 
5115 	if (verify) {
5116 		if (ut_params->obuf)
5117 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5118 							uint8_t *);
5119 		else
5120 			plaintext = ciphertext +
5121 				(tdata->cipher.offset_bits >> 3);
5122 
5123 		debug_hexdump(stdout, "plaintext:", plaintext,
5124 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5125 		debug_hexdump(stdout, "plaintext expected:",
5126 			tdata->plaintext.data,
5127 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5128 	} else {
5129 		if (ut_params->obuf)
5130 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5131 							uint8_t *);
5132 		else
5133 			ciphertext = plaintext;
5134 
5135 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5136 			ciphertext_len);
5137 		debug_hexdump(stdout, "ciphertext expected:",
5138 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5139 
5140 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5141 			+ (tdata->digest.offset_bytes == 0 ?
5142 		plaintext_pad_len : tdata->digest.offset_bytes);
5143 
5144 		debug_hexdump(stdout, "digest:", ut_params->digest,
5145 			tdata->digest.len);
5146 		debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5147 				tdata->digest.len);
5148 	}
5149 
5150 	/* Validate obuf */
5151 	if (verify) {
5152 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5153 			plaintext,
5154 			tdata->plaintext.data,
5155 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5156 			 (tdata->digest.len << 3)),
5157 			tdata->cipher.offset_bits,
5158 			"SNOW 3G Plaintext data not as expected");
5159 	} else {
5160 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5161 			ciphertext,
5162 			tdata->ciphertext.data,
5163 			(tdata->validDataLenInBits.len -
5164 			 tdata->cipher.offset_bits),
5165 			tdata->cipher.offset_bits,
5166 			"SNOW 3G Ciphertext data not as expected");
5167 
5168 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5169 			ut_params->digest,
5170 			tdata->digest.data,
5171 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5172 			"SNOW 3G Generated auth tag not as expected");
5173 	}
5174 	return 0;
5175 }
5176 
5177 static int
5178 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5179 	uint8_t op_mode, uint8_t verify)
5180 {
5181 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5182 	struct crypto_unittest_params *ut_params = &unittest_params;
5183 
5184 	int retval;
5185 
5186 	const uint8_t *plaintext = NULL;
5187 	const uint8_t *ciphertext = NULL;
5188 	const uint8_t *digest = NULL;
5189 	unsigned int plaintext_pad_len;
5190 	unsigned int plaintext_len;
5191 	unsigned int ciphertext_pad_len;
5192 	unsigned int ciphertext_len;
5193 	uint8_t buffer[10000];
5194 	uint8_t digest_buffer[10000];
5195 
5196 	struct rte_cryptodev_info dev_info;
5197 
5198 	/* Verify the capabilities */
5199 	struct rte_cryptodev_sym_capability_idx cap_idx;
5200 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5201 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5202 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5203 			&cap_idx) == NULL)
5204 		return TEST_SKIPPED;
5205 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5206 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5207 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5208 			&cap_idx) == NULL)
5209 		return TEST_SKIPPED;
5210 
5211 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5212 		return TEST_SKIPPED;
5213 
5214 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5215 
5216 	uint64_t feat_flags = dev_info.feature_flags;
5217 
5218 	if (op_mode == IN_PLACE) {
5219 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5220 			printf("Device doesn't support in-place scatter-gather "
5221 					"in both input and output mbufs.\n");
5222 			return TEST_SKIPPED;
5223 		}
5224 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5225 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5226 			printf("Device doesn't support RAW data-path APIs.\n");
5227 			return TEST_SKIPPED;
5228 		}
5229 	} else {
5230 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5231 			return TEST_SKIPPED;
5232 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5233 			printf("Device doesn't support out-of-place scatter-gather "
5234 					"in both input and output mbufs.\n");
5235 			return TEST_SKIPPED;
5236 		}
5237 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5238 			printf("Device doesn't support digest encrypted.\n");
5239 			return TEST_SKIPPED;
5240 		}
5241 	}
5242 
5243 	/* Create SNOW 3G session */
5244 	retval = create_wireless_algo_auth_cipher_session(
5245 			ts_params->valid_devs[0],
5246 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5247 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5248 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5249 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5250 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5251 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5252 			tdata->key.data, tdata->key.len,
5253 			tdata->auth_iv.len, tdata->digest.len,
5254 			tdata->cipher_iv.len);
5255 
5256 	if (retval != 0)
5257 		return retval;
5258 
5259 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5260 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5261 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5262 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5263 
5264 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5265 			plaintext_pad_len, 15, 0);
5266 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5267 			"Failed to allocate input buffer in mempool");
5268 
5269 	if (op_mode == OUT_OF_PLACE) {
5270 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5271 				plaintext_pad_len, 15, 0);
5272 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5273 				"Failed to allocate output buffer in mempool");
5274 	}
5275 
5276 	if (verify) {
5277 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5278 			tdata->ciphertext.data);
5279 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5280 					ciphertext_len, buffer);
5281 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5282 			ciphertext_len);
5283 	} else {
5284 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5285 			tdata->plaintext.data);
5286 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5287 					plaintext_len, buffer);
5288 		debug_hexdump(stdout, "plaintext:", plaintext,
5289 			plaintext_len);
5290 	}
5291 	memset(buffer, 0, sizeof(buffer));
5292 
5293 	/* Create SNOW 3G operation */
5294 	retval = create_wireless_algo_auth_cipher_operation(
5295 		tdata->digest.data, tdata->digest.len,
5296 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5297 		tdata->auth_iv.data, tdata->auth_iv.len,
5298 		(tdata->digest.offset_bytes == 0 ?
5299 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5300 			: tdata->digest.offset_bytes),
5301 		tdata->validCipherLenInBits.len,
5302 		tdata->cipher.offset_bits,
5303 		tdata->validAuthLenInBits.len,
5304 		tdata->auth.offset_bits,
5305 		op_mode, 1, verify);
5306 
5307 	if (retval < 0)
5308 		return retval;
5309 
5310 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5311 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5312 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5313 	else
5314 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5315 			ut_params->op);
5316 
5317 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5318 
5319 	ut_params->obuf = (op_mode == IN_PLACE ?
5320 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5321 
5322 	if (verify) {
5323 		if (ut_params->obuf)
5324 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5325 					plaintext_len, buffer);
5326 		else
5327 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5328 					plaintext_len, buffer);
5329 
5330 		debug_hexdump(stdout, "plaintext:", plaintext,
5331 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5332 		debug_hexdump(stdout, "plaintext expected:",
5333 			tdata->plaintext.data,
5334 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5335 	} else {
5336 		if (ut_params->obuf)
5337 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5338 					ciphertext_len, buffer);
5339 		else
5340 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5341 					ciphertext_len, buffer);
5342 
5343 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5344 			ciphertext_len);
5345 		debug_hexdump(stdout, "ciphertext expected:",
5346 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5347 
5348 		if (ut_params->obuf)
5349 			digest = rte_pktmbuf_read(ut_params->obuf,
5350 				(tdata->digest.offset_bytes == 0 ?
5351 				plaintext_pad_len : tdata->digest.offset_bytes),
5352 				tdata->digest.len, digest_buffer);
5353 		else
5354 			digest = rte_pktmbuf_read(ut_params->ibuf,
5355 				(tdata->digest.offset_bytes == 0 ?
5356 				plaintext_pad_len : tdata->digest.offset_bytes),
5357 				tdata->digest.len, digest_buffer);
5358 
5359 		debug_hexdump(stdout, "digest:", digest,
5360 			tdata->digest.len);
5361 		debug_hexdump(stdout, "digest expected:",
5362 			tdata->digest.data, tdata->digest.len);
5363 	}
5364 
5365 	/* Validate obuf */
5366 	if (verify) {
5367 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5368 			plaintext,
5369 			tdata->plaintext.data,
5370 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5371 			 (tdata->digest.len << 3)),
5372 			tdata->cipher.offset_bits,
5373 			"SNOW 3G Plaintext data not as expected");
5374 	} else {
5375 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5376 			ciphertext,
5377 			tdata->ciphertext.data,
5378 			(tdata->validDataLenInBits.len -
5379 			 tdata->cipher.offset_bits),
5380 			tdata->cipher.offset_bits,
5381 			"SNOW 3G Ciphertext data not as expected");
5382 
5383 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5384 			digest,
5385 			tdata->digest.data,
5386 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5387 			"SNOW 3G Generated auth tag not as expected");
5388 	}
5389 	return 0;
5390 }
5391 
5392 static int
5393 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5394 	uint8_t op_mode, uint8_t verify)
5395 {
5396 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5397 	struct crypto_unittest_params *ut_params = &unittest_params;
5398 
5399 	int retval;
5400 
5401 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5402 	unsigned int plaintext_pad_len;
5403 	unsigned int plaintext_len;
5404 	unsigned int ciphertext_pad_len;
5405 	unsigned int ciphertext_len;
5406 
5407 	struct rte_cryptodev_info dev_info;
5408 
5409 	/* Verify the capabilities */
5410 	struct rte_cryptodev_sym_capability_idx cap_idx;
5411 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5412 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5413 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5414 			&cap_idx) == NULL)
5415 		return TEST_SKIPPED;
5416 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5417 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5418 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5419 			&cap_idx) == NULL)
5420 		return TEST_SKIPPED;
5421 
5422 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5423 
5424 	uint64_t feat_flags = dev_info.feature_flags;
5425 
5426 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5427 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5428 		printf("Device doesn't support RAW data-path APIs.\n");
5429 		return TEST_SKIPPED;
5430 	}
5431 
5432 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5433 		return TEST_SKIPPED;
5434 
5435 	if (op_mode == OUT_OF_PLACE) {
5436 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5437 			return TEST_SKIPPED;
5438 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5439 			printf("Device doesn't support digest encrypted.\n");
5440 			return TEST_SKIPPED;
5441 		}
5442 	}
5443 
5444 	/* Create KASUMI session */
5445 	retval = create_wireless_algo_auth_cipher_session(
5446 			ts_params->valid_devs[0],
5447 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5448 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5449 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5450 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5451 			RTE_CRYPTO_AUTH_KASUMI_F9,
5452 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5453 			tdata->key.data, tdata->key.len,
5454 			0, tdata->digest.len,
5455 			tdata->cipher_iv.len);
5456 
5457 	if (retval != 0)
5458 		return retval;
5459 
5460 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5461 	if (op_mode == OUT_OF_PLACE)
5462 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5463 
5464 	/* clear mbuf payload */
5465 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5466 		rte_pktmbuf_tailroom(ut_params->ibuf));
5467 	if (op_mode == OUT_OF_PLACE)
5468 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5469 			rte_pktmbuf_tailroom(ut_params->obuf));
5470 
5471 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5472 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5473 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5474 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5475 
5476 	if (verify) {
5477 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5478 					ciphertext_pad_len);
5479 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5480 		if (op_mode == OUT_OF_PLACE)
5481 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5482 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5483 			ciphertext_len);
5484 	} else {
5485 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5486 					plaintext_pad_len);
5487 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5488 		if (op_mode == OUT_OF_PLACE)
5489 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5490 		debug_hexdump(stdout, "plaintext:", plaintext,
5491 			plaintext_len);
5492 	}
5493 
5494 	/* Create KASUMI operation */
5495 	retval = create_wireless_algo_auth_cipher_operation(
5496 		tdata->digest.data, tdata->digest.len,
5497 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5498 		NULL, 0,
5499 		(tdata->digest.offset_bytes == 0 ?
5500 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5501 			: tdata->digest.offset_bytes),
5502 		tdata->validCipherLenInBits.len,
5503 		tdata->validCipherOffsetInBits.len,
5504 		tdata->validAuthLenInBits.len,
5505 		0,
5506 		op_mode, 0, verify);
5507 
5508 	if (retval < 0)
5509 		return retval;
5510 
5511 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5512 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5513 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5514 	else
5515 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5516 			ut_params->op);
5517 
5518 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5519 
5520 	ut_params->obuf = (op_mode == IN_PLACE ?
5521 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5522 
5523 
5524 	if (verify) {
5525 		if (ut_params->obuf)
5526 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5527 							uint8_t *);
5528 		else
5529 			plaintext = ciphertext;
5530 
5531 		debug_hexdump(stdout, "plaintext:", plaintext,
5532 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5533 		debug_hexdump(stdout, "plaintext expected:",
5534 			tdata->plaintext.data,
5535 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5536 	} else {
5537 		if (ut_params->obuf)
5538 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5539 							uint8_t *);
5540 		else
5541 			ciphertext = plaintext;
5542 
5543 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5544 			ciphertext_len);
5545 		debug_hexdump(stdout, "ciphertext expected:",
5546 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5547 
5548 		ut_params->digest = rte_pktmbuf_mtod(
5549 			ut_params->obuf, uint8_t *) +
5550 			(tdata->digest.offset_bytes == 0 ?
5551 			plaintext_pad_len : tdata->digest.offset_bytes);
5552 
5553 		debug_hexdump(stdout, "digest:", ut_params->digest,
5554 			tdata->digest.len);
5555 		debug_hexdump(stdout, "digest expected:",
5556 			tdata->digest.data, tdata->digest.len);
5557 	}
5558 
5559 	/* Validate obuf */
5560 	if (verify) {
5561 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5562 			plaintext,
5563 			tdata->plaintext.data,
5564 			tdata->plaintext.len >> 3,
5565 			"KASUMI Plaintext data not as expected");
5566 	} else {
5567 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5568 			ciphertext,
5569 			tdata->ciphertext.data,
5570 			tdata->ciphertext.len >> 3,
5571 			"KASUMI Ciphertext data not as expected");
5572 
5573 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5574 			ut_params->digest,
5575 			tdata->digest.data,
5576 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5577 			"KASUMI Generated auth tag not as expected");
5578 	}
5579 	return 0;
5580 }
5581 
5582 static int
5583 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5584 	uint8_t op_mode, uint8_t verify)
5585 {
5586 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5587 	struct crypto_unittest_params *ut_params = &unittest_params;
5588 
5589 	int retval;
5590 
5591 	const uint8_t *plaintext = NULL;
5592 	const uint8_t *ciphertext = NULL;
5593 	const uint8_t *digest = NULL;
5594 	unsigned int plaintext_pad_len;
5595 	unsigned int plaintext_len;
5596 	unsigned int ciphertext_pad_len;
5597 	unsigned int ciphertext_len;
5598 	uint8_t buffer[10000];
5599 	uint8_t digest_buffer[10000];
5600 
5601 	struct rte_cryptodev_info dev_info;
5602 
5603 	/* Verify the capabilities */
5604 	struct rte_cryptodev_sym_capability_idx cap_idx;
5605 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5606 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5607 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5608 			&cap_idx) == NULL)
5609 		return TEST_SKIPPED;
5610 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5611 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5612 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5613 			&cap_idx) == NULL)
5614 		return TEST_SKIPPED;
5615 
5616 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5617 		return TEST_SKIPPED;
5618 
5619 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5620 
5621 	uint64_t feat_flags = dev_info.feature_flags;
5622 
5623 	if (op_mode == IN_PLACE) {
5624 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5625 			printf("Device doesn't support in-place scatter-gather "
5626 					"in both input and output mbufs.\n");
5627 			return TEST_SKIPPED;
5628 		}
5629 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5630 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5631 			printf("Device doesn't support RAW data-path APIs.\n");
5632 			return TEST_SKIPPED;
5633 		}
5634 	} else {
5635 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5636 			return TEST_SKIPPED;
5637 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5638 			printf("Device doesn't support out-of-place scatter-gather "
5639 					"in both input and output mbufs.\n");
5640 			return TEST_SKIPPED;
5641 		}
5642 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5643 			printf("Device doesn't support digest encrypted.\n");
5644 			return TEST_SKIPPED;
5645 		}
5646 	}
5647 
5648 	/* Create KASUMI session */
5649 	retval = create_wireless_algo_auth_cipher_session(
5650 			ts_params->valid_devs[0],
5651 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5652 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5653 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5654 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5655 			RTE_CRYPTO_AUTH_KASUMI_F9,
5656 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5657 			tdata->key.data, tdata->key.len,
5658 			0, tdata->digest.len,
5659 			tdata->cipher_iv.len);
5660 
5661 	if (retval != 0)
5662 		return retval;
5663 
5664 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5665 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5666 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5667 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5668 
5669 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5670 			plaintext_pad_len, 15, 0);
5671 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5672 			"Failed to allocate input buffer in mempool");
5673 
5674 	if (op_mode == OUT_OF_PLACE) {
5675 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5676 				plaintext_pad_len, 15, 0);
5677 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5678 				"Failed to allocate output buffer in mempool");
5679 	}
5680 
5681 	if (verify) {
5682 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5683 			tdata->ciphertext.data);
5684 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5685 					ciphertext_len, buffer);
5686 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5687 			ciphertext_len);
5688 	} else {
5689 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5690 			tdata->plaintext.data);
5691 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5692 					plaintext_len, buffer);
5693 		debug_hexdump(stdout, "plaintext:", plaintext,
5694 			plaintext_len);
5695 	}
5696 	memset(buffer, 0, sizeof(buffer));
5697 
5698 	/* Create KASUMI operation */
5699 	retval = create_wireless_algo_auth_cipher_operation(
5700 		tdata->digest.data, tdata->digest.len,
5701 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5702 		NULL, 0,
5703 		(tdata->digest.offset_bytes == 0 ?
5704 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5705 			: tdata->digest.offset_bytes),
5706 		tdata->validCipherLenInBits.len,
5707 		tdata->validCipherOffsetInBits.len,
5708 		tdata->validAuthLenInBits.len,
5709 		0,
5710 		op_mode, 1, verify);
5711 
5712 	if (retval < 0)
5713 		return retval;
5714 
5715 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5716 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5717 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5718 	else
5719 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5720 			ut_params->op);
5721 
5722 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5723 
5724 	ut_params->obuf = (op_mode == IN_PLACE ?
5725 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5726 
5727 	if (verify) {
5728 		if (ut_params->obuf)
5729 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5730 					plaintext_len, buffer);
5731 		else
5732 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5733 					plaintext_len, buffer);
5734 
5735 		debug_hexdump(stdout, "plaintext:", plaintext,
5736 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5737 		debug_hexdump(stdout, "plaintext expected:",
5738 			tdata->plaintext.data,
5739 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5740 	} else {
5741 		if (ut_params->obuf)
5742 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5743 					ciphertext_len, buffer);
5744 		else
5745 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5746 					ciphertext_len, buffer);
5747 
5748 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5749 			ciphertext_len);
5750 		debug_hexdump(stdout, "ciphertext expected:",
5751 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5752 
5753 		if (ut_params->obuf)
5754 			digest = rte_pktmbuf_read(ut_params->obuf,
5755 				(tdata->digest.offset_bytes == 0 ?
5756 				plaintext_pad_len : tdata->digest.offset_bytes),
5757 				tdata->digest.len, digest_buffer);
5758 		else
5759 			digest = rte_pktmbuf_read(ut_params->ibuf,
5760 				(tdata->digest.offset_bytes == 0 ?
5761 				plaintext_pad_len : tdata->digest.offset_bytes),
5762 				tdata->digest.len, digest_buffer);
5763 
5764 		debug_hexdump(stdout, "digest:", digest,
5765 			tdata->digest.len);
5766 		debug_hexdump(stdout, "digest expected:",
5767 			tdata->digest.data, tdata->digest.len);
5768 	}
5769 
5770 	/* Validate obuf */
5771 	if (verify) {
5772 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5773 			plaintext,
5774 			tdata->plaintext.data,
5775 			tdata->plaintext.len >> 3,
5776 			"KASUMI Plaintext data not as expected");
5777 	} else {
5778 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5779 			ciphertext,
5780 			tdata->ciphertext.data,
5781 			tdata->validDataLenInBits.len,
5782 			"KASUMI Ciphertext data not as expected");
5783 
5784 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5785 			digest,
5786 			tdata->digest.data,
5787 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5788 			"KASUMI Generated auth tag not as expected");
5789 	}
5790 	return 0;
5791 }
5792 
5793 static int
5794 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5795 {
5796 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5797 	struct crypto_unittest_params *ut_params = &unittest_params;
5798 
5799 	int retval;
5800 
5801 	uint8_t *plaintext, *ciphertext;
5802 	unsigned plaintext_pad_len;
5803 	unsigned plaintext_len;
5804 	struct rte_cryptodev_info dev_info;
5805 
5806 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5807 	uint64_t feat_flags = dev_info.feature_flags;
5808 
5809 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5810 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5811 		printf("Device doesn't support RAW data-path APIs.\n");
5812 		return TEST_SKIPPED;
5813 	}
5814 
5815 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5816 		return TEST_SKIPPED;
5817 
5818 	/* Verify the capabilities */
5819 	struct rte_cryptodev_sym_capability_idx cap_idx;
5820 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5821 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5822 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5823 			&cap_idx) == NULL)
5824 		return TEST_SKIPPED;
5825 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5826 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5827 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5828 			&cap_idx) == NULL)
5829 		return TEST_SKIPPED;
5830 
5831 	/* Create KASUMI session */
5832 	retval = create_wireless_algo_cipher_auth_session(
5833 			ts_params->valid_devs[0],
5834 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5835 			RTE_CRYPTO_AUTH_OP_GENERATE,
5836 			RTE_CRYPTO_AUTH_KASUMI_F9,
5837 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5838 			tdata->key.data, tdata->key.len,
5839 			0, tdata->digest.len,
5840 			tdata->cipher_iv.len);
5841 	if (retval != 0)
5842 		return retval;
5843 
5844 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5845 
5846 	/* clear mbuf payload */
5847 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5848 			rte_pktmbuf_tailroom(ut_params->ibuf));
5849 
5850 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5851 	/* Append data which is padded to a multiple of */
5852 	/* the algorithms block size */
5853 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5854 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5855 				plaintext_pad_len);
5856 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5857 
5858 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5859 
5860 	/* Create KASUMI operation */
5861 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5862 				tdata->digest.len, NULL, 0,
5863 				plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5864 				tdata->cipher_iv.data, tdata->cipher_iv.len,
5865 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5866 				tdata->validCipherOffsetInBits.len,
5867 				tdata->validAuthLenInBits.len,
5868 				0
5869 				);
5870 	if (retval < 0)
5871 		return retval;
5872 
5873 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5874 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5875 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5876 	else
5877 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5878 			ut_params->op);
5879 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5880 
5881 	if (ut_params->op->sym->m_dst)
5882 		ut_params->obuf = ut_params->op->sym->m_dst;
5883 	else
5884 		ut_params->obuf = ut_params->op->sym->m_src;
5885 
5886 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5887 				tdata->validCipherOffsetInBits.len >> 3);
5888 
5889 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5890 			+ plaintext_pad_len;
5891 
5892 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5893 				(tdata->validCipherOffsetInBits.len >> 3);
5894 	/* Validate obuf */
5895 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5896 		ciphertext,
5897 		reference_ciphertext,
5898 		tdata->validCipherLenInBits.len,
5899 		"KASUMI Ciphertext data not as expected");
5900 
5901 	/* Validate obuf */
5902 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5903 		ut_params->digest,
5904 		tdata->digest.data,
5905 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5906 		"KASUMI Generated auth tag not as expected");
5907 	return 0;
5908 }
5909 
5910 static int
5911 check_cipher_capability(const struct crypto_testsuite_params *ts_params,
5912 			const enum rte_crypto_cipher_algorithm cipher_algo,
5913 			const uint16_t key_size, const uint16_t iv_size)
5914 {
5915 	struct rte_cryptodev_sym_capability_idx cap_idx;
5916 	const struct rte_cryptodev_symmetric_capability *cap;
5917 
5918 	/* Check if device supports the algorithm */
5919 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5920 	cap_idx.algo.cipher = cipher_algo;
5921 
5922 	cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5923 			&cap_idx);
5924 
5925 	if (cap == NULL)
5926 		return -1;
5927 
5928 	/* Check if device supports key size and IV size */
5929 	if (rte_cryptodev_sym_capability_check_cipher(cap, key_size,
5930 			iv_size) < 0) {
5931 		return -1;
5932 	}
5933 
5934 	return 0;
5935 }
5936 
5937 static int
5938 check_auth_capability(const struct crypto_testsuite_params *ts_params,
5939 			const enum rte_crypto_auth_algorithm auth_algo,
5940 			const uint16_t key_size, const uint16_t iv_size,
5941 			const uint16_t tag_size)
5942 {
5943 	struct rte_cryptodev_sym_capability_idx cap_idx;
5944 	const struct rte_cryptodev_symmetric_capability *cap;
5945 
5946 	/* Check if device supports the algorithm */
5947 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5948 	cap_idx.algo.auth = auth_algo;
5949 
5950 	cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5951 			&cap_idx);
5952 
5953 	if (cap == NULL)
5954 		return -1;
5955 
5956 	/* Check if device supports key size and IV size */
5957 	if (rte_cryptodev_sym_capability_check_auth(cap, key_size,
5958 			tag_size, iv_size) < 0) {
5959 		return -1;
5960 	}
5961 
5962 	return 0;
5963 }
5964 
5965 static int
5966 test_zuc_encryption(const struct wireless_test_data *tdata)
5967 {
5968 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5969 	struct crypto_unittest_params *ut_params = &unittest_params;
5970 
5971 	int retval;
5972 	uint8_t *plaintext, *ciphertext;
5973 	unsigned plaintext_pad_len;
5974 	unsigned plaintext_len;
5975 	struct rte_cryptodev_info dev_info;
5976 
5977 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5978 	uint64_t feat_flags = dev_info.feature_flags;
5979 
5980 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5981 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5982 		printf("Device doesn't support RAW data-path APIs.\n");
5983 		return TEST_SKIPPED;
5984 	}
5985 
5986 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5987 		return TEST_SKIPPED;
5988 
5989 	/* Check if device supports ZUC EEA3 */
5990 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
5991 			tdata->key.len, tdata->cipher_iv.len) < 0)
5992 		return TEST_SKIPPED;
5993 
5994 	/* Create ZUC session */
5995 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5996 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5997 					RTE_CRYPTO_CIPHER_ZUC_EEA3,
5998 					tdata->key.data, tdata->key.len,
5999 					tdata->cipher_iv.len);
6000 	if (retval != 0)
6001 		return retval;
6002 
6003 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6004 
6005 	/* Clear mbuf payload */
6006 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6007 	       rte_pktmbuf_tailroom(ut_params->ibuf));
6008 
6009 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6010 	/* Append data which is padded to a multiple */
6011 	/* of the algorithms block size */
6012 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6013 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6014 				plaintext_pad_len);
6015 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6016 
6017 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6018 
6019 	/* Create ZUC operation */
6020 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6021 					tdata->cipher_iv.len,
6022 					tdata->plaintext.len,
6023 					0);
6024 	if (retval < 0)
6025 		return retval;
6026 
6027 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6028 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6029 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6030 	else
6031 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6032 						ut_params->op);
6033 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6034 
6035 	ut_params->obuf = ut_params->op->sym->m_dst;
6036 	if (ut_params->obuf)
6037 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
6038 	else
6039 		ciphertext = plaintext;
6040 
6041 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6042 
6043 	/* Validate obuf */
6044 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6045 		ciphertext,
6046 		tdata->ciphertext.data,
6047 		tdata->validCipherLenInBits.len,
6048 		"ZUC Ciphertext data not as expected");
6049 	return 0;
6050 }
6051 
6052 static int
6053 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
6054 {
6055 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6056 	struct crypto_unittest_params *ut_params = &unittest_params;
6057 
6058 	int retval;
6059 
6060 	unsigned int plaintext_pad_len;
6061 	unsigned int plaintext_len;
6062 	const uint8_t *ciphertext;
6063 	uint8_t ciphertext_buffer[2048];
6064 	struct rte_cryptodev_info dev_info;
6065 
6066 	/* Check if device supports ZUC EEA3 */
6067 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6068 			tdata->key.len, tdata->cipher_iv.len) < 0)
6069 		return TEST_SKIPPED;
6070 
6071 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6072 		return TEST_SKIPPED;
6073 
6074 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6075 
6076 	uint64_t feat_flags = dev_info.feature_flags;
6077 
6078 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6079 		printf("Device doesn't support in-place scatter-gather. "
6080 				"Test Skipped.\n");
6081 		return TEST_SKIPPED;
6082 	}
6083 
6084 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6085 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6086 		printf("Device doesn't support RAW data-path APIs.\n");
6087 		return TEST_SKIPPED;
6088 	}
6089 
6090 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6091 
6092 	/* Append data which is padded to a multiple */
6093 	/* of the algorithms block size */
6094 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6095 
6096 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6097 			plaintext_pad_len, 10, 0);
6098 
6099 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6100 			tdata->plaintext.data);
6101 
6102 	/* Create ZUC session */
6103 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6104 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6105 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6106 			tdata->key.data, tdata->key.len,
6107 			tdata->cipher_iv.len);
6108 	if (retval < 0)
6109 		return retval;
6110 
6111 	/* Clear mbuf payload */
6112 
6113 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
6114 
6115 	/* Create ZUC operation */
6116 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6117 			tdata->cipher_iv.len, tdata->plaintext.len,
6118 			0);
6119 	if (retval < 0)
6120 		return retval;
6121 
6122 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6123 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6124 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6125 	else
6126 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6127 						ut_params->op);
6128 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6129 
6130 	ut_params->obuf = ut_params->op->sym->m_dst;
6131 	if (ut_params->obuf)
6132 		ciphertext = rte_pktmbuf_read(ut_params->obuf,
6133 			0, plaintext_len, ciphertext_buffer);
6134 	else
6135 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
6136 			0, plaintext_len, ciphertext_buffer);
6137 
6138 	/* Validate obuf */
6139 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6140 
6141 	/* Validate obuf */
6142 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6143 		ciphertext,
6144 		tdata->ciphertext.data,
6145 		tdata->validCipherLenInBits.len,
6146 		"ZUC Ciphertext data not as expected");
6147 
6148 	return 0;
6149 }
6150 
6151 static int
6152 test_zuc_authentication(const struct wireless_test_data *tdata)
6153 {
6154 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6155 	struct crypto_unittest_params *ut_params = &unittest_params;
6156 
6157 	int retval;
6158 	unsigned plaintext_pad_len;
6159 	unsigned plaintext_len;
6160 	uint8_t *plaintext;
6161 
6162 	struct rte_cryptodev_info dev_info;
6163 
6164 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6165 	uint64_t feat_flags = dev_info.feature_flags;
6166 
6167 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
6168 			(tdata->validAuthLenInBits.len % 8 != 0)) {
6169 		printf("Device doesn't support NON-Byte Aligned Data.\n");
6170 		return TEST_SKIPPED;
6171 	}
6172 
6173 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6174 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6175 		printf("Device doesn't support RAW data-path APIs.\n");
6176 		return TEST_SKIPPED;
6177 	}
6178 
6179 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6180 		return TEST_SKIPPED;
6181 
6182 	/* Check if device supports ZUC EIA3 */
6183 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6184 			tdata->key.len, tdata->auth_iv.len,
6185 			tdata->digest.len) < 0)
6186 		return TEST_SKIPPED;
6187 
6188 	/* Create ZUC session */
6189 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6190 			tdata->key.data, tdata->key.len,
6191 			tdata->auth_iv.len, tdata->digest.len,
6192 			RTE_CRYPTO_AUTH_OP_GENERATE,
6193 			RTE_CRYPTO_AUTH_ZUC_EIA3);
6194 	if (retval != 0)
6195 		return retval;
6196 
6197 	/* alloc mbuf and set payload */
6198 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6199 
6200 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6201 	rte_pktmbuf_tailroom(ut_params->ibuf));
6202 
6203 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6204 	/* Append data which is padded to a multiple of */
6205 	/* the algorithms block size */
6206 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6207 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6208 				plaintext_pad_len);
6209 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6210 
6211 	/* Create ZUC operation */
6212 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6213 			tdata->auth_iv.data, tdata->auth_iv.len,
6214 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6215 			tdata->validAuthLenInBits.len,
6216 			0);
6217 	if (retval < 0)
6218 		return retval;
6219 
6220 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6221 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6222 				ut_params->op, 0, 1, 1, 0);
6223 	else
6224 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6225 				ut_params->op);
6226 	ut_params->obuf = ut_params->op->sym->m_src;
6227 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6228 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6229 			+ plaintext_pad_len;
6230 
6231 	/* Validate obuf */
6232 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
6233 	ut_params->digest,
6234 	tdata->digest.data,
6235 	tdata->digest.len,
6236 	"ZUC Generated auth tag not as expected");
6237 
6238 	return 0;
6239 }
6240 
6241 static int
6242 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6243 	uint8_t op_mode, uint8_t verify)
6244 {
6245 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6246 	struct crypto_unittest_params *ut_params = &unittest_params;
6247 
6248 	int retval;
6249 
6250 	uint8_t *plaintext = NULL, *ciphertext = NULL;
6251 	unsigned int plaintext_pad_len;
6252 	unsigned int plaintext_len;
6253 	unsigned int ciphertext_pad_len;
6254 	unsigned int ciphertext_len;
6255 
6256 	struct rte_cryptodev_info dev_info;
6257 
6258 	/* Check if device supports ZUC EEA3 */
6259 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6260 			tdata->key.len, tdata->cipher_iv.len) < 0)
6261 		return TEST_SKIPPED;
6262 
6263 	/* Check if device supports ZUC EIA3 */
6264 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6265 			tdata->key.len, tdata->auth_iv.len,
6266 			tdata->digest.len) < 0)
6267 		return TEST_SKIPPED;
6268 
6269 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6270 
6271 	uint64_t feat_flags = dev_info.feature_flags;
6272 
6273 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6274 		printf("Device doesn't support digest encrypted.\n");
6275 		return TEST_SKIPPED;
6276 	}
6277 	if (op_mode == IN_PLACE) {
6278 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6279 			printf("Device doesn't support in-place scatter-gather "
6280 					"in both input and output mbufs.\n");
6281 			return TEST_SKIPPED;
6282 		}
6283 
6284 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6285 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6286 			printf("Device doesn't support RAW data-path APIs.\n");
6287 			return TEST_SKIPPED;
6288 		}
6289 	} else {
6290 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6291 			return TEST_SKIPPED;
6292 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6293 			printf("Device doesn't support out-of-place scatter-gather "
6294 					"in both input and output mbufs.\n");
6295 			return TEST_SKIPPED;
6296 		}
6297 	}
6298 
6299 	/* Create ZUC session */
6300 	retval = create_wireless_algo_auth_cipher_session(
6301 			ts_params->valid_devs[0],
6302 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6303 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6304 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6305 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6306 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6307 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6308 			tdata->key.data, tdata->key.len,
6309 			tdata->auth_iv.len, tdata->digest.len,
6310 			tdata->cipher_iv.len);
6311 
6312 	if (retval != 0)
6313 		return retval;
6314 
6315 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6316 	if (op_mode == OUT_OF_PLACE)
6317 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6318 
6319 	/* clear mbuf payload */
6320 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6321 		rte_pktmbuf_tailroom(ut_params->ibuf));
6322 	if (op_mode == OUT_OF_PLACE)
6323 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6324 			rte_pktmbuf_tailroom(ut_params->obuf));
6325 
6326 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6327 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6328 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6329 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6330 
6331 	if (verify) {
6332 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6333 					ciphertext_pad_len);
6334 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6335 		if (op_mode == OUT_OF_PLACE)
6336 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6337 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6338 			ciphertext_len);
6339 	} else {
6340 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6341 					plaintext_pad_len);
6342 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6343 		if (op_mode == OUT_OF_PLACE)
6344 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6345 		debug_hexdump(stdout, "plaintext:", plaintext,
6346 			plaintext_len);
6347 	}
6348 
6349 	/* Create ZUC operation */
6350 	retval = create_wireless_algo_auth_cipher_operation(
6351 		tdata->digest.data, tdata->digest.len,
6352 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6353 		tdata->auth_iv.data, tdata->auth_iv.len,
6354 		(tdata->digest.offset_bytes == 0 ?
6355 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6356 			: tdata->digest.offset_bytes),
6357 		tdata->validCipherLenInBits.len,
6358 		tdata->validCipherOffsetInBits.len,
6359 		tdata->validAuthLenInBits.len,
6360 		0,
6361 		op_mode, 0, verify);
6362 
6363 	if (retval < 0)
6364 		return retval;
6365 
6366 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6367 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6368 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6369 	else
6370 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6371 			ut_params->op);
6372 
6373 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6374 
6375 	ut_params->obuf = (op_mode == IN_PLACE ?
6376 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6377 
6378 
6379 	if (verify) {
6380 		if (ut_params->obuf)
6381 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6382 							uint8_t *);
6383 		else
6384 			plaintext = ciphertext;
6385 
6386 		debug_hexdump(stdout, "plaintext:", plaintext,
6387 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6388 		debug_hexdump(stdout, "plaintext expected:",
6389 			tdata->plaintext.data,
6390 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6391 	} else {
6392 		if (ut_params->obuf)
6393 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6394 							uint8_t *);
6395 		else
6396 			ciphertext = plaintext;
6397 
6398 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6399 			ciphertext_len);
6400 		debug_hexdump(stdout, "ciphertext expected:",
6401 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6402 
6403 		ut_params->digest = rte_pktmbuf_mtod(
6404 			ut_params->obuf, uint8_t *) +
6405 			(tdata->digest.offset_bytes == 0 ?
6406 			plaintext_pad_len : tdata->digest.offset_bytes);
6407 
6408 		debug_hexdump(stdout, "digest:", ut_params->digest,
6409 			tdata->digest.len);
6410 		debug_hexdump(stdout, "digest expected:",
6411 			tdata->digest.data, tdata->digest.len);
6412 	}
6413 
6414 	/* Validate obuf */
6415 	if (verify) {
6416 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6417 			plaintext,
6418 			tdata->plaintext.data,
6419 			tdata->plaintext.len >> 3,
6420 			"ZUC Plaintext data not as expected");
6421 	} else {
6422 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6423 			ciphertext,
6424 			tdata->ciphertext.data,
6425 			tdata->ciphertext.len >> 3,
6426 			"ZUC Ciphertext data not as expected");
6427 
6428 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6429 			ut_params->digest,
6430 			tdata->digest.data,
6431 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6432 			"ZUC Generated auth tag not as expected");
6433 	}
6434 	return 0;
6435 }
6436 
6437 static int
6438 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6439 	uint8_t op_mode, uint8_t verify)
6440 {
6441 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6442 	struct crypto_unittest_params *ut_params = &unittest_params;
6443 
6444 	int retval;
6445 
6446 	const uint8_t *plaintext = NULL;
6447 	const uint8_t *ciphertext = NULL;
6448 	const uint8_t *digest = NULL;
6449 	unsigned int plaintext_pad_len;
6450 	unsigned int plaintext_len;
6451 	unsigned int ciphertext_pad_len;
6452 	unsigned int ciphertext_len;
6453 	uint8_t buffer[10000];
6454 	uint8_t digest_buffer[10000];
6455 
6456 	struct rte_cryptodev_info dev_info;
6457 
6458 	/* Check if device supports ZUC EEA3 */
6459 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6460 			tdata->key.len, tdata->cipher_iv.len) < 0)
6461 		return TEST_SKIPPED;
6462 
6463 	/* Check if device supports ZUC EIA3 */
6464 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6465 			tdata->key.len, tdata->auth_iv.len,
6466 			tdata->digest.len) < 0)
6467 		return TEST_SKIPPED;
6468 
6469 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6470 
6471 	uint64_t feat_flags = dev_info.feature_flags;
6472 
6473 	if (op_mode == IN_PLACE) {
6474 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6475 			printf("Device doesn't support in-place scatter-gather "
6476 					"in both input and output mbufs.\n");
6477 			return TEST_SKIPPED;
6478 		}
6479 
6480 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6481 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6482 			printf("Device doesn't support RAW data-path APIs.\n");
6483 			return TEST_SKIPPED;
6484 		}
6485 	} else {
6486 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6487 			return TEST_SKIPPED;
6488 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6489 			printf("Device doesn't support out-of-place scatter-gather "
6490 					"in both input and output mbufs.\n");
6491 			return TEST_SKIPPED;
6492 		}
6493 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6494 			printf("Device doesn't support digest encrypted.\n");
6495 			return TEST_SKIPPED;
6496 		}
6497 	}
6498 
6499 	/* Create ZUC session */
6500 	retval = create_wireless_algo_auth_cipher_session(
6501 			ts_params->valid_devs[0],
6502 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6503 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6504 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6505 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6506 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6507 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6508 			tdata->key.data, tdata->key.len,
6509 			tdata->auth_iv.len, tdata->digest.len,
6510 			tdata->cipher_iv.len);
6511 
6512 	if (retval != 0)
6513 		return retval;
6514 
6515 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6516 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6517 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6518 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6519 
6520 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6521 			plaintext_pad_len, 15, 0);
6522 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6523 			"Failed to allocate input buffer in mempool");
6524 
6525 	if (op_mode == OUT_OF_PLACE) {
6526 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6527 				plaintext_pad_len, 15, 0);
6528 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
6529 				"Failed to allocate output buffer in mempool");
6530 	}
6531 
6532 	if (verify) {
6533 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6534 			tdata->ciphertext.data);
6535 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6536 					ciphertext_len, buffer);
6537 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6538 			ciphertext_len);
6539 	} else {
6540 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6541 			tdata->plaintext.data);
6542 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6543 					plaintext_len, buffer);
6544 		debug_hexdump(stdout, "plaintext:", plaintext,
6545 			plaintext_len);
6546 	}
6547 	memset(buffer, 0, sizeof(buffer));
6548 
6549 	/* Create ZUC operation */
6550 	retval = create_wireless_algo_auth_cipher_operation(
6551 		tdata->digest.data, tdata->digest.len,
6552 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6553 		NULL, 0,
6554 		(tdata->digest.offset_bytes == 0 ?
6555 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6556 			: tdata->digest.offset_bytes),
6557 		tdata->validCipherLenInBits.len,
6558 		tdata->validCipherOffsetInBits.len,
6559 		tdata->validAuthLenInBits.len,
6560 		0,
6561 		op_mode, 1, verify);
6562 
6563 	if (retval < 0)
6564 		return retval;
6565 
6566 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6567 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6568 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6569 	else
6570 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6571 			ut_params->op);
6572 
6573 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6574 
6575 	ut_params->obuf = (op_mode == IN_PLACE ?
6576 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6577 
6578 	if (verify) {
6579 		if (ut_params->obuf)
6580 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6581 					plaintext_len, buffer);
6582 		else
6583 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6584 					plaintext_len, buffer);
6585 
6586 		debug_hexdump(stdout, "plaintext:", plaintext,
6587 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6588 		debug_hexdump(stdout, "plaintext expected:",
6589 			tdata->plaintext.data,
6590 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6591 	} else {
6592 		if (ut_params->obuf)
6593 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6594 					ciphertext_len, buffer);
6595 		else
6596 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6597 					ciphertext_len, buffer);
6598 
6599 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6600 			ciphertext_len);
6601 		debug_hexdump(stdout, "ciphertext expected:",
6602 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6603 
6604 		if (ut_params->obuf)
6605 			digest = rte_pktmbuf_read(ut_params->obuf,
6606 				(tdata->digest.offset_bytes == 0 ?
6607 				plaintext_pad_len : tdata->digest.offset_bytes),
6608 				tdata->digest.len, digest_buffer);
6609 		else
6610 			digest = rte_pktmbuf_read(ut_params->ibuf,
6611 				(tdata->digest.offset_bytes == 0 ?
6612 				plaintext_pad_len : tdata->digest.offset_bytes),
6613 				tdata->digest.len, digest_buffer);
6614 
6615 		debug_hexdump(stdout, "digest:", digest,
6616 			tdata->digest.len);
6617 		debug_hexdump(stdout, "digest expected:",
6618 			tdata->digest.data, tdata->digest.len);
6619 	}
6620 
6621 	/* Validate obuf */
6622 	if (verify) {
6623 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6624 			plaintext,
6625 			tdata->plaintext.data,
6626 			tdata->plaintext.len >> 3,
6627 			"ZUC Plaintext data not as expected");
6628 	} else {
6629 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6630 			ciphertext,
6631 			tdata->ciphertext.data,
6632 			tdata->validDataLenInBits.len,
6633 			"ZUC Ciphertext data not as expected");
6634 
6635 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6636 			digest,
6637 			tdata->digest.data,
6638 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6639 			"ZUC Generated auth tag not as expected");
6640 	}
6641 	return 0;
6642 }
6643 
6644 static int
6645 test_kasumi_encryption_test_case_1(void)
6646 {
6647 	return test_kasumi_encryption(&kasumi_test_case_1);
6648 }
6649 
6650 static int
6651 test_kasumi_encryption_test_case_1_sgl(void)
6652 {
6653 	return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6654 }
6655 
6656 static int
6657 test_kasumi_encryption_test_case_1_oop(void)
6658 {
6659 	return test_kasumi_encryption_oop(&kasumi_test_case_1);
6660 }
6661 
6662 static int
6663 test_kasumi_encryption_test_case_1_oop_sgl(void)
6664 {
6665 	return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6666 }
6667 
6668 static int
6669 test_kasumi_encryption_test_case_2(void)
6670 {
6671 	return test_kasumi_encryption(&kasumi_test_case_2);
6672 }
6673 
6674 static int
6675 test_kasumi_encryption_test_case_3(void)
6676 {
6677 	return test_kasumi_encryption(&kasumi_test_case_3);
6678 }
6679 
6680 static int
6681 test_kasumi_encryption_test_case_4(void)
6682 {
6683 	return test_kasumi_encryption(&kasumi_test_case_4);
6684 }
6685 
6686 static int
6687 test_kasumi_encryption_test_case_5(void)
6688 {
6689 	return test_kasumi_encryption(&kasumi_test_case_5);
6690 }
6691 
6692 static int
6693 test_kasumi_decryption_test_case_1(void)
6694 {
6695 	return test_kasumi_decryption(&kasumi_test_case_1);
6696 }
6697 
6698 static int
6699 test_kasumi_decryption_test_case_1_oop(void)
6700 {
6701 	return test_kasumi_decryption_oop(&kasumi_test_case_1);
6702 }
6703 
6704 static int
6705 test_kasumi_decryption_test_case_2(void)
6706 {
6707 	return test_kasumi_decryption(&kasumi_test_case_2);
6708 }
6709 
6710 static int
6711 test_kasumi_decryption_test_case_3(void)
6712 {
6713 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6714 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6715 		return TEST_SKIPPED;
6716 	return test_kasumi_decryption(&kasumi_test_case_3);
6717 }
6718 
6719 static int
6720 test_kasumi_decryption_test_case_4(void)
6721 {
6722 	return test_kasumi_decryption(&kasumi_test_case_4);
6723 }
6724 
6725 static int
6726 test_kasumi_decryption_test_case_5(void)
6727 {
6728 	return test_kasumi_decryption(&kasumi_test_case_5);
6729 }
6730 static int
6731 test_snow3g_encryption_test_case_1(void)
6732 {
6733 	return test_snow3g_encryption(&snow3g_test_case_1);
6734 }
6735 
6736 static int
6737 test_snow3g_encryption_test_case_1_oop(void)
6738 {
6739 	return test_snow3g_encryption_oop(&snow3g_test_case_1);
6740 }
6741 
6742 static int
6743 test_snow3g_encryption_test_case_1_oop_sgl(void)
6744 {
6745 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6746 }
6747 
6748 
6749 static int
6750 test_snow3g_encryption_test_case_1_offset_oop(void)
6751 {
6752 	return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6753 }
6754 
6755 static int
6756 test_snow3g_encryption_test_case_2(void)
6757 {
6758 	return test_snow3g_encryption(&snow3g_test_case_2);
6759 }
6760 
6761 static int
6762 test_snow3g_encryption_test_case_3(void)
6763 {
6764 	return test_snow3g_encryption(&snow3g_test_case_3);
6765 }
6766 
6767 static int
6768 test_snow3g_encryption_test_case_4(void)
6769 {
6770 	return test_snow3g_encryption(&snow3g_test_case_4);
6771 }
6772 
6773 static int
6774 test_snow3g_encryption_test_case_5(void)
6775 {
6776 	return test_snow3g_encryption(&snow3g_test_case_5);
6777 }
6778 
6779 static int
6780 test_snow3g_decryption_test_case_1(void)
6781 {
6782 	return test_snow3g_decryption(&snow3g_test_case_1);
6783 }
6784 
6785 static int
6786 test_snow3g_decryption_test_case_1_oop(void)
6787 {
6788 	return test_snow3g_decryption_oop(&snow3g_test_case_1);
6789 }
6790 
6791 static int
6792 test_snow3g_decryption_test_case_2(void)
6793 {
6794 	return test_snow3g_decryption(&snow3g_test_case_2);
6795 }
6796 
6797 static int
6798 test_snow3g_decryption_test_case_3(void)
6799 {
6800 	return test_snow3g_decryption(&snow3g_test_case_3);
6801 }
6802 
6803 static int
6804 test_snow3g_decryption_test_case_4(void)
6805 {
6806 	return test_snow3g_decryption(&snow3g_test_case_4);
6807 }
6808 
6809 static int
6810 test_snow3g_decryption_test_case_5(void)
6811 {
6812 	return test_snow3g_decryption(&snow3g_test_case_5);
6813 }
6814 
6815 /*
6816  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6817  * Pattern digest from snow3g_test_data must be allocated as
6818  * 4 last bytes in plaintext.
6819  */
6820 static void
6821 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6822 		struct snow3g_hash_test_data *output)
6823 {
6824 	if ((pattern != NULL) && (output != NULL)) {
6825 		output->key.len = pattern->key.len;
6826 
6827 		memcpy(output->key.data,
6828 		pattern->key.data, pattern->key.len);
6829 
6830 		output->auth_iv.len = pattern->auth_iv.len;
6831 
6832 		memcpy(output->auth_iv.data,
6833 		pattern->auth_iv.data, pattern->auth_iv.len);
6834 
6835 		output->plaintext.len = pattern->plaintext.len;
6836 
6837 		memcpy(output->plaintext.data,
6838 		pattern->plaintext.data, pattern->plaintext.len >> 3);
6839 
6840 		output->digest.len = pattern->digest.len;
6841 
6842 		memcpy(output->digest.data,
6843 		&pattern->plaintext.data[pattern->digest.offset_bytes],
6844 		pattern->digest.len);
6845 
6846 		output->validAuthLenInBits.len =
6847 		pattern->validAuthLenInBits.len;
6848 	}
6849 }
6850 
6851 /*
6852  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6853  */
6854 static int
6855 test_snow3g_decryption_with_digest_test_case_1(void)
6856 {
6857 	struct snow3g_hash_test_data snow3g_hash_data;
6858 	struct rte_cryptodev_info dev_info;
6859 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6860 
6861 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6862 	uint64_t feat_flags = dev_info.feature_flags;
6863 
6864 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6865 		printf("Device doesn't support encrypted digest operations.\n");
6866 		return TEST_SKIPPED;
6867 	}
6868 
6869 	/*
6870 	 * Function prepare data for hash veryfication test case.
6871 	 * Digest is allocated in 4 last bytes in plaintext, pattern.
6872 	 */
6873 	snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6874 
6875 	return test_snow3g_decryption(&snow3g_test_case_7) &
6876 			test_snow3g_authentication_verify(&snow3g_hash_data);
6877 }
6878 
6879 static int
6880 test_snow3g_cipher_auth_test_case_1(void)
6881 {
6882 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
6883 }
6884 
6885 static int
6886 test_snow3g_auth_cipher_test_case_1(void)
6887 {
6888 	return test_snow3g_auth_cipher(
6889 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6890 }
6891 
6892 static int
6893 test_snow3g_auth_cipher_test_case_2(void)
6894 {
6895 	return test_snow3g_auth_cipher(
6896 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6897 }
6898 
6899 static int
6900 test_snow3g_auth_cipher_test_case_2_oop(void)
6901 {
6902 	return test_snow3g_auth_cipher(
6903 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6904 }
6905 
6906 static int
6907 test_snow3g_auth_cipher_part_digest_enc(void)
6908 {
6909 	return test_snow3g_auth_cipher(
6910 		&snow3g_auth_cipher_partial_digest_encryption,
6911 			IN_PLACE, 0);
6912 }
6913 
6914 static int
6915 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6916 {
6917 	return test_snow3g_auth_cipher(
6918 		&snow3g_auth_cipher_partial_digest_encryption,
6919 			OUT_OF_PLACE, 0);
6920 }
6921 
6922 static int
6923 test_snow3g_auth_cipher_test_case_3_sgl(void)
6924 {
6925 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6926 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6927 		return TEST_SKIPPED;
6928 	return test_snow3g_auth_cipher_sgl(
6929 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6930 }
6931 
6932 static int
6933 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6934 {
6935 	return test_snow3g_auth_cipher_sgl(
6936 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6937 }
6938 
6939 static int
6940 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6941 {
6942 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6943 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6944 		return TEST_SKIPPED;
6945 	return test_snow3g_auth_cipher_sgl(
6946 		&snow3g_auth_cipher_partial_digest_encryption,
6947 			IN_PLACE, 0);
6948 }
6949 
6950 static int
6951 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6952 {
6953 	return test_snow3g_auth_cipher_sgl(
6954 		&snow3g_auth_cipher_partial_digest_encryption,
6955 			OUT_OF_PLACE, 0);
6956 }
6957 
6958 static int
6959 test_snow3g_auth_cipher_verify_test_case_1(void)
6960 {
6961 	return test_snow3g_auth_cipher(
6962 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6963 }
6964 
6965 static int
6966 test_snow3g_auth_cipher_verify_test_case_2(void)
6967 {
6968 	return test_snow3g_auth_cipher(
6969 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6970 }
6971 
6972 static int
6973 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6974 {
6975 	return test_snow3g_auth_cipher(
6976 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6977 }
6978 
6979 static int
6980 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6981 {
6982 	return test_snow3g_auth_cipher(
6983 		&snow3g_auth_cipher_partial_digest_encryption,
6984 			IN_PLACE, 1);
6985 }
6986 
6987 static int
6988 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6989 {
6990 	return test_snow3g_auth_cipher(
6991 		&snow3g_auth_cipher_partial_digest_encryption,
6992 			OUT_OF_PLACE, 1);
6993 }
6994 
6995 static int
6996 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6997 {
6998 	return test_snow3g_auth_cipher_sgl(
6999 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
7000 }
7001 
7002 static int
7003 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
7004 {
7005 	return test_snow3g_auth_cipher_sgl(
7006 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
7007 }
7008 
7009 static int
7010 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
7011 {
7012 	return test_snow3g_auth_cipher_sgl(
7013 		&snow3g_auth_cipher_partial_digest_encryption,
7014 			IN_PLACE, 1);
7015 }
7016 
7017 static int
7018 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
7019 {
7020 	return test_snow3g_auth_cipher_sgl(
7021 		&snow3g_auth_cipher_partial_digest_encryption,
7022 			OUT_OF_PLACE, 1);
7023 }
7024 
7025 static int
7026 test_snow3g_auth_cipher_with_digest_test_case_1(void)
7027 {
7028 	return test_snow3g_auth_cipher(
7029 		&snow3g_test_case_7, IN_PLACE, 0);
7030 }
7031 
7032 static int
7033 test_kasumi_auth_cipher_test_case_1(void)
7034 {
7035 	return test_kasumi_auth_cipher(
7036 		&kasumi_test_case_3, IN_PLACE, 0);
7037 }
7038 
7039 static int
7040 test_kasumi_auth_cipher_test_case_2(void)
7041 {
7042 	return test_kasumi_auth_cipher(
7043 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7044 }
7045 
7046 static int
7047 test_kasumi_auth_cipher_test_case_2_oop(void)
7048 {
7049 	return test_kasumi_auth_cipher(
7050 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7051 }
7052 
7053 static int
7054 test_kasumi_auth_cipher_test_case_2_sgl(void)
7055 {
7056 	return test_kasumi_auth_cipher_sgl(
7057 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7058 }
7059 
7060 static int
7061 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
7062 {
7063 	return test_kasumi_auth_cipher_sgl(
7064 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7065 }
7066 
7067 static int
7068 test_kasumi_auth_cipher_verify_test_case_1(void)
7069 {
7070 	return test_kasumi_auth_cipher(
7071 		&kasumi_test_case_3, IN_PLACE, 1);
7072 }
7073 
7074 static int
7075 test_kasumi_auth_cipher_verify_test_case_2(void)
7076 {
7077 	return test_kasumi_auth_cipher(
7078 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7079 }
7080 
7081 static int
7082 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
7083 {
7084 	return test_kasumi_auth_cipher(
7085 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7086 }
7087 
7088 static int
7089 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
7090 {
7091 	return test_kasumi_auth_cipher_sgl(
7092 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7093 }
7094 
7095 static int
7096 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
7097 {
7098 	return test_kasumi_auth_cipher_sgl(
7099 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7100 }
7101 
7102 static int
7103 test_kasumi_cipher_auth_test_case_1(void)
7104 {
7105 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
7106 }
7107 
7108 static int
7109 test_zuc_encryption_test_case_1(void)
7110 {
7111 	return test_zuc_encryption(&zuc_test_case_cipher_193b);
7112 }
7113 
7114 static int
7115 test_zuc_encryption_test_case_2(void)
7116 {
7117 	return test_zuc_encryption(&zuc_test_case_cipher_800b);
7118 }
7119 
7120 static int
7121 test_zuc_encryption_test_case_3(void)
7122 {
7123 	return test_zuc_encryption(&zuc_test_case_cipher_1570b);
7124 }
7125 
7126 static int
7127 test_zuc_encryption_test_case_4(void)
7128 {
7129 	return test_zuc_encryption(&zuc_test_case_cipher_2798b);
7130 }
7131 
7132 static int
7133 test_zuc_encryption_test_case_5(void)
7134 {
7135 	return test_zuc_encryption(&zuc_test_case_cipher_4019b);
7136 }
7137 
7138 static int
7139 test_zuc_encryption_test_case_6_sgl(void)
7140 {
7141 	return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
7142 }
7143 
7144 static int
7145 test_zuc_hash_generate_test_case_1(void)
7146 {
7147 	return test_zuc_authentication(&zuc_test_case_auth_1b);
7148 }
7149 
7150 static int
7151 test_zuc_hash_generate_test_case_2(void)
7152 {
7153 	return test_zuc_authentication(&zuc_test_case_auth_90b);
7154 }
7155 
7156 static int
7157 test_zuc_hash_generate_test_case_3(void)
7158 {
7159 	return test_zuc_authentication(&zuc_test_case_auth_577b);
7160 }
7161 
7162 static int
7163 test_zuc_hash_generate_test_case_4(void)
7164 {
7165 	return test_zuc_authentication(&zuc_test_case_auth_2079b);
7166 }
7167 
7168 static int
7169 test_zuc_hash_generate_test_case_5(void)
7170 {
7171 	return test_zuc_authentication(&zuc_test_auth_5670b);
7172 }
7173 
7174 static int
7175 test_zuc_hash_generate_test_case_6(void)
7176 {
7177 	return test_zuc_authentication(&zuc_test_case_auth_128b);
7178 }
7179 
7180 static int
7181 test_zuc_hash_generate_test_case_7(void)
7182 {
7183 	return test_zuc_authentication(&zuc_test_case_auth_2080b);
7184 }
7185 
7186 static int
7187 test_zuc_hash_generate_test_case_8(void)
7188 {
7189 	return test_zuc_authentication(&zuc_test_case_auth_584b);
7190 }
7191 
7192 static int
7193 test_zuc_hash_generate_test_case_9(void)
7194 {
7195 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_32b);
7196 }
7197 
7198 static int
7199 test_zuc_hash_generate_test_case_10(void)
7200 {
7201 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_64b);
7202 }
7203 
7204 static int
7205 test_zuc_hash_generate_test_case_11(void)
7206 {
7207 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_128b);
7208 }
7209 
7210 static int
7211 test_zuc_cipher_auth_test_case_1(void)
7212 {
7213 	return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7214 }
7215 
7216 static int
7217 test_zuc_cipher_auth_test_case_2(void)
7218 {
7219 	return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7220 }
7221 
7222 static int
7223 test_zuc_auth_cipher_test_case_1(void)
7224 {
7225 	return test_zuc_auth_cipher(
7226 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7227 }
7228 
7229 static int
7230 test_zuc_auth_cipher_test_case_1_oop(void)
7231 {
7232 	return test_zuc_auth_cipher(
7233 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7234 }
7235 
7236 static int
7237 test_zuc_auth_cipher_test_case_1_sgl(void)
7238 {
7239 	return test_zuc_auth_cipher_sgl(
7240 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7241 }
7242 
7243 static int
7244 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7245 {
7246 	return test_zuc_auth_cipher_sgl(
7247 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7248 }
7249 
7250 static int
7251 test_zuc_auth_cipher_verify_test_case_1(void)
7252 {
7253 	return test_zuc_auth_cipher(
7254 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7255 }
7256 
7257 static int
7258 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7259 {
7260 	return test_zuc_auth_cipher(
7261 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7262 }
7263 
7264 static int
7265 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7266 {
7267 	return test_zuc_auth_cipher_sgl(
7268 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7269 }
7270 
7271 static int
7272 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7273 {
7274 	return test_zuc_auth_cipher_sgl(
7275 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7276 }
7277 
7278 static int
7279 test_zuc256_encryption_test_case_1(void)
7280 {
7281 	return test_zuc_encryption(&zuc256_test_case_cipher_1);
7282 }
7283 
7284 static int
7285 test_zuc256_encryption_test_case_2(void)
7286 {
7287 	return test_zuc_encryption(&zuc256_test_case_cipher_2);
7288 }
7289 
7290 static int
7291 test_zuc256_authentication_test_case_1(void)
7292 {
7293 	return test_zuc_authentication(&zuc256_test_case_auth_1);
7294 }
7295 
7296 static int
7297 test_zuc256_authentication_test_case_2(void)
7298 {
7299 	return test_zuc_authentication(&zuc256_test_case_auth_2);
7300 }
7301 
7302 static int
7303 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7304 {
7305 	uint8_t dev_id = testsuite_params.valid_devs[0];
7306 
7307 	struct rte_cryptodev_sym_capability_idx cap_idx;
7308 
7309 	/* Check if device supports particular cipher algorithm */
7310 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7311 	cap_idx.algo.cipher = tdata->cipher_algo;
7312 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7313 		return TEST_SKIPPED;
7314 
7315 	/* Check if device supports particular hash algorithm */
7316 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7317 	cap_idx.algo.auth = tdata->auth_algo;
7318 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7319 		return TEST_SKIPPED;
7320 
7321 	return 0;
7322 }
7323 
7324 static int
7325 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7326 	uint8_t op_mode, uint8_t verify)
7327 {
7328 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7329 	struct crypto_unittest_params *ut_params = &unittest_params;
7330 
7331 	int retval;
7332 
7333 	uint8_t *plaintext = NULL, *ciphertext = NULL;
7334 	unsigned int plaintext_pad_len;
7335 	unsigned int plaintext_len;
7336 	unsigned int ciphertext_pad_len;
7337 	unsigned int ciphertext_len;
7338 
7339 	struct rte_cryptodev_info dev_info;
7340 	struct rte_crypto_op *op;
7341 
7342 	/* Check if device supports particular algorithms separately */
7343 	if (test_mixed_check_if_unsupported(tdata))
7344 		return TEST_SKIPPED;
7345 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7346 		return TEST_SKIPPED;
7347 
7348 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7349 
7350 	uint64_t feat_flags = dev_info.feature_flags;
7351 
7352 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7353 		printf("Device doesn't support digest encrypted.\n");
7354 		return TEST_SKIPPED;
7355 	}
7356 
7357 	/* Create the session */
7358 	if (verify)
7359 		retval = create_wireless_algo_cipher_auth_session(
7360 				ts_params->valid_devs[0],
7361 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7362 				RTE_CRYPTO_AUTH_OP_VERIFY,
7363 				tdata->auth_algo,
7364 				tdata->cipher_algo,
7365 				tdata->auth_key.data, tdata->auth_key.len,
7366 				tdata->auth_iv.len, tdata->digest_enc.len,
7367 				tdata->cipher_iv.len);
7368 	else
7369 		retval = create_wireless_algo_auth_cipher_session(
7370 				ts_params->valid_devs[0],
7371 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7372 				RTE_CRYPTO_AUTH_OP_GENERATE,
7373 				tdata->auth_algo,
7374 				tdata->cipher_algo,
7375 				tdata->auth_key.data, tdata->auth_key.len,
7376 				tdata->auth_iv.len, tdata->digest_enc.len,
7377 				tdata->cipher_iv.len);
7378 	if (retval != 0)
7379 		return retval;
7380 
7381 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7382 	if (op_mode == OUT_OF_PLACE)
7383 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7384 
7385 	/* clear mbuf payload */
7386 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7387 		rte_pktmbuf_tailroom(ut_params->ibuf));
7388 	if (op_mode == OUT_OF_PLACE) {
7389 
7390 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7391 				rte_pktmbuf_tailroom(ut_params->obuf));
7392 	}
7393 
7394 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7395 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7396 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7397 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7398 
7399 	if (verify) {
7400 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7401 				ciphertext_pad_len);
7402 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7403 		if (op_mode == OUT_OF_PLACE)
7404 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7405 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7406 				ciphertext_len);
7407 	} else {
7408 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7409 				plaintext_pad_len);
7410 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7411 		if (op_mode == OUT_OF_PLACE)
7412 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
7413 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7414 	}
7415 
7416 	/* Create the operation */
7417 	retval = create_wireless_algo_auth_cipher_operation(
7418 			tdata->digest_enc.data, tdata->digest_enc.len,
7419 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7420 			tdata->auth_iv.data, tdata->auth_iv.len,
7421 			(tdata->digest_enc.offset == 0 ?
7422 				plaintext_pad_len
7423 				: tdata->digest_enc.offset),
7424 			tdata->validCipherLen.len_bits,
7425 			tdata->cipher.offset_bits,
7426 			tdata->validAuthLen.len_bits,
7427 			tdata->auth.offset_bits,
7428 			op_mode, 0, verify);
7429 
7430 	if (retval < 0)
7431 		return retval;
7432 
7433 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7434 
7435 	/* Check if the op failed because the device doesn't */
7436 	/* support this particular combination of algorithms */
7437 	if (op == NULL && ut_params->op->status ==
7438 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7439 		printf("Device doesn't support this mixed combination. "
7440 				"Test Skipped.\n");
7441 		return TEST_SKIPPED;
7442 	}
7443 	ut_params->op = op;
7444 
7445 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7446 
7447 	ut_params->obuf = (op_mode == IN_PLACE ?
7448 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7449 
7450 	if (verify) {
7451 		if (ut_params->obuf)
7452 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7453 							uint8_t *);
7454 		else
7455 			plaintext = ciphertext +
7456 					(tdata->cipher.offset_bits >> 3);
7457 
7458 		debug_hexdump(stdout, "plaintext:", plaintext,
7459 				tdata->plaintext.len_bits >> 3);
7460 		debug_hexdump(stdout, "plaintext expected:",
7461 				tdata->plaintext.data,
7462 				tdata->plaintext.len_bits >> 3);
7463 	} else {
7464 		if (ut_params->obuf)
7465 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7466 					uint8_t *);
7467 		else
7468 			ciphertext = plaintext;
7469 
7470 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7471 				ciphertext_len);
7472 		debug_hexdump(stdout, "ciphertext expected:",
7473 				tdata->ciphertext.data,
7474 				tdata->ciphertext.len_bits >> 3);
7475 
7476 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7477 				+ (tdata->digest_enc.offset == 0 ?
7478 		plaintext_pad_len : tdata->digest_enc.offset);
7479 
7480 		debug_hexdump(stdout, "digest:", ut_params->digest,
7481 				tdata->digest_enc.len);
7482 		debug_hexdump(stdout, "digest expected:",
7483 				tdata->digest_enc.data,
7484 				tdata->digest_enc.len);
7485 	}
7486 
7487 	/* Validate obuf */
7488 	if (verify) {
7489 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7490 				plaintext,
7491 				tdata->plaintext.data,
7492 				tdata->plaintext.len_bits >> 3,
7493 				"Plaintext data not as expected");
7494 	} else {
7495 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7496 				ciphertext,
7497 				tdata->ciphertext.data,
7498 				tdata->validDataLen.len_bits,
7499 				"Ciphertext data not as expected");
7500 
7501 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7502 				ut_params->digest,
7503 				tdata->digest_enc.data,
7504 				DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
7505 				"Generated auth tag not as expected");
7506 	}
7507 
7508 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7509 			"crypto op processing failed");
7510 
7511 	return 0;
7512 }
7513 
7514 static int
7515 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7516 	uint8_t op_mode, uint8_t verify)
7517 {
7518 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7519 	struct crypto_unittest_params *ut_params = &unittest_params;
7520 
7521 	int retval;
7522 
7523 	const uint8_t *plaintext = NULL;
7524 	const uint8_t *ciphertext = NULL;
7525 	const uint8_t *digest = NULL;
7526 	unsigned int plaintext_pad_len;
7527 	unsigned int plaintext_len;
7528 	unsigned int ciphertext_pad_len;
7529 	unsigned int ciphertext_len;
7530 	uint8_t buffer[10000];
7531 	uint8_t digest_buffer[10000];
7532 
7533 	struct rte_cryptodev_info dev_info;
7534 	struct rte_crypto_op *op;
7535 
7536 	/* Check if device supports particular algorithms */
7537 	if (test_mixed_check_if_unsupported(tdata))
7538 		return TEST_SKIPPED;
7539 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7540 		return TEST_SKIPPED;
7541 
7542 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7543 
7544 	uint64_t feat_flags = dev_info.feature_flags;
7545 
7546 	if (op_mode == IN_PLACE) {
7547 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7548 			printf("Device doesn't support in-place scatter-gather "
7549 					"in both input and output mbufs.\n");
7550 			return TEST_SKIPPED;
7551 		}
7552 	} else {
7553 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7554 			printf("Device doesn't support out-of-place scatter-gather "
7555 					"in both input and output mbufs.\n");
7556 			return TEST_SKIPPED;
7557 		}
7558 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7559 			printf("Device doesn't support digest encrypted.\n");
7560 			return TEST_SKIPPED;
7561 		}
7562 	}
7563 
7564 	/* Create the session */
7565 	if (verify)
7566 		retval = create_wireless_algo_cipher_auth_session(
7567 				ts_params->valid_devs[0],
7568 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7569 				RTE_CRYPTO_AUTH_OP_VERIFY,
7570 				tdata->auth_algo,
7571 				tdata->cipher_algo,
7572 				tdata->auth_key.data, tdata->auth_key.len,
7573 				tdata->auth_iv.len, tdata->digest_enc.len,
7574 				tdata->cipher_iv.len);
7575 	else
7576 		retval = create_wireless_algo_auth_cipher_session(
7577 				ts_params->valid_devs[0],
7578 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7579 				RTE_CRYPTO_AUTH_OP_GENERATE,
7580 				tdata->auth_algo,
7581 				tdata->cipher_algo,
7582 				tdata->auth_key.data, tdata->auth_key.len,
7583 				tdata->auth_iv.len, tdata->digest_enc.len,
7584 				tdata->cipher_iv.len);
7585 	if (retval != 0)
7586 		return retval;
7587 
7588 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7589 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7590 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7591 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7592 
7593 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7594 			ciphertext_pad_len, 15, 0);
7595 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7596 			"Failed to allocate input buffer in mempool");
7597 
7598 	if (op_mode == OUT_OF_PLACE) {
7599 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7600 				plaintext_pad_len, 15, 0);
7601 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
7602 				"Failed to allocate output buffer in mempool");
7603 	}
7604 
7605 	if (verify) {
7606 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7607 			tdata->ciphertext.data);
7608 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7609 					ciphertext_len, buffer);
7610 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7611 			ciphertext_len);
7612 	} else {
7613 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7614 			tdata->plaintext.data);
7615 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7616 					plaintext_len, buffer);
7617 		debug_hexdump(stdout, "plaintext:", plaintext,
7618 			plaintext_len);
7619 	}
7620 	memset(buffer, 0, sizeof(buffer));
7621 
7622 	/* Create the operation */
7623 	retval = create_wireless_algo_auth_cipher_operation(
7624 			tdata->digest_enc.data, tdata->digest_enc.len,
7625 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7626 			tdata->auth_iv.data, tdata->auth_iv.len,
7627 			(tdata->digest_enc.offset == 0 ?
7628 				plaintext_pad_len
7629 				: tdata->digest_enc.offset),
7630 			tdata->validCipherLen.len_bits,
7631 			tdata->cipher.offset_bits,
7632 			tdata->validAuthLen.len_bits,
7633 			tdata->auth.offset_bits,
7634 			op_mode, 1, verify);
7635 
7636 	if (retval < 0)
7637 		return retval;
7638 
7639 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7640 
7641 	/* Check if the op failed because the device doesn't */
7642 	/* support this particular combination of algorithms */
7643 	if (op == NULL && ut_params->op->status ==
7644 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7645 		printf("Device doesn't support this mixed combination. "
7646 				"Test Skipped.\n");
7647 		return TEST_SKIPPED;
7648 	}
7649 	ut_params->op = op;
7650 
7651 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7652 
7653 	ut_params->obuf = (op_mode == IN_PLACE ?
7654 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7655 
7656 	if (verify) {
7657 		if (ut_params->obuf)
7658 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7659 					plaintext_len, buffer);
7660 		else
7661 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7662 					plaintext_len, buffer);
7663 
7664 		debug_hexdump(stdout, "plaintext:", plaintext,
7665 				(tdata->plaintext.len_bits >> 3) -
7666 				tdata->digest_enc.len);
7667 		debug_hexdump(stdout, "plaintext expected:",
7668 				tdata->plaintext.data,
7669 				(tdata->plaintext.len_bits >> 3) -
7670 				tdata->digest_enc.len);
7671 	} else {
7672 		if (ut_params->obuf)
7673 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7674 					ciphertext_len, buffer);
7675 		else
7676 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7677 					ciphertext_len, buffer);
7678 
7679 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7680 			ciphertext_len);
7681 		debug_hexdump(stdout, "ciphertext expected:",
7682 			tdata->ciphertext.data,
7683 			tdata->ciphertext.len_bits >> 3);
7684 
7685 		if (ut_params->obuf)
7686 			digest = rte_pktmbuf_read(ut_params->obuf,
7687 					(tdata->digest_enc.offset == 0 ?
7688 						plaintext_pad_len :
7689 						tdata->digest_enc.offset),
7690 					tdata->digest_enc.len, digest_buffer);
7691 		else
7692 			digest = rte_pktmbuf_read(ut_params->ibuf,
7693 					(tdata->digest_enc.offset == 0 ?
7694 						plaintext_pad_len :
7695 						tdata->digest_enc.offset),
7696 					tdata->digest_enc.len, digest_buffer);
7697 
7698 		debug_hexdump(stdout, "digest:", digest,
7699 				tdata->digest_enc.len);
7700 		debug_hexdump(stdout, "digest expected:",
7701 				tdata->digest_enc.data, tdata->digest_enc.len);
7702 	}
7703 
7704 	/* Validate obuf */
7705 	if (verify) {
7706 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7707 				plaintext,
7708 				tdata->plaintext.data,
7709 				tdata->plaintext.len_bits >> 3,
7710 				"Plaintext data not as expected");
7711 	} else {
7712 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7713 				ciphertext,
7714 				tdata->ciphertext.data,
7715 				tdata->validDataLen.len_bits,
7716 				"Ciphertext data not as expected");
7717 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7718 				digest,
7719 				tdata->digest_enc.data,
7720 				tdata->digest_enc.len,
7721 				"Generated auth tag not as expected");
7722 	}
7723 
7724 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7725 			"crypto op processing failed");
7726 
7727 	return 0;
7728 }
7729 
7730 /** AUTH AES CMAC + CIPHER AES CTR */
7731 
7732 static int
7733 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7734 {
7735 	return test_mixed_auth_cipher(
7736 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7737 }
7738 
7739 static int
7740 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7741 {
7742 	return test_mixed_auth_cipher(
7743 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7744 }
7745 
7746 static int
7747 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7748 {
7749 	return test_mixed_auth_cipher_sgl(
7750 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7751 }
7752 
7753 static int
7754 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7755 {
7756 	return test_mixed_auth_cipher_sgl(
7757 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7758 }
7759 
7760 static int
7761 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7762 {
7763 	return test_mixed_auth_cipher(
7764 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7765 }
7766 
7767 static int
7768 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7769 {
7770 	return test_mixed_auth_cipher(
7771 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7772 }
7773 
7774 static int
7775 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7776 {
7777 	return test_mixed_auth_cipher_sgl(
7778 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7779 }
7780 
7781 static int
7782 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7783 {
7784 	return test_mixed_auth_cipher_sgl(
7785 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7786 }
7787 
7788 /** MIXED AUTH + CIPHER */
7789 
7790 static int
7791 test_auth_zuc_cipher_snow_test_case_1(void)
7792 {
7793 	return test_mixed_auth_cipher(
7794 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7795 }
7796 
7797 static int
7798 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7799 {
7800 	return test_mixed_auth_cipher(
7801 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7802 }
7803 
7804 static int
7805 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7806 {
7807 	return test_mixed_auth_cipher(
7808 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7809 }
7810 
7811 static int
7812 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7813 {
7814 	return test_mixed_auth_cipher(
7815 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7816 }
7817 
7818 static int
7819 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7820 {
7821 	return test_mixed_auth_cipher(
7822 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7823 }
7824 
7825 static int
7826 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7827 {
7828 	return test_mixed_auth_cipher(
7829 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7830 }
7831 
7832 static int
7833 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7834 {
7835 	return test_mixed_auth_cipher(
7836 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7837 }
7838 
7839 static int
7840 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7841 {
7842 	return test_mixed_auth_cipher(
7843 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7844 }
7845 
7846 static int
7847 test_auth_snow_cipher_zuc_test_case_1(void)
7848 {
7849 	return test_mixed_auth_cipher(
7850 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7851 }
7852 
7853 static int
7854 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7855 {
7856 	return test_mixed_auth_cipher(
7857 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7858 }
7859 
7860 static int
7861 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7862 {
7863 	return test_mixed_auth_cipher(
7864 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7865 }
7866 
7867 static int
7868 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7869 {
7870 	return test_mixed_auth_cipher(
7871 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7872 }
7873 
7874 static int
7875 test_auth_null_cipher_snow_test_case_1(void)
7876 {
7877 	return test_mixed_auth_cipher(
7878 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7879 }
7880 
7881 static int
7882 test_verify_auth_null_cipher_snow_test_case_1(void)
7883 {
7884 	return test_mixed_auth_cipher(
7885 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7886 }
7887 
7888 static int
7889 test_auth_null_cipher_zuc_test_case_1(void)
7890 {
7891 	return test_mixed_auth_cipher(
7892 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7893 }
7894 
7895 static int
7896 test_verify_auth_null_cipher_zuc_test_case_1(void)
7897 {
7898 	return test_mixed_auth_cipher(
7899 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7900 }
7901 
7902 static int
7903 test_auth_snow_cipher_null_test_case_1(void)
7904 {
7905 	return test_mixed_auth_cipher(
7906 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7907 }
7908 
7909 static int
7910 test_verify_auth_snow_cipher_null_test_case_1(void)
7911 {
7912 	return test_mixed_auth_cipher(
7913 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7914 }
7915 
7916 static int
7917 test_auth_zuc_cipher_null_test_case_1(void)
7918 {
7919 	return test_mixed_auth_cipher(
7920 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7921 }
7922 
7923 static int
7924 test_verify_auth_zuc_cipher_null_test_case_1(void)
7925 {
7926 	return test_mixed_auth_cipher(
7927 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7928 }
7929 
7930 static int
7931 test_auth_null_cipher_aes_ctr_test_case_1(void)
7932 {
7933 	return test_mixed_auth_cipher(
7934 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7935 }
7936 
7937 static int
7938 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7939 {
7940 	return test_mixed_auth_cipher(
7941 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7942 }
7943 
7944 static int
7945 test_auth_aes_cmac_cipher_null_test_case_1(void)
7946 {
7947 	return test_mixed_auth_cipher(
7948 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7949 }
7950 
7951 static int
7952 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7953 {
7954 	return test_mixed_auth_cipher(
7955 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7956 }
7957 
7958 /* ***** AEAD algorithm Tests ***** */
7959 
7960 static int
7961 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7962 		enum rte_crypto_aead_operation op,
7963 		const uint8_t *key, const uint8_t key_len,
7964 		const uint16_t aad_len, const uint8_t auth_len,
7965 		uint8_t iv_len)
7966 {
7967 	uint8_t aead_key[key_len];
7968 
7969 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7970 	struct crypto_unittest_params *ut_params = &unittest_params;
7971 
7972 	memcpy(aead_key, key, key_len);
7973 
7974 	/* Setup AEAD Parameters */
7975 	ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7976 	ut_params->aead_xform.next = NULL;
7977 	ut_params->aead_xform.aead.algo = algo;
7978 	ut_params->aead_xform.aead.op = op;
7979 	ut_params->aead_xform.aead.key.data = aead_key;
7980 	ut_params->aead_xform.aead.key.length = key_len;
7981 	ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7982 	ut_params->aead_xform.aead.iv.length = iv_len;
7983 	ut_params->aead_xform.aead.digest_length = auth_len;
7984 	ut_params->aead_xform.aead.aad_length = aad_len;
7985 
7986 	debug_hexdump(stdout, "key:", key, key_len);
7987 
7988 	/* Create Crypto session*/
7989 	ut_params->sess = rte_cryptodev_sym_session_create(
7990 			ts_params->session_mpool);
7991 
7992 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7993 			&ut_params->aead_xform,
7994 			ts_params->session_priv_mpool);
7995 
7996 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7997 
7998 	return 0;
7999 }
8000 
8001 static int
8002 create_aead_xform(struct rte_crypto_op *op,
8003 		enum rte_crypto_aead_algorithm algo,
8004 		enum rte_crypto_aead_operation aead_op,
8005 		uint8_t *key, const uint8_t key_len,
8006 		const uint8_t aad_len, const uint8_t auth_len,
8007 		uint8_t iv_len)
8008 {
8009 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
8010 			"failed to allocate space for crypto transform");
8011 
8012 	struct rte_crypto_sym_op *sym_op = op->sym;
8013 
8014 	/* Setup AEAD Parameters */
8015 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
8016 	sym_op->xform->next = NULL;
8017 	sym_op->xform->aead.algo = algo;
8018 	sym_op->xform->aead.op = aead_op;
8019 	sym_op->xform->aead.key.data = key;
8020 	sym_op->xform->aead.key.length = key_len;
8021 	sym_op->xform->aead.iv.offset = IV_OFFSET;
8022 	sym_op->xform->aead.iv.length = iv_len;
8023 	sym_op->xform->aead.digest_length = auth_len;
8024 	sym_op->xform->aead.aad_length = aad_len;
8025 
8026 	debug_hexdump(stdout, "key:", key, key_len);
8027 
8028 	return 0;
8029 }
8030 
8031 static int
8032 create_aead_operation(enum rte_crypto_aead_operation op,
8033 		const struct aead_test_data *tdata)
8034 {
8035 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8036 	struct crypto_unittest_params *ut_params = &unittest_params;
8037 
8038 	uint8_t *plaintext, *ciphertext;
8039 	unsigned int aad_pad_len, plaintext_pad_len;
8040 
8041 	/* Generate Crypto op data structure */
8042 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8043 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8044 	TEST_ASSERT_NOT_NULL(ut_params->op,
8045 			"Failed to allocate symmetric crypto operation struct");
8046 
8047 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
8048 
8049 	/* Append aad data */
8050 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
8051 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
8052 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8053 				aad_pad_len);
8054 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8055 				"no room to append aad");
8056 
8057 		sym_op->aead.aad.phys_addr =
8058 				rte_pktmbuf_iova(ut_params->ibuf);
8059 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
8060 		memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
8061 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8062 			tdata->aad.len);
8063 
8064 		/* Append IV at the end of the crypto operation*/
8065 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8066 				uint8_t *, IV_OFFSET);
8067 
8068 		/* Copy IV 1 byte after the IV pointer, according to the API */
8069 		rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
8070 		debug_hexdump(stdout, "iv:", iv_ptr,
8071 			tdata->iv.len);
8072 	} else {
8073 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
8074 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8075 				aad_pad_len);
8076 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8077 				"no room to append aad");
8078 
8079 		sym_op->aead.aad.phys_addr =
8080 				rte_pktmbuf_iova(ut_params->ibuf);
8081 		memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
8082 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8083 			tdata->aad.len);
8084 
8085 		/* Append IV at the end of the crypto operation*/
8086 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8087 				uint8_t *, IV_OFFSET);
8088 
8089 		if (tdata->iv.len == 0) {
8090 			rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
8091 			debug_hexdump(stdout, "iv:", iv_ptr,
8092 				AES_GCM_J0_LENGTH);
8093 		} else {
8094 			rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
8095 			debug_hexdump(stdout, "iv:", iv_ptr,
8096 				tdata->iv.len);
8097 		}
8098 	}
8099 
8100 	/* Append plaintext/ciphertext */
8101 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8102 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8103 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8104 				plaintext_pad_len);
8105 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
8106 
8107 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
8108 		debug_hexdump(stdout, "plaintext:", plaintext,
8109 				tdata->plaintext.len);
8110 
8111 		if (ut_params->obuf) {
8112 			ciphertext = (uint8_t *)rte_pktmbuf_append(
8113 					ut_params->obuf,
8114 					plaintext_pad_len + aad_pad_len);
8115 			TEST_ASSERT_NOT_NULL(ciphertext,
8116 					"no room to append ciphertext");
8117 
8118 			memset(ciphertext + aad_pad_len, 0,
8119 					tdata->ciphertext.len);
8120 		}
8121 	} else {
8122 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
8123 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8124 				plaintext_pad_len);
8125 		TEST_ASSERT_NOT_NULL(ciphertext,
8126 				"no room to append ciphertext");
8127 
8128 		memcpy(ciphertext, tdata->ciphertext.data,
8129 				tdata->ciphertext.len);
8130 		debug_hexdump(stdout, "ciphertext:", ciphertext,
8131 				tdata->ciphertext.len);
8132 
8133 		if (ut_params->obuf) {
8134 			plaintext = (uint8_t *)rte_pktmbuf_append(
8135 					ut_params->obuf,
8136 					plaintext_pad_len + aad_pad_len);
8137 			TEST_ASSERT_NOT_NULL(plaintext,
8138 					"no room to append plaintext");
8139 
8140 			memset(plaintext + aad_pad_len, 0,
8141 					tdata->plaintext.len);
8142 		}
8143 	}
8144 
8145 	/* Append digest data */
8146 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8147 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8148 				ut_params->obuf ? ut_params->obuf :
8149 						ut_params->ibuf,
8150 						tdata->auth_tag.len);
8151 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8152 				"no room to append digest");
8153 		memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
8154 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8155 				ut_params->obuf ? ut_params->obuf :
8156 						ut_params->ibuf,
8157 						plaintext_pad_len +
8158 						aad_pad_len);
8159 	} else {
8160 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8161 				ut_params->ibuf, tdata->auth_tag.len);
8162 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8163 				"no room to append digest");
8164 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8165 				ut_params->ibuf,
8166 				plaintext_pad_len + aad_pad_len);
8167 
8168 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
8169 			tdata->auth_tag.len);
8170 		debug_hexdump(stdout, "digest:",
8171 			sym_op->aead.digest.data,
8172 			tdata->auth_tag.len);
8173 	}
8174 
8175 	sym_op->aead.data.length = tdata->plaintext.len;
8176 	sym_op->aead.data.offset = aad_pad_len;
8177 
8178 	return 0;
8179 }
8180 
8181 static int
8182 test_authenticated_encryption(const struct aead_test_data *tdata)
8183 {
8184 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8185 	struct crypto_unittest_params *ut_params = &unittest_params;
8186 
8187 	int retval;
8188 	uint8_t *ciphertext, *auth_tag;
8189 	uint16_t plaintext_pad_len;
8190 	uint32_t i;
8191 	struct rte_cryptodev_info dev_info;
8192 
8193 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8194 	uint64_t feat_flags = dev_info.feature_flags;
8195 
8196 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8197 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8198 		printf("Device doesn't support RAW data-path APIs.\n");
8199 		return TEST_SKIPPED;
8200 	}
8201 
8202 	/* Verify the capabilities */
8203 	struct rte_cryptodev_sym_capability_idx cap_idx;
8204 	const struct rte_cryptodev_symmetric_capability *capability;
8205 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8206 	cap_idx.algo.aead = tdata->algo;
8207 	capability = rte_cryptodev_sym_capability_get(
8208 			ts_params->valid_devs[0], &cap_idx);
8209 	if (capability == NULL)
8210 		return TEST_SKIPPED;
8211 	if (rte_cryptodev_sym_capability_check_aead(
8212 			capability, tdata->key.len, tdata->auth_tag.len,
8213 			tdata->aad.len, tdata->iv.len))
8214 		return TEST_SKIPPED;
8215 
8216 	/* Create AEAD session */
8217 	retval = create_aead_session(ts_params->valid_devs[0],
8218 			tdata->algo,
8219 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
8220 			tdata->key.data, tdata->key.len,
8221 			tdata->aad.len, tdata->auth_tag.len,
8222 			tdata->iv.len);
8223 	if (retval < 0)
8224 		return retval;
8225 
8226 	if (tdata->aad.len > MBUF_SIZE) {
8227 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8228 		/* Populate full size of add data */
8229 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8230 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8231 	} else
8232 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8233 
8234 	/* clear mbuf payload */
8235 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8236 			rte_pktmbuf_tailroom(ut_params->ibuf));
8237 
8238 	/* Create AEAD operation */
8239 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8240 	if (retval < 0)
8241 		return retval;
8242 
8243 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8244 
8245 	ut_params->op->sym->m_src = ut_params->ibuf;
8246 
8247 	/* Process crypto operation */
8248 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8249 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8250 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8251 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8252 				ut_params->op, 0, 0, 0, 0);
8253 	else
8254 		TEST_ASSERT_NOT_NULL(
8255 			process_crypto_request(ts_params->valid_devs[0],
8256 			ut_params->op), "failed to process sym crypto op");
8257 
8258 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8259 			"crypto op processing failed");
8260 
8261 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8262 
8263 	if (ut_params->op->sym->m_dst) {
8264 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8265 				uint8_t *);
8266 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8267 				uint8_t *, plaintext_pad_len);
8268 	} else {
8269 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8270 				uint8_t *,
8271 				ut_params->op->sym->cipher.data.offset);
8272 		auth_tag = ciphertext + plaintext_pad_len;
8273 	}
8274 
8275 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8276 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8277 
8278 	/* Validate obuf */
8279 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8280 			ciphertext,
8281 			tdata->ciphertext.data,
8282 			tdata->ciphertext.len,
8283 			"Ciphertext data not as expected");
8284 
8285 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8286 			auth_tag,
8287 			tdata->auth_tag.data,
8288 			tdata->auth_tag.len,
8289 			"Generated auth tag not as expected");
8290 
8291 	return 0;
8292 
8293 }
8294 
8295 #ifdef RTE_LIB_SECURITY
8296 static int
8297 security_proto_supported(enum rte_security_session_action_type action,
8298 	enum rte_security_session_protocol proto)
8299 {
8300 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8301 
8302 	const struct rte_security_capability *capabilities;
8303 	const struct rte_security_capability *capability;
8304 	uint16_t i = 0;
8305 
8306 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8307 				rte_cryptodev_get_sec_ctx(
8308 				ts_params->valid_devs[0]);
8309 
8310 
8311 	capabilities = rte_security_capabilities_get(ctx);
8312 
8313 	if (capabilities == NULL)
8314 		return -ENOTSUP;
8315 
8316 	while ((capability = &capabilities[i++])->action !=
8317 			RTE_SECURITY_ACTION_TYPE_NONE) {
8318 		if (capability->action == action &&
8319 				capability->protocol == proto)
8320 			return 0;
8321 	}
8322 
8323 	return -ENOTSUP;
8324 }
8325 
8326 /* Basic algorithm run function for async inplace mode.
8327  * Creates a session from input parameters and runs one operation
8328  * on input_vec. Checks the output of the crypto operation against
8329  * output_vec.
8330  */
8331 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8332 			   enum rte_crypto_auth_operation opa,
8333 			   const uint8_t *input_vec, unsigned int input_vec_len,
8334 			   const uint8_t *output_vec,
8335 			   unsigned int output_vec_len,
8336 			   enum rte_crypto_cipher_algorithm cipher_alg,
8337 			   const uint8_t *cipher_key, uint32_t cipher_key_len,
8338 			   enum rte_crypto_auth_algorithm auth_alg,
8339 			   const uint8_t *auth_key, uint32_t auth_key_len,
8340 			   uint8_t bearer, enum rte_security_pdcp_domain domain,
8341 			   uint8_t packet_direction, uint8_t sn_size,
8342 			   uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8343 {
8344 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8345 	struct crypto_unittest_params *ut_params = &unittest_params;
8346 	uint8_t *plaintext;
8347 	int ret = TEST_SUCCESS;
8348 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8349 				rte_cryptodev_get_sec_ctx(
8350 				ts_params->valid_devs[0]);
8351 
8352 	/* Verify the capabilities */
8353 	struct rte_security_capability_idx sec_cap_idx;
8354 
8355 	sec_cap_idx.action = ut_params->type;
8356 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8357 	sec_cap_idx.pdcp.domain = domain;
8358 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8359 		return TEST_SKIPPED;
8360 
8361 	/* Generate test mbuf data */
8362 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8363 
8364 	/* clear mbuf payload */
8365 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8366 			rte_pktmbuf_tailroom(ut_params->ibuf));
8367 
8368 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8369 						  input_vec_len);
8370 	memcpy(plaintext, input_vec, input_vec_len);
8371 
8372 	/* Out of place support */
8373 	if (oop) {
8374 		/*
8375 		 * For out-op-place we need to alloc another mbuf
8376 		 */
8377 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8378 		rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8379 	}
8380 
8381 	/* Setup Cipher Parameters */
8382 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8383 	ut_params->cipher_xform.cipher.algo = cipher_alg;
8384 	ut_params->cipher_xform.cipher.op = opc;
8385 	ut_params->cipher_xform.cipher.key.data = cipher_key;
8386 	ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8387 	ut_params->cipher_xform.cipher.iv.length =
8388 				packet_direction ? 4 : 0;
8389 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8390 
8391 	/* Setup HMAC Parameters if ICV header is required */
8392 	if (auth_alg != 0) {
8393 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8394 		ut_params->auth_xform.next = NULL;
8395 		ut_params->auth_xform.auth.algo = auth_alg;
8396 		ut_params->auth_xform.auth.op = opa;
8397 		ut_params->auth_xform.auth.key.data = auth_key;
8398 		ut_params->auth_xform.auth.key.length = auth_key_len;
8399 
8400 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8401 	} else {
8402 		ut_params->cipher_xform.next = NULL;
8403 	}
8404 
8405 	struct rte_security_session_conf sess_conf = {
8406 		.action_type = ut_params->type,
8407 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8408 		{.pdcp = {
8409 			.bearer = bearer,
8410 			.domain = domain,
8411 			.pkt_dir = packet_direction,
8412 			.sn_size = sn_size,
8413 			.hfn = packet_direction ? 0 : hfn,
8414 			/**
8415 			 * hfn can be set as pdcp_test_hfn[i]
8416 			 * if hfn_ovrd is not set. Here, PDCP
8417 			 * packet direction is just used to
8418 			 * run half of the cases with session
8419 			 * HFN and other half with per packet
8420 			 * HFN.
8421 			 */
8422 			.hfn_threshold = hfn_threshold,
8423 			.hfn_ovrd = packet_direction ? 1 : 0,
8424 			.sdap_enabled = sdap,
8425 		} },
8426 		.crypto_xform = &ut_params->cipher_xform
8427 	};
8428 
8429 	/* Create security session */
8430 	ut_params->sec_session = rte_security_session_create(ctx,
8431 				&sess_conf, ts_params->session_mpool,
8432 				ts_params->session_priv_mpool);
8433 
8434 	if (!ut_params->sec_session) {
8435 		printf("TestCase %s()-%d line %d failed %s: ",
8436 			__func__, i, __LINE__, "Failed to allocate session");
8437 		ret = TEST_FAILED;
8438 		goto on_err;
8439 	}
8440 
8441 	/* Generate crypto op data structure */
8442 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8443 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8444 	if (!ut_params->op) {
8445 		printf("TestCase %s()-%d line %d failed %s: ",
8446 			__func__, i, __LINE__,
8447 			"Failed to allocate symmetric crypto operation struct");
8448 		ret = TEST_FAILED;
8449 		goto on_err;
8450 	}
8451 
8452 	uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8453 					uint32_t *, IV_OFFSET);
8454 	*per_pkt_hfn = packet_direction ? hfn : 0;
8455 
8456 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8457 
8458 	/* set crypto operation source mbuf */
8459 	ut_params->op->sym->m_src = ut_params->ibuf;
8460 	if (oop)
8461 		ut_params->op->sym->m_dst = ut_params->obuf;
8462 
8463 	/* Process crypto operation */
8464 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8465 		== NULL) {
8466 		printf("TestCase %s()-%d line %d failed %s: ",
8467 			__func__, i, __LINE__,
8468 			"failed to process sym crypto op");
8469 		ret = TEST_FAILED;
8470 		goto on_err;
8471 	}
8472 
8473 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8474 		printf("TestCase %s()-%d line %d failed %s: ",
8475 			__func__, i, __LINE__, "crypto op processing failed");
8476 		ret = TEST_FAILED;
8477 		goto on_err;
8478 	}
8479 
8480 	/* Validate obuf */
8481 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8482 			uint8_t *);
8483 	if (oop) {
8484 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8485 				uint8_t *);
8486 	}
8487 
8488 	if (memcmp(ciphertext, output_vec, output_vec_len)) {
8489 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8490 		rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8491 		rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8492 		ret = TEST_FAILED;
8493 		goto on_err;
8494 	}
8495 
8496 on_err:
8497 	rte_crypto_op_free(ut_params->op);
8498 	ut_params->op = NULL;
8499 
8500 	if (ut_params->sec_session)
8501 		rte_security_session_destroy(ctx, ut_params->sec_session);
8502 	ut_params->sec_session = NULL;
8503 
8504 	rte_pktmbuf_free(ut_params->ibuf);
8505 	ut_params->ibuf = NULL;
8506 	if (oop) {
8507 		rte_pktmbuf_free(ut_params->obuf);
8508 		ut_params->obuf = NULL;
8509 	}
8510 
8511 	return ret;
8512 }
8513 
8514 static int
8515 test_pdcp_proto_SGL(int i, int oop,
8516 	enum rte_crypto_cipher_operation opc,
8517 	enum rte_crypto_auth_operation opa,
8518 	uint8_t *input_vec,
8519 	unsigned int input_vec_len,
8520 	uint8_t *output_vec,
8521 	unsigned int output_vec_len,
8522 	uint32_t fragsz,
8523 	uint32_t fragsz_oop)
8524 {
8525 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8526 	struct crypto_unittest_params *ut_params = &unittest_params;
8527 	uint8_t *plaintext;
8528 	struct rte_mbuf *buf, *buf_oop = NULL;
8529 	int ret = TEST_SUCCESS;
8530 	int to_trn = 0;
8531 	int to_trn_tbl[16];
8532 	int segs = 1;
8533 	unsigned int trn_data = 0;
8534 	struct rte_cryptodev_info dev_info;
8535 	uint64_t feat_flags;
8536 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8537 				rte_cryptodev_get_sec_ctx(
8538 				ts_params->valid_devs[0]);
8539 	struct rte_mbuf *temp_mbuf;
8540 
8541 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8542 	feat_flags = dev_info.feature_flags;
8543 
8544 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8545 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8546 		printf("Device does not support RAW data-path APIs.\n");
8547 		return -ENOTSUP;
8548 	}
8549 	/* Verify the capabilities */
8550 	struct rte_security_capability_idx sec_cap_idx;
8551 
8552 	sec_cap_idx.action = ut_params->type;
8553 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8554 	sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8555 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8556 		return TEST_SKIPPED;
8557 
8558 	if (fragsz > input_vec_len)
8559 		fragsz = input_vec_len;
8560 
8561 	uint16_t plaintext_len = fragsz;
8562 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8563 
8564 	if (fragsz_oop > output_vec_len)
8565 		frag_size_oop = output_vec_len;
8566 
8567 	int ecx = 0;
8568 	if (input_vec_len % fragsz != 0) {
8569 		if (input_vec_len / fragsz + 1 > 16)
8570 			return 1;
8571 	} else if (input_vec_len / fragsz > 16)
8572 		return 1;
8573 
8574 	/* Out of place support */
8575 	if (oop) {
8576 		/*
8577 		 * For out-op-place we need to alloc another mbuf
8578 		 */
8579 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8580 		rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8581 		buf_oop = ut_params->obuf;
8582 	}
8583 
8584 	/* Generate test mbuf data */
8585 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8586 
8587 	/* clear mbuf payload */
8588 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8589 			rte_pktmbuf_tailroom(ut_params->ibuf));
8590 
8591 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8592 						  plaintext_len);
8593 	memcpy(plaintext, input_vec, plaintext_len);
8594 	trn_data += plaintext_len;
8595 
8596 	buf = ut_params->ibuf;
8597 
8598 	/*
8599 	 * Loop until no more fragments
8600 	 */
8601 
8602 	while (trn_data < input_vec_len) {
8603 		++segs;
8604 		to_trn = (input_vec_len - trn_data < fragsz) ?
8605 				(input_vec_len - trn_data) : fragsz;
8606 
8607 		to_trn_tbl[ecx++] = to_trn;
8608 
8609 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8610 		buf = buf->next;
8611 
8612 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8613 				rte_pktmbuf_tailroom(buf));
8614 
8615 		/* OOP */
8616 		if (oop && !fragsz_oop) {
8617 			buf_oop->next =
8618 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
8619 			buf_oop = buf_oop->next;
8620 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8621 					0, rte_pktmbuf_tailroom(buf_oop));
8622 			rte_pktmbuf_append(buf_oop, to_trn);
8623 		}
8624 
8625 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8626 				to_trn);
8627 
8628 		memcpy(plaintext, input_vec + trn_data, to_trn);
8629 		trn_data += to_trn;
8630 	}
8631 
8632 	ut_params->ibuf->nb_segs = segs;
8633 
8634 	segs = 1;
8635 	if (fragsz_oop && oop) {
8636 		to_trn = 0;
8637 		ecx = 0;
8638 
8639 		trn_data = frag_size_oop;
8640 		while (trn_data < output_vec_len) {
8641 			++segs;
8642 			to_trn =
8643 				(output_vec_len - trn_data <
8644 						frag_size_oop) ?
8645 				(output_vec_len - trn_data) :
8646 						frag_size_oop;
8647 
8648 			to_trn_tbl[ecx++] = to_trn;
8649 
8650 			buf_oop->next =
8651 				rte_pktmbuf_alloc(ts_params->mbuf_pool);
8652 			buf_oop = buf_oop->next;
8653 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8654 					0, rte_pktmbuf_tailroom(buf_oop));
8655 			rte_pktmbuf_append(buf_oop, to_trn);
8656 
8657 			trn_data += to_trn;
8658 		}
8659 		ut_params->obuf->nb_segs = segs;
8660 	}
8661 
8662 	/* Setup Cipher Parameters */
8663 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8664 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8665 	ut_params->cipher_xform.cipher.op = opc;
8666 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8667 	ut_params->cipher_xform.cipher.key.length =
8668 					pdcp_test_params[i].cipher_key_len;
8669 	ut_params->cipher_xform.cipher.iv.length = 0;
8670 
8671 	/* Setup HMAC Parameters if ICV header is required */
8672 	if (pdcp_test_params[i].auth_alg != 0) {
8673 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8674 		ut_params->auth_xform.next = NULL;
8675 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8676 		ut_params->auth_xform.auth.op = opa;
8677 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8678 		ut_params->auth_xform.auth.key.length =
8679 					pdcp_test_params[i].auth_key_len;
8680 
8681 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8682 	} else {
8683 		ut_params->cipher_xform.next = NULL;
8684 	}
8685 
8686 	struct rte_security_session_conf sess_conf = {
8687 		.action_type = ut_params->type,
8688 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8689 		{.pdcp = {
8690 			.bearer = pdcp_test_bearer[i],
8691 			.domain = pdcp_test_params[i].domain,
8692 			.pkt_dir = pdcp_test_packet_direction[i],
8693 			.sn_size = pdcp_test_data_sn_size[i],
8694 			.hfn = pdcp_test_hfn[i],
8695 			.hfn_threshold = pdcp_test_hfn_threshold[i],
8696 			.hfn_ovrd = 0,
8697 		} },
8698 		.crypto_xform = &ut_params->cipher_xform
8699 	};
8700 
8701 	/* Create security session */
8702 	ut_params->sec_session = rte_security_session_create(ctx,
8703 				&sess_conf, ts_params->session_mpool,
8704 				ts_params->session_priv_mpool);
8705 
8706 	if (!ut_params->sec_session) {
8707 		printf("TestCase %s()-%d line %d failed %s: ",
8708 			__func__, i, __LINE__, "Failed to allocate session");
8709 		ret = TEST_FAILED;
8710 		goto on_err;
8711 	}
8712 
8713 	/* Generate crypto op data structure */
8714 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8715 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8716 	if (!ut_params->op) {
8717 		printf("TestCase %s()-%d line %d failed %s: ",
8718 			__func__, i, __LINE__,
8719 			"Failed to allocate symmetric crypto operation struct");
8720 		ret = TEST_FAILED;
8721 		goto on_err;
8722 	}
8723 
8724 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8725 
8726 	/* set crypto operation source mbuf */
8727 	ut_params->op->sym->m_src = ut_params->ibuf;
8728 	if (oop)
8729 		ut_params->op->sym->m_dst = ut_params->obuf;
8730 
8731 	/* Process crypto operation */
8732 	temp_mbuf = ut_params->op->sym->m_src;
8733 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
8734 		/* filling lengths */
8735 		while (temp_mbuf) {
8736 			ut_params->op->sym->cipher.data.length
8737 				+= temp_mbuf->pkt_len;
8738 			ut_params->op->sym->auth.data.length
8739 				+= temp_mbuf->pkt_len;
8740 			temp_mbuf = temp_mbuf->next;
8741 		}
8742 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8743 			ut_params->op, 1, 1, 0, 0);
8744 	} else {
8745 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
8746 							ut_params->op);
8747 	}
8748 	if (ut_params->op == NULL) {
8749 		printf("TestCase %s()-%d line %d failed %s: ",
8750 			__func__, i, __LINE__,
8751 			"failed to process sym crypto op");
8752 		ret = TEST_FAILED;
8753 		goto on_err;
8754 	}
8755 
8756 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8757 		printf("TestCase %s()-%d line %d failed %s: ",
8758 			__func__, i, __LINE__, "crypto op processing failed");
8759 		ret = TEST_FAILED;
8760 		goto on_err;
8761 	}
8762 
8763 	/* Validate obuf */
8764 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8765 			uint8_t *);
8766 	if (oop) {
8767 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8768 				uint8_t *);
8769 	}
8770 	if (fragsz_oop)
8771 		fragsz = frag_size_oop;
8772 	if (memcmp(ciphertext, output_vec, fragsz)) {
8773 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8774 		rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8775 		rte_hexdump(stdout, "reference", output_vec, fragsz);
8776 		ret = TEST_FAILED;
8777 		goto on_err;
8778 	}
8779 
8780 	buf = ut_params->op->sym->m_src->next;
8781 	if (oop)
8782 		buf = ut_params->op->sym->m_dst->next;
8783 
8784 	unsigned int off = fragsz;
8785 
8786 	ecx = 0;
8787 	while (buf) {
8788 		ciphertext = rte_pktmbuf_mtod(buf,
8789 				uint8_t *);
8790 		if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8791 			printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8792 			rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8793 			rte_hexdump(stdout, "reference", output_vec + off,
8794 					to_trn_tbl[ecx]);
8795 			ret = TEST_FAILED;
8796 			goto on_err;
8797 		}
8798 		off += to_trn_tbl[ecx++];
8799 		buf = buf->next;
8800 	}
8801 on_err:
8802 	rte_crypto_op_free(ut_params->op);
8803 	ut_params->op = NULL;
8804 
8805 	if (ut_params->sec_session)
8806 		rte_security_session_destroy(ctx, ut_params->sec_session);
8807 	ut_params->sec_session = NULL;
8808 
8809 	rte_pktmbuf_free(ut_params->ibuf);
8810 	ut_params->ibuf = NULL;
8811 	if (oop) {
8812 		rte_pktmbuf_free(ut_params->obuf);
8813 		ut_params->obuf = NULL;
8814 	}
8815 
8816 	return ret;
8817 }
8818 
8819 int
8820 test_pdcp_proto_cplane_encap(int i)
8821 {
8822 	return test_pdcp_proto(
8823 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8824 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8825 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8826 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8827 		pdcp_test_params[i].cipher_key_len,
8828 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8829 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8830 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8831 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8832 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8833 }
8834 
8835 int
8836 test_pdcp_proto_uplane_encap(int i)
8837 {
8838 	return test_pdcp_proto(
8839 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8840 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8841 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8842 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8843 		pdcp_test_params[i].cipher_key_len,
8844 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8845 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8846 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8847 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8848 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8849 }
8850 
8851 int
8852 test_pdcp_proto_uplane_encap_with_int(int i)
8853 {
8854 	return test_pdcp_proto(
8855 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8856 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8857 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8858 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8859 		pdcp_test_params[i].cipher_key_len,
8860 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8861 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8862 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8863 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8864 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8865 }
8866 
8867 int
8868 test_pdcp_proto_cplane_decap(int i)
8869 {
8870 	return test_pdcp_proto(
8871 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8872 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8873 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8874 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8875 		pdcp_test_params[i].cipher_key_len,
8876 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8877 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8878 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8879 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8880 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8881 }
8882 
8883 int
8884 test_pdcp_proto_uplane_decap(int i)
8885 {
8886 	return test_pdcp_proto(
8887 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8888 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8889 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8890 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8891 		pdcp_test_params[i].cipher_key_len,
8892 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8893 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8894 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8895 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8896 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8897 }
8898 
8899 int
8900 test_pdcp_proto_uplane_decap_with_int(int i)
8901 {
8902 	return test_pdcp_proto(
8903 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8904 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8905 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8906 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8907 		pdcp_test_params[i].cipher_key_len,
8908 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8909 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8910 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8911 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8912 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8913 }
8914 
8915 static int
8916 test_PDCP_PROTO_SGL_in_place_32B(void)
8917 {
8918 	/* i can be used for running any PDCP case
8919 	 * In this case it is uplane 12-bit AES-SNOW DL encap
8920 	 */
8921 	int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8922 	return test_pdcp_proto_SGL(i, IN_PLACE,
8923 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8924 			RTE_CRYPTO_AUTH_OP_GENERATE,
8925 			pdcp_test_data_in[i],
8926 			pdcp_test_data_in_len[i],
8927 			pdcp_test_data_out[i],
8928 			pdcp_test_data_in_len[i]+4,
8929 			32, 0);
8930 }
8931 static int
8932 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8933 {
8934 	/* i can be used for running any PDCP case
8935 	 * In this case it is uplane 18-bit NULL-NULL DL encap
8936 	 */
8937 	int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8938 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8939 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8940 			RTE_CRYPTO_AUTH_OP_GENERATE,
8941 			pdcp_test_data_in[i],
8942 			pdcp_test_data_in_len[i],
8943 			pdcp_test_data_out[i],
8944 			pdcp_test_data_in_len[i]+4,
8945 			32, 128);
8946 }
8947 static int
8948 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8949 {
8950 	/* i can be used for running any PDCP case
8951 	 * In this case it is uplane 18-bit AES DL encap
8952 	 */
8953 	int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8954 			+ DOWNLINK;
8955 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8956 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8957 			RTE_CRYPTO_AUTH_OP_GENERATE,
8958 			pdcp_test_data_in[i],
8959 			pdcp_test_data_in_len[i],
8960 			pdcp_test_data_out[i],
8961 			pdcp_test_data_in_len[i],
8962 			32, 40);
8963 }
8964 static int
8965 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8966 {
8967 	/* i can be used for running any PDCP case
8968 	 * In this case it is cplane 12-bit AES-ZUC DL encap
8969 	 */
8970 	int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8971 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8972 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8973 			RTE_CRYPTO_AUTH_OP_GENERATE,
8974 			pdcp_test_data_in[i],
8975 			pdcp_test_data_in_len[i],
8976 			pdcp_test_data_out[i],
8977 			pdcp_test_data_in_len[i]+4,
8978 			128, 32);
8979 }
8980 
8981 static int
8982 test_PDCP_SDAP_PROTO_encap_all(void)
8983 {
8984 	int i = 0, size = 0;
8985 	int err, all_err = TEST_SUCCESS;
8986 	const struct pdcp_sdap_test *cur_test;
8987 
8988 	size = RTE_DIM(list_pdcp_sdap_tests);
8989 
8990 	for (i = 0; i < size; i++) {
8991 		cur_test = &list_pdcp_sdap_tests[i];
8992 		err = test_pdcp_proto(
8993 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8994 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8995 			cur_test->in_len, cur_test->data_out,
8996 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8997 			cur_test->param.cipher_alg, cur_test->cipher_key,
8998 			cur_test->param.cipher_key_len,
8999 			cur_test->param.auth_alg,
9000 			cur_test->auth_key, cur_test->param.auth_key_len,
9001 			cur_test->bearer, cur_test->param.domain,
9002 			cur_test->packet_direction, cur_test->sn_size,
9003 			cur_test->hfn,
9004 			cur_test->hfn_threshold, SDAP_ENABLED);
9005 		if (err) {
9006 			printf("\t%d) %s: Encapsulation failed\n",
9007 					cur_test->test_idx,
9008 					cur_test->param.name);
9009 			err = TEST_FAILED;
9010 		} else {
9011 			printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
9012 					cur_test->param.name);
9013 			err = TEST_SUCCESS;
9014 		}
9015 		all_err += err;
9016 	}
9017 
9018 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9019 
9020 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9021 }
9022 
9023 static int
9024 test_PDCP_PROTO_short_mac(void)
9025 {
9026 	int i = 0, size = 0;
9027 	int err, all_err = TEST_SUCCESS;
9028 	const struct pdcp_short_mac_test *cur_test;
9029 
9030 	size = RTE_DIM(list_pdcp_smac_tests);
9031 
9032 	for (i = 0; i < size; i++) {
9033 		cur_test = &list_pdcp_smac_tests[i];
9034 		err = test_pdcp_proto(
9035 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9036 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9037 			cur_test->in_len, cur_test->data_out,
9038 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9039 			RTE_CRYPTO_CIPHER_NULL, NULL,
9040 			0, cur_test->param.auth_alg,
9041 			cur_test->auth_key, cur_test->param.auth_key_len,
9042 			0, cur_test->param.domain, 0, 0,
9043 			0, 0, 0);
9044 		if (err) {
9045 			printf("\t%d) %s: Short MAC test failed\n",
9046 					cur_test->test_idx,
9047 					cur_test->param.name);
9048 			err = TEST_FAILED;
9049 		} else {
9050 			printf("\t%d) %s: Short MAC test PASS\n",
9051 					cur_test->test_idx,
9052 					cur_test->param.name);
9053 			rte_hexdump(stdout, "MAC I",
9054 				    cur_test->data_out + cur_test->in_len + 2,
9055 				    2);
9056 			err = TEST_SUCCESS;
9057 		}
9058 		all_err += err;
9059 	}
9060 
9061 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9062 
9063 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9064 
9065 }
9066 
9067 static int
9068 test_PDCP_SDAP_PROTO_decap_all(void)
9069 {
9070 	int i = 0, size = 0;
9071 	int err, all_err = TEST_SUCCESS;
9072 	const struct pdcp_sdap_test *cur_test;
9073 
9074 	size = RTE_DIM(list_pdcp_sdap_tests);
9075 
9076 	for (i = 0; i < size; i++) {
9077 		cur_test = &list_pdcp_sdap_tests[i];
9078 		err = test_pdcp_proto(
9079 			i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
9080 			RTE_CRYPTO_AUTH_OP_VERIFY,
9081 			cur_test->data_out,
9082 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9083 			cur_test->data_in, cur_test->in_len,
9084 			cur_test->param.cipher_alg,
9085 			cur_test->cipher_key, cur_test->param.cipher_key_len,
9086 			cur_test->param.auth_alg, cur_test->auth_key,
9087 			cur_test->param.auth_key_len, cur_test->bearer,
9088 			cur_test->param.domain, cur_test->packet_direction,
9089 			cur_test->sn_size, cur_test->hfn,
9090 			cur_test->hfn_threshold, SDAP_ENABLED);
9091 		if (err) {
9092 			printf("\t%d) %s: Decapsulation failed\n",
9093 					cur_test->test_idx,
9094 					cur_test->param.name);
9095 			err = TEST_FAILED;
9096 		} else {
9097 			printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
9098 					cur_test->param.name);
9099 			err = TEST_SUCCESS;
9100 		}
9101 		all_err += err;
9102 	}
9103 
9104 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9105 
9106 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9107 }
9108 
9109 static int
9110 test_ipsec_proto_process(const struct ipsec_test_data td[],
9111 			 struct ipsec_test_data res_d[],
9112 			 int nb_td,
9113 			 bool silent,
9114 			 const struct ipsec_test_flags *flags)
9115 {
9116 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9117 	struct crypto_unittest_params *ut_params = &unittest_params;
9118 	struct rte_security_capability_idx sec_cap_idx;
9119 	const struct rte_security_capability *sec_cap;
9120 	struct rte_security_ipsec_xform ipsec_xform;
9121 	uint8_t dev_id = ts_params->valid_devs[0];
9122 	enum rte_security_ipsec_sa_direction dir;
9123 	struct ipsec_test_data *res_d_tmp = NULL;
9124 	uint32_t src = RTE_IPV4(192, 168, 1, 0);
9125 	uint32_t dst = RTE_IPV4(192, 168, 1, 1);
9126 	int salt_len, i, ret = TEST_SUCCESS;
9127 	struct rte_security_ctx *ctx;
9128 	uint8_t *input_text;
9129 	uint32_t verify;
9130 
9131 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9132 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9133 
9134 	/* Use first test data to create session */
9135 
9136 	/* Copy IPsec xform */
9137 	memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform));
9138 
9139 	dir = ipsec_xform.direction;
9140 	verify = flags->tunnel_hdr_verify;
9141 
9142 	if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) {
9143 		if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR)
9144 			src += 1;
9145 		else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR)
9146 			dst += 1;
9147 	}
9148 
9149 	memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src, sizeof(src));
9150 	memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst, sizeof(dst));
9151 
9152 	ctx = rte_cryptodev_get_sec_ctx(dev_id);
9153 
9154 	sec_cap_idx.action = ut_params->type;
9155 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
9156 	sec_cap_idx.ipsec.proto = ipsec_xform.proto;
9157 	sec_cap_idx.ipsec.mode = ipsec_xform.mode;
9158 	sec_cap_idx.ipsec.direction = ipsec_xform.direction;
9159 
9160 	if (flags->udp_encap)
9161 		ipsec_xform.options.udp_encap = 1;
9162 
9163 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9164 	if (sec_cap == NULL)
9165 		return TEST_SKIPPED;
9166 
9167 	/* Copy cipher session parameters */
9168 	if (td[0].aead) {
9169 		memcpy(&ut_params->aead_xform, &td[0].xform.aead,
9170 		       sizeof(ut_params->aead_xform));
9171 		ut_params->aead_xform.aead.key.data = td[0].key.data;
9172 		ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
9173 
9174 		/* Verify crypto capabilities */
9175 		if (test_ipsec_crypto_caps_aead_verify(
9176 				sec_cap,
9177 				&ut_params->aead_xform) != 0) {
9178 			if (!silent)
9179 				RTE_LOG(INFO, USER1,
9180 					"Crypto capabilities not supported\n");
9181 			return TEST_SKIPPED;
9182 		}
9183 	} else {
9184 		/* Only AEAD supported now */
9185 		return TEST_SKIPPED;
9186 	}
9187 
9188 	if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
9189 		return TEST_SKIPPED;
9190 
9191 	salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
9192 	memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
9193 
9194 	struct rte_security_session_conf sess_conf = {
9195 		.action_type = ut_params->type,
9196 		.protocol = RTE_SECURITY_PROTOCOL_IPSEC,
9197 		.ipsec = ipsec_xform,
9198 		.crypto_xform = &ut_params->aead_xform,
9199 	};
9200 
9201 	/* Create security session */
9202 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9203 					ts_params->session_mpool,
9204 					ts_params->session_priv_mpool);
9205 
9206 	if (ut_params->sec_session == NULL)
9207 		return TEST_SKIPPED;
9208 
9209 	for (i = 0; i < nb_td; i++) {
9210 		/* Setup source mbuf payload */
9211 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9212 		memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9213 				rte_pktmbuf_tailroom(ut_params->ibuf));
9214 
9215 		input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9216 				td[i].input_text.len);
9217 
9218 		memcpy(input_text, td[i].input_text.data,
9219 		       td[i].input_text.len);
9220 
9221 		/* Generate crypto op data structure */
9222 		ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9223 					RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9224 		if (!ut_params->op) {
9225 			printf("TestCase %s line %d: %s\n",
9226 				__func__, __LINE__,
9227 				"failed to allocate crypto op");
9228 			ret = TEST_FAILED;
9229 			goto crypto_op_free;
9230 		}
9231 
9232 		/* Attach session to operation */
9233 		rte_security_attach_session(ut_params->op,
9234 					    ut_params->sec_session);
9235 
9236 		/* Set crypto operation mbufs */
9237 		ut_params->op->sym->m_src = ut_params->ibuf;
9238 		ut_params->op->sym->m_dst = NULL;
9239 
9240 		/* Copy IV in crypto operation when IV generation is disabled */
9241 		if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
9242 		    ipsec_xform.options.iv_gen_disable == 1) {
9243 			uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
9244 								uint8_t *,
9245 								IV_OFFSET);
9246 			int len;
9247 
9248 			if (td[i].aead)
9249 				len = td[i].xform.aead.aead.iv.length;
9250 			else
9251 				len = td[i].xform.chain.cipher.cipher.iv.length;
9252 
9253 			memcpy(iv, td[i].iv.data, len);
9254 		}
9255 
9256 		/* Process crypto operation */
9257 		process_crypto_request(dev_id, ut_params->op);
9258 
9259 		ret = test_ipsec_status_check(ut_params->op, flags, dir, i + 1);
9260 		if (ret != TEST_SUCCESS)
9261 			goto crypto_op_free;
9262 
9263 		if (res_d != NULL)
9264 			res_d_tmp = &res_d[i];
9265 
9266 		ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
9267 					      res_d_tmp, silent, flags);
9268 		if (ret != TEST_SUCCESS)
9269 			goto crypto_op_free;
9270 
9271 		rte_crypto_op_free(ut_params->op);
9272 		ut_params->op = NULL;
9273 
9274 		rte_pktmbuf_free(ut_params->ibuf);
9275 		ut_params->ibuf = NULL;
9276 	}
9277 
9278 crypto_op_free:
9279 	rte_crypto_op_free(ut_params->op);
9280 	ut_params->op = NULL;
9281 
9282 	rte_pktmbuf_free(ut_params->ibuf);
9283 	ut_params->ibuf = NULL;
9284 
9285 	if (ut_params->sec_session)
9286 		rte_security_session_destroy(ctx, ut_params->sec_session);
9287 	ut_params->sec_session = NULL;
9288 
9289 	return ret;
9290 }
9291 
9292 static int
9293 test_ipsec_proto_known_vec(const void *test_data)
9294 {
9295 	struct ipsec_test_data td_outb;
9296 	struct ipsec_test_flags flags;
9297 
9298 	memset(&flags, 0, sizeof(flags));
9299 
9300 	memcpy(&td_outb, test_data, sizeof(td_outb));
9301 
9302 	/* Disable IV gen to be able to test with known vectors */
9303 	td_outb.ipsec_xform.options.iv_gen_disable = 1;
9304 
9305 	return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9306 }
9307 
9308 static int
9309 test_ipsec_proto_known_vec_inb(const void *td_outb)
9310 {
9311 	struct ipsec_test_flags flags;
9312 	struct ipsec_test_data td_inb;
9313 
9314 	memset(&flags, 0, sizeof(flags));
9315 
9316 	test_ipsec_td_in_from_out(td_outb, &td_inb);
9317 
9318 	return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
9319 }
9320 
9321 static int
9322 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
9323 {
9324 	struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9325 	struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9326 	unsigned int i, nb_pkts = 1, pass_cnt = 0;
9327 	int ret;
9328 
9329 	if (flags->iv_gen ||
9330 	    flags->sa_expiry_pkts_soft ||
9331 	    flags->sa_expiry_pkts_hard)
9332 		nb_pkts = IPSEC_TEST_PACKETS_MAX;
9333 
9334 	for (i = 0; i < RTE_DIM(aead_list); i++) {
9335 		test_ipsec_td_prepare(&aead_list[i],
9336 				      NULL,
9337 				      flags,
9338 				      td_outb,
9339 				      nb_pkts);
9340 
9341 		ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9342 					       flags);
9343 		if (ret == TEST_SKIPPED)
9344 			continue;
9345 
9346 		if (ret == TEST_FAILED)
9347 			return TEST_FAILED;
9348 
9349 		test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9350 
9351 		ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9352 					       flags);
9353 		if (ret == TEST_SKIPPED)
9354 			continue;
9355 
9356 		if (ret == TEST_FAILED)
9357 			return TEST_FAILED;
9358 
9359 		if (flags->display_alg)
9360 			test_ipsec_display_alg(&aead_list[i], NULL);
9361 
9362 		pass_cnt++;
9363 	}
9364 
9365 	if (pass_cnt > 0)
9366 		return TEST_SUCCESS;
9367 	else
9368 		return TEST_SKIPPED;
9369 }
9370 
9371 static int
9372 test_ipsec_proto_display_list(const void *data __rte_unused)
9373 {
9374 	struct ipsec_test_flags flags;
9375 
9376 	memset(&flags, 0, sizeof(flags));
9377 
9378 	flags.display_alg = true;
9379 
9380 	return test_ipsec_proto_all(&flags);
9381 }
9382 
9383 static int
9384 test_ipsec_proto_iv_gen(const void *data __rte_unused)
9385 {
9386 	struct ipsec_test_flags flags;
9387 
9388 	memset(&flags, 0, sizeof(flags));
9389 
9390 	flags.iv_gen = true;
9391 
9392 	return test_ipsec_proto_all(&flags);
9393 }
9394 
9395 static int
9396 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused)
9397 {
9398 	struct ipsec_test_flags flags;
9399 
9400 	memset(&flags, 0, sizeof(flags));
9401 
9402 	flags.sa_expiry_pkts_soft = true;
9403 
9404 	return test_ipsec_proto_all(&flags);
9405 }
9406 
9407 static int
9408 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused)
9409 {
9410 	struct ipsec_test_flags flags;
9411 
9412 	memset(&flags, 0, sizeof(flags));
9413 
9414 	flags.sa_expiry_pkts_hard = true;
9415 
9416 	return test_ipsec_proto_all(&flags);
9417 }
9418 
9419 static int
9420 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused)
9421 {
9422 	struct ipsec_test_flags flags;
9423 
9424 	memset(&flags, 0, sizeof(flags));
9425 
9426 	flags.icv_corrupt = true;
9427 
9428 	return test_ipsec_proto_all(&flags);
9429 }
9430 
9431 static int
9432 test_ipsec_proto_udp_encap(const void *data __rte_unused)
9433 {
9434 	struct ipsec_test_flags flags;
9435 
9436 	memset(&flags, 0, sizeof(flags));
9437 
9438 	flags.udp_encap = true;
9439 
9440 	return test_ipsec_proto_all(&flags);
9441 }
9442 
9443 static int
9444 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused)
9445 {
9446 	struct ipsec_test_flags flags;
9447 
9448 	memset(&flags, 0, sizeof(flags));
9449 
9450 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
9451 
9452 	return test_ipsec_proto_all(&flags);
9453 }
9454 
9455 static int
9456 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
9457 {
9458 	struct ipsec_test_flags flags;
9459 
9460 	memset(&flags, 0, sizeof(flags));
9461 
9462 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
9463 
9464 	return test_ipsec_proto_all(&flags);
9465 }
9466 
9467 static int
9468 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused)
9469 {
9470 	struct ipsec_test_flags flags;
9471 
9472 	memset(&flags, 0, sizeof(flags));
9473 
9474 	flags.udp_encap = true;
9475 	flags.udp_ports_verify = true;
9476 
9477 	return test_ipsec_proto_all(&flags);
9478 }
9479 
9480 static int
9481 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused)
9482 {
9483 	struct ipsec_test_flags flags;
9484 
9485 	memset(&flags, 0, sizeof(flags));
9486 
9487 	flags.ip_csum = true;
9488 
9489 	return test_ipsec_proto_all(&flags);
9490 }
9491 
9492 static int
9493 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused)
9494 {
9495 	struct ipsec_test_flags flags;
9496 
9497 	memset(&flags, 0, sizeof(flags));
9498 
9499 	flags.l4_csum = true;
9500 
9501 	return test_ipsec_proto_all(&flags);
9502 }
9503 
9504 static int
9505 test_PDCP_PROTO_all(void)
9506 {
9507 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9508 	struct crypto_unittest_params *ut_params = &unittest_params;
9509 	struct rte_cryptodev_info dev_info;
9510 	int status;
9511 
9512 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9513 	uint64_t feat_flags = dev_info.feature_flags;
9514 
9515 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9516 		return TEST_SKIPPED;
9517 
9518 	/* Set action type */
9519 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9520 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9521 		gbl_action_type;
9522 
9523 	if (security_proto_supported(ut_params->type,
9524 			RTE_SECURITY_PROTOCOL_PDCP) < 0)
9525 		return TEST_SKIPPED;
9526 
9527 	status = test_PDCP_PROTO_cplane_encap_all();
9528 	status += test_PDCP_PROTO_cplane_decap_all();
9529 	status += test_PDCP_PROTO_uplane_encap_all();
9530 	status += test_PDCP_PROTO_uplane_decap_all();
9531 	status += test_PDCP_PROTO_SGL_in_place_32B();
9532 	status += test_PDCP_PROTO_SGL_oop_32B_128B();
9533 	status += test_PDCP_PROTO_SGL_oop_32B_40B();
9534 	status += test_PDCP_PROTO_SGL_oop_128B_32B();
9535 	status += test_PDCP_SDAP_PROTO_encap_all();
9536 	status += test_PDCP_SDAP_PROTO_decap_all();
9537 	status += test_PDCP_PROTO_short_mac();
9538 
9539 	if (status)
9540 		return TEST_FAILED;
9541 	else
9542 		return TEST_SUCCESS;
9543 }
9544 
9545 static int
9546 test_docsis_proto_uplink(const void *data)
9547 {
9548 	const struct docsis_test_data *d_td = data;
9549 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9550 	struct crypto_unittest_params *ut_params = &unittest_params;
9551 	uint8_t *plaintext = NULL;
9552 	uint8_t *ciphertext = NULL;
9553 	uint8_t *iv_ptr;
9554 	int32_t cipher_len, crc_len;
9555 	uint32_t crc_data_len;
9556 	int ret = TEST_SUCCESS;
9557 
9558 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9559 					rte_cryptodev_get_sec_ctx(
9560 						ts_params->valid_devs[0]);
9561 
9562 	/* Verify the capabilities */
9563 	struct rte_security_capability_idx sec_cap_idx;
9564 	const struct rte_security_capability *sec_cap;
9565 	const struct rte_cryptodev_capabilities *crypto_cap;
9566 	const struct rte_cryptodev_symmetric_capability *sym_cap;
9567 	int j = 0;
9568 
9569 	/* Set action type */
9570 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9571 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9572 		gbl_action_type;
9573 
9574 	if (security_proto_supported(ut_params->type,
9575 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
9576 		return TEST_SKIPPED;
9577 
9578 	sec_cap_idx.action = ut_params->type;
9579 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9580 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
9581 
9582 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9583 	if (sec_cap == NULL)
9584 		return TEST_SKIPPED;
9585 
9586 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9587 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9588 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9589 				crypto_cap->sym.xform_type ==
9590 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
9591 				crypto_cap->sym.cipher.algo ==
9592 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9593 			sym_cap = &crypto_cap->sym;
9594 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9595 						d_td->key.len,
9596 						d_td->iv.len) == 0)
9597 				break;
9598 		}
9599 	}
9600 
9601 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9602 		return TEST_SKIPPED;
9603 
9604 	/* Setup source mbuf payload */
9605 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9606 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9607 			rte_pktmbuf_tailroom(ut_params->ibuf));
9608 
9609 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9610 			d_td->ciphertext.len);
9611 
9612 	memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
9613 
9614 	/* Setup cipher session parameters */
9615 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9616 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9617 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
9618 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9619 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9620 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9621 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9622 	ut_params->cipher_xform.next = NULL;
9623 
9624 	/* Setup DOCSIS session parameters */
9625 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
9626 
9627 	struct rte_security_session_conf sess_conf = {
9628 		.action_type = ut_params->type,
9629 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9630 		.docsis = ut_params->docsis_xform,
9631 		.crypto_xform = &ut_params->cipher_xform,
9632 	};
9633 
9634 	/* Create security session */
9635 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9636 					ts_params->session_mpool,
9637 					ts_params->session_priv_mpool);
9638 
9639 	if (!ut_params->sec_session) {
9640 		printf("Test function %s line %u: failed to allocate session\n",
9641 			__func__, __LINE__);
9642 		ret = TEST_FAILED;
9643 		goto on_err;
9644 	}
9645 
9646 	/* Generate crypto op data structure */
9647 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9648 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9649 	if (!ut_params->op) {
9650 		printf("Test function %s line %u: failed to allocate symmetric "
9651 			"crypto operation\n", __func__, __LINE__);
9652 		ret = TEST_FAILED;
9653 		goto on_err;
9654 	}
9655 
9656 	/* Setup CRC operation parameters */
9657 	crc_len = d_td->ciphertext.no_crc == false ?
9658 			(d_td->ciphertext.len -
9659 				d_td->ciphertext.crc_offset -
9660 				RTE_ETHER_CRC_LEN) :
9661 			0;
9662 	crc_len = crc_len > 0 ? crc_len : 0;
9663 	crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
9664 	ut_params->op->sym->auth.data.length = crc_len;
9665 	ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
9666 
9667 	/* Setup cipher operation parameters */
9668 	cipher_len = d_td->ciphertext.no_cipher == false ?
9669 			(d_td->ciphertext.len -
9670 				d_td->ciphertext.cipher_offset) :
9671 			0;
9672 	cipher_len = cipher_len > 0 ? cipher_len : 0;
9673 	ut_params->op->sym->cipher.data.length = cipher_len;
9674 	ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
9675 
9676 	/* Setup cipher IV */
9677 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9678 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9679 
9680 	/* Attach session to operation */
9681 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
9682 
9683 	/* Set crypto operation mbufs */
9684 	ut_params->op->sym->m_src = ut_params->ibuf;
9685 	ut_params->op->sym->m_dst = NULL;
9686 
9687 	/* Process crypto operation */
9688 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9689 			NULL) {
9690 		printf("Test function %s line %u: failed to process security "
9691 			"crypto op\n", __func__, __LINE__);
9692 		ret = TEST_FAILED;
9693 		goto on_err;
9694 	}
9695 
9696 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9697 		printf("Test function %s line %u: failed to process crypto op\n",
9698 			__func__, __LINE__);
9699 		ret = TEST_FAILED;
9700 		goto on_err;
9701 	}
9702 
9703 	/* Validate plaintext */
9704 	plaintext = ciphertext;
9705 
9706 	if (memcmp(plaintext, d_td->plaintext.data,
9707 			d_td->plaintext.len - crc_data_len)) {
9708 		printf("Test function %s line %u: plaintext not as expected\n",
9709 			__func__, __LINE__);
9710 		rte_hexdump(stdout, "expected", d_td->plaintext.data,
9711 				d_td->plaintext.len);
9712 		rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
9713 		ret = TEST_FAILED;
9714 		goto on_err;
9715 	}
9716 
9717 on_err:
9718 	rte_crypto_op_free(ut_params->op);
9719 	ut_params->op = NULL;
9720 
9721 	if (ut_params->sec_session)
9722 		rte_security_session_destroy(ctx, ut_params->sec_session);
9723 	ut_params->sec_session = NULL;
9724 
9725 	rte_pktmbuf_free(ut_params->ibuf);
9726 	ut_params->ibuf = NULL;
9727 
9728 	return ret;
9729 }
9730 
9731 static int
9732 test_docsis_proto_downlink(const void *data)
9733 {
9734 	const struct docsis_test_data *d_td = data;
9735 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9736 	struct crypto_unittest_params *ut_params = &unittest_params;
9737 	uint8_t *plaintext = NULL;
9738 	uint8_t *ciphertext = NULL;
9739 	uint8_t *iv_ptr;
9740 	int32_t cipher_len, crc_len;
9741 	int ret = TEST_SUCCESS;
9742 
9743 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9744 					rte_cryptodev_get_sec_ctx(
9745 						ts_params->valid_devs[0]);
9746 
9747 	/* Verify the capabilities */
9748 	struct rte_security_capability_idx sec_cap_idx;
9749 	const struct rte_security_capability *sec_cap;
9750 	const struct rte_cryptodev_capabilities *crypto_cap;
9751 	const struct rte_cryptodev_symmetric_capability *sym_cap;
9752 	int j = 0;
9753 
9754 	/* Set action type */
9755 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9756 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9757 		gbl_action_type;
9758 
9759 	if (security_proto_supported(ut_params->type,
9760 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
9761 		return TEST_SKIPPED;
9762 
9763 	sec_cap_idx.action = ut_params->type;
9764 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9765 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9766 
9767 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9768 	if (sec_cap == NULL)
9769 		return TEST_SKIPPED;
9770 
9771 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9772 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9773 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9774 				crypto_cap->sym.xform_type ==
9775 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
9776 				crypto_cap->sym.cipher.algo ==
9777 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9778 			sym_cap = &crypto_cap->sym;
9779 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9780 						d_td->key.len,
9781 						d_td->iv.len) == 0)
9782 				break;
9783 		}
9784 	}
9785 
9786 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9787 		return TEST_SKIPPED;
9788 
9789 	/* Setup source mbuf payload */
9790 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9791 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9792 			rte_pktmbuf_tailroom(ut_params->ibuf));
9793 
9794 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9795 			d_td->plaintext.len);
9796 
9797 	memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
9798 
9799 	/* Setup cipher session parameters */
9800 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9801 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9802 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9803 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9804 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9805 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9806 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9807 	ut_params->cipher_xform.next = NULL;
9808 
9809 	/* Setup DOCSIS session parameters */
9810 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9811 
9812 	struct rte_security_session_conf sess_conf = {
9813 		.action_type = ut_params->type,
9814 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9815 		.docsis = ut_params->docsis_xform,
9816 		.crypto_xform = &ut_params->cipher_xform,
9817 	};
9818 
9819 	/* Create security session */
9820 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9821 					ts_params->session_mpool,
9822 					ts_params->session_priv_mpool);
9823 
9824 	if (!ut_params->sec_session) {
9825 		printf("Test function %s line %u: failed to allocate session\n",
9826 			__func__, __LINE__);
9827 		ret = TEST_FAILED;
9828 		goto on_err;
9829 	}
9830 
9831 	/* Generate crypto op data structure */
9832 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9833 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9834 	if (!ut_params->op) {
9835 		printf("Test function %s line %u: failed to allocate symmetric "
9836 			"crypto operation\n", __func__, __LINE__);
9837 		ret = TEST_FAILED;
9838 		goto on_err;
9839 	}
9840 
9841 	/* Setup CRC operation parameters */
9842 	crc_len = d_td->plaintext.no_crc == false ?
9843 			(d_td->plaintext.len -
9844 				d_td->plaintext.crc_offset -
9845 				RTE_ETHER_CRC_LEN) :
9846 			0;
9847 	crc_len = crc_len > 0 ? crc_len : 0;
9848 	ut_params->op->sym->auth.data.length = crc_len;
9849 	ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
9850 
9851 	/* Setup cipher operation parameters */
9852 	cipher_len = d_td->plaintext.no_cipher == false ?
9853 			(d_td->plaintext.len -
9854 				d_td->plaintext.cipher_offset) :
9855 			0;
9856 	cipher_len = cipher_len > 0 ? cipher_len : 0;
9857 	ut_params->op->sym->cipher.data.length = cipher_len;
9858 	ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
9859 
9860 	/* Setup cipher IV */
9861 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9862 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9863 
9864 	/* Attach session to operation */
9865 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
9866 
9867 	/* Set crypto operation mbufs */
9868 	ut_params->op->sym->m_src = ut_params->ibuf;
9869 	ut_params->op->sym->m_dst = NULL;
9870 
9871 	/* Process crypto operation */
9872 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9873 			NULL) {
9874 		printf("Test function %s line %u: failed to process crypto op\n",
9875 			__func__, __LINE__);
9876 		ret = TEST_FAILED;
9877 		goto on_err;
9878 	}
9879 
9880 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9881 		printf("Test function %s line %u: crypto op processing failed\n",
9882 			__func__, __LINE__);
9883 		ret = TEST_FAILED;
9884 		goto on_err;
9885 	}
9886 
9887 	/* Validate ciphertext */
9888 	ciphertext = plaintext;
9889 
9890 	if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
9891 		printf("Test function %s line %u: plaintext not as expected\n",
9892 			__func__, __LINE__);
9893 		rte_hexdump(stdout, "expected", d_td->ciphertext.data,
9894 				d_td->ciphertext.len);
9895 		rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
9896 		ret = TEST_FAILED;
9897 		goto on_err;
9898 	}
9899 
9900 on_err:
9901 	rte_crypto_op_free(ut_params->op);
9902 	ut_params->op = NULL;
9903 
9904 	if (ut_params->sec_session)
9905 		rte_security_session_destroy(ctx, ut_params->sec_session);
9906 	ut_params->sec_session = NULL;
9907 
9908 	rte_pktmbuf_free(ut_params->ibuf);
9909 	ut_params->ibuf = NULL;
9910 
9911 	return ret;
9912 }
9913 #endif
9914 
9915 static int
9916 test_AES_GCM_authenticated_encryption_test_case_1(void)
9917 {
9918 	return test_authenticated_encryption(&gcm_test_case_1);
9919 }
9920 
9921 static int
9922 test_AES_GCM_authenticated_encryption_test_case_2(void)
9923 {
9924 	return test_authenticated_encryption(&gcm_test_case_2);
9925 }
9926 
9927 static int
9928 test_AES_GCM_authenticated_encryption_test_case_3(void)
9929 {
9930 	return test_authenticated_encryption(&gcm_test_case_3);
9931 }
9932 
9933 static int
9934 test_AES_GCM_authenticated_encryption_test_case_4(void)
9935 {
9936 	return test_authenticated_encryption(&gcm_test_case_4);
9937 }
9938 
9939 static int
9940 test_AES_GCM_authenticated_encryption_test_case_5(void)
9941 {
9942 	return test_authenticated_encryption(&gcm_test_case_5);
9943 }
9944 
9945 static int
9946 test_AES_GCM_authenticated_encryption_test_case_6(void)
9947 {
9948 	return test_authenticated_encryption(&gcm_test_case_6);
9949 }
9950 
9951 static int
9952 test_AES_GCM_authenticated_encryption_test_case_7(void)
9953 {
9954 	return test_authenticated_encryption(&gcm_test_case_7);
9955 }
9956 
9957 static int
9958 test_AES_GCM_authenticated_encryption_test_case_8(void)
9959 {
9960 	return test_authenticated_encryption(&gcm_test_case_8);
9961 }
9962 
9963 static int
9964 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
9965 {
9966 	return test_authenticated_encryption(&gcm_J0_test_case_1);
9967 }
9968 
9969 static int
9970 test_AES_GCM_auth_encryption_test_case_192_1(void)
9971 {
9972 	return test_authenticated_encryption(&gcm_test_case_192_1);
9973 }
9974 
9975 static int
9976 test_AES_GCM_auth_encryption_test_case_192_2(void)
9977 {
9978 	return test_authenticated_encryption(&gcm_test_case_192_2);
9979 }
9980 
9981 static int
9982 test_AES_GCM_auth_encryption_test_case_192_3(void)
9983 {
9984 	return test_authenticated_encryption(&gcm_test_case_192_3);
9985 }
9986 
9987 static int
9988 test_AES_GCM_auth_encryption_test_case_192_4(void)
9989 {
9990 	return test_authenticated_encryption(&gcm_test_case_192_4);
9991 }
9992 
9993 static int
9994 test_AES_GCM_auth_encryption_test_case_192_5(void)
9995 {
9996 	return test_authenticated_encryption(&gcm_test_case_192_5);
9997 }
9998 
9999 static int
10000 test_AES_GCM_auth_encryption_test_case_192_6(void)
10001 {
10002 	return test_authenticated_encryption(&gcm_test_case_192_6);
10003 }
10004 
10005 static int
10006 test_AES_GCM_auth_encryption_test_case_192_7(void)
10007 {
10008 	return test_authenticated_encryption(&gcm_test_case_192_7);
10009 }
10010 
10011 static int
10012 test_AES_GCM_auth_encryption_test_case_256_1(void)
10013 {
10014 	return test_authenticated_encryption(&gcm_test_case_256_1);
10015 }
10016 
10017 static int
10018 test_AES_GCM_auth_encryption_test_case_256_2(void)
10019 {
10020 	return test_authenticated_encryption(&gcm_test_case_256_2);
10021 }
10022 
10023 static int
10024 test_AES_GCM_auth_encryption_test_case_256_3(void)
10025 {
10026 	return test_authenticated_encryption(&gcm_test_case_256_3);
10027 }
10028 
10029 static int
10030 test_AES_GCM_auth_encryption_test_case_256_4(void)
10031 {
10032 	return test_authenticated_encryption(&gcm_test_case_256_4);
10033 }
10034 
10035 static int
10036 test_AES_GCM_auth_encryption_test_case_256_5(void)
10037 {
10038 	return test_authenticated_encryption(&gcm_test_case_256_5);
10039 }
10040 
10041 static int
10042 test_AES_GCM_auth_encryption_test_case_256_6(void)
10043 {
10044 	return test_authenticated_encryption(&gcm_test_case_256_6);
10045 }
10046 
10047 static int
10048 test_AES_GCM_auth_encryption_test_case_256_7(void)
10049 {
10050 	return test_authenticated_encryption(&gcm_test_case_256_7);
10051 }
10052 
10053 static int
10054 test_AES_GCM_auth_encryption_test_case_aad_1(void)
10055 {
10056 	return test_authenticated_encryption(&gcm_test_case_aad_1);
10057 }
10058 
10059 static int
10060 test_AES_GCM_auth_encryption_test_case_aad_2(void)
10061 {
10062 	return test_authenticated_encryption(&gcm_test_case_aad_2);
10063 }
10064 
10065 static int
10066 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
10067 {
10068 	struct aead_test_data tdata;
10069 	int res;
10070 
10071 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10072 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10073 	tdata.iv.data[0] += 1;
10074 	res = test_authenticated_encryption(&tdata);
10075 	if (res == TEST_SKIPPED)
10076 		return res;
10077 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10078 	return TEST_SUCCESS;
10079 }
10080 
10081 static int
10082 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
10083 {
10084 	struct aead_test_data tdata;
10085 	int res;
10086 
10087 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10088 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10089 	tdata.plaintext.data[0] += 1;
10090 	res = test_authenticated_encryption(&tdata);
10091 	if (res == TEST_SKIPPED)
10092 		return res;
10093 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10094 	return TEST_SUCCESS;
10095 }
10096 
10097 static int
10098 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
10099 {
10100 	struct aead_test_data tdata;
10101 	int res;
10102 
10103 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10104 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10105 	tdata.ciphertext.data[0] += 1;
10106 	res = test_authenticated_encryption(&tdata);
10107 	if (res == TEST_SKIPPED)
10108 		return res;
10109 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10110 	return TEST_SUCCESS;
10111 }
10112 
10113 static int
10114 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
10115 {
10116 	struct aead_test_data tdata;
10117 	int res;
10118 
10119 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10120 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10121 	tdata.aad.len += 1;
10122 	res = test_authenticated_encryption(&tdata);
10123 	if (res == TEST_SKIPPED)
10124 		return res;
10125 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10126 	return TEST_SUCCESS;
10127 }
10128 
10129 static int
10130 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
10131 {
10132 	struct aead_test_data tdata;
10133 	uint8_t aad[gcm_test_case_7.aad.len];
10134 	int res;
10135 
10136 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10137 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10138 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10139 	aad[0] += 1;
10140 	tdata.aad.data = aad;
10141 	res = test_authenticated_encryption(&tdata);
10142 	if (res == TEST_SKIPPED)
10143 		return res;
10144 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10145 	return TEST_SUCCESS;
10146 }
10147 
10148 static int
10149 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
10150 {
10151 	struct aead_test_data tdata;
10152 	int res;
10153 
10154 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10155 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10156 	tdata.auth_tag.data[0] += 1;
10157 	res = test_authenticated_encryption(&tdata);
10158 	if (res == TEST_SKIPPED)
10159 		return res;
10160 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10161 	return TEST_SUCCESS;
10162 }
10163 
10164 static int
10165 test_authenticated_decryption(const struct aead_test_data *tdata)
10166 {
10167 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10168 	struct crypto_unittest_params *ut_params = &unittest_params;
10169 
10170 	int retval;
10171 	uint8_t *plaintext;
10172 	uint32_t i;
10173 	struct rte_cryptodev_info dev_info;
10174 
10175 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10176 	uint64_t feat_flags = dev_info.feature_flags;
10177 
10178 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10179 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10180 		printf("Device doesn't support RAW data-path APIs.\n");
10181 		return TEST_SKIPPED;
10182 	}
10183 
10184 	/* Verify the capabilities */
10185 	struct rte_cryptodev_sym_capability_idx cap_idx;
10186 	const struct rte_cryptodev_symmetric_capability *capability;
10187 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10188 	cap_idx.algo.aead = tdata->algo;
10189 	capability = rte_cryptodev_sym_capability_get(
10190 			ts_params->valid_devs[0], &cap_idx);
10191 	if (capability == NULL)
10192 		return TEST_SKIPPED;
10193 	if (rte_cryptodev_sym_capability_check_aead(
10194 			capability, tdata->key.len, tdata->auth_tag.len,
10195 			tdata->aad.len, tdata->iv.len))
10196 		return TEST_SKIPPED;
10197 
10198 	/* Create AEAD session */
10199 	retval = create_aead_session(ts_params->valid_devs[0],
10200 			tdata->algo,
10201 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10202 			tdata->key.data, tdata->key.len,
10203 			tdata->aad.len, tdata->auth_tag.len,
10204 			tdata->iv.len);
10205 	if (retval < 0)
10206 		return retval;
10207 
10208 	/* alloc mbuf and set payload */
10209 	if (tdata->aad.len > MBUF_SIZE) {
10210 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10211 		/* Populate full size of add data */
10212 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
10213 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
10214 	} else
10215 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10216 
10217 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10218 			rte_pktmbuf_tailroom(ut_params->ibuf));
10219 
10220 	/* Create AEAD operation */
10221 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10222 	if (retval < 0)
10223 		return retval;
10224 
10225 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10226 
10227 	ut_params->op->sym->m_src = ut_params->ibuf;
10228 
10229 	/* Process crypto operation */
10230 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10231 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
10232 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10233 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10234 				ut_params->op, 0, 0, 0, 0);
10235 	else
10236 		TEST_ASSERT_NOT_NULL(
10237 			process_crypto_request(ts_params->valid_devs[0],
10238 			ut_params->op), "failed to process sym crypto op");
10239 
10240 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10241 			"crypto op processing failed");
10242 
10243 	if (ut_params->op->sym->m_dst)
10244 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
10245 				uint8_t *);
10246 	else
10247 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
10248 				uint8_t *,
10249 				ut_params->op->sym->cipher.data.offset);
10250 
10251 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10252 
10253 	/* Validate obuf */
10254 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10255 			plaintext,
10256 			tdata->plaintext.data,
10257 			tdata->plaintext.len,
10258 			"Plaintext data not as expected");
10259 
10260 	TEST_ASSERT_EQUAL(ut_params->op->status,
10261 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10262 			"Authentication failed");
10263 
10264 	return 0;
10265 }
10266 
10267 static int
10268 test_AES_GCM_authenticated_decryption_test_case_1(void)
10269 {
10270 	return test_authenticated_decryption(&gcm_test_case_1);
10271 }
10272 
10273 static int
10274 test_AES_GCM_authenticated_decryption_test_case_2(void)
10275 {
10276 	return test_authenticated_decryption(&gcm_test_case_2);
10277 }
10278 
10279 static int
10280 test_AES_GCM_authenticated_decryption_test_case_3(void)
10281 {
10282 	return test_authenticated_decryption(&gcm_test_case_3);
10283 }
10284 
10285 static int
10286 test_AES_GCM_authenticated_decryption_test_case_4(void)
10287 {
10288 	return test_authenticated_decryption(&gcm_test_case_4);
10289 }
10290 
10291 static int
10292 test_AES_GCM_authenticated_decryption_test_case_5(void)
10293 {
10294 	return test_authenticated_decryption(&gcm_test_case_5);
10295 }
10296 
10297 static int
10298 test_AES_GCM_authenticated_decryption_test_case_6(void)
10299 {
10300 	return test_authenticated_decryption(&gcm_test_case_6);
10301 }
10302 
10303 static int
10304 test_AES_GCM_authenticated_decryption_test_case_7(void)
10305 {
10306 	return test_authenticated_decryption(&gcm_test_case_7);
10307 }
10308 
10309 static int
10310 test_AES_GCM_authenticated_decryption_test_case_8(void)
10311 {
10312 	return test_authenticated_decryption(&gcm_test_case_8);
10313 }
10314 
10315 static int
10316 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
10317 {
10318 	return test_authenticated_decryption(&gcm_J0_test_case_1);
10319 }
10320 
10321 static int
10322 test_AES_GCM_auth_decryption_test_case_192_1(void)
10323 {
10324 	return test_authenticated_decryption(&gcm_test_case_192_1);
10325 }
10326 
10327 static int
10328 test_AES_GCM_auth_decryption_test_case_192_2(void)
10329 {
10330 	return test_authenticated_decryption(&gcm_test_case_192_2);
10331 }
10332 
10333 static int
10334 test_AES_GCM_auth_decryption_test_case_192_3(void)
10335 {
10336 	return test_authenticated_decryption(&gcm_test_case_192_3);
10337 }
10338 
10339 static int
10340 test_AES_GCM_auth_decryption_test_case_192_4(void)
10341 {
10342 	return test_authenticated_decryption(&gcm_test_case_192_4);
10343 }
10344 
10345 static int
10346 test_AES_GCM_auth_decryption_test_case_192_5(void)
10347 {
10348 	return test_authenticated_decryption(&gcm_test_case_192_5);
10349 }
10350 
10351 static int
10352 test_AES_GCM_auth_decryption_test_case_192_6(void)
10353 {
10354 	return test_authenticated_decryption(&gcm_test_case_192_6);
10355 }
10356 
10357 static int
10358 test_AES_GCM_auth_decryption_test_case_192_7(void)
10359 {
10360 	return test_authenticated_decryption(&gcm_test_case_192_7);
10361 }
10362 
10363 static int
10364 test_AES_GCM_auth_decryption_test_case_256_1(void)
10365 {
10366 	return test_authenticated_decryption(&gcm_test_case_256_1);
10367 }
10368 
10369 static int
10370 test_AES_GCM_auth_decryption_test_case_256_2(void)
10371 {
10372 	return test_authenticated_decryption(&gcm_test_case_256_2);
10373 }
10374 
10375 static int
10376 test_AES_GCM_auth_decryption_test_case_256_3(void)
10377 {
10378 	return test_authenticated_decryption(&gcm_test_case_256_3);
10379 }
10380 
10381 static int
10382 test_AES_GCM_auth_decryption_test_case_256_4(void)
10383 {
10384 	return test_authenticated_decryption(&gcm_test_case_256_4);
10385 }
10386 
10387 static int
10388 test_AES_GCM_auth_decryption_test_case_256_5(void)
10389 {
10390 	return test_authenticated_decryption(&gcm_test_case_256_5);
10391 }
10392 
10393 static int
10394 test_AES_GCM_auth_decryption_test_case_256_6(void)
10395 {
10396 	return test_authenticated_decryption(&gcm_test_case_256_6);
10397 }
10398 
10399 static int
10400 test_AES_GCM_auth_decryption_test_case_256_7(void)
10401 {
10402 	return test_authenticated_decryption(&gcm_test_case_256_7);
10403 }
10404 
10405 static int
10406 test_AES_GCM_auth_decryption_test_case_aad_1(void)
10407 {
10408 	return test_authenticated_decryption(&gcm_test_case_aad_1);
10409 }
10410 
10411 static int
10412 test_AES_GCM_auth_decryption_test_case_aad_2(void)
10413 {
10414 	return test_authenticated_decryption(&gcm_test_case_aad_2);
10415 }
10416 
10417 static int
10418 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
10419 {
10420 	struct aead_test_data tdata;
10421 	int res;
10422 
10423 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10424 	tdata.iv.data[0] += 1;
10425 	res = test_authenticated_decryption(&tdata);
10426 	if (res == TEST_SKIPPED)
10427 		return res;
10428 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10429 	return TEST_SUCCESS;
10430 }
10431 
10432 static int
10433 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
10434 {
10435 	struct aead_test_data tdata;
10436 	int res;
10437 
10438 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10439 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10440 	tdata.plaintext.data[0] += 1;
10441 	res = test_authenticated_decryption(&tdata);
10442 	if (res == TEST_SKIPPED)
10443 		return res;
10444 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10445 	return TEST_SUCCESS;
10446 }
10447 
10448 static int
10449 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
10450 {
10451 	struct aead_test_data tdata;
10452 	int res;
10453 
10454 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10455 	tdata.ciphertext.data[0] += 1;
10456 	res = test_authenticated_decryption(&tdata);
10457 	if (res == TEST_SKIPPED)
10458 		return res;
10459 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10460 	return TEST_SUCCESS;
10461 }
10462 
10463 static int
10464 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
10465 {
10466 	struct aead_test_data tdata;
10467 	int res;
10468 
10469 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10470 	tdata.aad.len += 1;
10471 	res = test_authenticated_decryption(&tdata);
10472 	if (res == TEST_SKIPPED)
10473 		return res;
10474 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10475 	return TEST_SUCCESS;
10476 }
10477 
10478 static int
10479 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
10480 {
10481 	struct aead_test_data tdata;
10482 	uint8_t aad[gcm_test_case_7.aad.len];
10483 	int res;
10484 
10485 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10486 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10487 	aad[0] += 1;
10488 	tdata.aad.data = aad;
10489 	res = test_authenticated_decryption(&tdata);
10490 	if (res == TEST_SKIPPED)
10491 		return res;
10492 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10493 	return TEST_SUCCESS;
10494 }
10495 
10496 static int
10497 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
10498 {
10499 	struct aead_test_data tdata;
10500 	int res;
10501 
10502 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10503 	tdata.auth_tag.data[0] += 1;
10504 	res = test_authenticated_decryption(&tdata);
10505 	if (res == TEST_SKIPPED)
10506 		return res;
10507 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
10508 	return TEST_SUCCESS;
10509 }
10510 
10511 static int
10512 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
10513 {
10514 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10515 	struct crypto_unittest_params *ut_params = &unittest_params;
10516 
10517 	int retval;
10518 	uint8_t *ciphertext, *auth_tag;
10519 	uint16_t plaintext_pad_len;
10520 	struct rte_cryptodev_info dev_info;
10521 
10522 	/* Verify the capabilities */
10523 	struct rte_cryptodev_sym_capability_idx cap_idx;
10524 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10525 	cap_idx.algo.aead = tdata->algo;
10526 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10527 			&cap_idx) == NULL)
10528 		return TEST_SKIPPED;
10529 
10530 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10531 	uint64_t feat_flags = dev_info.feature_flags;
10532 
10533 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10534 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)))
10535 		return TEST_SKIPPED;
10536 
10537 	/* not supported with CPU crypto */
10538 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10539 		return TEST_SKIPPED;
10540 
10541 	/* Create AEAD session */
10542 	retval = create_aead_session(ts_params->valid_devs[0],
10543 			tdata->algo,
10544 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
10545 			tdata->key.data, tdata->key.len,
10546 			tdata->aad.len, tdata->auth_tag.len,
10547 			tdata->iv.len);
10548 	if (retval < 0)
10549 		return retval;
10550 
10551 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10552 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10553 
10554 	/* clear mbuf payload */
10555 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10556 			rte_pktmbuf_tailroom(ut_params->ibuf));
10557 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10558 			rte_pktmbuf_tailroom(ut_params->obuf));
10559 
10560 	/* Create AEAD operation */
10561 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10562 	if (retval < 0)
10563 		return retval;
10564 
10565 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10566 
10567 	ut_params->op->sym->m_src = ut_params->ibuf;
10568 	ut_params->op->sym->m_dst = ut_params->obuf;
10569 
10570 	/* Process crypto operation */
10571 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10572 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10573 			ut_params->op, 0, 0, 0, 0);
10574 	else
10575 		TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10576 			ut_params->op), "failed to process sym crypto op");
10577 
10578 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10579 			"crypto op processing failed");
10580 
10581 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10582 
10583 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10584 			ut_params->op->sym->cipher.data.offset);
10585 	auth_tag = ciphertext + plaintext_pad_len;
10586 
10587 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10588 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10589 
10590 	/* Validate obuf */
10591 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10592 			ciphertext,
10593 			tdata->ciphertext.data,
10594 			tdata->ciphertext.len,
10595 			"Ciphertext data not as expected");
10596 
10597 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10598 			auth_tag,
10599 			tdata->auth_tag.data,
10600 			tdata->auth_tag.len,
10601 			"Generated auth tag not as expected");
10602 
10603 	return 0;
10604 
10605 }
10606 
10607 static int
10608 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
10609 {
10610 	return test_authenticated_encryption_oop(&gcm_test_case_5);
10611 }
10612 
10613 static int
10614 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
10615 {
10616 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10617 	struct crypto_unittest_params *ut_params = &unittest_params;
10618 
10619 	int retval;
10620 	uint8_t *plaintext;
10621 	struct rte_cryptodev_info dev_info;
10622 
10623 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10624 	uint64_t feat_flags = dev_info.feature_flags;
10625 
10626 	/* Verify the capabilities */
10627 	struct rte_cryptodev_sym_capability_idx cap_idx;
10628 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10629 	cap_idx.algo.aead = tdata->algo;
10630 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10631 			&cap_idx) == NULL)
10632 		return TEST_SKIPPED;
10633 
10634 	/* not supported with CPU crypto and raw data-path APIs*/
10635 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
10636 			global_api_test_type == CRYPTODEV_RAW_API_TEST)
10637 		return TEST_SKIPPED;
10638 
10639 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10640 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10641 		printf("Device does not support RAW data-path APIs.\n");
10642 		return TEST_SKIPPED;
10643 	}
10644 
10645 	/* Create AEAD session */
10646 	retval = create_aead_session(ts_params->valid_devs[0],
10647 			tdata->algo,
10648 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10649 			tdata->key.data, tdata->key.len,
10650 			tdata->aad.len, tdata->auth_tag.len,
10651 			tdata->iv.len);
10652 	if (retval < 0)
10653 		return retval;
10654 
10655 	/* alloc mbuf and set payload */
10656 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10657 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10658 
10659 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10660 			rte_pktmbuf_tailroom(ut_params->ibuf));
10661 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10662 			rte_pktmbuf_tailroom(ut_params->obuf));
10663 
10664 	/* Create AEAD operation */
10665 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10666 	if (retval < 0)
10667 		return retval;
10668 
10669 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10670 
10671 	ut_params->op->sym->m_src = ut_params->ibuf;
10672 	ut_params->op->sym->m_dst = ut_params->obuf;
10673 
10674 	/* Process crypto operation */
10675 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10676 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10677 				ut_params->op, 0, 0, 0, 0);
10678 	else
10679 		TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10680 			ut_params->op), "failed to process sym crypto op");
10681 
10682 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10683 			"crypto op processing failed");
10684 
10685 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10686 			ut_params->op->sym->cipher.data.offset);
10687 
10688 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10689 
10690 	/* Validate obuf */
10691 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10692 			plaintext,
10693 			tdata->plaintext.data,
10694 			tdata->plaintext.len,
10695 			"Plaintext data not as expected");
10696 
10697 	TEST_ASSERT_EQUAL(ut_params->op->status,
10698 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10699 			"Authentication failed");
10700 	return 0;
10701 }
10702 
10703 static int
10704 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
10705 {
10706 	return test_authenticated_decryption_oop(&gcm_test_case_5);
10707 }
10708 
10709 static int
10710 test_authenticated_encryption_sessionless(
10711 		const struct aead_test_data *tdata)
10712 {
10713 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10714 	struct crypto_unittest_params *ut_params = &unittest_params;
10715 
10716 	int retval;
10717 	uint8_t *ciphertext, *auth_tag;
10718 	uint16_t plaintext_pad_len;
10719 	uint8_t key[tdata->key.len + 1];
10720 	struct rte_cryptodev_info dev_info;
10721 
10722 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10723 	uint64_t feat_flags = dev_info.feature_flags;
10724 
10725 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10726 		printf("Device doesn't support Sessionless ops.\n");
10727 		return TEST_SKIPPED;
10728 	}
10729 
10730 	/* not supported with CPU crypto */
10731 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10732 		return TEST_SKIPPED;
10733 
10734 	/* Verify the capabilities */
10735 	struct rte_cryptodev_sym_capability_idx cap_idx;
10736 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10737 	cap_idx.algo.aead = tdata->algo;
10738 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10739 			&cap_idx) == NULL)
10740 		return TEST_SKIPPED;
10741 
10742 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10743 
10744 	/* clear mbuf payload */
10745 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10746 			rte_pktmbuf_tailroom(ut_params->ibuf));
10747 
10748 	/* Create AEAD operation */
10749 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10750 	if (retval < 0)
10751 		return retval;
10752 
10753 	/* Create GCM xform */
10754 	memcpy(key, tdata->key.data, tdata->key.len);
10755 	retval = create_aead_xform(ut_params->op,
10756 			tdata->algo,
10757 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
10758 			key, tdata->key.len,
10759 			tdata->aad.len, tdata->auth_tag.len,
10760 			tdata->iv.len);
10761 	if (retval < 0)
10762 		return retval;
10763 
10764 	ut_params->op->sym->m_src = ut_params->ibuf;
10765 
10766 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10767 			RTE_CRYPTO_OP_SESSIONLESS,
10768 			"crypto op session type not sessionless");
10769 
10770 	/* Process crypto operation */
10771 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10772 			ut_params->op), "failed to process sym crypto op");
10773 
10774 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10775 
10776 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10777 			"crypto op status not success");
10778 
10779 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10780 
10781 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10782 			ut_params->op->sym->cipher.data.offset);
10783 	auth_tag = ciphertext + plaintext_pad_len;
10784 
10785 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10786 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10787 
10788 	/* Validate obuf */
10789 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10790 			ciphertext,
10791 			tdata->ciphertext.data,
10792 			tdata->ciphertext.len,
10793 			"Ciphertext data not as expected");
10794 
10795 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10796 			auth_tag,
10797 			tdata->auth_tag.data,
10798 			tdata->auth_tag.len,
10799 			"Generated auth tag not as expected");
10800 
10801 	return 0;
10802 
10803 }
10804 
10805 static int
10806 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
10807 {
10808 	return test_authenticated_encryption_sessionless(
10809 			&gcm_test_case_5);
10810 }
10811 
10812 static int
10813 test_authenticated_decryption_sessionless(
10814 		const struct aead_test_data *tdata)
10815 {
10816 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10817 	struct crypto_unittest_params *ut_params = &unittest_params;
10818 
10819 	int retval;
10820 	uint8_t *plaintext;
10821 	uint8_t key[tdata->key.len + 1];
10822 	struct rte_cryptodev_info dev_info;
10823 
10824 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10825 	uint64_t feat_flags = dev_info.feature_flags;
10826 
10827 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10828 		printf("Device doesn't support Sessionless ops.\n");
10829 		return TEST_SKIPPED;
10830 	}
10831 
10832 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10833 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10834 		printf("Device doesn't support RAW data-path APIs.\n");
10835 		return TEST_SKIPPED;
10836 	}
10837 
10838 	/* not supported with CPU crypto */
10839 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10840 		return TEST_SKIPPED;
10841 
10842 	/* Verify the capabilities */
10843 	struct rte_cryptodev_sym_capability_idx cap_idx;
10844 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10845 	cap_idx.algo.aead = tdata->algo;
10846 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10847 			&cap_idx) == NULL)
10848 		return TEST_SKIPPED;
10849 
10850 	/* alloc mbuf and set payload */
10851 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10852 
10853 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10854 			rte_pktmbuf_tailroom(ut_params->ibuf));
10855 
10856 	/* Create AEAD operation */
10857 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10858 	if (retval < 0)
10859 		return retval;
10860 
10861 	/* Create AEAD xform */
10862 	memcpy(key, tdata->key.data, tdata->key.len);
10863 	retval = create_aead_xform(ut_params->op,
10864 			tdata->algo,
10865 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10866 			key, tdata->key.len,
10867 			tdata->aad.len, tdata->auth_tag.len,
10868 			tdata->iv.len);
10869 	if (retval < 0)
10870 		return retval;
10871 
10872 	ut_params->op->sym->m_src = ut_params->ibuf;
10873 
10874 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10875 			RTE_CRYPTO_OP_SESSIONLESS,
10876 			"crypto op session type not sessionless");
10877 
10878 	/* Process crypto operation */
10879 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10880 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10881 				ut_params->op, 0, 0, 0, 0);
10882 	else
10883 		TEST_ASSERT_NOT_NULL(process_crypto_request(
10884 			ts_params->valid_devs[0], ut_params->op),
10885 				"failed to process sym crypto op");
10886 
10887 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10888 
10889 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10890 			"crypto op status not success");
10891 
10892 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10893 			ut_params->op->sym->cipher.data.offset);
10894 
10895 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10896 
10897 	/* Validate obuf */
10898 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10899 			plaintext,
10900 			tdata->plaintext.data,
10901 			tdata->plaintext.len,
10902 			"Plaintext data not as expected");
10903 
10904 	TEST_ASSERT_EQUAL(ut_params->op->status,
10905 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10906 			"Authentication failed");
10907 	return 0;
10908 }
10909 
10910 static int
10911 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
10912 {
10913 	return test_authenticated_decryption_sessionless(
10914 			&gcm_test_case_5);
10915 }
10916 
10917 static int
10918 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
10919 {
10920 	return test_authenticated_encryption(&ccm_test_case_128_1);
10921 }
10922 
10923 static int
10924 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
10925 {
10926 	return test_authenticated_encryption(&ccm_test_case_128_2);
10927 }
10928 
10929 static int
10930 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
10931 {
10932 	return test_authenticated_encryption(&ccm_test_case_128_3);
10933 }
10934 
10935 static int
10936 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
10937 {
10938 	return test_authenticated_decryption(&ccm_test_case_128_1);
10939 }
10940 
10941 static int
10942 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
10943 {
10944 	return test_authenticated_decryption(&ccm_test_case_128_2);
10945 }
10946 
10947 static int
10948 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
10949 {
10950 	return test_authenticated_decryption(&ccm_test_case_128_3);
10951 }
10952 
10953 static int
10954 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
10955 {
10956 	return test_authenticated_encryption(&ccm_test_case_192_1);
10957 }
10958 
10959 static int
10960 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
10961 {
10962 	return test_authenticated_encryption(&ccm_test_case_192_2);
10963 }
10964 
10965 static int
10966 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
10967 {
10968 	return test_authenticated_encryption(&ccm_test_case_192_3);
10969 }
10970 
10971 static int
10972 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
10973 {
10974 	return test_authenticated_decryption(&ccm_test_case_192_1);
10975 }
10976 
10977 static int
10978 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
10979 {
10980 	return test_authenticated_decryption(&ccm_test_case_192_2);
10981 }
10982 
10983 static int
10984 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
10985 {
10986 	return test_authenticated_decryption(&ccm_test_case_192_3);
10987 }
10988 
10989 static int
10990 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
10991 {
10992 	return test_authenticated_encryption(&ccm_test_case_256_1);
10993 }
10994 
10995 static int
10996 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
10997 {
10998 	return test_authenticated_encryption(&ccm_test_case_256_2);
10999 }
11000 
11001 static int
11002 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
11003 {
11004 	return test_authenticated_encryption(&ccm_test_case_256_3);
11005 }
11006 
11007 static int
11008 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
11009 {
11010 	return test_authenticated_decryption(&ccm_test_case_256_1);
11011 }
11012 
11013 static int
11014 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
11015 {
11016 	return test_authenticated_decryption(&ccm_test_case_256_2);
11017 }
11018 
11019 static int
11020 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
11021 {
11022 	return test_authenticated_decryption(&ccm_test_case_256_3);
11023 }
11024 
11025 static int
11026 test_stats(void)
11027 {
11028 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11029 	struct rte_cryptodev_stats stats;
11030 
11031 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11032 		return TEST_SKIPPED;
11033 
11034 	/* Verify the capabilities */
11035 	struct rte_cryptodev_sym_capability_idx cap_idx;
11036 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11037 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
11038 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11039 			&cap_idx) == NULL)
11040 		return TEST_SKIPPED;
11041 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11042 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11043 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11044 			&cap_idx) == NULL)
11045 		return TEST_SKIPPED;
11046 
11047 	if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
11048 			== -ENOTSUP)
11049 		return TEST_SKIPPED;
11050 
11051 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11052 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
11053 			&stats) == -ENODEV),
11054 		"rte_cryptodev_stats_get invalid dev failed");
11055 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
11056 		"rte_cryptodev_stats_get invalid Param failed");
11057 
11058 	/* Test expected values */
11059 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
11060 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11061 			&stats),
11062 		"rte_cryptodev_stats_get failed");
11063 	TEST_ASSERT((stats.enqueued_count == 1),
11064 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11065 	TEST_ASSERT((stats.dequeued_count == 1),
11066 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11067 	TEST_ASSERT((stats.enqueue_err_count == 0),
11068 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11069 	TEST_ASSERT((stats.dequeue_err_count == 0),
11070 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11071 
11072 	/* invalid device but should ignore and not reset device stats*/
11073 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
11074 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11075 			&stats),
11076 		"rte_cryptodev_stats_get failed");
11077 	TEST_ASSERT((stats.enqueued_count == 1),
11078 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11079 
11080 	/* check that a valid reset clears stats */
11081 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11082 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11083 			&stats),
11084 					  "rte_cryptodev_stats_get failed");
11085 	TEST_ASSERT((stats.enqueued_count == 0),
11086 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11087 	TEST_ASSERT((stats.dequeued_count == 0),
11088 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11089 
11090 	return TEST_SUCCESS;
11091 }
11092 
11093 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
11094 				   struct crypto_unittest_params *ut_params,
11095 				   enum rte_crypto_auth_operation op,
11096 				   const struct HMAC_MD5_vector *test_case)
11097 {
11098 	uint8_t key[64];
11099 
11100 	memcpy(key, test_case->key.data, test_case->key.len);
11101 
11102 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11103 	ut_params->auth_xform.next = NULL;
11104 	ut_params->auth_xform.auth.op = op;
11105 
11106 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
11107 
11108 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
11109 	ut_params->auth_xform.auth.key.length = test_case->key.len;
11110 	ut_params->auth_xform.auth.key.data = key;
11111 
11112 	ut_params->sess = rte_cryptodev_sym_session_create(
11113 			ts_params->session_mpool);
11114 
11115 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11116 			ut_params->sess, &ut_params->auth_xform,
11117 			ts_params->session_priv_mpool);
11118 
11119 	if (ut_params->sess == NULL)
11120 		return TEST_FAILED;
11121 
11122 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11123 
11124 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11125 			rte_pktmbuf_tailroom(ut_params->ibuf));
11126 
11127 	return 0;
11128 }
11129 
11130 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
11131 			      const struct HMAC_MD5_vector *test_case,
11132 			      uint8_t **plaintext)
11133 {
11134 	uint16_t plaintext_pad_len;
11135 
11136 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11137 
11138 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11139 				16);
11140 
11141 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11142 			plaintext_pad_len);
11143 	memcpy(*plaintext, test_case->plaintext.data,
11144 			test_case->plaintext.len);
11145 
11146 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11147 			ut_params->ibuf, MD5_DIGEST_LEN);
11148 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11149 			"no room to append digest");
11150 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11151 			ut_params->ibuf, plaintext_pad_len);
11152 
11153 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11154 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
11155 			   test_case->auth_tag.len);
11156 	}
11157 
11158 	sym_op->auth.data.offset = 0;
11159 	sym_op->auth.data.length = test_case->plaintext.len;
11160 
11161 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11162 	ut_params->op->sym->m_src = ut_params->ibuf;
11163 
11164 	return 0;
11165 }
11166 
11167 static int
11168 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
11169 {
11170 	uint16_t plaintext_pad_len;
11171 	uint8_t *plaintext, *auth_tag;
11172 
11173 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11174 	struct crypto_unittest_params *ut_params = &unittest_params;
11175 	struct rte_cryptodev_info dev_info;
11176 
11177 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11178 	uint64_t feat_flags = dev_info.feature_flags;
11179 
11180 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11181 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11182 		printf("Device doesn't support RAW data-path APIs.\n");
11183 		return TEST_SKIPPED;
11184 	}
11185 
11186 	/* Verify the capabilities */
11187 	struct rte_cryptodev_sym_capability_idx cap_idx;
11188 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11189 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11190 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11191 			&cap_idx) == NULL)
11192 		return TEST_SKIPPED;
11193 
11194 	if (MD5_HMAC_create_session(ts_params, ut_params,
11195 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
11196 		return TEST_FAILED;
11197 
11198 	/* Generate Crypto op data structure */
11199 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11200 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11201 	TEST_ASSERT_NOT_NULL(ut_params->op,
11202 			"Failed to allocate symmetric crypto operation struct");
11203 
11204 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11205 				16);
11206 
11207 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11208 		return TEST_FAILED;
11209 
11210 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11211 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11212 			ut_params->op);
11213 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11214 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11215 				ut_params->op, 0, 1, 0, 0);
11216 	else
11217 		TEST_ASSERT_NOT_NULL(
11218 			process_crypto_request(ts_params->valid_devs[0],
11219 				ut_params->op),
11220 				"failed to process sym crypto op");
11221 
11222 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11223 			"crypto op processing failed");
11224 
11225 	if (ut_params->op->sym->m_dst) {
11226 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11227 				uint8_t *, plaintext_pad_len);
11228 	} else {
11229 		auth_tag = plaintext + plaintext_pad_len;
11230 	}
11231 
11232 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11233 			auth_tag,
11234 			test_case->auth_tag.data,
11235 			test_case->auth_tag.len,
11236 			"HMAC_MD5 generated tag not as expected");
11237 
11238 	return TEST_SUCCESS;
11239 }
11240 
11241 static int
11242 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
11243 {
11244 	uint8_t *plaintext;
11245 
11246 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11247 	struct crypto_unittest_params *ut_params = &unittest_params;
11248 	struct rte_cryptodev_info dev_info;
11249 
11250 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11251 	uint64_t feat_flags = dev_info.feature_flags;
11252 
11253 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11254 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11255 		printf("Device doesn't support RAW data-path APIs.\n");
11256 		return TEST_SKIPPED;
11257 	}
11258 
11259 	/* Verify the capabilities */
11260 	struct rte_cryptodev_sym_capability_idx cap_idx;
11261 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11262 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11263 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11264 			&cap_idx) == NULL)
11265 		return TEST_SKIPPED;
11266 
11267 	if (MD5_HMAC_create_session(ts_params, ut_params,
11268 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
11269 		return TEST_FAILED;
11270 	}
11271 
11272 	/* Generate Crypto op data structure */
11273 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11274 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11275 	TEST_ASSERT_NOT_NULL(ut_params->op,
11276 			"Failed to allocate symmetric crypto operation struct");
11277 
11278 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11279 		return TEST_FAILED;
11280 
11281 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11282 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11283 			ut_params->op);
11284 	else 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, 1, 0, 0);
11287 	else
11288 		TEST_ASSERT_NOT_NULL(
11289 			process_crypto_request(ts_params->valid_devs[0],
11290 				ut_params->op),
11291 				"failed to process sym crypto op");
11292 
11293 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11294 			"HMAC_MD5 crypto op processing failed");
11295 
11296 	return TEST_SUCCESS;
11297 }
11298 
11299 static int
11300 test_MD5_HMAC_generate_case_1(void)
11301 {
11302 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
11303 }
11304 
11305 static int
11306 test_MD5_HMAC_verify_case_1(void)
11307 {
11308 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
11309 }
11310 
11311 static int
11312 test_MD5_HMAC_generate_case_2(void)
11313 {
11314 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
11315 }
11316 
11317 static int
11318 test_MD5_HMAC_verify_case_2(void)
11319 {
11320 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
11321 }
11322 
11323 static int
11324 test_multi_session(void)
11325 {
11326 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11327 	struct crypto_unittest_params *ut_params = &unittest_params;
11328 
11329 	struct rte_cryptodev_info dev_info;
11330 	struct rte_cryptodev_sym_session **sessions;
11331 
11332 	uint16_t i;
11333 
11334 	/* Verify the capabilities */
11335 	struct rte_cryptodev_sym_capability_idx cap_idx;
11336 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11337 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11338 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11339 			&cap_idx) == NULL)
11340 		return TEST_SKIPPED;
11341 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11342 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11343 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11344 			&cap_idx) == NULL)
11345 		return TEST_SKIPPED;
11346 
11347 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
11348 			aes_cbc_key, hmac_sha512_key);
11349 
11350 
11351 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11352 
11353 	sessions = rte_malloc(NULL,
11354 			sizeof(struct rte_cryptodev_sym_session *) *
11355 			(MAX_NB_SESSIONS + 1), 0);
11356 
11357 	/* Create multiple crypto sessions*/
11358 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
11359 
11360 		sessions[i] = rte_cryptodev_sym_session_create(
11361 				ts_params->session_mpool);
11362 
11363 		rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11364 				sessions[i], &ut_params->auth_xform,
11365 				ts_params->session_priv_mpool);
11366 		TEST_ASSERT_NOT_NULL(sessions[i],
11367 				"Session creation failed at session number %u",
11368 				i);
11369 
11370 		/* Attempt to send a request on each session */
11371 		TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
11372 			sessions[i],
11373 			ut_params,
11374 			ts_params,
11375 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
11376 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
11377 			aes_cbc_iv),
11378 			"Failed to perform decrypt on request number %u.", i);
11379 		/* free crypto operation structure */
11380 		if (ut_params->op)
11381 			rte_crypto_op_free(ut_params->op);
11382 
11383 		/*
11384 		 * free mbuf - both obuf and ibuf are usually the same,
11385 		 * so check if they point at the same address is necessary,
11386 		 * to avoid freeing the mbuf twice.
11387 		 */
11388 		if (ut_params->obuf) {
11389 			rte_pktmbuf_free(ut_params->obuf);
11390 			if (ut_params->ibuf == ut_params->obuf)
11391 				ut_params->ibuf = 0;
11392 			ut_params->obuf = 0;
11393 		}
11394 		if (ut_params->ibuf) {
11395 			rte_pktmbuf_free(ut_params->ibuf);
11396 			ut_params->ibuf = 0;
11397 		}
11398 	}
11399 
11400 	sessions[i] = NULL;
11401 	/* Next session create should fail */
11402 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11403 			sessions[i], &ut_params->auth_xform,
11404 			ts_params->session_priv_mpool);
11405 	TEST_ASSERT_NULL(sessions[i],
11406 			"Session creation succeeded unexpectedly!");
11407 
11408 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
11409 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11410 				sessions[i]);
11411 		rte_cryptodev_sym_session_free(sessions[i]);
11412 	}
11413 
11414 	rte_free(sessions);
11415 
11416 	return TEST_SUCCESS;
11417 }
11418 
11419 struct multi_session_params {
11420 	struct crypto_unittest_params ut_params;
11421 	uint8_t *cipher_key;
11422 	uint8_t *hmac_key;
11423 	const uint8_t *cipher;
11424 	const uint8_t *digest;
11425 	uint8_t *iv;
11426 };
11427 
11428 #define MB_SESSION_NUMBER 3
11429 
11430 static int
11431 test_multi_session_random_usage(void)
11432 {
11433 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11434 	struct rte_cryptodev_info dev_info;
11435 	struct rte_cryptodev_sym_session **sessions;
11436 	uint32_t i, j;
11437 	struct multi_session_params ut_paramz[] = {
11438 
11439 		{
11440 			.cipher_key = ms_aes_cbc_key0,
11441 			.hmac_key = ms_hmac_key0,
11442 			.cipher = ms_aes_cbc_cipher0,
11443 			.digest = ms_hmac_digest0,
11444 			.iv = ms_aes_cbc_iv0
11445 		},
11446 		{
11447 			.cipher_key = ms_aes_cbc_key1,
11448 			.hmac_key = ms_hmac_key1,
11449 			.cipher = ms_aes_cbc_cipher1,
11450 			.digest = ms_hmac_digest1,
11451 			.iv = ms_aes_cbc_iv1
11452 		},
11453 		{
11454 			.cipher_key = ms_aes_cbc_key2,
11455 			.hmac_key = ms_hmac_key2,
11456 			.cipher = ms_aes_cbc_cipher2,
11457 			.digest = ms_hmac_digest2,
11458 			.iv = ms_aes_cbc_iv2
11459 		},
11460 
11461 	};
11462 
11463 	/* Verify the capabilities */
11464 	struct rte_cryptodev_sym_capability_idx cap_idx;
11465 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11466 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11467 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11468 			&cap_idx) == NULL)
11469 		return TEST_SKIPPED;
11470 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11471 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11472 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11473 			&cap_idx) == NULL)
11474 		return TEST_SKIPPED;
11475 
11476 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11477 
11478 	sessions = rte_malloc(NULL,
11479 			(sizeof(struct rte_cryptodev_sym_session *)
11480 					* MAX_NB_SESSIONS) + 1, 0);
11481 
11482 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
11483 		sessions[i] = rte_cryptodev_sym_session_create(
11484 				ts_params->session_mpool);
11485 
11486 		rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
11487 				sizeof(struct crypto_unittest_params));
11488 
11489 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
11490 				&ut_paramz[i].ut_params,
11491 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
11492 
11493 		/* Create multiple crypto sessions*/
11494 		rte_cryptodev_sym_session_init(
11495 				ts_params->valid_devs[0],
11496 				sessions[i],
11497 				&ut_paramz[i].ut_params.auth_xform,
11498 				ts_params->session_priv_mpool);
11499 
11500 		TEST_ASSERT_NOT_NULL(sessions[i],
11501 				"Session creation failed at session number %u",
11502 				i);
11503 
11504 	}
11505 
11506 	srand(time(NULL));
11507 	for (i = 0; i < 40000; i++) {
11508 
11509 		j = rand() % MB_SESSION_NUMBER;
11510 
11511 		TEST_ASSERT_SUCCESS(
11512 			test_AES_CBC_HMAC_SHA512_decrypt_perform(
11513 					sessions[j],
11514 					&ut_paramz[j].ut_params,
11515 					ts_params, ut_paramz[j].cipher,
11516 					ut_paramz[j].digest,
11517 					ut_paramz[j].iv),
11518 			"Failed to perform decrypt on request number %u.", i);
11519 
11520 		if (ut_paramz[j].ut_params.op)
11521 			rte_crypto_op_free(ut_paramz[j].ut_params.op);
11522 
11523 		/*
11524 		 * free mbuf - both obuf and ibuf are usually the same,
11525 		 * so check if they point at the same address is necessary,
11526 		 * to avoid freeing the mbuf twice.
11527 		 */
11528 		if (ut_paramz[j].ut_params.obuf) {
11529 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
11530 			if (ut_paramz[j].ut_params.ibuf
11531 					== ut_paramz[j].ut_params.obuf)
11532 				ut_paramz[j].ut_params.ibuf = 0;
11533 			ut_paramz[j].ut_params.obuf = 0;
11534 		}
11535 		if (ut_paramz[j].ut_params.ibuf) {
11536 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
11537 			ut_paramz[j].ut_params.ibuf = 0;
11538 		}
11539 	}
11540 
11541 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
11542 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11543 				sessions[i]);
11544 		rte_cryptodev_sym_session_free(sessions[i]);
11545 	}
11546 
11547 	rte_free(sessions);
11548 
11549 	return TEST_SUCCESS;
11550 }
11551 
11552 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
11553 			0xab, 0xab, 0xab, 0xab,
11554 			0xab, 0xab, 0xab, 0xab,
11555 			0xab, 0xab, 0xab, 0xab};
11556 
11557 static int
11558 test_null_invalid_operation(void)
11559 {
11560 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11561 	struct crypto_unittest_params *ut_params = &unittest_params;
11562 	int ret;
11563 
11564 	/* This test is for NULL PMD only */
11565 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
11566 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11567 		return TEST_SKIPPED;
11568 
11569 	/* Setup Cipher Parameters */
11570 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11571 	ut_params->cipher_xform.next = NULL;
11572 
11573 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
11574 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11575 
11576 	ut_params->sess = rte_cryptodev_sym_session_create(
11577 			ts_params->session_mpool);
11578 
11579 	/* Create Crypto session*/
11580 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11581 			ut_params->sess, &ut_params->cipher_xform,
11582 			ts_params->session_priv_mpool);
11583 	TEST_ASSERT(ret < 0,
11584 			"Session creation succeeded unexpectedly");
11585 
11586 
11587 	/* Setup HMAC Parameters */
11588 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11589 	ut_params->auth_xform.next = NULL;
11590 
11591 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
11592 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11593 
11594 	ut_params->sess = rte_cryptodev_sym_session_create(
11595 			ts_params->session_mpool);
11596 
11597 	/* Create Crypto session*/
11598 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11599 			ut_params->sess, &ut_params->auth_xform,
11600 			ts_params->session_priv_mpool);
11601 	TEST_ASSERT(ret < 0,
11602 			"Session creation succeeded unexpectedly");
11603 
11604 	return TEST_SUCCESS;
11605 }
11606 
11607 
11608 #define NULL_BURST_LENGTH (32)
11609 
11610 static int
11611 test_null_burst_operation(void)
11612 {
11613 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11614 	struct crypto_unittest_params *ut_params = &unittest_params;
11615 
11616 	unsigned i, burst_len = NULL_BURST_LENGTH;
11617 
11618 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
11619 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
11620 
11621 	/* This test is for NULL PMD only */
11622 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
11623 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11624 		return TEST_SKIPPED;
11625 
11626 	/* Setup Cipher Parameters */
11627 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11628 	ut_params->cipher_xform.next = &ut_params->auth_xform;
11629 
11630 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
11631 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11632 
11633 	/* Setup HMAC Parameters */
11634 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11635 	ut_params->auth_xform.next = NULL;
11636 
11637 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
11638 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11639 
11640 	ut_params->sess = rte_cryptodev_sym_session_create(
11641 			ts_params->session_mpool);
11642 
11643 	/* Create Crypto session*/
11644 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11645 			ut_params->sess, &ut_params->cipher_xform,
11646 			ts_params->session_priv_mpool);
11647 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11648 
11649 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
11650 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
11651 			burst_len, "failed to generate burst of crypto ops");
11652 
11653 	/* Generate an operation for each mbuf in burst */
11654 	for (i = 0; i < burst_len; i++) {
11655 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11656 
11657 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
11658 
11659 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
11660 				sizeof(unsigned));
11661 		*data = i;
11662 
11663 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
11664 
11665 		burst[i]->sym->m_src = m;
11666 	}
11667 
11668 	/* Process crypto operation */
11669 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
11670 			0, burst, burst_len),
11671 			burst_len,
11672 			"Error enqueuing burst");
11673 
11674 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
11675 			0, burst_dequeued, burst_len),
11676 			burst_len,
11677 			"Error dequeuing burst");
11678 
11679 
11680 	for (i = 0; i < burst_len; i++) {
11681 		TEST_ASSERT_EQUAL(
11682 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
11683 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
11684 					uint32_t *),
11685 			"data not as expected");
11686 
11687 		rte_pktmbuf_free(burst[i]->sym->m_src);
11688 		rte_crypto_op_free(burst[i]);
11689 	}
11690 
11691 	return TEST_SUCCESS;
11692 }
11693 
11694 static uint16_t
11695 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11696 		  uint16_t nb_ops, void *user_param)
11697 {
11698 	RTE_SET_USED(dev_id);
11699 	RTE_SET_USED(qp_id);
11700 	RTE_SET_USED(ops);
11701 	RTE_SET_USED(user_param);
11702 
11703 	printf("crypto enqueue callback called\n");
11704 	return nb_ops;
11705 }
11706 
11707 static uint16_t
11708 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11709 		  uint16_t nb_ops, void *user_param)
11710 {
11711 	RTE_SET_USED(dev_id);
11712 	RTE_SET_USED(qp_id);
11713 	RTE_SET_USED(ops);
11714 	RTE_SET_USED(user_param);
11715 
11716 	printf("crypto dequeue callback called\n");
11717 	return nb_ops;
11718 }
11719 
11720 /*
11721  * Thread using enqueue/dequeue callback with RCU.
11722  */
11723 static int
11724 test_enqdeq_callback_thread(void *arg)
11725 {
11726 	RTE_SET_USED(arg);
11727 	/* DP thread calls rte_cryptodev_enqueue_burst()/
11728 	 * rte_cryptodev_dequeue_burst() and invokes callback.
11729 	 */
11730 	test_null_burst_operation();
11731 	return 0;
11732 }
11733 
11734 static int
11735 test_enq_callback_setup(void)
11736 {
11737 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11738 	struct rte_cryptodev_info dev_info;
11739 	struct rte_cryptodev_qp_conf qp_conf = {
11740 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
11741 	};
11742 
11743 	struct rte_cryptodev_cb *cb;
11744 	uint16_t qp_id = 0;
11745 
11746 	/* Stop the device in case it's started so it can be configured */
11747 	rte_cryptodev_stop(ts_params->valid_devs[0]);
11748 
11749 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11750 
11751 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11752 			&ts_params->conf),
11753 			"Failed to configure cryptodev %u",
11754 			ts_params->valid_devs[0]);
11755 
11756 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11757 	qp_conf.mp_session = ts_params->session_mpool;
11758 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
11759 
11760 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11761 			ts_params->valid_devs[0], qp_id, &qp_conf,
11762 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11763 			"Failed test for "
11764 			"rte_cryptodev_queue_pair_setup: num_inflights "
11765 			"%u on qp %u on cryptodev %u",
11766 			qp_conf.nb_descriptors, qp_id,
11767 			ts_params->valid_devs[0]);
11768 
11769 	/* Test with invalid crypto device */
11770 	cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
11771 			qp_id, test_enq_callback, NULL);
11772 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11773 			"cryptodev %u did not fail",
11774 			qp_id, RTE_CRYPTO_MAX_DEVS);
11775 
11776 	/* Test with invalid queue pair */
11777 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11778 			dev_info.max_nb_queue_pairs + 1,
11779 			test_enq_callback, NULL);
11780 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11781 			"cryptodev %u did not fail",
11782 			dev_info.max_nb_queue_pairs + 1,
11783 			ts_params->valid_devs[0]);
11784 
11785 	/* Test with NULL callback */
11786 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11787 			qp_id, NULL, NULL);
11788 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11789 			"cryptodev %u did not fail",
11790 			qp_id, ts_params->valid_devs[0]);
11791 
11792 	/* Test with valid configuration */
11793 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11794 			qp_id, test_enq_callback, NULL);
11795 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11796 			"qp %u on cryptodev %u",
11797 			qp_id, ts_params->valid_devs[0]);
11798 
11799 	rte_cryptodev_start(ts_params->valid_devs[0]);
11800 
11801 	/* Launch a thread */
11802 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11803 				rte_get_next_lcore(-1, 1, 0));
11804 
11805 	/* Wait until reader exited. */
11806 	rte_eal_mp_wait_lcore();
11807 
11808 	/* Test with invalid crypto device */
11809 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11810 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11811 			"Expected call to fail as crypto device is invalid");
11812 
11813 	/* Test with invalid queue pair */
11814 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11815 			ts_params->valid_devs[0],
11816 			dev_info.max_nb_queue_pairs + 1, cb),
11817 			"Expected call to fail as queue pair is invalid");
11818 
11819 	/* Test with NULL callback */
11820 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11821 			ts_params->valid_devs[0], qp_id, NULL),
11822 			"Expected call to fail as callback is NULL");
11823 
11824 	/* Test with valid configuration */
11825 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
11826 			ts_params->valid_devs[0], qp_id, cb),
11827 			"Failed test to remove callback on "
11828 			"qp %u on cryptodev %u",
11829 			qp_id, ts_params->valid_devs[0]);
11830 
11831 	return TEST_SUCCESS;
11832 }
11833 
11834 static int
11835 test_deq_callback_setup(void)
11836 {
11837 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11838 	struct rte_cryptodev_info dev_info;
11839 	struct rte_cryptodev_qp_conf qp_conf = {
11840 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
11841 	};
11842 
11843 	struct rte_cryptodev_cb *cb;
11844 	uint16_t qp_id = 0;
11845 
11846 	/* Stop the device in case it's started so it can be configured */
11847 	rte_cryptodev_stop(ts_params->valid_devs[0]);
11848 
11849 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11850 
11851 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11852 			&ts_params->conf),
11853 			"Failed to configure cryptodev %u",
11854 			ts_params->valid_devs[0]);
11855 
11856 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11857 	qp_conf.mp_session = ts_params->session_mpool;
11858 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
11859 
11860 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11861 			ts_params->valid_devs[0], qp_id, &qp_conf,
11862 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11863 			"Failed test for "
11864 			"rte_cryptodev_queue_pair_setup: num_inflights "
11865 			"%u on qp %u on cryptodev %u",
11866 			qp_conf.nb_descriptors, qp_id,
11867 			ts_params->valid_devs[0]);
11868 
11869 	/* Test with invalid crypto device */
11870 	cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
11871 			qp_id, test_deq_callback, NULL);
11872 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11873 			"cryptodev %u did not fail",
11874 			qp_id, RTE_CRYPTO_MAX_DEVS);
11875 
11876 	/* Test with invalid queue pair */
11877 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11878 			dev_info.max_nb_queue_pairs + 1,
11879 			test_deq_callback, NULL);
11880 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11881 			"cryptodev %u did not fail",
11882 			dev_info.max_nb_queue_pairs + 1,
11883 			ts_params->valid_devs[0]);
11884 
11885 	/* Test with NULL callback */
11886 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11887 			qp_id, NULL, NULL);
11888 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11889 			"cryptodev %u did not fail",
11890 			qp_id, ts_params->valid_devs[0]);
11891 
11892 	/* Test with valid configuration */
11893 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11894 			qp_id, test_deq_callback, NULL);
11895 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11896 			"qp %u on cryptodev %u",
11897 			qp_id, ts_params->valid_devs[0]);
11898 
11899 	rte_cryptodev_start(ts_params->valid_devs[0]);
11900 
11901 	/* Launch a thread */
11902 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11903 				rte_get_next_lcore(-1, 1, 0));
11904 
11905 	/* Wait until reader exited. */
11906 	rte_eal_mp_wait_lcore();
11907 
11908 	/* Test with invalid crypto device */
11909 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11910 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11911 			"Expected call to fail as crypto device is invalid");
11912 
11913 	/* Test with invalid queue pair */
11914 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11915 			ts_params->valid_devs[0],
11916 			dev_info.max_nb_queue_pairs + 1, cb),
11917 			"Expected call to fail as queue pair is invalid");
11918 
11919 	/* Test with NULL callback */
11920 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11921 			ts_params->valid_devs[0], qp_id, NULL),
11922 			"Expected call to fail as callback is NULL");
11923 
11924 	/* Test with valid configuration */
11925 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
11926 			ts_params->valid_devs[0], qp_id, cb),
11927 			"Failed test to remove callback on "
11928 			"qp %u on cryptodev %u",
11929 			qp_id, ts_params->valid_devs[0]);
11930 
11931 	return TEST_SUCCESS;
11932 }
11933 
11934 static void
11935 generate_gmac_large_plaintext(uint8_t *data)
11936 {
11937 	uint16_t i;
11938 
11939 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
11940 		memcpy(&data[i], &data[0], 32);
11941 }
11942 
11943 static int
11944 create_gmac_operation(enum rte_crypto_auth_operation op,
11945 		const struct gmac_test_data *tdata)
11946 {
11947 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11948 	struct crypto_unittest_params *ut_params = &unittest_params;
11949 	struct rte_crypto_sym_op *sym_op;
11950 
11951 	uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11952 
11953 	/* Generate Crypto op data structure */
11954 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11955 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11956 	TEST_ASSERT_NOT_NULL(ut_params->op,
11957 			"Failed to allocate symmetric crypto operation struct");
11958 
11959 	sym_op = ut_params->op->sym;
11960 
11961 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11962 			ut_params->ibuf, tdata->gmac_tag.len);
11963 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11964 			"no room to append digest");
11965 
11966 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11967 			ut_params->ibuf, plaintext_pad_len);
11968 
11969 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11970 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11971 				tdata->gmac_tag.len);
11972 		debug_hexdump(stdout, "digest:",
11973 				sym_op->auth.digest.data,
11974 				tdata->gmac_tag.len);
11975 	}
11976 
11977 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11978 			uint8_t *, IV_OFFSET);
11979 
11980 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11981 
11982 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11983 
11984 	sym_op->cipher.data.length = 0;
11985 	sym_op->cipher.data.offset = 0;
11986 
11987 	sym_op->auth.data.offset = 0;
11988 	sym_op->auth.data.length = tdata->plaintext.len;
11989 
11990 	return 0;
11991 }
11992 
11993 static int
11994 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
11995 		const struct gmac_test_data *tdata,
11996 		void *digest_mem, uint64_t digest_phys)
11997 {
11998 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11999 	struct crypto_unittest_params *ut_params = &unittest_params;
12000 	struct rte_crypto_sym_op *sym_op;
12001 
12002 	/* Generate Crypto op data structure */
12003 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12004 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12005 	TEST_ASSERT_NOT_NULL(ut_params->op,
12006 			"Failed to allocate symmetric crypto operation struct");
12007 
12008 	sym_op = ut_params->op->sym;
12009 
12010 	sym_op->auth.digest.data = digest_mem;
12011 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12012 			"no room to append digest");
12013 
12014 	sym_op->auth.digest.phys_addr = digest_phys;
12015 
12016 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12017 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12018 				tdata->gmac_tag.len);
12019 		debug_hexdump(stdout, "digest:",
12020 				sym_op->auth.digest.data,
12021 				tdata->gmac_tag.len);
12022 	}
12023 
12024 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12025 			uint8_t *, IV_OFFSET);
12026 
12027 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12028 
12029 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12030 
12031 	sym_op->cipher.data.length = 0;
12032 	sym_op->cipher.data.offset = 0;
12033 
12034 	sym_op->auth.data.offset = 0;
12035 	sym_op->auth.data.length = tdata->plaintext.len;
12036 
12037 	return 0;
12038 }
12039 
12040 static int create_gmac_session(uint8_t dev_id,
12041 		const struct gmac_test_data *tdata,
12042 		enum rte_crypto_auth_operation auth_op)
12043 {
12044 	uint8_t auth_key[tdata->key.len];
12045 
12046 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12047 	struct crypto_unittest_params *ut_params = &unittest_params;
12048 
12049 	memcpy(auth_key, tdata->key.data, tdata->key.len);
12050 
12051 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12052 	ut_params->auth_xform.next = NULL;
12053 
12054 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
12055 	ut_params->auth_xform.auth.op = auth_op;
12056 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
12057 	ut_params->auth_xform.auth.key.length = tdata->key.len;
12058 	ut_params->auth_xform.auth.key.data = auth_key;
12059 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12060 	ut_params->auth_xform.auth.iv.length = tdata->iv.len;
12061 
12062 
12063 	ut_params->sess = rte_cryptodev_sym_session_create(
12064 			ts_params->session_mpool);
12065 
12066 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12067 			&ut_params->auth_xform,
12068 			ts_params->session_priv_mpool);
12069 
12070 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12071 
12072 	return 0;
12073 }
12074 
12075 static int
12076 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
12077 {
12078 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12079 	struct crypto_unittest_params *ut_params = &unittest_params;
12080 	struct rte_cryptodev_info dev_info;
12081 
12082 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12083 	uint64_t feat_flags = dev_info.feature_flags;
12084 
12085 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12086 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12087 		printf("Device doesn't support RAW data-path APIs.\n");
12088 		return TEST_SKIPPED;
12089 	}
12090 
12091 	int retval;
12092 
12093 	uint8_t *auth_tag, *plaintext;
12094 	uint16_t plaintext_pad_len;
12095 
12096 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12097 			      "No GMAC length in the source data");
12098 
12099 	/* Verify the capabilities */
12100 	struct rte_cryptodev_sym_capability_idx cap_idx;
12101 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12102 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12103 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12104 			&cap_idx) == NULL)
12105 		return TEST_SKIPPED;
12106 
12107 	retval = create_gmac_session(ts_params->valid_devs[0],
12108 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12109 
12110 	if (retval < 0)
12111 		return retval;
12112 
12113 	if (tdata->plaintext.len > MBUF_SIZE)
12114 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12115 	else
12116 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12117 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12118 			"Failed to allocate input buffer in mempool");
12119 
12120 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12121 			rte_pktmbuf_tailroom(ut_params->ibuf));
12122 
12123 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12124 	/*
12125 	 * Runtime generate the large plain text instead of use hard code
12126 	 * plain text vector. It is done to avoid create huge source file
12127 	 * with the test vector.
12128 	 */
12129 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12130 		generate_gmac_large_plaintext(tdata->plaintext.data);
12131 
12132 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12133 				plaintext_pad_len);
12134 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12135 
12136 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12137 	debug_hexdump(stdout, "plaintext:", plaintext,
12138 			tdata->plaintext.len);
12139 
12140 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
12141 			tdata);
12142 
12143 	if (retval < 0)
12144 		return retval;
12145 
12146 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12147 
12148 	ut_params->op->sym->m_src = ut_params->ibuf;
12149 
12150 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12151 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12152 			ut_params->op);
12153 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12154 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12155 				ut_params->op, 0, 1, 0, 0);
12156 	else
12157 		TEST_ASSERT_NOT_NULL(
12158 			process_crypto_request(ts_params->valid_devs[0],
12159 			ut_params->op), "failed to process sym crypto op");
12160 
12161 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12162 			"crypto op processing failed");
12163 
12164 	if (ut_params->op->sym->m_dst) {
12165 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12166 				uint8_t *, plaintext_pad_len);
12167 	} else {
12168 		auth_tag = plaintext + plaintext_pad_len;
12169 	}
12170 
12171 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12172 
12173 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12174 			auth_tag,
12175 			tdata->gmac_tag.data,
12176 			tdata->gmac_tag.len,
12177 			"GMAC Generated auth tag not as expected");
12178 
12179 	return 0;
12180 }
12181 
12182 static int
12183 test_AES_GMAC_authentication_test_case_1(void)
12184 {
12185 	return test_AES_GMAC_authentication(&gmac_test_case_1);
12186 }
12187 
12188 static int
12189 test_AES_GMAC_authentication_test_case_2(void)
12190 {
12191 	return test_AES_GMAC_authentication(&gmac_test_case_2);
12192 }
12193 
12194 static int
12195 test_AES_GMAC_authentication_test_case_3(void)
12196 {
12197 	return test_AES_GMAC_authentication(&gmac_test_case_3);
12198 }
12199 
12200 static int
12201 test_AES_GMAC_authentication_test_case_4(void)
12202 {
12203 	return test_AES_GMAC_authentication(&gmac_test_case_4);
12204 }
12205 
12206 static int
12207 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
12208 {
12209 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12210 	struct crypto_unittest_params *ut_params = &unittest_params;
12211 	int retval;
12212 	uint32_t plaintext_pad_len;
12213 	uint8_t *plaintext;
12214 	struct rte_cryptodev_info dev_info;
12215 
12216 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12217 	uint64_t feat_flags = dev_info.feature_flags;
12218 
12219 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12220 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12221 		printf("Device doesn't support RAW data-path APIs.\n");
12222 		return TEST_SKIPPED;
12223 	}
12224 
12225 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12226 			      "No GMAC length in the source data");
12227 
12228 	/* Verify the capabilities */
12229 	struct rte_cryptodev_sym_capability_idx cap_idx;
12230 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12231 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12232 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12233 			&cap_idx) == NULL)
12234 		return TEST_SKIPPED;
12235 
12236 	retval = create_gmac_session(ts_params->valid_devs[0],
12237 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
12238 
12239 	if (retval < 0)
12240 		return retval;
12241 
12242 	if (tdata->plaintext.len > MBUF_SIZE)
12243 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12244 	else
12245 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12246 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12247 			"Failed to allocate input buffer in mempool");
12248 
12249 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12250 			rte_pktmbuf_tailroom(ut_params->ibuf));
12251 
12252 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12253 
12254 	/*
12255 	 * Runtime generate the large plain text instead of use hard code
12256 	 * plain text vector. It is done to avoid create huge source file
12257 	 * with the test vector.
12258 	 */
12259 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12260 		generate_gmac_large_plaintext(tdata->plaintext.data);
12261 
12262 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12263 				plaintext_pad_len);
12264 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12265 
12266 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12267 	debug_hexdump(stdout, "plaintext:", plaintext,
12268 			tdata->plaintext.len);
12269 
12270 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
12271 			tdata);
12272 
12273 	if (retval < 0)
12274 		return retval;
12275 
12276 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12277 
12278 	ut_params->op->sym->m_src = ut_params->ibuf;
12279 
12280 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12281 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12282 			ut_params->op);
12283 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12284 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12285 				ut_params->op, 0, 1, 0, 0);
12286 	else
12287 		TEST_ASSERT_NOT_NULL(
12288 			process_crypto_request(ts_params->valid_devs[0],
12289 			ut_params->op), "failed to process sym crypto op");
12290 
12291 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12292 			"crypto op processing failed");
12293 
12294 	return 0;
12295 
12296 }
12297 
12298 static int
12299 test_AES_GMAC_authentication_verify_test_case_1(void)
12300 {
12301 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
12302 }
12303 
12304 static int
12305 test_AES_GMAC_authentication_verify_test_case_2(void)
12306 {
12307 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
12308 }
12309 
12310 static int
12311 test_AES_GMAC_authentication_verify_test_case_3(void)
12312 {
12313 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
12314 }
12315 
12316 static int
12317 test_AES_GMAC_authentication_verify_test_case_4(void)
12318 {
12319 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
12320 }
12321 
12322 static int
12323 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
12324 				uint32_t fragsz)
12325 {
12326 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12327 	struct crypto_unittest_params *ut_params = &unittest_params;
12328 	struct rte_cryptodev_info dev_info;
12329 	uint64_t feature_flags;
12330 	unsigned int trn_data = 0;
12331 	void *digest_mem = NULL;
12332 	uint32_t segs = 1;
12333 	unsigned int to_trn = 0;
12334 	struct rte_mbuf *buf = NULL;
12335 	uint8_t *auth_tag, *plaintext;
12336 	int retval;
12337 
12338 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12339 			      "No GMAC length in the source data");
12340 
12341 	/* Verify the capabilities */
12342 	struct rte_cryptodev_sym_capability_idx cap_idx;
12343 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12344 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12345 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12346 			&cap_idx) == NULL)
12347 		return TEST_SKIPPED;
12348 
12349 	/* Check for any input SGL support */
12350 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12351 	feature_flags = dev_info.feature_flags;
12352 
12353 	if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
12354 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
12355 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
12356 		return TEST_SKIPPED;
12357 
12358 	if (fragsz > tdata->plaintext.len)
12359 		fragsz = tdata->plaintext.len;
12360 
12361 	uint16_t plaintext_len = fragsz;
12362 
12363 	retval = create_gmac_session(ts_params->valid_devs[0],
12364 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12365 
12366 	if (retval < 0)
12367 		return retval;
12368 
12369 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12370 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12371 			"Failed to allocate input buffer in mempool");
12372 
12373 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12374 			rte_pktmbuf_tailroom(ut_params->ibuf));
12375 
12376 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12377 				plaintext_len);
12378 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12379 
12380 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12381 
12382 	trn_data += plaintext_len;
12383 
12384 	buf = ut_params->ibuf;
12385 
12386 	/*
12387 	 * Loop until no more fragments
12388 	 */
12389 
12390 	while (trn_data < tdata->plaintext.len) {
12391 		++segs;
12392 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12393 				(tdata->plaintext.len - trn_data) : fragsz;
12394 
12395 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12396 		buf = buf->next;
12397 
12398 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12399 				rte_pktmbuf_tailroom(buf));
12400 
12401 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12402 				to_trn);
12403 
12404 		memcpy(plaintext, tdata->plaintext.data + trn_data,
12405 				to_trn);
12406 		trn_data += to_trn;
12407 		if (trn_data  == tdata->plaintext.len)
12408 			digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12409 					tdata->gmac_tag.len);
12410 	}
12411 	ut_params->ibuf->nb_segs = segs;
12412 
12413 	/*
12414 	 * Place digest at the end of the last buffer
12415 	 */
12416 	uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12417 
12418 	if (!digest_mem) {
12419 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12420 				+ tdata->gmac_tag.len);
12421 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12422 				tdata->plaintext.len);
12423 	}
12424 
12425 	retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
12426 			tdata, digest_mem, digest_phys);
12427 
12428 	if (retval < 0)
12429 		return retval;
12430 
12431 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12432 
12433 	ut_params->op->sym->m_src = ut_params->ibuf;
12434 
12435 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12436 		return TEST_SKIPPED;
12437 
12438 	TEST_ASSERT_NOT_NULL(
12439 		process_crypto_request(ts_params->valid_devs[0],
12440 		ut_params->op), "failed to process sym crypto op");
12441 
12442 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12443 			"crypto op processing failed");
12444 
12445 	auth_tag = digest_mem;
12446 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12447 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12448 			auth_tag,
12449 			tdata->gmac_tag.data,
12450 			tdata->gmac_tag.len,
12451 			"GMAC Generated auth tag not as expected");
12452 
12453 	return 0;
12454 }
12455 
12456 /* Segment size not multiple of block size (16B) */
12457 static int
12458 test_AES_GMAC_authentication_SGL_40B(void)
12459 {
12460 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
12461 }
12462 
12463 static int
12464 test_AES_GMAC_authentication_SGL_80B(void)
12465 {
12466 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
12467 }
12468 
12469 static int
12470 test_AES_GMAC_authentication_SGL_2048B(void)
12471 {
12472 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
12473 }
12474 
12475 /* Segment size not multiple of block size (16B) */
12476 static int
12477 test_AES_GMAC_authentication_SGL_2047B(void)
12478 {
12479 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
12480 }
12481 
12482 struct test_crypto_vector {
12483 	enum rte_crypto_cipher_algorithm crypto_algo;
12484 	unsigned int cipher_offset;
12485 	unsigned int cipher_len;
12486 
12487 	struct {
12488 		uint8_t data[64];
12489 		unsigned int len;
12490 	} cipher_key;
12491 
12492 	struct {
12493 		uint8_t data[64];
12494 		unsigned int len;
12495 	} iv;
12496 
12497 	struct {
12498 		const uint8_t *data;
12499 		unsigned int len;
12500 	} plaintext;
12501 
12502 	struct {
12503 		const uint8_t *data;
12504 		unsigned int len;
12505 	} ciphertext;
12506 
12507 	enum rte_crypto_auth_algorithm auth_algo;
12508 	unsigned int auth_offset;
12509 
12510 	struct {
12511 		uint8_t data[128];
12512 		unsigned int len;
12513 	} auth_key;
12514 
12515 	struct {
12516 		const uint8_t *data;
12517 		unsigned int len;
12518 	} aad;
12519 
12520 	struct {
12521 		uint8_t data[128];
12522 		unsigned int len;
12523 	} digest;
12524 };
12525 
12526 static const struct test_crypto_vector
12527 hmac_sha1_test_crypto_vector = {
12528 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12529 	.plaintext = {
12530 		.data = plaintext_hash,
12531 		.len = 512
12532 	},
12533 	.auth_key = {
12534 		.data = {
12535 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12536 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12537 			0xDE, 0xF4, 0xDE, 0xAD
12538 		},
12539 		.len = 20
12540 	},
12541 	.digest = {
12542 		.data = {
12543 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
12544 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
12545 			0x3F, 0x91, 0x64, 0x59
12546 		},
12547 		.len = 20
12548 	}
12549 };
12550 
12551 static const struct test_crypto_vector
12552 aes128_gmac_test_vector = {
12553 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
12554 	.plaintext = {
12555 		.data = plaintext_hash,
12556 		.len = 512
12557 	},
12558 	.iv = {
12559 		.data = {
12560 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12561 			0x08, 0x09, 0x0A, 0x0B
12562 		},
12563 		.len = 12
12564 	},
12565 	.auth_key = {
12566 		.data = {
12567 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12568 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
12569 		},
12570 		.len = 16
12571 	},
12572 	.digest = {
12573 		.data = {
12574 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
12575 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
12576 		},
12577 		.len = 16
12578 	}
12579 };
12580 
12581 static const struct test_crypto_vector
12582 aes128cbc_hmac_sha1_test_vector = {
12583 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12584 	.cipher_offset = 0,
12585 	.cipher_len = 512,
12586 	.cipher_key = {
12587 		.data = {
12588 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12589 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12590 		},
12591 		.len = 16
12592 	},
12593 	.iv = {
12594 		.data = {
12595 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12596 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12597 		},
12598 		.len = 16
12599 	},
12600 	.plaintext = {
12601 		.data = plaintext_hash,
12602 		.len = 512
12603 	},
12604 	.ciphertext = {
12605 		.data = ciphertext512_aes128cbc,
12606 		.len = 512
12607 	},
12608 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12609 	.auth_offset = 0,
12610 	.auth_key = {
12611 		.data = {
12612 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12613 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12614 			0xDE, 0xF4, 0xDE, 0xAD
12615 		},
12616 		.len = 20
12617 	},
12618 	.digest = {
12619 		.data = {
12620 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
12621 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12622 			0x18, 0x8C, 0x1D, 0x32
12623 		},
12624 		.len = 20
12625 	}
12626 };
12627 
12628 static const struct test_crypto_vector
12629 aes128cbc_hmac_sha1_aad_test_vector = {
12630 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12631 	.cipher_offset = 8,
12632 	.cipher_len = 496,
12633 	.cipher_key = {
12634 		.data = {
12635 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12636 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12637 		},
12638 		.len = 16
12639 	},
12640 	.iv = {
12641 		.data = {
12642 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12643 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12644 		},
12645 		.len = 16
12646 	},
12647 	.plaintext = {
12648 		.data = plaintext_hash,
12649 		.len = 512
12650 	},
12651 	.ciphertext = {
12652 		.data = ciphertext512_aes128cbc_aad,
12653 		.len = 512
12654 	},
12655 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12656 	.auth_offset = 0,
12657 	.auth_key = {
12658 		.data = {
12659 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12660 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12661 			0xDE, 0xF4, 0xDE, 0xAD
12662 		},
12663 		.len = 20
12664 	},
12665 	.digest = {
12666 		.data = {
12667 			0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
12668 			0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
12669 			0x62, 0x0F, 0xFB, 0x10
12670 		},
12671 		.len = 20
12672 	}
12673 };
12674 
12675 static void
12676 data_corruption(uint8_t *data)
12677 {
12678 	data[0] += 1;
12679 }
12680 
12681 static void
12682 tag_corruption(uint8_t *data, unsigned int tag_offset)
12683 {
12684 	data[tag_offset] += 1;
12685 }
12686 
12687 static int
12688 create_auth_session(struct crypto_unittest_params *ut_params,
12689 		uint8_t dev_id,
12690 		const struct test_crypto_vector *reference,
12691 		enum rte_crypto_auth_operation auth_op)
12692 {
12693 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12694 	uint8_t auth_key[reference->auth_key.len + 1];
12695 
12696 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12697 
12698 	/* Setup Authentication Parameters */
12699 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12700 	ut_params->auth_xform.auth.op = auth_op;
12701 	ut_params->auth_xform.next = NULL;
12702 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12703 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12704 	ut_params->auth_xform.auth.key.data = auth_key;
12705 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12706 
12707 	/* Create Crypto session*/
12708 	ut_params->sess = rte_cryptodev_sym_session_create(
12709 			ts_params->session_mpool);
12710 
12711 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12712 				&ut_params->auth_xform,
12713 				ts_params->session_priv_mpool);
12714 
12715 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12716 
12717 	return 0;
12718 }
12719 
12720 static int
12721 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
12722 		uint8_t dev_id,
12723 		const struct test_crypto_vector *reference,
12724 		enum rte_crypto_auth_operation auth_op,
12725 		enum rte_crypto_cipher_operation cipher_op)
12726 {
12727 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12728 	uint8_t cipher_key[reference->cipher_key.len + 1];
12729 	uint8_t auth_key[reference->auth_key.len + 1];
12730 
12731 	memcpy(cipher_key, reference->cipher_key.data,
12732 			reference->cipher_key.len);
12733 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12734 
12735 	/* Setup Authentication Parameters */
12736 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12737 	ut_params->auth_xform.auth.op = auth_op;
12738 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12739 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12740 	ut_params->auth_xform.auth.key.data = auth_key;
12741 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12742 
12743 	if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
12744 		ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12745 		ut_params->auth_xform.auth.iv.length = reference->iv.len;
12746 	} else {
12747 		ut_params->auth_xform.next = &ut_params->cipher_xform;
12748 
12749 		/* Setup Cipher Parameters */
12750 		ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12751 		ut_params->cipher_xform.next = NULL;
12752 		ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12753 		ut_params->cipher_xform.cipher.op = cipher_op;
12754 		ut_params->cipher_xform.cipher.key.data = cipher_key;
12755 		ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12756 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12757 		ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12758 	}
12759 
12760 	/* Create Crypto session*/
12761 	ut_params->sess = rte_cryptodev_sym_session_create(
12762 			ts_params->session_mpool);
12763 
12764 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12765 				&ut_params->auth_xform,
12766 				ts_params->session_priv_mpool);
12767 
12768 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12769 
12770 	return 0;
12771 }
12772 
12773 static int
12774 create_auth_operation(struct crypto_testsuite_params *ts_params,
12775 		struct crypto_unittest_params *ut_params,
12776 		const struct test_crypto_vector *reference,
12777 		unsigned int auth_generate)
12778 {
12779 	/* Generate Crypto op data structure */
12780 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12781 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12782 	TEST_ASSERT_NOT_NULL(ut_params->op,
12783 			"Failed to allocate pktmbuf offload");
12784 
12785 	/* Set crypto operation data parameters */
12786 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12787 
12788 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12789 
12790 	/* set crypto operation source mbuf */
12791 	sym_op->m_src = ut_params->ibuf;
12792 
12793 	/* digest */
12794 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12795 			ut_params->ibuf, reference->digest.len);
12796 
12797 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12798 			"no room to append auth tag");
12799 
12800 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12801 			ut_params->ibuf, reference->plaintext.len);
12802 
12803 	if (auth_generate)
12804 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12805 	else
12806 		memcpy(sym_op->auth.digest.data,
12807 				reference->digest.data,
12808 				reference->digest.len);
12809 
12810 	debug_hexdump(stdout, "digest:",
12811 			sym_op->auth.digest.data,
12812 			reference->digest.len);
12813 
12814 	sym_op->auth.data.length = reference->plaintext.len;
12815 	sym_op->auth.data.offset = 0;
12816 
12817 	return 0;
12818 }
12819 
12820 static int
12821 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
12822 		struct crypto_unittest_params *ut_params,
12823 		const struct test_crypto_vector *reference,
12824 		unsigned int auth_generate)
12825 {
12826 	/* Generate Crypto op data structure */
12827 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12828 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12829 	TEST_ASSERT_NOT_NULL(ut_params->op,
12830 			"Failed to allocate pktmbuf offload");
12831 
12832 	/* Set crypto operation data parameters */
12833 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12834 
12835 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12836 
12837 	/* set crypto operation source mbuf */
12838 	sym_op->m_src = ut_params->ibuf;
12839 
12840 	/* digest */
12841 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12842 			ut_params->ibuf, reference->digest.len);
12843 
12844 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12845 			"no room to append auth tag");
12846 
12847 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12848 			ut_params->ibuf, reference->ciphertext.len);
12849 
12850 	if (auth_generate)
12851 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12852 	else
12853 		memcpy(sym_op->auth.digest.data,
12854 				reference->digest.data,
12855 				reference->digest.len);
12856 
12857 	debug_hexdump(stdout, "digest:",
12858 			sym_op->auth.digest.data,
12859 			reference->digest.len);
12860 
12861 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12862 			reference->iv.data, reference->iv.len);
12863 
12864 	sym_op->cipher.data.length = 0;
12865 	sym_op->cipher.data.offset = 0;
12866 
12867 	sym_op->auth.data.length = reference->plaintext.len;
12868 	sym_op->auth.data.offset = 0;
12869 
12870 	return 0;
12871 }
12872 
12873 static int
12874 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
12875 		struct crypto_unittest_params *ut_params,
12876 		const struct test_crypto_vector *reference,
12877 		unsigned int auth_generate)
12878 {
12879 	/* Generate Crypto op data structure */
12880 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12881 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12882 	TEST_ASSERT_NOT_NULL(ut_params->op,
12883 			"Failed to allocate pktmbuf offload");
12884 
12885 	/* Set crypto operation data parameters */
12886 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12887 
12888 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12889 
12890 	/* set crypto operation source mbuf */
12891 	sym_op->m_src = ut_params->ibuf;
12892 
12893 	/* digest */
12894 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12895 			ut_params->ibuf, reference->digest.len);
12896 
12897 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12898 			"no room to append auth tag");
12899 
12900 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12901 			ut_params->ibuf, reference->ciphertext.len);
12902 
12903 	if (auth_generate)
12904 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12905 	else
12906 		memcpy(sym_op->auth.digest.data,
12907 				reference->digest.data,
12908 				reference->digest.len);
12909 
12910 	debug_hexdump(stdout, "digest:",
12911 			sym_op->auth.digest.data,
12912 			reference->digest.len);
12913 
12914 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12915 			reference->iv.data, reference->iv.len);
12916 
12917 	sym_op->cipher.data.length = reference->cipher_len;
12918 	sym_op->cipher.data.offset = reference->cipher_offset;
12919 
12920 	sym_op->auth.data.length = reference->plaintext.len;
12921 	sym_op->auth.data.offset = reference->auth_offset;
12922 
12923 	return 0;
12924 }
12925 
12926 static int
12927 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12928 		struct crypto_unittest_params *ut_params,
12929 		const struct test_crypto_vector *reference)
12930 {
12931 	return create_auth_operation(ts_params, ut_params, reference, 0);
12932 }
12933 
12934 static int
12935 create_auth_verify_GMAC_operation(
12936 		struct crypto_testsuite_params *ts_params,
12937 		struct crypto_unittest_params *ut_params,
12938 		const struct test_crypto_vector *reference)
12939 {
12940 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
12941 }
12942 
12943 static int
12944 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12945 		struct crypto_unittest_params *ut_params,
12946 		const struct test_crypto_vector *reference)
12947 {
12948 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
12949 }
12950 
12951 static int
12952 test_authentication_verify_fail_when_data_corruption(
12953 		struct crypto_testsuite_params *ts_params,
12954 		struct crypto_unittest_params *ut_params,
12955 		const struct test_crypto_vector *reference,
12956 		unsigned int data_corrupted)
12957 {
12958 	int retval;
12959 
12960 	uint8_t *plaintext;
12961 	struct rte_cryptodev_info dev_info;
12962 
12963 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12964 	uint64_t feat_flags = dev_info.feature_flags;
12965 
12966 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12967 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12968 		printf("Device doesn't support RAW data-path APIs.\n");
12969 		return TEST_SKIPPED;
12970 	}
12971 
12972 	/* Verify the capabilities */
12973 	struct rte_cryptodev_sym_capability_idx cap_idx;
12974 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12975 	cap_idx.algo.auth = reference->auth_algo;
12976 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12977 			&cap_idx) == NULL)
12978 		return TEST_SKIPPED;
12979 
12980 
12981 	/* Create session */
12982 	retval = create_auth_session(ut_params,
12983 			ts_params->valid_devs[0],
12984 			reference,
12985 			RTE_CRYPTO_AUTH_OP_VERIFY);
12986 	if (retval < 0)
12987 		return retval;
12988 
12989 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12990 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12991 			"Failed to allocate input buffer in mempool");
12992 
12993 	/* clear mbuf payload */
12994 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12995 			rte_pktmbuf_tailroom(ut_params->ibuf));
12996 
12997 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12998 			reference->plaintext.len);
12999 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13000 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13001 
13002 	debug_hexdump(stdout, "plaintext:", plaintext,
13003 		reference->plaintext.len);
13004 
13005 	/* Create operation */
13006 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
13007 
13008 	if (retval < 0)
13009 		return retval;
13010 
13011 	if (data_corrupted)
13012 		data_corruption(plaintext);
13013 	else
13014 		tag_corruption(plaintext, reference->plaintext.len);
13015 
13016 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13017 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13018 			ut_params->op);
13019 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13020 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13021 			"authentication not failed");
13022 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13023 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13024 				ut_params->op, 0, 1, 0, 0);
13025 	else {
13026 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13027 			ut_params->op);
13028 	}
13029 	if (ut_params->op == NULL)
13030 		return 0;
13031 	else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
13032 		return 0;
13033 
13034 	return -1;
13035 }
13036 
13037 static int
13038 test_authentication_verify_GMAC_fail_when_corruption(
13039 		struct crypto_testsuite_params *ts_params,
13040 		struct crypto_unittest_params *ut_params,
13041 		const struct test_crypto_vector *reference,
13042 		unsigned int data_corrupted)
13043 {
13044 	int retval;
13045 	uint8_t *plaintext;
13046 	struct rte_cryptodev_info dev_info;
13047 
13048 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13049 	uint64_t feat_flags = dev_info.feature_flags;
13050 
13051 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13052 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13053 		printf("Device doesn't support RAW data-path APIs.\n");
13054 		return TEST_SKIPPED;
13055 	}
13056 
13057 	/* Verify the capabilities */
13058 	struct rte_cryptodev_sym_capability_idx cap_idx;
13059 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13060 	cap_idx.algo.auth = reference->auth_algo;
13061 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13062 			&cap_idx) == NULL)
13063 		return TEST_SKIPPED;
13064 
13065 	/* Create session */
13066 	retval = create_auth_cipher_session(ut_params,
13067 			ts_params->valid_devs[0],
13068 			reference,
13069 			RTE_CRYPTO_AUTH_OP_VERIFY,
13070 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
13071 	if (retval < 0)
13072 		return retval;
13073 
13074 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13075 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13076 			"Failed to allocate input buffer in mempool");
13077 
13078 	/* clear mbuf payload */
13079 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13080 			rte_pktmbuf_tailroom(ut_params->ibuf));
13081 
13082 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13083 			reference->plaintext.len);
13084 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13085 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13086 
13087 	debug_hexdump(stdout, "plaintext:", plaintext,
13088 		reference->plaintext.len);
13089 
13090 	/* Create operation */
13091 	retval = create_auth_verify_GMAC_operation(ts_params,
13092 			ut_params,
13093 			reference);
13094 
13095 	if (retval < 0)
13096 		return retval;
13097 
13098 	if (data_corrupted)
13099 		data_corruption(plaintext);
13100 	else
13101 		tag_corruption(plaintext, reference->aad.len);
13102 
13103 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13104 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13105 			ut_params->op);
13106 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13107 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13108 			"authentication not failed");
13109 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13110 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13111 				ut_params->op, 0, 1, 0, 0);
13112 	else {
13113 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13114 			ut_params->op);
13115 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13116 	}
13117 
13118 	return 0;
13119 }
13120 
13121 static int
13122 test_authenticated_decryption_fail_when_corruption(
13123 		struct crypto_testsuite_params *ts_params,
13124 		struct crypto_unittest_params *ut_params,
13125 		const struct test_crypto_vector *reference,
13126 		unsigned int data_corrupted)
13127 {
13128 	int retval;
13129 
13130 	uint8_t *ciphertext;
13131 	struct rte_cryptodev_info dev_info;
13132 
13133 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13134 	uint64_t feat_flags = dev_info.feature_flags;
13135 
13136 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13137 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13138 		printf("Device doesn't support RAW data-path APIs.\n");
13139 		return TEST_SKIPPED;
13140 	}
13141 
13142 	/* Verify the capabilities */
13143 	struct rte_cryptodev_sym_capability_idx cap_idx;
13144 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13145 	cap_idx.algo.auth = reference->auth_algo;
13146 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13147 			&cap_idx) == NULL)
13148 		return TEST_SKIPPED;
13149 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13150 	cap_idx.algo.cipher = reference->crypto_algo;
13151 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13152 			&cap_idx) == NULL)
13153 		return TEST_SKIPPED;
13154 
13155 	/* Create session */
13156 	retval = create_auth_cipher_session(ut_params,
13157 			ts_params->valid_devs[0],
13158 			reference,
13159 			RTE_CRYPTO_AUTH_OP_VERIFY,
13160 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
13161 	if (retval < 0)
13162 		return retval;
13163 
13164 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13165 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13166 			"Failed to allocate input buffer in mempool");
13167 
13168 	/* clear mbuf payload */
13169 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13170 			rte_pktmbuf_tailroom(ut_params->ibuf));
13171 
13172 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13173 			reference->ciphertext.len);
13174 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13175 	memcpy(ciphertext, reference->ciphertext.data,
13176 			reference->ciphertext.len);
13177 
13178 	/* Create operation */
13179 	retval = create_cipher_auth_verify_operation(ts_params,
13180 			ut_params,
13181 			reference);
13182 
13183 	if (retval < 0)
13184 		return retval;
13185 
13186 	if (data_corrupted)
13187 		data_corruption(ciphertext);
13188 	else
13189 		tag_corruption(ciphertext, reference->ciphertext.len);
13190 
13191 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13192 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13193 			ut_params->op);
13194 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13195 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13196 			"authentication not failed");
13197 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13198 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13199 				ut_params->op, 1, 1, 0, 0);
13200 	else {
13201 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13202 			ut_params->op);
13203 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13204 	}
13205 
13206 	return 0;
13207 }
13208 
13209 static int
13210 test_authenticated_encrypt_with_esn(
13211 		struct crypto_testsuite_params *ts_params,
13212 		struct crypto_unittest_params *ut_params,
13213 		const struct test_crypto_vector *reference)
13214 {
13215 	int retval;
13216 
13217 	uint8_t *authciphertext, *plaintext, *auth_tag;
13218 	uint16_t plaintext_pad_len;
13219 	uint8_t cipher_key[reference->cipher_key.len + 1];
13220 	uint8_t auth_key[reference->auth_key.len + 1];
13221 	struct rte_cryptodev_info dev_info;
13222 
13223 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13224 	uint64_t feat_flags = dev_info.feature_flags;
13225 
13226 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13227 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13228 		printf("Device doesn't support RAW data-path APIs.\n");
13229 		return TEST_SKIPPED;
13230 	}
13231 
13232 	/* Verify the capabilities */
13233 	struct rte_cryptodev_sym_capability_idx cap_idx;
13234 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13235 	cap_idx.algo.auth = reference->auth_algo;
13236 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13237 			&cap_idx) == NULL)
13238 		return TEST_SKIPPED;
13239 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13240 	cap_idx.algo.cipher = reference->crypto_algo;
13241 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13242 			&cap_idx) == NULL)
13243 		return TEST_SKIPPED;
13244 
13245 	/* Create session */
13246 	memcpy(cipher_key, reference->cipher_key.data,
13247 			reference->cipher_key.len);
13248 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13249 
13250 	/* Setup Cipher Parameters */
13251 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13252 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13253 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13254 	ut_params->cipher_xform.cipher.key.data = cipher_key;
13255 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13256 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13257 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13258 
13259 	ut_params->cipher_xform.next = &ut_params->auth_xform;
13260 
13261 	/* Setup Authentication Parameters */
13262 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13263 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13264 	ut_params->auth_xform.auth.algo = reference->auth_algo;
13265 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13266 	ut_params->auth_xform.auth.key.data = auth_key;
13267 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
13268 	ut_params->auth_xform.next = NULL;
13269 
13270 	/* Create Crypto session*/
13271 	ut_params->sess = rte_cryptodev_sym_session_create(
13272 			ts_params->session_mpool);
13273 
13274 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13275 				ut_params->sess,
13276 				&ut_params->cipher_xform,
13277 				ts_params->session_priv_mpool);
13278 
13279 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13280 
13281 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13282 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13283 			"Failed to allocate input buffer in mempool");
13284 
13285 	/* clear mbuf payload */
13286 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13287 			rte_pktmbuf_tailroom(ut_params->ibuf));
13288 
13289 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13290 			reference->plaintext.len);
13291 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13292 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13293 
13294 	/* Create operation */
13295 	retval = create_cipher_auth_operation(ts_params,
13296 			ut_params,
13297 			reference, 0);
13298 
13299 	if (retval < 0)
13300 		return retval;
13301 
13302 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13303 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13304 			ut_params->op);
13305 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13306 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13307 				ut_params->op, 1, 1, 0, 0);
13308 	else
13309 		ut_params->op = process_crypto_request(
13310 			ts_params->valid_devs[0], ut_params->op);
13311 
13312 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
13313 
13314 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13315 			"crypto op processing failed");
13316 
13317 	plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
13318 
13319 	authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
13320 			ut_params->op->sym->auth.data.offset);
13321 	auth_tag = authciphertext + plaintext_pad_len;
13322 	debug_hexdump(stdout, "ciphertext:", authciphertext,
13323 			reference->ciphertext.len);
13324 	debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
13325 
13326 	/* Validate obuf */
13327 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13328 			authciphertext,
13329 			reference->ciphertext.data,
13330 			reference->ciphertext.len,
13331 			"Ciphertext data not as expected");
13332 
13333 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13334 			auth_tag,
13335 			reference->digest.data,
13336 			reference->digest.len,
13337 			"Generated digest not as expected");
13338 
13339 	return TEST_SUCCESS;
13340 
13341 }
13342 
13343 static int
13344 test_authenticated_decrypt_with_esn(
13345 		struct crypto_testsuite_params *ts_params,
13346 		struct crypto_unittest_params *ut_params,
13347 		const struct test_crypto_vector *reference)
13348 {
13349 	int retval;
13350 
13351 	uint8_t *ciphertext;
13352 	uint8_t cipher_key[reference->cipher_key.len + 1];
13353 	uint8_t auth_key[reference->auth_key.len + 1];
13354 	struct rte_cryptodev_info dev_info;
13355 
13356 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13357 	uint64_t feat_flags = dev_info.feature_flags;
13358 
13359 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13360 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13361 		printf("Device doesn't support RAW data-path APIs.\n");
13362 		return TEST_SKIPPED;
13363 	}
13364 
13365 	/* Verify the capabilities */
13366 	struct rte_cryptodev_sym_capability_idx cap_idx;
13367 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13368 	cap_idx.algo.auth = reference->auth_algo;
13369 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13370 			&cap_idx) == NULL)
13371 		return TEST_SKIPPED;
13372 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13373 	cap_idx.algo.cipher = reference->crypto_algo;
13374 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13375 			&cap_idx) == NULL)
13376 		return TEST_SKIPPED;
13377 
13378 	/* Create session */
13379 	memcpy(cipher_key, reference->cipher_key.data,
13380 			reference->cipher_key.len);
13381 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13382 
13383 	/* Setup Authentication Parameters */
13384 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13385 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
13386 	ut_params->auth_xform.auth.algo = reference->auth_algo;
13387 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13388 	ut_params->auth_xform.auth.key.data = auth_key;
13389 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
13390 	ut_params->auth_xform.next = &ut_params->cipher_xform;
13391 
13392 	/* Setup Cipher Parameters */
13393 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13394 	ut_params->cipher_xform.next = NULL;
13395 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13396 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
13397 	ut_params->cipher_xform.cipher.key.data = cipher_key;
13398 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13399 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13400 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13401 
13402 	/* Create Crypto session*/
13403 	ut_params->sess = rte_cryptodev_sym_session_create(
13404 			ts_params->session_mpool);
13405 
13406 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13407 				ut_params->sess,
13408 				&ut_params->auth_xform,
13409 				ts_params->session_priv_mpool);
13410 
13411 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13412 
13413 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13414 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13415 			"Failed to allocate input buffer in mempool");
13416 
13417 	/* clear mbuf payload */
13418 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13419 			rte_pktmbuf_tailroom(ut_params->ibuf));
13420 
13421 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13422 			reference->ciphertext.len);
13423 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13424 	memcpy(ciphertext, reference->ciphertext.data,
13425 			reference->ciphertext.len);
13426 
13427 	/* Create operation */
13428 	retval = create_cipher_auth_verify_operation(ts_params,
13429 			ut_params,
13430 			reference);
13431 
13432 	if (retval < 0)
13433 		return retval;
13434 
13435 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13436 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13437 			ut_params->op);
13438 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13439 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13440 				ut_params->op, 1, 1, 0, 0);
13441 	else
13442 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13443 			ut_params->op);
13444 
13445 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
13446 	TEST_ASSERT_EQUAL(ut_params->op->status,
13447 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13448 			"crypto op processing passed");
13449 
13450 	ut_params->obuf = ut_params->op->sym->m_src;
13451 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
13452 
13453 	return 0;
13454 }
13455 
13456 static int
13457 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
13458 		const struct aead_test_data *tdata,
13459 		void *digest_mem, uint64_t digest_phys)
13460 {
13461 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13462 	struct crypto_unittest_params *ut_params = &unittest_params;
13463 
13464 	const unsigned int auth_tag_len = tdata->auth_tag.len;
13465 	const unsigned int iv_len = tdata->iv.len;
13466 	unsigned int aad_len = tdata->aad.len;
13467 	unsigned int aad_len_pad = 0;
13468 
13469 	/* Generate Crypto op data structure */
13470 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13471 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13472 	TEST_ASSERT_NOT_NULL(ut_params->op,
13473 		"Failed to allocate symmetric crypto operation struct");
13474 
13475 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13476 
13477 	sym_op->aead.digest.data = digest_mem;
13478 
13479 	TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
13480 			"no room to append digest");
13481 
13482 	sym_op->aead.digest.phys_addr = digest_phys;
13483 
13484 	if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
13485 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
13486 				auth_tag_len);
13487 		debug_hexdump(stdout, "digest:",
13488 				sym_op->aead.digest.data,
13489 				auth_tag_len);
13490 	}
13491 
13492 	/* Append aad data */
13493 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
13494 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13495 				uint8_t *, IV_OFFSET);
13496 
13497 		/* Copy IV 1 byte after the IV pointer, according to the API */
13498 		rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
13499 
13500 		aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
13501 
13502 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13503 				ut_params->ibuf, aad_len);
13504 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13505 				"no room to prepend aad");
13506 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13507 				ut_params->ibuf);
13508 
13509 		memset(sym_op->aead.aad.data, 0, aad_len);
13510 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
13511 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13512 
13513 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13514 		debug_hexdump(stdout, "aad:",
13515 				sym_op->aead.aad.data, aad_len);
13516 	} else {
13517 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13518 				uint8_t *, IV_OFFSET);
13519 
13520 		rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
13521 
13522 		aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
13523 
13524 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13525 				ut_params->ibuf, aad_len_pad);
13526 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13527 				"no room to prepend aad");
13528 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13529 				ut_params->ibuf);
13530 
13531 		memset(sym_op->aead.aad.data, 0, aad_len);
13532 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13533 
13534 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13535 		debug_hexdump(stdout, "aad:",
13536 				sym_op->aead.aad.data, aad_len);
13537 	}
13538 
13539 	sym_op->aead.data.length = tdata->plaintext.len;
13540 	sym_op->aead.data.offset = aad_len_pad;
13541 
13542 	return 0;
13543 }
13544 
13545 #define SGL_MAX_NO	16
13546 
13547 static int
13548 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
13549 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
13550 {
13551 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13552 	struct crypto_unittest_params *ut_params = &unittest_params;
13553 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
13554 	int retval;
13555 	int to_trn = 0;
13556 	int to_trn_tbl[SGL_MAX_NO];
13557 	int segs = 1;
13558 	unsigned int trn_data = 0;
13559 	uint8_t *plaintext, *ciphertext, *auth_tag;
13560 	struct rte_cryptodev_info dev_info;
13561 
13562 	/* Verify the capabilities */
13563 	struct rte_cryptodev_sym_capability_idx cap_idx;
13564 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
13565 	cap_idx.algo.aead = tdata->algo;
13566 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13567 			&cap_idx) == NULL)
13568 		return TEST_SKIPPED;
13569 
13570 	/* OOP not supported with CPU crypto */
13571 	if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13572 		return TEST_SKIPPED;
13573 
13574 	/* Detailed check for the particular SGL support flag */
13575 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13576 	if (!oop) {
13577 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
13578 		if (sgl_in && (!(dev_info.feature_flags &
13579 				RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
13580 			return TEST_SKIPPED;
13581 
13582 		uint64_t feat_flags = dev_info.feature_flags;
13583 
13584 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13585 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13586 			printf("Device doesn't support RAW data-path APIs.\n");
13587 			return TEST_SKIPPED;
13588 		}
13589 	} else {
13590 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
13591 		unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
13592 				tdata->plaintext.len;
13593 		/* Raw data path API does not support OOP */
13594 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13595 			return TEST_SKIPPED;
13596 		if (sgl_in && !sgl_out) {
13597 			if (!(dev_info.feature_flags &
13598 					RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
13599 				return TEST_SKIPPED;
13600 		} else if (!sgl_in && sgl_out) {
13601 			if (!(dev_info.feature_flags &
13602 					RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
13603 				return TEST_SKIPPED;
13604 		} else if (sgl_in && sgl_out) {
13605 			if (!(dev_info.feature_flags &
13606 					RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
13607 				return TEST_SKIPPED;
13608 		}
13609 	}
13610 
13611 	if (fragsz > tdata->plaintext.len)
13612 		fragsz = tdata->plaintext.len;
13613 
13614 	uint16_t plaintext_len = fragsz;
13615 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
13616 
13617 	if (fragsz_oop > tdata->plaintext.len)
13618 		frag_size_oop = tdata->plaintext.len;
13619 
13620 	int ecx = 0;
13621 	void *digest_mem = NULL;
13622 
13623 	uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
13624 
13625 	if (tdata->plaintext.len % fragsz != 0) {
13626 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
13627 			return 1;
13628 	}	else {
13629 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
13630 			return 1;
13631 	}
13632 
13633 	/*
13634 	 * For out-op-place we need to alloc another mbuf
13635 	 */
13636 	if (oop) {
13637 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13638 		rte_pktmbuf_append(ut_params->obuf,
13639 				frag_size_oop + prepend_len);
13640 		buf_oop = ut_params->obuf;
13641 	}
13642 
13643 	/* Create AEAD session */
13644 	retval = create_aead_session(ts_params->valid_devs[0],
13645 			tdata->algo,
13646 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
13647 			tdata->key.data, tdata->key.len,
13648 			tdata->aad.len, tdata->auth_tag.len,
13649 			tdata->iv.len);
13650 	if (retval < 0)
13651 		return retval;
13652 
13653 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13654 
13655 	/* clear mbuf payload */
13656 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13657 			rte_pktmbuf_tailroom(ut_params->ibuf));
13658 
13659 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13660 			plaintext_len);
13661 
13662 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13663 
13664 	trn_data += plaintext_len;
13665 
13666 	buf = ut_params->ibuf;
13667 
13668 	/*
13669 	 * Loop until no more fragments
13670 	 */
13671 
13672 	while (trn_data < tdata->plaintext.len) {
13673 		++segs;
13674 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13675 				(tdata->plaintext.len - trn_data) : fragsz;
13676 
13677 		to_trn_tbl[ecx++] = to_trn;
13678 
13679 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13680 		buf = buf->next;
13681 
13682 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13683 				rte_pktmbuf_tailroom(buf));
13684 
13685 		/* OOP */
13686 		if (oop && !fragsz_oop) {
13687 			buf_last_oop = buf_oop->next =
13688 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
13689 			buf_oop = buf_oop->next;
13690 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13691 					0, rte_pktmbuf_tailroom(buf_oop));
13692 			rte_pktmbuf_append(buf_oop, to_trn);
13693 		}
13694 
13695 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
13696 				to_trn);
13697 
13698 		memcpy(plaintext, tdata->plaintext.data + trn_data,
13699 				to_trn);
13700 		trn_data += to_trn;
13701 		if (trn_data  == tdata->plaintext.len) {
13702 			if (oop) {
13703 				if (!fragsz_oop)
13704 					digest_mem = rte_pktmbuf_append(buf_oop,
13705 						tdata->auth_tag.len);
13706 			} else
13707 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
13708 					tdata->auth_tag.len);
13709 		}
13710 	}
13711 
13712 	uint64_t digest_phys = 0;
13713 
13714 	ut_params->ibuf->nb_segs = segs;
13715 
13716 	segs = 1;
13717 	if (fragsz_oop && oop) {
13718 		to_trn = 0;
13719 		ecx = 0;
13720 
13721 		if (frag_size_oop == tdata->plaintext.len) {
13722 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
13723 				tdata->auth_tag.len);
13724 
13725 			digest_phys = rte_pktmbuf_iova_offset(
13726 					ut_params->obuf,
13727 					tdata->plaintext.len + prepend_len);
13728 		}
13729 
13730 		trn_data = frag_size_oop;
13731 		while (trn_data < tdata->plaintext.len) {
13732 			++segs;
13733 			to_trn =
13734 				(tdata->plaintext.len - trn_data <
13735 						frag_size_oop) ?
13736 				(tdata->plaintext.len - trn_data) :
13737 						frag_size_oop;
13738 
13739 			to_trn_tbl[ecx++] = to_trn;
13740 
13741 			buf_last_oop = buf_oop->next =
13742 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
13743 			buf_oop = buf_oop->next;
13744 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13745 					0, rte_pktmbuf_tailroom(buf_oop));
13746 			rte_pktmbuf_append(buf_oop, to_trn);
13747 
13748 			trn_data += to_trn;
13749 
13750 			if (trn_data  == tdata->plaintext.len) {
13751 				digest_mem = rte_pktmbuf_append(buf_oop,
13752 					tdata->auth_tag.len);
13753 			}
13754 		}
13755 
13756 		ut_params->obuf->nb_segs = segs;
13757 	}
13758 
13759 	/*
13760 	 * Place digest at the end of the last buffer
13761 	 */
13762 	if (!digest_phys)
13763 		digest_phys = rte_pktmbuf_iova(buf) + to_trn;
13764 	if (oop && buf_last_oop)
13765 		digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
13766 
13767 	if (!digest_mem && !oop) {
13768 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13769 				+ tdata->auth_tag.len);
13770 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
13771 				tdata->plaintext.len);
13772 	}
13773 
13774 	/* Create AEAD operation */
13775 	retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
13776 			tdata, digest_mem, digest_phys);
13777 
13778 	if (retval < 0)
13779 		return retval;
13780 
13781 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13782 
13783 	ut_params->op->sym->m_src = ut_params->ibuf;
13784 	if (oop)
13785 		ut_params->op->sym->m_dst = ut_params->obuf;
13786 
13787 	/* Process crypto operation */
13788 	if (oop == IN_PLACE &&
13789 			gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13790 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
13791 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13792 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13793 				ut_params->op, 0, 0, 0, 0);
13794 	else
13795 		TEST_ASSERT_NOT_NULL(
13796 			process_crypto_request(ts_params->valid_devs[0],
13797 			ut_params->op), "failed to process sym crypto op");
13798 
13799 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13800 			"crypto op processing failed");
13801 
13802 
13803 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
13804 			uint8_t *, prepend_len);
13805 	if (oop) {
13806 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
13807 				uint8_t *, prepend_len);
13808 	}
13809 
13810 	if (fragsz_oop)
13811 		fragsz = fragsz_oop;
13812 
13813 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13814 			ciphertext,
13815 			tdata->ciphertext.data,
13816 			fragsz,
13817 			"Ciphertext data not as expected");
13818 
13819 	buf = ut_params->op->sym->m_src->next;
13820 	if (oop)
13821 		buf = ut_params->op->sym->m_dst->next;
13822 
13823 	unsigned int off = fragsz;
13824 
13825 	ecx = 0;
13826 	while (buf) {
13827 		ciphertext = rte_pktmbuf_mtod(buf,
13828 				uint8_t *);
13829 
13830 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
13831 				ciphertext,
13832 				tdata->ciphertext.data + off,
13833 				to_trn_tbl[ecx],
13834 				"Ciphertext data not as expected");
13835 
13836 		off += to_trn_tbl[ecx++];
13837 		buf = buf->next;
13838 	}
13839 
13840 	auth_tag = digest_mem;
13841 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13842 			auth_tag,
13843 			tdata->auth_tag.data,
13844 			tdata->auth_tag.len,
13845 			"Generated auth tag not as expected");
13846 
13847 	return 0;
13848 }
13849 
13850 static int
13851 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
13852 {
13853 	return test_authenticated_encryption_SGL(
13854 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
13855 }
13856 
13857 static int
13858 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
13859 {
13860 	return test_authenticated_encryption_SGL(
13861 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
13862 }
13863 
13864 static int
13865 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
13866 {
13867 	return test_authenticated_encryption_SGL(
13868 			&gcm_test_case_8, OUT_OF_PLACE, 400,
13869 			gcm_test_case_8.plaintext.len);
13870 }
13871 
13872 static int
13873 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
13874 {
13875 	/* This test is not for OPENSSL PMD */
13876 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
13877 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
13878 		return TEST_SKIPPED;
13879 
13880 	return test_authenticated_encryption_SGL(
13881 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
13882 }
13883 
13884 static int
13885 test_authentication_verify_fail_when_data_corrupted(
13886 		struct crypto_testsuite_params *ts_params,
13887 		struct crypto_unittest_params *ut_params,
13888 		const struct test_crypto_vector *reference)
13889 {
13890 	return test_authentication_verify_fail_when_data_corruption(
13891 			ts_params, ut_params, reference, 1);
13892 }
13893 
13894 static int
13895 test_authentication_verify_fail_when_tag_corrupted(
13896 		struct crypto_testsuite_params *ts_params,
13897 		struct crypto_unittest_params *ut_params,
13898 		const struct test_crypto_vector *reference)
13899 {
13900 	return test_authentication_verify_fail_when_data_corruption(
13901 			ts_params, ut_params, reference, 0);
13902 }
13903 
13904 static int
13905 test_authentication_verify_GMAC_fail_when_data_corrupted(
13906 		struct crypto_testsuite_params *ts_params,
13907 		struct crypto_unittest_params *ut_params,
13908 		const struct test_crypto_vector *reference)
13909 {
13910 	return test_authentication_verify_GMAC_fail_when_corruption(
13911 			ts_params, ut_params, reference, 1);
13912 }
13913 
13914 static int
13915 test_authentication_verify_GMAC_fail_when_tag_corrupted(
13916 		struct crypto_testsuite_params *ts_params,
13917 		struct crypto_unittest_params *ut_params,
13918 		const struct test_crypto_vector *reference)
13919 {
13920 	return test_authentication_verify_GMAC_fail_when_corruption(
13921 			ts_params, ut_params, reference, 0);
13922 }
13923 
13924 static int
13925 test_authenticated_decryption_fail_when_data_corrupted(
13926 		struct crypto_testsuite_params *ts_params,
13927 		struct crypto_unittest_params *ut_params,
13928 		const struct test_crypto_vector *reference)
13929 {
13930 	return test_authenticated_decryption_fail_when_corruption(
13931 			ts_params, ut_params, reference, 1);
13932 }
13933 
13934 static int
13935 test_authenticated_decryption_fail_when_tag_corrupted(
13936 		struct crypto_testsuite_params *ts_params,
13937 		struct crypto_unittest_params *ut_params,
13938 		const struct test_crypto_vector *reference)
13939 {
13940 	return test_authenticated_decryption_fail_when_corruption(
13941 			ts_params, ut_params, reference, 0);
13942 }
13943 
13944 static int
13945 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
13946 {
13947 	return test_authentication_verify_fail_when_data_corrupted(
13948 			&testsuite_params, &unittest_params,
13949 			&hmac_sha1_test_crypto_vector);
13950 }
13951 
13952 static int
13953 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
13954 {
13955 	return test_authentication_verify_fail_when_tag_corrupted(
13956 			&testsuite_params, &unittest_params,
13957 			&hmac_sha1_test_crypto_vector);
13958 }
13959 
13960 static int
13961 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
13962 {
13963 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
13964 			&testsuite_params, &unittest_params,
13965 			&aes128_gmac_test_vector);
13966 }
13967 
13968 static int
13969 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
13970 {
13971 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
13972 			&testsuite_params, &unittest_params,
13973 			&aes128_gmac_test_vector);
13974 }
13975 
13976 static int
13977 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
13978 {
13979 	return test_authenticated_decryption_fail_when_data_corrupted(
13980 			&testsuite_params,
13981 			&unittest_params,
13982 			&aes128cbc_hmac_sha1_test_vector);
13983 }
13984 
13985 static int
13986 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
13987 {
13988 	return test_authenticated_decryption_fail_when_tag_corrupted(
13989 			&testsuite_params,
13990 			&unittest_params,
13991 			&aes128cbc_hmac_sha1_test_vector);
13992 }
13993 
13994 static int
13995 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13996 {
13997 	return test_authenticated_encrypt_with_esn(
13998 			&testsuite_params,
13999 			&unittest_params,
14000 			&aes128cbc_hmac_sha1_aad_test_vector);
14001 }
14002 
14003 static int
14004 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14005 {
14006 	return test_authenticated_decrypt_with_esn(
14007 			&testsuite_params,
14008 			&unittest_params,
14009 			&aes128cbc_hmac_sha1_aad_test_vector);
14010 }
14011 
14012 static int
14013 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
14014 {
14015 	return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
14016 }
14017 
14018 static int
14019 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
14020 {
14021 	return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
14022 }
14023 
14024 static int
14025 test_chacha20_poly1305_encrypt_SGL_out_of_place(void)
14026 {
14027 	return test_authenticated_encryption_SGL(
14028 		&chacha20_poly1305_case_2, OUT_OF_PLACE, 32,
14029 		chacha20_poly1305_case_2.plaintext.len);
14030 }
14031 
14032 #ifdef RTE_CRYPTO_SCHEDULER
14033 
14034 /* global AESNI worker IDs for the scheduler test */
14035 uint8_t aesni_ids[2];
14036 
14037 static int
14038 scheduler_testsuite_setup(void)
14039 {
14040 	uint32_t i = 0;
14041 	int32_t nb_devs, ret;
14042 	char vdev_args[VDEV_ARGS_SIZE] = {""};
14043 	char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
14044 		"ordering=enable,name=cryptodev_test_scheduler,corelist="};
14045 	uint16_t worker_core_count = 0;
14046 	uint16_t socket_id = 0;
14047 
14048 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
14049 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
14050 
14051 		/* Identify the Worker Cores
14052 		 * Use 2 worker cores for the device args
14053 		 */
14054 		RTE_LCORE_FOREACH_WORKER(i) {
14055 			if (worker_core_count > 1)
14056 				break;
14057 			snprintf(vdev_args, sizeof(vdev_args),
14058 					"%s%d", temp_str, i);
14059 			strcpy(temp_str, vdev_args);
14060 			strlcat(temp_str, ";", sizeof(temp_str));
14061 			worker_core_count++;
14062 			socket_id = rte_lcore_to_socket_id(i);
14063 		}
14064 		if (worker_core_count != 2) {
14065 			RTE_LOG(ERR, USER1,
14066 				"Cryptodev scheduler test require at least "
14067 				"two worker cores to run. "
14068 				"Please use the correct coremask.\n");
14069 			return TEST_FAILED;
14070 		}
14071 		strcpy(temp_str, vdev_args);
14072 		snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
14073 				temp_str, socket_id);
14074 		RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
14075 		nb_devs = rte_cryptodev_device_count_by_driver(
14076 				rte_cryptodev_driver_id_get(
14077 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
14078 		if (nb_devs < 1) {
14079 			ret = rte_vdev_init(
14080 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
14081 					vdev_args);
14082 			TEST_ASSERT(ret == 0,
14083 				"Failed to create instance %u of pmd : %s",
14084 				i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14085 		}
14086 	}
14087 	return testsuite_setup();
14088 }
14089 
14090 static int
14091 test_scheduler_attach_worker_op(void)
14092 {
14093 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14094 	uint8_t sched_id = ts_params->valid_devs[0];
14095 	uint32_t i, nb_devs_attached = 0;
14096 	int ret;
14097 	char vdev_name[32];
14098 	unsigned int count = rte_cryptodev_count();
14099 
14100 	/* create 2 AESNI_MB vdevs on top of existing devices */
14101 	for (i = count; i < count + 2; i++) {
14102 		snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
14103 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
14104 				i);
14105 		ret = rte_vdev_init(vdev_name, NULL);
14106 
14107 		TEST_ASSERT(ret == 0,
14108 			"Failed to create instance %u of"
14109 			" pmd : %s",
14110 			i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14111 
14112 		if (ret < 0) {
14113 			RTE_LOG(ERR, USER1,
14114 				"Failed to create 2 AESNI MB PMDs.\n");
14115 			return TEST_SKIPPED;
14116 		}
14117 	}
14118 
14119 	/* attach 2 AESNI_MB cdevs */
14120 	for (i = count; i < count + 2; i++) {
14121 		struct rte_cryptodev_info info;
14122 		unsigned int session_size;
14123 
14124 		rte_cryptodev_info_get(i, &info);
14125 		if (info.driver_id != rte_cryptodev_driver_id_get(
14126 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
14127 			continue;
14128 
14129 		session_size = rte_cryptodev_sym_get_private_session_size(i);
14130 		/*
14131 		 * Create the session mempool again, since now there are new devices
14132 		 * to use the mempool.
14133 		 */
14134 		if (ts_params->session_mpool) {
14135 			rte_mempool_free(ts_params->session_mpool);
14136 			ts_params->session_mpool = NULL;
14137 		}
14138 		if (ts_params->session_priv_mpool) {
14139 			rte_mempool_free(ts_params->session_priv_mpool);
14140 			ts_params->session_priv_mpool = NULL;
14141 		}
14142 
14143 		if (info.sym.max_nb_sessions != 0 &&
14144 				info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
14145 			RTE_LOG(ERR, USER1,
14146 					"Device does not support "
14147 					"at least %u sessions\n",
14148 					MAX_NB_SESSIONS);
14149 			return TEST_FAILED;
14150 		}
14151 		/*
14152 		 * Create mempool with maximum number of sessions,
14153 		 * to include the session headers
14154 		 */
14155 		if (ts_params->session_mpool == NULL) {
14156 			ts_params->session_mpool =
14157 				rte_cryptodev_sym_session_pool_create(
14158 						"test_sess_mp",
14159 						MAX_NB_SESSIONS, 0, 0, 0,
14160 						SOCKET_ID_ANY);
14161 			TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
14162 					"session mempool allocation failed");
14163 		}
14164 
14165 		/*
14166 		 * Create mempool with maximum number of sessions,
14167 		 * to include device specific session private data
14168 		 */
14169 		if (ts_params->session_priv_mpool == NULL) {
14170 			ts_params->session_priv_mpool = rte_mempool_create(
14171 					"test_sess_mp_priv",
14172 					MAX_NB_SESSIONS,
14173 					session_size,
14174 					0, 0, NULL, NULL, NULL,
14175 					NULL, SOCKET_ID_ANY,
14176 					0);
14177 
14178 			TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
14179 					"session mempool allocation failed");
14180 		}
14181 
14182 		ts_params->qp_conf.mp_session = ts_params->session_mpool;
14183 		ts_params->qp_conf.mp_session_private =
14184 				ts_params->session_priv_mpool;
14185 
14186 		ret = rte_cryptodev_scheduler_worker_attach(sched_id,
14187 				(uint8_t)i);
14188 
14189 		TEST_ASSERT(ret == 0,
14190 			"Failed to attach device %u of pmd : %s", i,
14191 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14192 
14193 		aesni_ids[nb_devs_attached] = (uint8_t)i;
14194 
14195 		nb_devs_attached++;
14196 	}
14197 
14198 	return 0;
14199 }
14200 
14201 static int
14202 test_scheduler_detach_worker_op(void)
14203 {
14204 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14205 	uint8_t sched_id = ts_params->valid_devs[0];
14206 	uint32_t i;
14207 	int ret;
14208 
14209 	for (i = 0; i < 2; i++) {
14210 		ret = rte_cryptodev_scheduler_worker_detach(sched_id,
14211 				aesni_ids[i]);
14212 		TEST_ASSERT(ret == 0,
14213 			"Failed to detach device %u", aesni_ids[i]);
14214 	}
14215 
14216 	return 0;
14217 }
14218 
14219 static int
14220 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
14221 {
14222 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14223 	uint8_t sched_id = ts_params->valid_devs[0];
14224 	/* set mode */
14225 	return rte_cryptodev_scheduler_mode_set(sched_id,
14226 		scheduler_mode);
14227 }
14228 
14229 static int
14230 test_scheduler_mode_roundrobin_op(void)
14231 {
14232 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
14233 			0, "Failed to set roundrobin mode");
14234 	return 0;
14235 
14236 }
14237 
14238 static int
14239 test_scheduler_mode_multicore_op(void)
14240 {
14241 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
14242 			0, "Failed to set multicore mode");
14243 
14244 	return 0;
14245 }
14246 
14247 static int
14248 test_scheduler_mode_failover_op(void)
14249 {
14250 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
14251 			0, "Failed to set failover mode");
14252 
14253 	return 0;
14254 }
14255 
14256 static int
14257 test_scheduler_mode_pkt_size_distr_op(void)
14258 {
14259 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
14260 			0, "Failed to set pktsize mode");
14261 
14262 	return 0;
14263 }
14264 
14265 static int
14266 scheduler_multicore_testsuite_setup(void)
14267 {
14268 	if (test_scheduler_attach_worker_op() < 0)
14269 		return TEST_SKIPPED;
14270 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
14271 		return TEST_SKIPPED;
14272 	return 0;
14273 }
14274 
14275 static int
14276 scheduler_roundrobin_testsuite_setup(void)
14277 {
14278 	if (test_scheduler_attach_worker_op() < 0)
14279 		return TEST_SKIPPED;
14280 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
14281 		return TEST_SKIPPED;
14282 	return 0;
14283 }
14284 
14285 static int
14286 scheduler_failover_testsuite_setup(void)
14287 {
14288 	if (test_scheduler_attach_worker_op() < 0)
14289 		return TEST_SKIPPED;
14290 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
14291 		return TEST_SKIPPED;
14292 	return 0;
14293 }
14294 
14295 static int
14296 scheduler_pkt_size_distr_testsuite_setup(void)
14297 {
14298 	if (test_scheduler_attach_worker_op() < 0)
14299 		return TEST_SKIPPED;
14300 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
14301 		return TEST_SKIPPED;
14302 	return 0;
14303 }
14304 
14305 static void
14306 scheduler_mode_testsuite_teardown(void)
14307 {
14308 	test_scheduler_detach_worker_op();
14309 }
14310 
14311 #endif /* RTE_CRYPTO_SCHEDULER */
14312 
14313 static struct unit_test_suite end_testsuite = {
14314 	.suite_name = NULL,
14315 	.setup = NULL,
14316 	.teardown = NULL,
14317 	.unit_test_suites = NULL
14318 };
14319 
14320 #ifdef RTE_LIB_SECURITY
14321 static struct unit_test_suite ipsec_proto_testsuite  = {
14322 	.suite_name = "IPsec Proto Unit Test Suite",
14323 	.setup = ipsec_proto_testsuite_setup,
14324 	.unit_test_cases = {
14325 		TEST_CASE_NAMED_WITH_DATA(
14326 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14327 			ut_setup_security, ut_teardown,
14328 			test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
14329 		TEST_CASE_NAMED_WITH_DATA(
14330 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14331 			ut_setup_security, ut_teardown,
14332 			test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
14333 		TEST_CASE_NAMED_WITH_DATA(
14334 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14335 			ut_setup_security, ut_teardown,
14336 			test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
14337 		TEST_CASE_NAMED_WITH_DATA(
14338 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14339 			ut_setup_security, ut_teardown,
14340 			test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
14341 		TEST_CASE_NAMED_WITH_DATA(
14342 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14343 			ut_setup_security, ut_teardown,
14344 			test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
14345 		TEST_CASE_NAMED_WITH_DATA(
14346 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14347 			ut_setup_security, ut_teardown,
14348 			test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
14349 		TEST_CASE_NAMED_ST(
14350 			"Combined test alg list",
14351 			ut_setup_security, ut_teardown,
14352 			test_ipsec_proto_display_list),
14353 		TEST_CASE_NAMED_ST(
14354 			"IV generation",
14355 			ut_setup_security, ut_teardown,
14356 			test_ipsec_proto_iv_gen),
14357 		TEST_CASE_NAMED_ST(
14358 			"UDP encapsulation",
14359 			ut_setup_security, ut_teardown,
14360 			test_ipsec_proto_udp_encap),
14361 		TEST_CASE_NAMED_ST(
14362 			"UDP encapsulation ports verification test",
14363 			ut_setup_security, ut_teardown,
14364 			test_ipsec_proto_udp_ports_verify),
14365 		TEST_CASE_NAMED_ST(
14366 			"SA expiry packets soft",
14367 			ut_setup_security, ut_teardown,
14368 			test_ipsec_proto_sa_exp_pkts_soft),
14369 		TEST_CASE_NAMED_ST(
14370 			"SA expiry packets hard",
14371 			ut_setup_security, ut_teardown,
14372 			test_ipsec_proto_sa_exp_pkts_hard),
14373 		TEST_CASE_NAMED_ST(
14374 			"Negative test: ICV corruption",
14375 			ut_setup_security, ut_teardown,
14376 			test_ipsec_proto_err_icv_corrupt),
14377 		TEST_CASE_NAMED_ST(
14378 			"Tunnel dst addr verification",
14379 			ut_setup_security, ut_teardown,
14380 			test_ipsec_proto_tunnel_dst_addr_verify),
14381 		TEST_CASE_NAMED_ST(
14382 			"Tunnel src and dst addr verification",
14383 			ut_setup_security, ut_teardown,
14384 			test_ipsec_proto_tunnel_src_dst_addr_verify),
14385 		TEST_CASE_NAMED_ST(
14386 			"Inner IP checksum",
14387 			ut_setup_security, ut_teardown,
14388 			test_ipsec_proto_inner_ip_csum),
14389 		TEST_CASE_NAMED_ST(
14390 			"Inner L4 checksum",
14391 			ut_setup_security, ut_teardown,
14392 			test_ipsec_proto_inner_l4_csum),
14393 		TEST_CASES_END() /**< NULL terminate unit test array */
14394 	}
14395 };
14396 
14397 static struct unit_test_suite pdcp_proto_testsuite  = {
14398 	.suite_name = "PDCP Proto Unit Test Suite",
14399 	.setup = pdcp_proto_testsuite_setup,
14400 	.unit_test_cases = {
14401 		TEST_CASE_ST(ut_setup_security, ut_teardown,
14402 			test_PDCP_PROTO_all),
14403 		TEST_CASES_END() /**< NULL terminate unit test array */
14404 	}
14405 };
14406 
14407 #define ADD_UPLINK_TESTCASE(data)						\
14408 	TEST_CASE_NAMED_WITH_DATA(data.test_descr_uplink, ut_setup_security,	\
14409 	ut_teardown, test_docsis_proto_uplink, (const void *) &data),		\
14410 
14411 #define ADD_DOWNLINK_TESTCASE(data)						\
14412 	TEST_CASE_NAMED_WITH_DATA(data.test_descr_downlink, ut_setup_security,	\
14413 	ut_teardown, test_docsis_proto_downlink, (const void *) &data),		\
14414 
14415 static struct unit_test_suite docsis_proto_testsuite  = {
14416 	.suite_name = "DOCSIS Proto Unit Test Suite",
14417 	.setup = docsis_proto_testsuite_setup,
14418 	.unit_test_cases = {
14419 		/* Uplink */
14420 		ADD_UPLINK_TESTCASE(docsis_test_case_1)
14421 		ADD_UPLINK_TESTCASE(docsis_test_case_2)
14422 		ADD_UPLINK_TESTCASE(docsis_test_case_3)
14423 		ADD_UPLINK_TESTCASE(docsis_test_case_4)
14424 		ADD_UPLINK_TESTCASE(docsis_test_case_5)
14425 		ADD_UPLINK_TESTCASE(docsis_test_case_6)
14426 		ADD_UPLINK_TESTCASE(docsis_test_case_7)
14427 		ADD_UPLINK_TESTCASE(docsis_test_case_8)
14428 		ADD_UPLINK_TESTCASE(docsis_test_case_9)
14429 		ADD_UPLINK_TESTCASE(docsis_test_case_10)
14430 		ADD_UPLINK_TESTCASE(docsis_test_case_11)
14431 		ADD_UPLINK_TESTCASE(docsis_test_case_12)
14432 		ADD_UPLINK_TESTCASE(docsis_test_case_13)
14433 		ADD_UPLINK_TESTCASE(docsis_test_case_14)
14434 		ADD_UPLINK_TESTCASE(docsis_test_case_15)
14435 		ADD_UPLINK_TESTCASE(docsis_test_case_16)
14436 		ADD_UPLINK_TESTCASE(docsis_test_case_17)
14437 		ADD_UPLINK_TESTCASE(docsis_test_case_18)
14438 		ADD_UPLINK_TESTCASE(docsis_test_case_19)
14439 		ADD_UPLINK_TESTCASE(docsis_test_case_20)
14440 		ADD_UPLINK_TESTCASE(docsis_test_case_21)
14441 		ADD_UPLINK_TESTCASE(docsis_test_case_22)
14442 		ADD_UPLINK_TESTCASE(docsis_test_case_23)
14443 		ADD_UPLINK_TESTCASE(docsis_test_case_24)
14444 		ADD_UPLINK_TESTCASE(docsis_test_case_25)
14445 		ADD_UPLINK_TESTCASE(docsis_test_case_26)
14446 		/* Downlink */
14447 		ADD_DOWNLINK_TESTCASE(docsis_test_case_1)
14448 		ADD_DOWNLINK_TESTCASE(docsis_test_case_2)
14449 		ADD_DOWNLINK_TESTCASE(docsis_test_case_3)
14450 		ADD_DOWNLINK_TESTCASE(docsis_test_case_4)
14451 		ADD_DOWNLINK_TESTCASE(docsis_test_case_5)
14452 		ADD_DOWNLINK_TESTCASE(docsis_test_case_6)
14453 		ADD_DOWNLINK_TESTCASE(docsis_test_case_7)
14454 		ADD_DOWNLINK_TESTCASE(docsis_test_case_8)
14455 		ADD_DOWNLINK_TESTCASE(docsis_test_case_9)
14456 		ADD_DOWNLINK_TESTCASE(docsis_test_case_10)
14457 		ADD_DOWNLINK_TESTCASE(docsis_test_case_11)
14458 		ADD_DOWNLINK_TESTCASE(docsis_test_case_12)
14459 		ADD_DOWNLINK_TESTCASE(docsis_test_case_13)
14460 		ADD_DOWNLINK_TESTCASE(docsis_test_case_14)
14461 		ADD_DOWNLINK_TESTCASE(docsis_test_case_15)
14462 		ADD_DOWNLINK_TESTCASE(docsis_test_case_16)
14463 		ADD_DOWNLINK_TESTCASE(docsis_test_case_17)
14464 		ADD_DOWNLINK_TESTCASE(docsis_test_case_18)
14465 		ADD_DOWNLINK_TESTCASE(docsis_test_case_19)
14466 		ADD_DOWNLINK_TESTCASE(docsis_test_case_20)
14467 		ADD_DOWNLINK_TESTCASE(docsis_test_case_21)
14468 		ADD_DOWNLINK_TESTCASE(docsis_test_case_22)
14469 		ADD_DOWNLINK_TESTCASE(docsis_test_case_23)
14470 		ADD_DOWNLINK_TESTCASE(docsis_test_case_24)
14471 		ADD_DOWNLINK_TESTCASE(docsis_test_case_25)
14472 		ADD_DOWNLINK_TESTCASE(docsis_test_case_26)
14473 		TEST_CASES_END() /**< NULL terminate unit test array */
14474 	}
14475 };
14476 #endif
14477 
14478 static struct unit_test_suite cryptodev_gen_testsuite  = {
14479 	.suite_name = "Crypto General Unit Test Suite",
14480 	.setup = crypto_gen_testsuite_setup,
14481 	.unit_test_cases = {
14482 		TEST_CASE_ST(ut_setup, ut_teardown,
14483 				test_device_configure_invalid_dev_id),
14484 		TEST_CASE_ST(ut_setup, ut_teardown,
14485 				test_queue_pair_descriptor_setup),
14486 		TEST_CASE_ST(ut_setup, ut_teardown,
14487 				test_device_configure_invalid_queue_pair_ids),
14488 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
14489 		TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
14490 		TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
14491 		TEST_CASES_END() /**< NULL terminate unit test array */
14492 	}
14493 };
14494 
14495 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
14496 	.suite_name = "Negative HMAC SHA1 Unit Test Suite",
14497 	.setup = negative_hmac_sha1_testsuite_setup,
14498 	.unit_test_cases = {
14499 		/** Negative tests */
14500 		TEST_CASE_ST(ut_setup, ut_teardown,
14501 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
14502 		TEST_CASE_ST(ut_setup, ut_teardown,
14503 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14504 		TEST_CASE_ST(ut_setup, ut_teardown,
14505 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14506 		TEST_CASE_ST(ut_setup, ut_teardown,
14507 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14508 
14509 		TEST_CASES_END() /**< NULL terminate unit test array */
14510 	}
14511 };
14512 
14513 static struct unit_test_suite cryptodev_multi_session_testsuite = {
14514 	.suite_name = "Multi Session Unit Test Suite",
14515 	.setup = multi_session_testsuite_setup,
14516 	.unit_test_cases = {
14517 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
14518 		TEST_CASE_ST(ut_setup, ut_teardown,
14519 				test_multi_session_random_usage),
14520 
14521 		TEST_CASES_END() /**< NULL terminate unit test array */
14522 	}
14523 };
14524 
14525 static struct unit_test_suite cryptodev_null_testsuite  = {
14526 	.suite_name = "NULL Test Suite",
14527 	.setup = null_testsuite_setup,
14528 	.unit_test_cases = {
14529 		TEST_CASE_ST(ut_setup, ut_teardown,
14530 			test_null_invalid_operation),
14531 		TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
14532 		TEST_CASES_END()
14533 	}
14534 };
14535 
14536 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
14537 	.suite_name = "AES CCM Authenticated Test Suite",
14538 	.setup = aes_ccm_auth_testsuite_setup,
14539 	.unit_test_cases = {
14540 		/** AES CCM Authenticated Encryption 128 bits key*/
14541 		TEST_CASE_ST(ut_setup, ut_teardown,
14542 			test_AES_CCM_authenticated_encryption_test_case_128_1),
14543 		TEST_CASE_ST(ut_setup, ut_teardown,
14544 			test_AES_CCM_authenticated_encryption_test_case_128_2),
14545 		TEST_CASE_ST(ut_setup, ut_teardown,
14546 			test_AES_CCM_authenticated_encryption_test_case_128_3),
14547 
14548 		/** AES CCM Authenticated Decryption 128 bits key*/
14549 		TEST_CASE_ST(ut_setup, ut_teardown,
14550 			test_AES_CCM_authenticated_decryption_test_case_128_1),
14551 		TEST_CASE_ST(ut_setup, ut_teardown,
14552 			test_AES_CCM_authenticated_decryption_test_case_128_2),
14553 		TEST_CASE_ST(ut_setup, ut_teardown,
14554 			test_AES_CCM_authenticated_decryption_test_case_128_3),
14555 
14556 		/** AES CCM Authenticated Encryption 192 bits key */
14557 		TEST_CASE_ST(ut_setup, ut_teardown,
14558 			test_AES_CCM_authenticated_encryption_test_case_192_1),
14559 		TEST_CASE_ST(ut_setup, ut_teardown,
14560 			test_AES_CCM_authenticated_encryption_test_case_192_2),
14561 		TEST_CASE_ST(ut_setup, ut_teardown,
14562 			test_AES_CCM_authenticated_encryption_test_case_192_3),
14563 
14564 		/** AES CCM Authenticated Decryption 192 bits key*/
14565 		TEST_CASE_ST(ut_setup, ut_teardown,
14566 			test_AES_CCM_authenticated_decryption_test_case_192_1),
14567 		TEST_CASE_ST(ut_setup, ut_teardown,
14568 			test_AES_CCM_authenticated_decryption_test_case_192_2),
14569 		TEST_CASE_ST(ut_setup, ut_teardown,
14570 			test_AES_CCM_authenticated_decryption_test_case_192_3),
14571 
14572 		/** AES CCM Authenticated Encryption 256 bits key */
14573 		TEST_CASE_ST(ut_setup, ut_teardown,
14574 			test_AES_CCM_authenticated_encryption_test_case_256_1),
14575 		TEST_CASE_ST(ut_setup, ut_teardown,
14576 			test_AES_CCM_authenticated_encryption_test_case_256_2),
14577 		TEST_CASE_ST(ut_setup, ut_teardown,
14578 			test_AES_CCM_authenticated_encryption_test_case_256_3),
14579 
14580 		/** AES CCM Authenticated Decryption 256 bits key*/
14581 		TEST_CASE_ST(ut_setup, ut_teardown,
14582 			test_AES_CCM_authenticated_decryption_test_case_256_1),
14583 		TEST_CASE_ST(ut_setup, ut_teardown,
14584 			test_AES_CCM_authenticated_decryption_test_case_256_2),
14585 		TEST_CASE_ST(ut_setup, ut_teardown,
14586 			test_AES_CCM_authenticated_decryption_test_case_256_3),
14587 		TEST_CASES_END()
14588 	}
14589 };
14590 
14591 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
14592 	.suite_name = "AES GCM Authenticated Test Suite",
14593 	.setup = aes_gcm_auth_testsuite_setup,
14594 	.unit_test_cases = {
14595 		/** AES GCM Authenticated Encryption */
14596 		TEST_CASE_ST(ut_setup, ut_teardown,
14597 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
14598 		TEST_CASE_ST(ut_setup, ut_teardown,
14599 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
14600 		TEST_CASE_ST(ut_setup, ut_teardown,
14601 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
14602 		TEST_CASE_ST(ut_setup, ut_teardown,
14603 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
14604 		TEST_CASE_ST(ut_setup, ut_teardown,
14605 			test_AES_GCM_authenticated_encryption_test_case_1),
14606 		TEST_CASE_ST(ut_setup, ut_teardown,
14607 			test_AES_GCM_authenticated_encryption_test_case_2),
14608 		TEST_CASE_ST(ut_setup, ut_teardown,
14609 			test_AES_GCM_authenticated_encryption_test_case_3),
14610 		TEST_CASE_ST(ut_setup, ut_teardown,
14611 			test_AES_GCM_authenticated_encryption_test_case_4),
14612 		TEST_CASE_ST(ut_setup, ut_teardown,
14613 			test_AES_GCM_authenticated_encryption_test_case_5),
14614 		TEST_CASE_ST(ut_setup, ut_teardown,
14615 			test_AES_GCM_authenticated_encryption_test_case_6),
14616 		TEST_CASE_ST(ut_setup, ut_teardown,
14617 			test_AES_GCM_authenticated_encryption_test_case_7),
14618 		TEST_CASE_ST(ut_setup, ut_teardown,
14619 			test_AES_GCM_authenticated_encryption_test_case_8),
14620 		TEST_CASE_ST(ut_setup, ut_teardown,
14621 			test_AES_GCM_J0_authenticated_encryption_test_case_1),
14622 
14623 		/** AES GCM Authenticated Decryption */
14624 		TEST_CASE_ST(ut_setup, ut_teardown,
14625 			test_AES_GCM_authenticated_decryption_test_case_1),
14626 		TEST_CASE_ST(ut_setup, ut_teardown,
14627 			test_AES_GCM_authenticated_decryption_test_case_2),
14628 		TEST_CASE_ST(ut_setup, ut_teardown,
14629 			test_AES_GCM_authenticated_decryption_test_case_3),
14630 		TEST_CASE_ST(ut_setup, ut_teardown,
14631 			test_AES_GCM_authenticated_decryption_test_case_4),
14632 		TEST_CASE_ST(ut_setup, ut_teardown,
14633 			test_AES_GCM_authenticated_decryption_test_case_5),
14634 		TEST_CASE_ST(ut_setup, ut_teardown,
14635 			test_AES_GCM_authenticated_decryption_test_case_6),
14636 		TEST_CASE_ST(ut_setup, ut_teardown,
14637 			test_AES_GCM_authenticated_decryption_test_case_7),
14638 		TEST_CASE_ST(ut_setup, ut_teardown,
14639 			test_AES_GCM_authenticated_decryption_test_case_8),
14640 		TEST_CASE_ST(ut_setup, ut_teardown,
14641 			test_AES_GCM_J0_authenticated_decryption_test_case_1),
14642 
14643 		/** AES GCM Authenticated Encryption 192 bits key */
14644 		TEST_CASE_ST(ut_setup, ut_teardown,
14645 			test_AES_GCM_auth_encryption_test_case_192_1),
14646 		TEST_CASE_ST(ut_setup, ut_teardown,
14647 			test_AES_GCM_auth_encryption_test_case_192_2),
14648 		TEST_CASE_ST(ut_setup, ut_teardown,
14649 			test_AES_GCM_auth_encryption_test_case_192_3),
14650 		TEST_CASE_ST(ut_setup, ut_teardown,
14651 			test_AES_GCM_auth_encryption_test_case_192_4),
14652 		TEST_CASE_ST(ut_setup, ut_teardown,
14653 			test_AES_GCM_auth_encryption_test_case_192_5),
14654 		TEST_CASE_ST(ut_setup, ut_teardown,
14655 			test_AES_GCM_auth_encryption_test_case_192_6),
14656 		TEST_CASE_ST(ut_setup, ut_teardown,
14657 			test_AES_GCM_auth_encryption_test_case_192_7),
14658 
14659 		/** AES GCM Authenticated Decryption 192 bits key */
14660 		TEST_CASE_ST(ut_setup, ut_teardown,
14661 			test_AES_GCM_auth_decryption_test_case_192_1),
14662 		TEST_CASE_ST(ut_setup, ut_teardown,
14663 			test_AES_GCM_auth_decryption_test_case_192_2),
14664 		TEST_CASE_ST(ut_setup, ut_teardown,
14665 			test_AES_GCM_auth_decryption_test_case_192_3),
14666 		TEST_CASE_ST(ut_setup, ut_teardown,
14667 			test_AES_GCM_auth_decryption_test_case_192_4),
14668 		TEST_CASE_ST(ut_setup, ut_teardown,
14669 			test_AES_GCM_auth_decryption_test_case_192_5),
14670 		TEST_CASE_ST(ut_setup, ut_teardown,
14671 			test_AES_GCM_auth_decryption_test_case_192_6),
14672 		TEST_CASE_ST(ut_setup, ut_teardown,
14673 			test_AES_GCM_auth_decryption_test_case_192_7),
14674 
14675 		/** AES GCM Authenticated Encryption 256 bits key */
14676 		TEST_CASE_ST(ut_setup, ut_teardown,
14677 			test_AES_GCM_auth_encryption_test_case_256_1),
14678 		TEST_CASE_ST(ut_setup, ut_teardown,
14679 			test_AES_GCM_auth_encryption_test_case_256_2),
14680 		TEST_CASE_ST(ut_setup, ut_teardown,
14681 			test_AES_GCM_auth_encryption_test_case_256_3),
14682 		TEST_CASE_ST(ut_setup, ut_teardown,
14683 			test_AES_GCM_auth_encryption_test_case_256_4),
14684 		TEST_CASE_ST(ut_setup, ut_teardown,
14685 			test_AES_GCM_auth_encryption_test_case_256_5),
14686 		TEST_CASE_ST(ut_setup, ut_teardown,
14687 			test_AES_GCM_auth_encryption_test_case_256_6),
14688 		TEST_CASE_ST(ut_setup, ut_teardown,
14689 			test_AES_GCM_auth_encryption_test_case_256_7),
14690 
14691 		/** AES GCM Authenticated Decryption 256 bits key */
14692 		TEST_CASE_ST(ut_setup, ut_teardown,
14693 			test_AES_GCM_auth_decryption_test_case_256_1),
14694 		TEST_CASE_ST(ut_setup, ut_teardown,
14695 			test_AES_GCM_auth_decryption_test_case_256_2),
14696 		TEST_CASE_ST(ut_setup, ut_teardown,
14697 			test_AES_GCM_auth_decryption_test_case_256_3),
14698 		TEST_CASE_ST(ut_setup, ut_teardown,
14699 			test_AES_GCM_auth_decryption_test_case_256_4),
14700 		TEST_CASE_ST(ut_setup, ut_teardown,
14701 			test_AES_GCM_auth_decryption_test_case_256_5),
14702 		TEST_CASE_ST(ut_setup, ut_teardown,
14703 			test_AES_GCM_auth_decryption_test_case_256_6),
14704 		TEST_CASE_ST(ut_setup, ut_teardown,
14705 			test_AES_GCM_auth_decryption_test_case_256_7),
14706 
14707 		/** AES GCM Authenticated Encryption big aad size */
14708 		TEST_CASE_ST(ut_setup, ut_teardown,
14709 			test_AES_GCM_auth_encryption_test_case_aad_1),
14710 		TEST_CASE_ST(ut_setup, ut_teardown,
14711 			test_AES_GCM_auth_encryption_test_case_aad_2),
14712 
14713 		/** AES GCM Authenticated Decryption big aad size */
14714 		TEST_CASE_ST(ut_setup, ut_teardown,
14715 			test_AES_GCM_auth_decryption_test_case_aad_1),
14716 		TEST_CASE_ST(ut_setup, ut_teardown,
14717 			test_AES_GCM_auth_decryption_test_case_aad_2),
14718 
14719 		/** Out of place tests */
14720 		TEST_CASE_ST(ut_setup, ut_teardown,
14721 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
14722 		TEST_CASE_ST(ut_setup, ut_teardown,
14723 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
14724 
14725 		/** Session-less tests */
14726 		TEST_CASE_ST(ut_setup, ut_teardown,
14727 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
14728 		TEST_CASE_ST(ut_setup, ut_teardown,
14729 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
14730 
14731 		TEST_CASES_END()
14732 	}
14733 };
14734 
14735 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
14736 	.suite_name = "AES GMAC Authentication Test Suite",
14737 	.setup = aes_gmac_auth_testsuite_setup,
14738 	.unit_test_cases = {
14739 		TEST_CASE_ST(ut_setup, ut_teardown,
14740 			test_AES_GMAC_authentication_test_case_1),
14741 		TEST_CASE_ST(ut_setup, ut_teardown,
14742 			test_AES_GMAC_authentication_verify_test_case_1),
14743 		TEST_CASE_ST(ut_setup, ut_teardown,
14744 			test_AES_GMAC_authentication_test_case_2),
14745 		TEST_CASE_ST(ut_setup, ut_teardown,
14746 			test_AES_GMAC_authentication_verify_test_case_2),
14747 		TEST_CASE_ST(ut_setup, ut_teardown,
14748 			test_AES_GMAC_authentication_test_case_3),
14749 		TEST_CASE_ST(ut_setup, ut_teardown,
14750 			test_AES_GMAC_authentication_verify_test_case_3),
14751 		TEST_CASE_ST(ut_setup, ut_teardown,
14752 			test_AES_GMAC_authentication_test_case_4),
14753 		TEST_CASE_ST(ut_setup, ut_teardown,
14754 			test_AES_GMAC_authentication_verify_test_case_4),
14755 		TEST_CASE_ST(ut_setup, ut_teardown,
14756 			test_AES_GMAC_authentication_SGL_40B),
14757 		TEST_CASE_ST(ut_setup, ut_teardown,
14758 			test_AES_GMAC_authentication_SGL_80B),
14759 		TEST_CASE_ST(ut_setup, ut_teardown,
14760 			test_AES_GMAC_authentication_SGL_2048B),
14761 		TEST_CASE_ST(ut_setup, ut_teardown,
14762 			test_AES_GMAC_authentication_SGL_2047B),
14763 
14764 		TEST_CASES_END()
14765 	}
14766 };
14767 
14768 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
14769 	.suite_name = "Chacha20-Poly1305 Test Suite",
14770 	.setup = chacha20_poly1305_testsuite_setup,
14771 	.unit_test_cases = {
14772 		TEST_CASE_ST(ut_setup, ut_teardown,
14773 			test_chacha20_poly1305_encrypt_test_case_rfc8439),
14774 		TEST_CASE_ST(ut_setup, ut_teardown,
14775 			test_chacha20_poly1305_decrypt_test_case_rfc8439),
14776 		TEST_CASE_ST(ut_setup, ut_teardown,
14777 			test_chacha20_poly1305_encrypt_SGL_out_of_place),
14778 		TEST_CASES_END()
14779 	}
14780 };
14781 
14782 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
14783 	.suite_name = "SNOW 3G Test Suite",
14784 	.setup = snow3g_testsuite_setup,
14785 	.unit_test_cases = {
14786 		/** SNOW 3G encrypt only (UEA2) */
14787 		TEST_CASE_ST(ut_setup, ut_teardown,
14788 			test_snow3g_encryption_test_case_1),
14789 		TEST_CASE_ST(ut_setup, ut_teardown,
14790 			test_snow3g_encryption_test_case_2),
14791 		TEST_CASE_ST(ut_setup, ut_teardown,
14792 			test_snow3g_encryption_test_case_3),
14793 		TEST_CASE_ST(ut_setup, ut_teardown,
14794 			test_snow3g_encryption_test_case_4),
14795 		TEST_CASE_ST(ut_setup, ut_teardown,
14796 			test_snow3g_encryption_test_case_5),
14797 
14798 		TEST_CASE_ST(ut_setup, ut_teardown,
14799 			test_snow3g_encryption_test_case_1_oop),
14800 		TEST_CASE_ST(ut_setup, ut_teardown,
14801 			test_snow3g_encryption_test_case_1_oop_sgl),
14802 		TEST_CASE_ST(ut_setup, ut_teardown,
14803 			test_snow3g_encryption_test_case_1_offset_oop),
14804 		TEST_CASE_ST(ut_setup, ut_teardown,
14805 			test_snow3g_decryption_test_case_1_oop),
14806 
14807 		/** SNOW 3G generate auth, then encrypt (UEA2) */
14808 		TEST_CASE_ST(ut_setup, ut_teardown,
14809 			test_snow3g_auth_cipher_test_case_1),
14810 		TEST_CASE_ST(ut_setup, ut_teardown,
14811 			test_snow3g_auth_cipher_test_case_2),
14812 		TEST_CASE_ST(ut_setup, ut_teardown,
14813 			test_snow3g_auth_cipher_test_case_2_oop),
14814 		TEST_CASE_ST(ut_setup, ut_teardown,
14815 			test_snow3g_auth_cipher_part_digest_enc),
14816 		TEST_CASE_ST(ut_setup, ut_teardown,
14817 			test_snow3g_auth_cipher_part_digest_enc_oop),
14818 		TEST_CASE_ST(ut_setup, ut_teardown,
14819 			test_snow3g_auth_cipher_test_case_3_sgl),
14820 		TEST_CASE_ST(ut_setup, ut_teardown,
14821 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
14822 		TEST_CASE_ST(ut_setup, ut_teardown,
14823 			test_snow3g_auth_cipher_part_digest_enc_sgl),
14824 		TEST_CASE_ST(ut_setup, ut_teardown,
14825 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
14826 
14827 		/** SNOW 3G decrypt (UEA2), then verify auth */
14828 		TEST_CASE_ST(ut_setup, ut_teardown,
14829 			test_snow3g_auth_cipher_verify_test_case_1),
14830 		TEST_CASE_ST(ut_setup, ut_teardown,
14831 			test_snow3g_auth_cipher_verify_test_case_2),
14832 		TEST_CASE_ST(ut_setup, ut_teardown,
14833 			test_snow3g_auth_cipher_verify_test_case_2_oop),
14834 		TEST_CASE_ST(ut_setup, ut_teardown,
14835 			test_snow3g_auth_cipher_verify_part_digest_enc),
14836 		TEST_CASE_ST(ut_setup, ut_teardown,
14837 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
14838 		TEST_CASE_ST(ut_setup, ut_teardown,
14839 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
14840 		TEST_CASE_ST(ut_setup, ut_teardown,
14841 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
14842 		TEST_CASE_ST(ut_setup, ut_teardown,
14843 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
14844 		TEST_CASE_ST(ut_setup, ut_teardown,
14845 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
14846 
14847 		/** SNOW 3G decrypt only (UEA2) */
14848 		TEST_CASE_ST(ut_setup, ut_teardown,
14849 			test_snow3g_decryption_test_case_1),
14850 		TEST_CASE_ST(ut_setup, ut_teardown,
14851 			test_snow3g_decryption_test_case_2),
14852 		TEST_CASE_ST(ut_setup, ut_teardown,
14853 			test_snow3g_decryption_test_case_3),
14854 		TEST_CASE_ST(ut_setup, ut_teardown,
14855 			test_snow3g_decryption_test_case_4),
14856 		TEST_CASE_ST(ut_setup, ut_teardown,
14857 			test_snow3g_decryption_test_case_5),
14858 		TEST_CASE_ST(ut_setup, ut_teardown,
14859 			test_snow3g_decryption_with_digest_test_case_1),
14860 		TEST_CASE_ST(ut_setup, ut_teardown,
14861 			test_snow3g_hash_generate_test_case_1),
14862 		TEST_CASE_ST(ut_setup, ut_teardown,
14863 			test_snow3g_hash_generate_test_case_2),
14864 		TEST_CASE_ST(ut_setup, ut_teardown,
14865 			test_snow3g_hash_generate_test_case_3),
14866 
14867 		/* Tests with buffers which length is not byte-aligned */
14868 		TEST_CASE_ST(ut_setup, ut_teardown,
14869 			test_snow3g_hash_generate_test_case_4),
14870 		TEST_CASE_ST(ut_setup, ut_teardown,
14871 			test_snow3g_hash_generate_test_case_5),
14872 		TEST_CASE_ST(ut_setup, ut_teardown,
14873 			test_snow3g_hash_generate_test_case_6),
14874 		TEST_CASE_ST(ut_setup, ut_teardown,
14875 			test_snow3g_hash_verify_test_case_1),
14876 		TEST_CASE_ST(ut_setup, ut_teardown,
14877 			test_snow3g_hash_verify_test_case_2),
14878 		TEST_CASE_ST(ut_setup, ut_teardown,
14879 			test_snow3g_hash_verify_test_case_3),
14880 
14881 		/* Tests with buffers which length is not byte-aligned */
14882 		TEST_CASE_ST(ut_setup, ut_teardown,
14883 			test_snow3g_hash_verify_test_case_4),
14884 		TEST_CASE_ST(ut_setup, ut_teardown,
14885 			test_snow3g_hash_verify_test_case_5),
14886 		TEST_CASE_ST(ut_setup, ut_teardown,
14887 			test_snow3g_hash_verify_test_case_6),
14888 		TEST_CASE_ST(ut_setup, ut_teardown,
14889 			test_snow3g_cipher_auth_test_case_1),
14890 		TEST_CASE_ST(ut_setup, ut_teardown,
14891 			test_snow3g_auth_cipher_with_digest_test_case_1),
14892 		TEST_CASES_END()
14893 	}
14894 };
14895 
14896 static struct unit_test_suite cryptodev_zuc_testsuite  = {
14897 	.suite_name = "ZUC Test Suite",
14898 	.setup = zuc_testsuite_setup,
14899 	.unit_test_cases = {
14900 		/** ZUC encrypt only (EEA3) */
14901 		TEST_CASE_ST(ut_setup, ut_teardown,
14902 			test_zuc_encryption_test_case_1),
14903 		TEST_CASE_ST(ut_setup, ut_teardown,
14904 			test_zuc_encryption_test_case_2),
14905 		TEST_CASE_ST(ut_setup, ut_teardown,
14906 			test_zuc_encryption_test_case_3),
14907 		TEST_CASE_ST(ut_setup, ut_teardown,
14908 			test_zuc_encryption_test_case_4),
14909 		TEST_CASE_ST(ut_setup, ut_teardown,
14910 			test_zuc_encryption_test_case_5),
14911 		TEST_CASE_ST(ut_setup, ut_teardown,
14912 			test_zuc_encryption_test_case_6_sgl),
14913 
14914 		/** ZUC authenticate (EIA3) */
14915 		TEST_CASE_ST(ut_setup, ut_teardown,
14916 			test_zuc_hash_generate_test_case_1),
14917 		TEST_CASE_ST(ut_setup, ut_teardown,
14918 			test_zuc_hash_generate_test_case_2),
14919 		TEST_CASE_ST(ut_setup, ut_teardown,
14920 			test_zuc_hash_generate_test_case_3),
14921 		TEST_CASE_ST(ut_setup, ut_teardown,
14922 			test_zuc_hash_generate_test_case_4),
14923 		TEST_CASE_ST(ut_setup, ut_teardown,
14924 			test_zuc_hash_generate_test_case_5),
14925 		TEST_CASE_ST(ut_setup, ut_teardown,
14926 			test_zuc_hash_generate_test_case_6),
14927 		TEST_CASE_ST(ut_setup, ut_teardown,
14928 			test_zuc_hash_generate_test_case_7),
14929 		TEST_CASE_ST(ut_setup, ut_teardown,
14930 			test_zuc_hash_generate_test_case_8),
14931 		TEST_CASE_ST(ut_setup, ut_teardown,
14932 			test_zuc_hash_generate_test_case_9),
14933 		TEST_CASE_ST(ut_setup, ut_teardown,
14934 			test_zuc_hash_generate_test_case_10),
14935 		TEST_CASE_ST(ut_setup, ut_teardown,
14936 			test_zuc_hash_generate_test_case_11),
14937 
14938 
14939 		/** ZUC alg-chain (EEA3/EIA3) */
14940 		TEST_CASE_ST(ut_setup, ut_teardown,
14941 			test_zuc_cipher_auth_test_case_1),
14942 		TEST_CASE_ST(ut_setup, ut_teardown,
14943 			test_zuc_cipher_auth_test_case_2),
14944 
14945 		/** ZUC generate auth, then encrypt (EEA3) */
14946 		TEST_CASE_ST(ut_setup, ut_teardown,
14947 			test_zuc_auth_cipher_test_case_1),
14948 		TEST_CASE_ST(ut_setup, ut_teardown,
14949 			test_zuc_auth_cipher_test_case_1_oop),
14950 		TEST_CASE_ST(ut_setup, ut_teardown,
14951 			test_zuc_auth_cipher_test_case_1_sgl),
14952 		TEST_CASE_ST(ut_setup, ut_teardown,
14953 			test_zuc_auth_cipher_test_case_1_oop_sgl),
14954 
14955 		/** ZUC decrypt (EEA3), then verify auth */
14956 		TEST_CASE_ST(ut_setup, ut_teardown,
14957 			test_zuc_auth_cipher_verify_test_case_1),
14958 		TEST_CASE_ST(ut_setup, ut_teardown,
14959 			test_zuc_auth_cipher_verify_test_case_1_oop),
14960 		TEST_CASE_ST(ut_setup, ut_teardown,
14961 			test_zuc_auth_cipher_verify_test_case_1_sgl),
14962 		TEST_CASE_ST(ut_setup, ut_teardown,
14963 			test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
14964 
14965 		/** ZUC-256 encrypt only **/
14966 		TEST_CASE_ST(ut_setup, ut_teardown,
14967 			test_zuc256_encryption_test_case_1),
14968 		TEST_CASE_ST(ut_setup, ut_teardown,
14969 			test_zuc256_encryption_test_case_2),
14970 
14971 		/** ZUC-256 authentication only **/
14972 		TEST_CASE_ST(ut_setup, ut_teardown,
14973 			test_zuc256_authentication_test_case_1),
14974 		TEST_CASE_ST(ut_setup, ut_teardown,
14975 			test_zuc256_authentication_test_case_2),
14976 
14977 		TEST_CASES_END()
14978 	}
14979 };
14980 
14981 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
14982 	.suite_name = "HMAC_MD5 Authentication Test Suite",
14983 	.setup = hmac_md5_auth_testsuite_setup,
14984 	.unit_test_cases = {
14985 		TEST_CASE_ST(ut_setup, ut_teardown,
14986 			test_MD5_HMAC_generate_case_1),
14987 		TEST_CASE_ST(ut_setup, ut_teardown,
14988 			test_MD5_HMAC_verify_case_1),
14989 		TEST_CASE_ST(ut_setup, ut_teardown,
14990 			test_MD5_HMAC_generate_case_2),
14991 		TEST_CASE_ST(ut_setup, ut_teardown,
14992 			test_MD5_HMAC_verify_case_2),
14993 		TEST_CASES_END()
14994 	}
14995 };
14996 
14997 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
14998 	.suite_name = "Kasumi Test Suite",
14999 	.setup = kasumi_testsuite_setup,
15000 	.unit_test_cases = {
15001 		/** KASUMI hash only (UIA1) */
15002 		TEST_CASE_ST(ut_setup, ut_teardown,
15003 			test_kasumi_hash_generate_test_case_1),
15004 		TEST_CASE_ST(ut_setup, ut_teardown,
15005 			test_kasumi_hash_generate_test_case_2),
15006 		TEST_CASE_ST(ut_setup, ut_teardown,
15007 			test_kasumi_hash_generate_test_case_3),
15008 		TEST_CASE_ST(ut_setup, ut_teardown,
15009 			test_kasumi_hash_generate_test_case_4),
15010 		TEST_CASE_ST(ut_setup, ut_teardown,
15011 			test_kasumi_hash_generate_test_case_5),
15012 		TEST_CASE_ST(ut_setup, ut_teardown,
15013 			test_kasumi_hash_generate_test_case_6),
15014 
15015 		TEST_CASE_ST(ut_setup, ut_teardown,
15016 			test_kasumi_hash_verify_test_case_1),
15017 		TEST_CASE_ST(ut_setup, ut_teardown,
15018 			test_kasumi_hash_verify_test_case_2),
15019 		TEST_CASE_ST(ut_setup, ut_teardown,
15020 			test_kasumi_hash_verify_test_case_3),
15021 		TEST_CASE_ST(ut_setup, ut_teardown,
15022 			test_kasumi_hash_verify_test_case_4),
15023 		TEST_CASE_ST(ut_setup, ut_teardown,
15024 			test_kasumi_hash_verify_test_case_5),
15025 
15026 		/** KASUMI encrypt only (UEA1) */
15027 		TEST_CASE_ST(ut_setup, ut_teardown,
15028 			test_kasumi_encryption_test_case_1),
15029 		TEST_CASE_ST(ut_setup, ut_teardown,
15030 			test_kasumi_encryption_test_case_1_sgl),
15031 		TEST_CASE_ST(ut_setup, ut_teardown,
15032 			test_kasumi_encryption_test_case_1_oop),
15033 		TEST_CASE_ST(ut_setup, ut_teardown,
15034 			test_kasumi_encryption_test_case_1_oop_sgl),
15035 		TEST_CASE_ST(ut_setup, ut_teardown,
15036 			test_kasumi_encryption_test_case_2),
15037 		TEST_CASE_ST(ut_setup, ut_teardown,
15038 			test_kasumi_encryption_test_case_3),
15039 		TEST_CASE_ST(ut_setup, ut_teardown,
15040 			test_kasumi_encryption_test_case_4),
15041 		TEST_CASE_ST(ut_setup, ut_teardown,
15042 			test_kasumi_encryption_test_case_5),
15043 
15044 		/** KASUMI decrypt only (UEA1) */
15045 		TEST_CASE_ST(ut_setup, ut_teardown,
15046 			test_kasumi_decryption_test_case_1),
15047 		TEST_CASE_ST(ut_setup, ut_teardown,
15048 			test_kasumi_decryption_test_case_2),
15049 		TEST_CASE_ST(ut_setup, ut_teardown,
15050 			test_kasumi_decryption_test_case_3),
15051 		TEST_CASE_ST(ut_setup, ut_teardown,
15052 			test_kasumi_decryption_test_case_4),
15053 		TEST_CASE_ST(ut_setup, ut_teardown,
15054 			test_kasumi_decryption_test_case_5),
15055 		TEST_CASE_ST(ut_setup, ut_teardown,
15056 			test_kasumi_decryption_test_case_1_oop),
15057 		TEST_CASE_ST(ut_setup, ut_teardown,
15058 			test_kasumi_cipher_auth_test_case_1),
15059 
15060 		/** KASUMI generate auth, then encrypt (F8) */
15061 		TEST_CASE_ST(ut_setup, ut_teardown,
15062 			test_kasumi_auth_cipher_test_case_1),
15063 		TEST_CASE_ST(ut_setup, ut_teardown,
15064 			test_kasumi_auth_cipher_test_case_2),
15065 		TEST_CASE_ST(ut_setup, ut_teardown,
15066 			test_kasumi_auth_cipher_test_case_2_oop),
15067 		TEST_CASE_ST(ut_setup, ut_teardown,
15068 			test_kasumi_auth_cipher_test_case_2_sgl),
15069 		TEST_CASE_ST(ut_setup, ut_teardown,
15070 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
15071 
15072 		/** KASUMI decrypt (F8), then verify auth */
15073 		TEST_CASE_ST(ut_setup, ut_teardown,
15074 			test_kasumi_auth_cipher_verify_test_case_1),
15075 		TEST_CASE_ST(ut_setup, ut_teardown,
15076 			test_kasumi_auth_cipher_verify_test_case_2),
15077 		TEST_CASE_ST(ut_setup, ut_teardown,
15078 			test_kasumi_auth_cipher_verify_test_case_2_oop),
15079 		TEST_CASE_ST(ut_setup, ut_teardown,
15080 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
15081 		TEST_CASE_ST(ut_setup, ut_teardown,
15082 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
15083 
15084 		TEST_CASES_END()
15085 	}
15086 };
15087 
15088 static struct unit_test_suite cryptodev_esn_testsuite  = {
15089 	.suite_name = "ESN Test Suite",
15090 	.setup = esn_testsuite_setup,
15091 	.unit_test_cases = {
15092 		TEST_CASE_ST(ut_setup, ut_teardown,
15093 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
15094 		TEST_CASE_ST(ut_setup, ut_teardown,
15095 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
15096 		TEST_CASES_END()
15097 	}
15098 };
15099 
15100 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
15101 	.suite_name = "Negative AES GCM Test Suite",
15102 	.setup = negative_aes_gcm_testsuite_setup,
15103 	.unit_test_cases = {
15104 		TEST_CASE_ST(ut_setup, ut_teardown,
15105 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
15106 		TEST_CASE_ST(ut_setup, ut_teardown,
15107 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
15108 		TEST_CASE_ST(ut_setup, ut_teardown,
15109 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
15110 		TEST_CASE_ST(ut_setup, ut_teardown,
15111 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
15112 		TEST_CASE_ST(ut_setup, ut_teardown,
15113 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
15114 		TEST_CASE_ST(ut_setup, ut_teardown,
15115 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
15116 		TEST_CASE_ST(ut_setup, ut_teardown,
15117 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
15118 		TEST_CASE_ST(ut_setup, ut_teardown,
15119 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
15120 		TEST_CASE_ST(ut_setup, ut_teardown,
15121 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
15122 		TEST_CASE_ST(ut_setup, ut_teardown,
15123 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
15124 		TEST_CASE_ST(ut_setup, ut_teardown,
15125 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
15126 		TEST_CASE_ST(ut_setup, ut_teardown,
15127 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
15128 
15129 		TEST_CASES_END()
15130 	}
15131 };
15132 
15133 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
15134 	.suite_name = "Negative AES GMAC Test Suite",
15135 	.setup = negative_aes_gmac_testsuite_setup,
15136 	.unit_test_cases = {
15137 		TEST_CASE_ST(ut_setup, ut_teardown,
15138 			authentication_verify_AES128_GMAC_fail_data_corrupt),
15139 		TEST_CASE_ST(ut_setup, ut_teardown,
15140 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
15141 
15142 		TEST_CASES_END()
15143 	}
15144 };
15145 
15146 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
15147 	.suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
15148 	.setup = mixed_cipher_hash_testsuite_setup,
15149 	.unit_test_cases = {
15150 		/** AUTH AES CMAC + CIPHER AES CTR */
15151 		TEST_CASE_ST(ut_setup, ut_teardown,
15152 			test_aes_cmac_aes_ctr_digest_enc_test_case_1),
15153 		TEST_CASE_ST(ut_setup, ut_teardown,
15154 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15155 		TEST_CASE_ST(ut_setup, ut_teardown,
15156 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15157 		TEST_CASE_ST(ut_setup, ut_teardown,
15158 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15159 		TEST_CASE_ST(ut_setup, ut_teardown,
15160 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
15161 		TEST_CASE_ST(ut_setup, ut_teardown,
15162 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15163 		TEST_CASE_ST(ut_setup, ut_teardown,
15164 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15165 		TEST_CASE_ST(ut_setup, ut_teardown,
15166 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15167 
15168 		/** AUTH ZUC + CIPHER SNOW3G */
15169 		TEST_CASE_ST(ut_setup, ut_teardown,
15170 			test_auth_zuc_cipher_snow_test_case_1),
15171 		TEST_CASE_ST(ut_setup, ut_teardown,
15172 			test_verify_auth_zuc_cipher_snow_test_case_1),
15173 		/** AUTH AES CMAC + CIPHER SNOW3G */
15174 		TEST_CASE_ST(ut_setup, ut_teardown,
15175 			test_auth_aes_cmac_cipher_snow_test_case_1),
15176 		TEST_CASE_ST(ut_setup, ut_teardown,
15177 			test_verify_auth_aes_cmac_cipher_snow_test_case_1),
15178 		/** AUTH ZUC + CIPHER AES CTR */
15179 		TEST_CASE_ST(ut_setup, ut_teardown,
15180 			test_auth_zuc_cipher_aes_ctr_test_case_1),
15181 		TEST_CASE_ST(ut_setup, ut_teardown,
15182 			test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
15183 		/** AUTH SNOW3G + CIPHER AES CTR */
15184 		TEST_CASE_ST(ut_setup, ut_teardown,
15185 			test_auth_snow_cipher_aes_ctr_test_case_1),
15186 		TEST_CASE_ST(ut_setup, ut_teardown,
15187 			test_verify_auth_snow_cipher_aes_ctr_test_case_1),
15188 		/** AUTH SNOW3G + CIPHER ZUC */
15189 		TEST_CASE_ST(ut_setup, ut_teardown,
15190 			test_auth_snow_cipher_zuc_test_case_1),
15191 		TEST_CASE_ST(ut_setup, ut_teardown,
15192 			test_verify_auth_snow_cipher_zuc_test_case_1),
15193 		/** AUTH AES CMAC + CIPHER ZUC */
15194 		TEST_CASE_ST(ut_setup, ut_teardown,
15195 			test_auth_aes_cmac_cipher_zuc_test_case_1),
15196 		TEST_CASE_ST(ut_setup, ut_teardown,
15197 			test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
15198 
15199 		/** AUTH NULL + CIPHER SNOW3G */
15200 		TEST_CASE_ST(ut_setup, ut_teardown,
15201 			test_auth_null_cipher_snow_test_case_1),
15202 		TEST_CASE_ST(ut_setup, ut_teardown,
15203 			test_verify_auth_null_cipher_snow_test_case_1),
15204 		/** AUTH NULL + CIPHER ZUC */
15205 		TEST_CASE_ST(ut_setup, ut_teardown,
15206 			test_auth_null_cipher_zuc_test_case_1),
15207 		TEST_CASE_ST(ut_setup, ut_teardown,
15208 			test_verify_auth_null_cipher_zuc_test_case_1),
15209 		/** AUTH SNOW3G + CIPHER NULL */
15210 		TEST_CASE_ST(ut_setup, ut_teardown,
15211 			test_auth_snow_cipher_null_test_case_1),
15212 		TEST_CASE_ST(ut_setup, ut_teardown,
15213 			test_verify_auth_snow_cipher_null_test_case_1),
15214 		/** AUTH ZUC + CIPHER NULL */
15215 		TEST_CASE_ST(ut_setup, ut_teardown,
15216 			test_auth_zuc_cipher_null_test_case_1),
15217 		TEST_CASE_ST(ut_setup, ut_teardown,
15218 			test_verify_auth_zuc_cipher_null_test_case_1),
15219 		/** AUTH NULL + CIPHER AES CTR */
15220 		TEST_CASE_ST(ut_setup, ut_teardown,
15221 			test_auth_null_cipher_aes_ctr_test_case_1),
15222 		TEST_CASE_ST(ut_setup, ut_teardown,
15223 			test_verify_auth_null_cipher_aes_ctr_test_case_1),
15224 		/** AUTH AES CMAC + CIPHER NULL */
15225 		TEST_CASE_ST(ut_setup, ut_teardown,
15226 			test_auth_aes_cmac_cipher_null_test_case_1),
15227 		TEST_CASE_ST(ut_setup, ut_teardown,
15228 			test_verify_auth_aes_cmac_cipher_null_test_case_1),
15229 		TEST_CASES_END()
15230 	}
15231 };
15232 
15233 static int
15234 run_cryptodev_testsuite(const char *pmd_name)
15235 {
15236 	uint8_t ret, j, i = 0, blk_start_idx = 0;
15237 	const enum blockcipher_test_type blk_suites[] = {
15238 		BLKCIPHER_AES_CHAIN_TYPE,
15239 		BLKCIPHER_AES_CIPHERONLY_TYPE,
15240 		BLKCIPHER_AES_DOCSIS_TYPE,
15241 		BLKCIPHER_3DES_CHAIN_TYPE,
15242 		BLKCIPHER_3DES_CIPHERONLY_TYPE,
15243 		BLKCIPHER_DES_CIPHERONLY_TYPE,
15244 		BLKCIPHER_DES_DOCSIS_TYPE,
15245 		BLKCIPHER_AUTHONLY_TYPE};
15246 	struct unit_test_suite *static_suites[] = {
15247 		&cryptodev_multi_session_testsuite,
15248 		&cryptodev_null_testsuite,
15249 		&cryptodev_aes_ccm_auth_testsuite,
15250 		&cryptodev_aes_gcm_auth_testsuite,
15251 		&cryptodev_aes_gmac_auth_testsuite,
15252 		&cryptodev_snow3g_testsuite,
15253 		&cryptodev_chacha20_poly1305_testsuite,
15254 		&cryptodev_zuc_testsuite,
15255 		&cryptodev_hmac_md5_auth_testsuite,
15256 		&cryptodev_kasumi_testsuite,
15257 		&cryptodev_esn_testsuite,
15258 		&cryptodev_negative_aes_gcm_testsuite,
15259 		&cryptodev_negative_aes_gmac_testsuite,
15260 		&cryptodev_mixed_cipher_hash_testsuite,
15261 		&cryptodev_negative_hmac_sha1_testsuite,
15262 		&cryptodev_gen_testsuite,
15263 #ifdef RTE_LIB_SECURITY
15264 		&ipsec_proto_testsuite,
15265 		&pdcp_proto_testsuite,
15266 		&docsis_proto_testsuite,
15267 #endif
15268 		&end_testsuite
15269 	};
15270 	static struct unit_test_suite ts = {
15271 		.suite_name = "Cryptodev Unit Test Suite",
15272 		.setup = testsuite_setup,
15273 		.teardown = testsuite_teardown,
15274 		.unit_test_cases = {TEST_CASES_END()}
15275 	};
15276 
15277 	gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
15278 
15279 	if (gbl_driver_id == -1) {
15280 		RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
15281 		return TEST_SKIPPED;
15282 	}
15283 
15284 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15285 			(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
15286 
15287 	ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
15288 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15289 	ret = unit_test_suite_runner(&ts);
15290 
15291 	FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
15292 	free(ts.unit_test_suites);
15293 	return ret;
15294 }
15295 
15296 static int
15297 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
15298 {
15299 	struct rte_cryptodev_info dev_info;
15300 	uint8_t i, nb_devs;
15301 	int driver_id;
15302 
15303 	driver_id = rte_cryptodev_driver_id_get(pmd_name);
15304 	if (driver_id == -1) {
15305 		RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
15306 		return TEST_SKIPPED;
15307 	}
15308 
15309 	nb_devs = rte_cryptodev_count();
15310 	if (nb_devs < 1) {
15311 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
15312 		return TEST_SKIPPED;
15313 	}
15314 
15315 	for (i = 0; i < nb_devs; i++) {
15316 		rte_cryptodev_info_get(i, &dev_info);
15317 		if (dev_info.driver_id == driver_id) {
15318 			if (!(dev_info.feature_flags & flag)) {
15319 				RTE_LOG(INFO, USER1, "%s not supported\n",
15320 						flag_name);
15321 				return TEST_SKIPPED;
15322 			}
15323 			return 0; /* found */
15324 		}
15325 	}
15326 
15327 	RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
15328 	return TEST_SKIPPED;
15329 }
15330 
15331 static int
15332 test_cryptodev_qat(void)
15333 {
15334 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
15335 }
15336 
15337 static int
15338 test_cryptodev_virtio(void)
15339 {
15340 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
15341 }
15342 
15343 static int
15344 test_cryptodev_aesni_mb(void)
15345 {
15346 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15347 }
15348 
15349 static int
15350 test_cryptodev_cpu_aesni_mb(void)
15351 {
15352 	int32_t rc;
15353 	enum rte_security_session_action_type at = gbl_action_type;
15354 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15355 	rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15356 	gbl_action_type = at;
15357 	return rc;
15358 }
15359 
15360 static int
15361 test_cryptodev_chacha_poly_mb(void)
15362 {
15363 	int32_t rc;
15364 	enum rte_security_session_action_type at = gbl_action_type;
15365 	rc = run_cryptodev_testsuite(
15366 			RTE_STR(CRYPTODEV_NAME_CHACHA20_POLY1305_PMD));
15367 	gbl_action_type = at;
15368 	return rc;
15369 }
15370 
15371 static int
15372 test_cryptodev_openssl(void)
15373 {
15374 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
15375 }
15376 
15377 static int
15378 test_cryptodev_aesni_gcm(void)
15379 {
15380 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15381 }
15382 
15383 static int
15384 test_cryptodev_cpu_aesni_gcm(void)
15385 {
15386 	int32_t rc;
15387 	enum rte_security_session_action_type at = gbl_action_type;
15388 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15389 	rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15390 	gbl_action_type = at;
15391 	return rc;
15392 }
15393 
15394 static int
15395 test_cryptodev_mlx5(void)
15396 {
15397 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
15398 }
15399 
15400 static int
15401 test_cryptodev_null(void)
15402 {
15403 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
15404 }
15405 
15406 static int
15407 test_cryptodev_sw_snow3g(void)
15408 {
15409 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
15410 }
15411 
15412 static int
15413 test_cryptodev_sw_kasumi(void)
15414 {
15415 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
15416 }
15417 
15418 static int
15419 test_cryptodev_sw_zuc(void)
15420 {
15421 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
15422 }
15423 
15424 static int
15425 test_cryptodev_armv8(void)
15426 {
15427 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
15428 }
15429 
15430 static int
15431 test_cryptodev_mrvl(void)
15432 {
15433 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
15434 }
15435 
15436 #ifdef RTE_CRYPTO_SCHEDULER
15437 
15438 static int
15439 test_cryptodev_scheduler(void)
15440 {
15441 	uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
15442 	const enum blockcipher_test_type blk_suites[] = {
15443 		BLKCIPHER_AES_CHAIN_TYPE,
15444 		BLKCIPHER_AES_CIPHERONLY_TYPE,
15445 		BLKCIPHER_AUTHONLY_TYPE
15446 	};
15447 	static struct unit_test_suite scheduler_multicore = {
15448 		.suite_name = "Scheduler Multicore Unit Test Suite",
15449 		.setup = scheduler_multicore_testsuite_setup,
15450 		.teardown = scheduler_mode_testsuite_teardown,
15451 		.unit_test_cases = {TEST_CASES_END()}
15452 	};
15453 	static struct unit_test_suite scheduler_round_robin = {
15454 		.suite_name = "Scheduler Round Robin Unit Test Suite",
15455 		.setup = scheduler_roundrobin_testsuite_setup,
15456 		.teardown = scheduler_mode_testsuite_teardown,
15457 		.unit_test_cases = {TEST_CASES_END()}
15458 	};
15459 	static struct unit_test_suite scheduler_failover = {
15460 		.suite_name = "Scheduler Failover Unit Test Suite",
15461 		.setup = scheduler_failover_testsuite_setup,
15462 		.teardown = scheduler_mode_testsuite_teardown,
15463 		.unit_test_cases = {TEST_CASES_END()}
15464 	};
15465 	static struct unit_test_suite scheduler_pkt_size_distr = {
15466 		.suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
15467 		.setup = scheduler_pkt_size_distr_testsuite_setup,
15468 		.teardown = scheduler_mode_testsuite_teardown,
15469 		.unit_test_cases = {TEST_CASES_END()}
15470 	};
15471 	struct unit_test_suite *sched_mode_suites[] = {
15472 		&scheduler_multicore,
15473 		&scheduler_round_robin,
15474 		&scheduler_failover,
15475 		&scheduler_pkt_size_distr
15476 	};
15477 	static struct unit_test_suite scheduler_config = {
15478 		.suite_name = "Crypto Device Scheduler Config Unit Test Suite",
15479 		.unit_test_cases = {
15480 			TEST_CASE(test_scheduler_attach_worker_op),
15481 			TEST_CASE(test_scheduler_mode_multicore_op),
15482 			TEST_CASE(test_scheduler_mode_roundrobin_op),
15483 			TEST_CASE(test_scheduler_mode_failover_op),
15484 			TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
15485 			TEST_CASE(test_scheduler_detach_worker_op),
15486 
15487 			TEST_CASES_END() /**< NULL terminate array */
15488 		}
15489 	};
15490 	struct unit_test_suite *static_suites[] = {
15491 		&scheduler_config,
15492 		&end_testsuite
15493 	};
15494 	static struct unit_test_suite ts = {
15495 		.suite_name = "Scheduler Unit Test Suite",
15496 		.setup = scheduler_testsuite_setup,
15497 		.teardown = testsuite_teardown,
15498 		.unit_test_cases = {TEST_CASES_END()}
15499 	};
15500 
15501 	gbl_driver_id =	rte_cryptodev_driver_id_get(
15502 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
15503 
15504 	if (gbl_driver_id == -1) {
15505 		RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
15506 		return TEST_SKIPPED;
15507 	}
15508 
15509 	if (rte_cryptodev_driver_id_get(
15510 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
15511 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
15512 		return TEST_SKIPPED;
15513 	}
15514 
15515 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15516 		uint8_t blk_i = 0;
15517 		sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
15518 				(struct unit_test_suite *) *
15519 				(RTE_DIM(blk_suites) + 1));
15520 		ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
15521 				blk_suites, RTE_DIM(blk_suites));
15522 		sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
15523 	}
15524 
15525 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15526 			(RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
15527 	ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
15528 			RTE_DIM(sched_mode_suites));
15529 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15530 	ret = unit_test_suite_runner(&ts);
15531 
15532 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15533 		FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
15534 				(*sched_mode_suites[sched_i]),
15535 				RTE_DIM(blk_suites));
15536 		free(sched_mode_suites[sched_i]->unit_test_suites);
15537 	}
15538 	free(ts.unit_test_suites);
15539 	return ret;
15540 }
15541 
15542 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
15543 
15544 #endif
15545 
15546 static int
15547 test_cryptodev_dpaa2_sec(void)
15548 {
15549 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
15550 }
15551 
15552 static int
15553 test_cryptodev_dpaa_sec(void)
15554 {
15555 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
15556 }
15557 
15558 static int
15559 test_cryptodev_ccp(void)
15560 {
15561 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
15562 }
15563 
15564 static int
15565 test_cryptodev_octeontx(void)
15566 {
15567 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
15568 }
15569 
15570 static int
15571 test_cryptodev_octeontx2(void)
15572 {
15573 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
15574 }
15575 
15576 static int
15577 test_cryptodev_caam_jr(void)
15578 {
15579 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
15580 }
15581 
15582 static int
15583 test_cryptodev_nitrox(void)
15584 {
15585 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
15586 }
15587 
15588 static int
15589 test_cryptodev_bcmfs(void)
15590 {
15591 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
15592 }
15593 
15594 static int
15595 test_cryptodev_qat_raw_api(void)
15596 {
15597 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
15598 	int ret;
15599 
15600 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15601 			"RAW API");
15602 	if (ret)
15603 		return ret;
15604 
15605 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
15606 	ret = run_cryptodev_testsuite(pmd_name);
15607 	global_api_test_type = CRYPTODEV_API_TEST;
15608 
15609 	return ret;
15610 }
15611 
15612 static int
15613 test_cryptodev_cn9k(void)
15614 {
15615 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
15616 }
15617 
15618 static int
15619 test_cryptodev_cn10k(void)
15620 {
15621 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
15622 }
15623 
15624 static int
15625 test_cryptodev_dpaa2_sec_raw_api(void)
15626 {
15627 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
15628 	int ret;
15629 
15630 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15631 			"RAW API");
15632 	if (ret)
15633 		return ret;
15634 
15635 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
15636 	ret = run_cryptodev_testsuite(pmd_name);
15637 	global_api_test_type = CRYPTODEV_API_TEST;
15638 
15639 	return ret;
15640 }
15641 
15642 static int
15643 test_cryptodev_dpaa_sec_raw_api(void)
15644 {
15645 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
15646 	int ret;
15647 
15648 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15649 			"RAW API");
15650 	if (ret)
15651 		return ret;
15652 
15653 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
15654 	ret = run_cryptodev_testsuite(pmd_name);
15655 	global_api_test_type = CRYPTODEV_API_TEST;
15656 
15657 	return ret;
15658 }
15659 
15660 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest,
15661 		test_cryptodev_dpaa2_sec_raw_api);
15662 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest,
15663 		test_cryptodev_dpaa_sec_raw_api);
15664 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
15665 		test_cryptodev_qat_raw_api);
15666 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
15667 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
15668 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
15669 	test_cryptodev_cpu_aesni_mb);
15670 REGISTER_TEST_COMMAND(cryptodev_chacha_poly_mb_autotest,
15671 	test_cryptodev_chacha_poly_mb);
15672 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
15673 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
15674 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
15675 	test_cryptodev_cpu_aesni_gcm);
15676 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
15677 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
15678 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
15679 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
15680 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
15681 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
15682 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
15683 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
15684 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
15685 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
15686 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
15687 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
15688 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
15689 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
15690 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
15691 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
15692 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
15693 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);
15694