xref: /dpdk/app/test/test_cryptodev.c (revision 97b914f4e715565d53d38ac6e04815b9be5e58a9)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2015-2020 Intel Corporation
3  * Copyright 2020 NXP
4  */
5 
6 #ifndef RTE_EXEC_ENV_WINDOWS
7 
8 #include <time.h>
9 
10 #include <rte_common.h>
11 #include <rte_hexdump.h>
12 #include <rte_mbuf.h>
13 #include <rte_malloc.h>
14 #include <rte_memcpy.h>
15 #include <rte_pause.h>
16 #include <rte_bus_vdev.h>
17 #include <rte_ether.h>
18 
19 #include <rte_crypto.h>
20 #include <rte_cryptodev.h>
21 #include <rte_ip.h>
22 #include <rte_string_fns.h>
23 #include <rte_tcp.h>
24 #include <rte_udp.h>
25 
26 #ifdef RTE_CRYPTO_SCHEDULER
27 #include <rte_cryptodev_scheduler.h>
28 #include <rte_cryptodev_scheduler_operations.h>
29 #endif
30 
31 #include <rte_lcore.h>
32 
33 #include "test.h"
34 #include "test_cryptodev.h"
35 
36 #include "test_cryptodev_blockcipher.h"
37 #include "test_cryptodev_aes_test_vectors.h"
38 #include "test_cryptodev_des_test_vectors.h"
39 #include "test_cryptodev_hash_test_vectors.h"
40 #include "test_cryptodev_kasumi_test_vectors.h"
41 #include "test_cryptodev_kasumi_hash_test_vectors.h"
42 #include "test_cryptodev_snow3g_test_vectors.h"
43 #include "test_cryptodev_snow3g_hash_test_vectors.h"
44 #include "test_cryptodev_zuc_test_vectors.h"
45 #include "test_cryptodev_aead_test_vectors.h"
46 #include "test_cryptodev_hmac_test_vectors.h"
47 #include "test_cryptodev_mixed_test_vectors.h"
48 #ifdef RTE_LIB_SECURITY
49 #include "test_cryptodev_security_ipsec.h"
50 #include "test_cryptodev_security_ipsec_test_vectors.h"
51 #include "test_cryptodev_security_pdcp_test_vectors.h"
52 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
53 #include "test_cryptodev_security_pdcp_test_func.h"
54 #include "test_cryptodev_security_docsis_test_vectors.h"
55 
56 #define SDAP_DISABLED	0
57 #define SDAP_ENABLED	1
58 #endif
59 
60 #define VDEV_ARGS_SIZE 100
61 #define MAX_NB_SESSIONS 4
62 
63 #define MAX_DRV_SERVICE_CTX_SIZE 256
64 
65 #define MAX_RAW_DEQUEUE_COUNT	65535
66 
67 #define IN_PLACE 0
68 #define OUT_OF_PLACE 1
69 
70 static int gbl_driver_id;
71 
72 static enum rte_security_session_action_type gbl_action_type =
73 	RTE_SECURITY_ACTION_TYPE_NONE;
74 
75 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
76 
77 struct crypto_unittest_params {
78 	struct rte_crypto_sym_xform cipher_xform;
79 	struct rte_crypto_sym_xform auth_xform;
80 	struct rte_crypto_sym_xform aead_xform;
81 #ifdef RTE_LIB_SECURITY
82 	struct rte_security_docsis_xform docsis_xform;
83 #endif
84 
85 	union {
86 		struct rte_cryptodev_sym_session *sess;
87 #ifdef RTE_LIB_SECURITY
88 		struct rte_security_session *sec_session;
89 #endif
90 	};
91 #ifdef RTE_LIB_SECURITY
92 	enum rte_security_session_action_type type;
93 #endif
94 	struct rte_crypto_op *op;
95 
96 	struct rte_mbuf *obuf, *ibuf;
97 
98 	uint8_t *digest;
99 };
100 
101 #define ALIGN_POW2_ROUNDUP(num, align) \
102 	(((num) + (align) - 1) & ~((align) - 1))
103 
104 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts)	\
105 	for (j = 0; j < num_child_ts; index++, j++)			\
106 		parent_ts.unit_test_suites[index] = child_ts[j]
107 
108 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types)	\
109 	for (j = 0; j < num_blk_types; index++, j++)				\
110 		parent_ts.unit_test_suites[index] =				\
111 				build_blockcipher_test_suite(blk_types[j])
112 
113 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types)		\
114 	for (j = index; j < index + num_blk_types; j++)				\
115 		free_blockcipher_test_suite(parent_ts.unit_test_suites[j])
116 
117 /*
118  * Forward declarations.
119  */
120 static int
121 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
122 		struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
123 		uint8_t *hmac_key);
124 
125 static int
126 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
127 		struct crypto_unittest_params *ut_params,
128 		struct crypto_testsuite_params *ts_param,
129 		const uint8_t *cipher,
130 		const uint8_t *digest,
131 		const uint8_t *iv);
132 
133 static int
134 security_proto_supported(enum rte_security_session_action_type action,
135 	enum rte_security_session_protocol proto);
136 
137 static int
138 dev_configure_and_start(uint64_t ff_disable);
139 
140 static struct rte_mbuf *
141 setup_test_string(struct rte_mempool *mpool,
142 		const char *string, size_t len, uint8_t blocksize)
143 {
144 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
145 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
146 
147 	if (m) {
148 		char *dst;
149 
150 		memset(m->buf_addr, 0, m->buf_len);
151 		dst = rte_pktmbuf_append(m, t_len);
152 		if (!dst) {
153 			rte_pktmbuf_free(m);
154 			return NULL;
155 		}
156 		if (string != NULL)
157 			rte_memcpy(dst, string, t_len);
158 		else
159 			memset(dst, 0, t_len);
160 	}
161 
162 	return m;
163 }
164 
165 /* Get number of bytes in X bits (rounding up) */
166 static uint32_t
167 ceil_byte_length(uint32_t num_bits)
168 {
169 	if (num_bits % 8)
170 		return ((num_bits >> 3) + 1);
171 	else
172 		return (num_bits >> 3);
173 }
174 
175 static void
176 post_process_raw_dp_op(void *user_data,	uint32_t index __rte_unused,
177 		uint8_t is_op_success)
178 {
179 	struct rte_crypto_op *op = user_data;
180 	op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
181 			RTE_CRYPTO_OP_STATUS_ERROR;
182 }
183 
184 static struct crypto_testsuite_params testsuite_params = { NULL };
185 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
186 static struct crypto_unittest_params unittest_params;
187 
188 void
189 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
190 		struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
191 		uint8_t len_in_bits, uint8_t cipher_iv_len)
192 {
193 	struct rte_crypto_sym_op *sop = op->sym;
194 	struct rte_crypto_op *ret_op = NULL;
195 	struct rte_crypto_vec data_vec[UINT8_MAX], dest_data_vec[UINT8_MAX];
196 	struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
197 	union rte_crypto_sym_ofs ofs;
198 	struct rte_crypto_sym_vec vec;
199 	struct rte_crypto_sgl sgl, dest_sgl;
200 	uint32_t max_len;
201 	union rte_cryptodev_session_ctx sess;
202 	uint64_t auth_end_iova;
203 	uint32_t count = 0;
204 	struct rte_crypto_raw_dp_ctx *ctx;
205 	uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
206 			auth_len = 0;
207 	int32_t n;
208 	uint32_t n_success;
209 	int ctx_service_size;
210 	int32_t status = 0;
211 	int enqueue_status, dequeue_status;
212 	struct crypto_unittest_params *ut_params = &unittest_params;
213 	int is_sgl = sop->m_src->nb_segs > 1;
214 	int is_oop = 0;
215 
216 	ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
217 	if (ctx_service_size < 0) {
218 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
219 		return;
220 	}
221 
222 	ctx = malloc(ctx_service_size);
223 	if (!ctx) {
224 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
225 		return;
226 	}
227 
228 	/* Both are enums, setting crypto_sess will suit any session type */
229 	sess.crypto_sess = op->sym->session;
230 
231 	if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
232 			op->sess_type, sess, 0) < 0) {
233 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
234 		goto exit;
235 	}
236 
237 	cipher_iv.iova = 0;
238 	cipher_iv.va = NULL;
239 	aad_auth_iv.iova = 0;
240 	aad_auth_iv.va = NULL;
241 	digest.iova = 0;
242 	digest.va = NULL;
243 	sgl.vec = data_vec;
244 	vec.num = 1;
245 	vec.src_sgl = &sgl;
246 	vec.iv = &cipher_iv;
247 	vec.digest = &digest;
248 	vec.aad = &aad_auth_iv;
249 	vec.status = &status;
250 
251 	ofs.raw = 0;
252 
253 	if ((sop->m_dst != NULL) && (sop->m_dst != sop->m_src))
254 		is_oop = 1;
255 
256 	if (is_cipher && is_auth) {
257 		cipher_offset = sop->cipher.data.offset;
258 		cipher_len = sop->cipher.data.length;
259 		auth_offset = sop->auth.data.offset;
260 		auth_len = sop->auth.data.length;
261 		max_len = RTE_MAX(cipher_offset + cipher_len,
262 				auth_offset + auth_len);
263 		if (len_in_bits) {
264 			max_len = max_len >> 3;
265 			cipher_offset = cipher_offset >> 3;
266 			auth_offset = auth_offset >> 3;
267 			cipher_len = cipher_len >> 3;
268 			auth_len = auth_len >> 3;
269 		}
270 		ofs.ofs.cipher.head = cipher_offset;
271 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
272 		ofs.ofs.auth.head = auth_offset;
273 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
274 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
275 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
276 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
277 				op, void *, IV_OFFSET + cipher_iv_len);
278 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
279 				cipher_iv_len);
280 		digest.va = (void *)sop->auth.digest.data;
281 		digest.iova = sop->auth.digest.phys_addr;
282 
283 		if (is_sgl) {
284 			uint32_t remaining_off = auth_offset + auth_len;
285 			struct rte_mbuf *sgl_buf = sop->m_src;
286 			if (is_oop)
287 				sgl_buf = sop->m_dst;
288 
289 			while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)
290 					&& sgl_buf->next != NULL) {
291 				remaining_off -= rte_pktmbuf_data_len(sgl_buf);
292 				sgl_buf = sgl_buf->next;
293 			}
294 
295 			auth_end_iova = (uint64_t)rte_pktmbuf_iova_offset(
296 				sgl_buf, remaining_off);
297 		} else {
298 			auth_end_iova = rte_pktmbuf_iova(op->sym->m_src) +
299 							 auth_offset + auth_len;
300 		}
301 		/* Then check if digest-encrypted conditions are met */
302 		if ((auth_offset + auth_len < cipher_offset + cipher_len) &&
303 				(digest.iova == auth_end_iova) && is_sgl)
304 			max_len = RTE_MAX(max_len,
305 				auth_offset + auth_len +
306 				ut_params->auth_xform.auth.digest_length);
307 
308 	} else if (is_cipher) {
309 		cipher_offset = sop->cipher.data.offset;
310 		cipher_len = sop->cipher.data.length;
311 		max_len = cipher_len + cipher_offset;
312 		if (len_in_bits) {
313 			max_len = max_len >> 3;
314 			cipher_offset = cipher_offset >> 3;
315 			cipher_len = cipher_len >> 3;
316 		}
317 		ofs.ofs.cipher.head = cipher_offset;
318 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
319 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
320 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
321 
322 	} else if (is_auth) {
323 		auth_offset = sop->auth.data.offset;
324 		auth_len = sop->auth.data.length;
325 		max_len = auth_len + auth_offset;
326 		if (len_in_bits) {
327 			max_len = max_len >> 3;
328 			auth_offset = auth_offset >> 3;
329 			auth_len = auth_len >> 3;
330 		}
331 		ofs.ofs.auth.head = auth_offset;
332 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
333 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
334 				op, void *, IV_OFFSET + cipher_iv_len);
335 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
336 				cipher_iv_len);
337 		digest.va = (void *)sop->auth.digest.data;
338 		digest.iova = sop->auth.digest.phys_addr;
339 
340 	} else { /* aead */
341 		cipher_offset = sop->aead.data.offset;
342 		cipher_len = sop->aead.data.length;
343 		max_len = cipher_len + cipher_offset;
344 		if (len_in_bits) {
345 			max_len = max_len >> 3;
346 			cipher_offset = cipher_offset >> 3;
347 			cipher_len = cipher_len >> 3;
348 		}
349 		ofs.ofs.cipher.head = cipher_offset;
350 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
351 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
352 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
353 		aad_auth_iv.va = (void *)sop->aead.aad.data;
354 		aad_auth_iv.iova = sop->aead.aad.phys_addr;
355 		digest.va = (void *)sop->aead.digest.data;
356 		digest.iova = sop->aead.digest.phys_addr;
357 	}
358 
359 	n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
360 			data_vec, RTE_DIM(data_vec));
361 	if (n < 0 || n > sop->m_src->nb_segs) {
362 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
363 		goto exit;
364 	}
365 
366 	sgl.num = n;
367 	/* Out of place */
368 	if (is_oop) {
369 		dest_sgl.vec = dest_data_vec;
370 		vec.dest_sgl = &dest_sgl;
371 		n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
372 				dest_data_vec, RTE_DIM(dest_data_vec));
373 		if (n < 0 || n > sop->m_dst->nb_segs) {
374 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
375 			goto exit;
376 		}
377 		dest_sgl.num = n;
378 	} else
379 		vec.dest_sgl = NULL;
380 
381 	if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
382 			&enqueue_status) < 1) {
383 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
384 		goto exit;
385 	}
386 
387 	if (enqueue_status == 0) {
388 		status = rte_cryptodev_raw_enqueue_done(ctx, 1);
389 		if (status < 0) {
390 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
391 			goto exit;
392 		}
393 	} else if (enqueue_status < 0) {
394 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
395 		goto exit;
396 	}
397 
398 	n = n_success = 0;
399 	while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
400 		n = rte_cryptodev_raw_dequeue_burst(ctx,
401 			NULL, 1, post_process_raw_dp_op,
402 				(void **)&ret_op, 0, &n_success,
403 				&dequeue_status);
404 		if (dequeue_status < 0) {
405 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
406 			goto exit;
407 		}
408 		if (n == 0)
409 			rte_pause();
410 	}
411 
412 	if (n == 1 && dequeue_status == 0) {
413 		if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
414 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
415 			goto exit;
416 		}
417 	}
418 
419 	op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
420 			ret_op->status == RTE_CRYPTO_OP_STATUS_ERROR ||
421 			n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
422 					RTE_CRYPTO_OP_STATUS_SUCCESS;
423 
424 exit:
425 	free(ctx);
426 }
427 
428 static void
429 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
430 {
431 	int32_t n, st;
432 	struct rte_crypto_sym_op *sop;
433 	union rte_crypto_sym_ofs ofs;
434 	struct rte_crypto_sgl sgl;
435 	struct rte_crypto_sym_vec symvec;
436 	struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
437 	struct rte_crypto_vec vec[UINT8_MAX];
438 
439 	sop = op->sym;
440 
441 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
442 		sop->aead.data.length, vec, RTE_DIM(vec));
443 
444 	if (n < 0 || n != sop->m_src->nb_segs) {
445 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
446 		return;
447 	}
448 
449 	sgl.vec = vec;
450 	sgl.num = n;
451 	symvec.src_sgl = &sgl;
452 	symvec.iv = &iv_ptr;
453 	symvec.digest = &digest_ptr;
454 	symvec.aad = &aad_ptr;
455 	symvec.status = &st;
456 	symvec.num = 1;
457 
458 	/* for CPU crypto the IOVA address is not required */
459 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
460 	digest_ptr.va = (void *)sop->aead.digest.data;
461 	aad_ptr.va = (void *)sop->aead.aad.data;
462 
463 	ofs.raw = 0;
464 
465 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
466 		&symvec);
467 
468 	if (n != 1)
469 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
470 	else
471 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
472 }
473 
474 static void
475 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
476 {
477 	int32_t n, st;
478 	struct rte_crypto_sym_op *sop;
479 	union rte_crypto_sym_ofs ofs;
480 	struct rte_crypto_sgl sgl;
481 	struct rte_crypto_sym_vec symvec;
482 	struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
483 	struct rte_crypto_vec vec[UINT8_MAX];
484 
485 	sop = op->sym;
486 
487 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
488 		sop->auth.data.length, vec, RTE_DIM(vec));
489 
490 	if (n < 0 || n != sop->m_src->nb_segs) {
491 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
492 		return;
493 	}
494 
495 	sgl.vec = vec;
496 	sgl.num = n;
497 	symvec.src_sgl = &sgl;
498 	symvec.iv = &iv_ptr;
499 	symvec.digest = &digest_ptr;
500 	symvec.status = &st;
501 	symvec.num = 1;
502 
503 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
504 	digest_ptr.va = (void *)sop->auth.digest.data;
505 
506 	ofs.raw = 0;
507 	ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
508 	ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
509 		(sop->cipher.data.offset + sop->cipher.data.length);
510 
511 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
512 		&symvec);
513 
514 	if (n != 1)
515 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
516 	else
517 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
518 }
519 
520 static struct rte_crypto_op *
521 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
522 {
523 
524 	RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
525 
526 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
527 		RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
528 		return NULL;
529 	}
530 
531 	op = NULL;
532 
533 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
534 		rte_pause();
535 
536 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
537 		RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
538 		return NULL;
539 	}
540 
541 	return op;
542 }
543 
544 static int
545 testsuite_setup(void)
546 {
547 	struct crypto_testsuite_params *ts_params = &testsuite_params;
548 	struct rte_cryptodev_info info;
549 	uint32_t i = 0, nb_devs, dev_id;
550 	uint16_t qp_id;
551 
552 	memset(ts_params, 0, sizeof(*ts_params));
553 
554 	ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
555 	if (ts_params->mbuf_pool == NULL) {
556 		/* Not already created so create */
557 		ts_params->mbuf_pool = rte_pktmbuf_pool_create(
558 				"CRYPTO_MBUFPOOL",
559 				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
560 				rte_socket_id());
561 		if (ts_params->mbuf_pool == NULL) {
562 			RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
563 			return TEST_FAILED;
564 		}
565 	}
566 
567 	ts_params->large_mbuf_pool = rte_mempool_lookup(
568 			"CRYPTO_LARGE_MBUFPOOL");
569 	if (ts_params->large_mbuf_pool == NULL) {
570 		/* Not already created so create */
571 		ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
572 				"CRYPTO_LARGE_MBUFPOOL",
573 				1, 0, 0, UINT16_MAX,
574 				rte_socket_id());
575 		if (ts_params->large_mbuf_pool == NULL) {
576 			RTE_LOG(ERR, USER1,
577 				"Can't create CRYPTO_LARGE_MBUFPOOL\n");
578 			return TEST_FAILED;
579 		}
580 	}
581 
582 	ts_params->op_mpool = rte_crypto_op_pool_create(
583 			"MBUF_CRYPTO_SYM_OP_POOL",
584 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
585 			NUM_MBUFS, MBUF_CACHE_SIZE,
586 			DEFAULT_NUM_XFORMS *
587 			sizeof(struct rte_crypto_sym_xform) +
588 			MAXIMUM_IV_LENGTH,
589 			rte_socket_id());
590 	if (ts_params->op_mpool == NULL) {
591 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
592 		return TEST_FAILED;
593 	}
594 
595 	nb_devs = rte_cryptodev_count();
596 	if (nb_devs < 1) {
597 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
598 		return TEST_SKIPPED;
599 	}
600 
601 	if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
602 		RTE_LOG(WARNING, USER1, "No %s devices found?\n",
603 				rte_cryptodev_driver_name_get(gbl_driver_id));
604 		return TEST_SKIPPED;
605 	}
606 
607 	/* Create list of valid crypto devs */
608 	for (i = 0; i < nb_devs; i++) {
609 		rte_cryptodev_info_get(i, &info);
610 		if (info.driver_id == gbl_driver_id)
611 			ts_params->valid_devs[ts_params->valid_dev_count++] = i;
612 	}
613 
614 	if (ts_params->valid_dev_count < 1)
615 		return TEST_FAILED;
616 
617 	/* Set up all the qps on the first of the valid devices found */
618 
619 	dev_id = ts_params->valid_devs[0];
620 
621 	rte_cryptodev_info_get(dev_id, &info);
622 
623 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
624 	ts_params->conf.socket_id = SOCKET_ID_ANY;
625 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
626 
627 	unsigned int session_size =
628 		rte_cryptodev_sym_get_private_session_size(dev_id);
629 
630 #ifdef RTE_LIB_SECURITY
631 	unsigned int security_session_size = rte_security_session_get_size(
632 			rte_cryptodev_get_sec_ctx(dev_id));
633 
634 	if (session_size < security_session_size)
635 		session_size = security_session_size;
636 #endif
637 	/*
638 	 * Create mempool with maximum number of sessions.
639 	 */
640 	if (info.sym.max_nb_sessions != 0 &&
641 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
642 		RTE_LOG(ERR, USER1, "Device does not support "
643 				"at least %u sessions\n",
644 				MAX_NB_SESSIONS);
645 		return TEST_FAILED;
646 	}
647 
648 	ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
649 			"test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
650 			SOCKET_ID_ANY);
651 	TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
652 			"session mempool allocation failed");
653 
654 	ts_params->session_priv_mpool = rte_mempool_create(
655 			"test_sess_mp_priv",
656 			MAX_NB_SESSIONS,
657 			session_size,
658 			0, 0, NULL, NULL, NULL,
659 			NULL, SOCKET_ID_ANY,
660 			0);
661 	TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
662 			"session mempool allocation failed");
663 
664 
665 
666 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
667 			&ts_params->conf),
668 			"Failed to configure cryptodev %u with %u qps",
669 			dev_id, ts_params->conf.nb_queue_pairs);
670 
671 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
672 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
673 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
674 
675 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
676 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
677 			dev_id, qp_id, &ts_params->qp_conf,
678 			rte_cryptodev_socket_id(dev_id)),
679 			"Failed to setup queue pair %u on cryptodev %u",
680 			qp_id, dev_id);
681 	}
682 
683 	return TEST_SUCCESS;
684 }
685 
686 static void
687 testsuite_teardown(void)
688 {
689 	struct crypto_testsuite_params *ts_params = &testsuite_params;
690 	int res;
691 
692 	if (ts_params->mbuf_pool != NULL) {
693 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
694 		rte_mempool_avail_count(ts_params->mbuf_pool));
695 	}
696 
697 	if (ts_params->op_mpool != NULL) {
698 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
699 		rte_mempool_avail_count(ts_params->op_mpool));
700 	}
701 
702 	/* Free session mempools */
703 	if (ts_params->session_priv_mpool != NULL) {
704 		rte_mempool_free(ts_params->session_priv_mpool);
705 		ts_params->session_priv_mpool = NULL;
706 	}
707 
708 	if (ts_params->session_mpool != NULL) {
709 		rte_mempool_free(ts_params->session_mpool);
710 		ts_params->session_mpool = NULL;
711 	}
712 
713 	res = rte_cryptodev_close(ts_params->valid_devs[0]);
714 	if (res)
715 		RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
716 }
717 
718 static int
719 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
720 		const int *algs, uint16_t num_algs)
721 {
722 	uint8_t dev_id = testsuite_params.valid_devs[0];
723 	bool some_alg_supported = FALSE;
724 	uint16_t i;
725 
726 	for (i = 0; i < num_algs && !some_alg_supported; i++) {
727 		struct rte_cryptodev_sym_capability_idx alg = {
728 			type, {algs[i]}
729 		};
730 		if (rte_cryptodev_sym_capability_get(dev_id,
731 				&alg) != NULL)
732 			some_alg_supported = TRUE;
733 	}
734 	if (!some_alg_supported)
735 		return TEST_SKIPPED;
736 
737 	return 0;
738 }
739 
740 int
741 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
742 		uint16_t num_ciphers)
743 {
744 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
745 			(const int *) ciphers, num_ciphers);
746 }
747 
748 int
749 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
750 		uint16_t num_auths)
751 {
752 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
753 			(const int *) auths, num_auths);
754 }
755 
756 int
757 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
758 		uint16_t num_aeads)
759 {
760 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
761 			(const int *) aeads, num_aeads);
762 }
763 
764 static int
765 null_testsuite_setup(void)
766 {
767 	struct crypto_testsuite_params *ts_params = &testsuite_params;
768 	uint8_t dev_id = ts_params->valid_devs[0];
769 	struct rte_cryptodev_info dev_info;
770 	const enum rte_crypto_cipher_algorithm ciphers[] = {
771 		RTE_CRYPTO_CIPHER_NULL
772 	};
773 	const enum rte_crypto_auth_algorithm auths[] = {
774 		RTE_CRYPTO_AUTH_NULL
775 	};
776 
777 	rte_cryptodev_info_get(dev_id, &dev_info);
778 
779 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
780 		RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
781 				"testsuite not met\n");
782 		return TEST_SKIPPED;
783 	}
784 
785 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
786 			&& check_auth_capabilities_supported(auths,
787 			RTE_DIM(auths)) != 0) {
788 		RTE_LOG(INFO, USER1, "Capability requirements for NULL "
789 				"testsuite not met\n");
790 		return TEST_SKIPPED;
791 	}
792 
793 	return 0;
794 }
795 
796 static int
797 crypto_gen_testsuite_setup(void)
798 {
799 	struct crypto_testsuite_params *ts_params = &testsuite_params;
800 	uint8_t dev_id = ts_params->valid_devs[0];
801 	struct rte_cryptodev_info dev_info;
802 
803 	rte_cryptodev_info_get(dev_id, &dev_info);
804 
805 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
806 		RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
807 				"testsuite not met\n");
808 		return TEST_SKIPPED;
809 	}
810 
811 	return 0;
812 }
813 
814 #ifdef RTE_LIB_SECURITY
815 static int
816 ipsec_proto_testsuite_setup(void)
817 {
818 	struct crypto_testsuite_params *ts_params = &testsuite_params;
819 	struct crypto_unittest_params *ut_params = &unittest_params;
820 	struct rte_cryptodev_info dev_info;
821 	int ret = 0;
822 
823 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
824 
825 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
826 		RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto "
827 				"testsuite not met\n");
828 		return TEST_SKIPPED;
829 	}
830 
831 	/* Reconfigure to enable security */
832 	ret = dev_configure_and_start(0);
833 	if (ret != TEST_SUCCESS)
834 		return ret;
835 
836 	/* Set action type */
837 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
838 
839 	if (security_proto_supported(
840 			RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
841 			RTE_SECURITY_PROTOCOL_IPSEC) < 0) {
842 		RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto "
843 				"test not met\n");
844 		ret = TEST_SKIPPED;
845 	}
846 
847 	test_ipsec_alg_list_populate();
848 	test_ipsec_ah_alg_list_populate();
849 
850 	/*
851 	 * Stop the device. Device would be started again by individual test
852 	 * case setup routine.
853 	 */
854 	rte_cryptodev_stop(ts_params->valid_devs[0]);
855 
856 	return ret;
857 }
858 
859 static int
860 pdcp_proto_testsuite_setup(void)
861 {
862 	struct crypto_testsuite_params *ts_params = &testsuite_params;
863 	uint8_t dev_id = ts_params->valid_devs[0];
864 	struct rte_cryptodev_info dev_info;
865 	const enum rte_crypto_cipher_algorithm ciphers[] = {
866 		RTE_CRYPTO_CIPHER_NULL,
867 		RTE_CRYPTO_CIPHER_AES_CTR,
868 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
869 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
870 	};
871 	const enum rte_crypto_auth_algorithm auths[] = {
872 		RTE_CRYPTO_AUTH_NULL,
873 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
874 		RTE_CRYPTO_AUTH_AES_CMAC,
875 		RTE_CRYPTO_AUTH_ZUC_EIA3
876 	};
877 
878 	rte_cryptodev_info_get(dev_id, &dev_info);
879 
880 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
881 			!(dev_info.feature_flags &
882 			RTE_CRYPTODEV_FF_SECURITY)) {
883 		RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
884 				"testsuite not met\n");
885 		return TEST_SKIPPED;
886 	}
887 
888 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
889 			&& check_auth_capabilities_supported(auths,
890 			RTE_DIM(auths)) != 0) {
891 		RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
892 				"testsuite not met\n");
893 		return TEST_SKIPPED;
894 	}
895 
896 	return 0;
897 }
898 
899 static int
900 docsis_proto_testsuite_setup(void)
901 {
902 	struct crypto_testsuite_params *ts_params = &testsuite_params;
903 	uint8_t dev_id = ts_params->valid_devs[0];
904 	struct rte_cryptodev_info dev_info;
905 	const enum rte_crypto_cipher_algorithm ciphers[] = {
906 		RTE_CRYPTO_CIPHER_AES_DOCSISBPI
907 	};
908 
909 	rte_cryptodev_info_get(dev_id, &dev_info);
910 
911 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
912 			!(dev_info.feature_flags &
913 			RTE_CRYPTODEV_FF_SECURITY)) {
914 		RTE_LOG(INFO, USER1, "Feature flag requirements for DOCSIS "
915 				"Proto testsuite not met\n");
916 		return TEST_SKIPPED;
917 	}
918 
919 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
920 		RTE_LOG(INFO, USER1, "Capability requirements for DOCSIS Proto "
921 				"testsuite not met\n");
922 		return TEST_SKIPPED;
923 	}
924 
925 	return 0;
926 }
927 #endif
928 
929 static int
930 aes_ccm_auth_testsuite_setup(void)
931 {
932 	struct crypto_testsuite_params *ts_params = &testsuite_params;
933 	uint8_t dev_id = ts_params->valid_devs[0];
934 	struct rte_cryptodev_info dev_info;
935 	const enum rte_crypto_aead_algorithm aeads[] = {
936 		RTE_CRYPTO_AEAD_AES_CCM
937 	};
938 
939 	rte_cryptodev_info_get(dev_id, &dev_info);
940 
941 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
942 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
943 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
944 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
945 				"testsuite not met\n");
946 		return TEST_SKIPPED;
947 	}
948 
949 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
950 		RTE_LOG(INFO, USER1, "Capability requirements for AES CCM "
951 				"testsuite not met\n");
952 		return TEST_SKIPPED;
953 	}
954 
955 	return 0;
956 }
957 
958 static int
959 aes_gcm_auth_testsuite_setup(void)
960 {
961 	struct crypto_testsuite_params *ts_params = &testsuite_params;
962 	uint8_t dev_id = ts_params->valid_devs[0];
963 	struct rte_cryptodev_info dev_info;
964 	const enum rte_crypto_aead_algorithm aeads[] = {
965 		RTE_CRYPTO_AEAD_AES_GCM
966 	};
967 
968 	rte_cryptodev_info_get(dev_id, &dev_info);
969 
970 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
971 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
972 				"testsuite not met\n");
973 		return TEST_SKIPPED;
974 	}
975 
976 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
977 		RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
978 				"testsuite not met\n");
979 		return TEST_SKIPPED;
980 	}
981 
982 	return 0;
983 }
984 
985 static int
986 aes_gmac_auth_testsuite_setup(void)
987 {
988 	struct crypto_testsuite_params *ts_params = &testsuite_params;
989 	uint8_t dev_id = ts_params->valid_devs[0];
990 	struct rte_cryptodev_info dev_info;
991 	const enum rte_crypto_auth_algorithm auths[] = {
992 		RTE_CRYPTO_AUTH_AES_GMAC
993 	};
994 
995 	rte_cryptodev_info_get(dev_id, &dev_info);
996 
997 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
998 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
999 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1000 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
1001 				"testsuite not met\n");
1002 		return TEST_SKIPPED;
1003 	}
1004 
1005 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1006 		RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
1007 				"testsuite not met\n");
1008 		return TEST_SKIPPED;
1009 	}
1010 
1011 	return 0;
1012 }
1013 
1014 static int
1015 chacha20_poly1305_testsuite_setup(void)
1016 {
1017 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1018 	uint8_t dev_id = ts_params->valid_devs[0];
1019 	struct rte_cryptodev_info dev_info;
1020 	const enum rte_crypto_aead_algorithm aeads[] = {
1021 		RTE_CRYPTO_AEAD_CHACHA20_POLY1305
1022 	};
1023 
1024 	rte_cryptodev_info_get(dev_id, &dev_info);
1025 
1026 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1027 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1028 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1029 		RTE_LOG(INFO, USER1, "Feature flag requirements for "
1030 				"Chacha20-Poly1305 testsuite not met\n");
1031 		return TEST_SKIPPED;
1032 	}
1033 
1034 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1035 		RTE_LOG(INFO, USER1, "Capability requirements for "
1036 				"Chacha20-Poly1305 testsuite not met\n");
1037 		return TEST_SKIPPED;
1038 	}
1039 
1040 	return 0;
1041 }
1042 
1043 static int
1044 snow3g_testsuite_setup(void)
1045 {
1046 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1047 	uint8_t dev_id = ts_params->valid_devs[0];
1048 	struct rte_cryptodev_info dev_info;
1049 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1050 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1051 
1052 	};
1053 	const enum rte_crypto_auth_algorithm auths[] = {
1054 		RTE_CRYPTO_AUTH_SNOW3G_UIA2
1055 	};
1056 
1057 	rte_cryptodev_info_get(dev_id, &dev_info);
1058 
1059 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1060 		RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
1061 				"testsuite not met\n");
1062 		return TEST_SKIPPED;
1063 	}
1064 
1065 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1066 			&& check_auth_capabilities_supported(auths,
1067 			RTE_DIM(auths)) != 0) {
1068 		RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
1069 				"testsuite not met\n");
1070 		return TEST_SKIPPED;
1071 	}
1072 
1073 	return 0;
1074 }
1075 
1076 static int
1077 zuc_testsuite_setup(void)
1078 {
1079 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1080 	uint8_t dev_id = ts_params->valid_devs[0];
1081 	struct rte_cryptodev_info dev_info;
1082 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1083 		RTE_CRYPTO_CIPHER_ZUC_EEA3
1084 	};
1085 	const enum rte_crypto_auth_algorithm auths[] = {
1086 		RTE_CRYPTO_AUTH_ZUC_EIA3
1087 	};
1088 
1089 	rte_cryptodev_info_get(dev_id, &dev_info);
1090 
1091 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1092 		RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
1093 				"testsuite not met\n");
1094 		return TEST_SKIPPED;
1095 	}
1096 
1097 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1098 			&& check_auth_capabilities_supported(auths,
1099 			RTE_DIM(auths)) != 0) {
1100 		RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
1101 				"testsuite not met\n");
1102 		return TEST_SKIPPED;
1103 	}
1104 
1105 	return 0;
1106 }
1107 
1108 static int
1109 hmac_md5_auth_testsuite_setup(void)
1110 {
1111 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1112 	uint8_t dev_id = ts_params->valid_devs[0];
1113 	struct rte_cryptodev_info dev_info;
1114 	const enum rte_crypto_auth_algorithm auths[] = {
1115 		RTE_CRYPTO_AUTH_MD5_HMAC
1116 	};
1117 
1118 	rte_cryptodev_info_get(dev_id, &dev_info);
1119 
1120 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1121 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1122 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1123 		RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1124 				"Auth testsuite not met\n");
1125 		return TEST_SKIPPED;
1126 	}
1127 
1128 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1129 		RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1130 				"testsuite not met\n");
1131 		return TEST_SKIPPED;
1132 	}
1133 
1134 	return 0;
1135 }
1136 
1137 static int
1138 kasumi_testsuite_setup(void)
1139 {
1140 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1141 	uint8_t dev_id = ts_params->valid_devs[0];
1142 	struct rte_cryptodev_info dev_info;
1143 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1144 		RTE_CRYPTO_CIPHER_KASUMI_F8
1145 	};
1146 	const enum rte_crypto_auth_algorithm auths[] = {
1147 		RTE_CRYPTO_AUTH_KASUMI_F9
1148 	};
1149 
1150 	rte_cryptodev_info_get(dev_id, &dev_info);
1151 
1152 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1153 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1154 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1155 		RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1156 				"testsuite not met\n");
1157 		return TEST_SKIPPED;
1158 	}
1159 
1160 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1161 			&& check_auth_capabilities_supported(auths,
1162 			RTE_DIM(auths)) != 0) {
1163 		RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1164 				"testsuite not met\n");
1165 		return TEST_SKIPPED;
1166 	}
1167 
1168 	return 0;
1169 }
1170 
1171 static int
1172 negative_aes_gcm_testsuite_setup(void)
1173 {
1174 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1175 	uint8_t dev_id = ts_params->valid_devs[0];
1176 	struct rte_cryptodev_info dev_info;
1177 	const enum rte_crypto_aead_algorithm aeads[] = {
1178 		RTE_CRYPTO_AEAD_AES_GCM
1179 	};
1180 
1181 	rte_cryptodev_info_get(dev_id, &dev_info);
1182 
1183 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1184 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1185 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1186 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1187 				"AES GCM testsuite not met\n");
1188 		return TEST_SKIPPED;
1189 	}
1190 
1191 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1192 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1193 				"AES GCM testsuite not met\n");
1194 		return TEST_SKIPPED;
1195 	}
1196 
1197 	return 0;
1198 }
1199 
1200 static int
1201 negative_aes_gmac_testsuite_setup(void)
1202 {
1203 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1204 	uint8_t dev_id = ts_params->valid_devs[0];
1205 	struct rte_cryptodev_info dev_info;
1206 	const enum rte_crypto_auth_algorithm auths[] = {
1207 		RTE_CRYPTO_AUTH_AES_GMAC
1208 	};
1209 
1210 	rte_cryptodev_info_get(dev_id, &dev_info);
1211 
1212 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1213 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1214 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1215 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1216 				"AES GMAC testsuite not met\n");
1217 		return TEST_SKIPPED;
1218 	}
1219 
1220 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1221 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1222 				"AES GMAC testsuite not met\n");
1223 		return TEST_SKIPPED;
1224 	}
1225 
1226 	return 0;
1227 }
1228 
1229 static int
1230 mixed_cipher_hash_testsuite_setup(void)
1231 {
1232 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1233 	uint8_t dev_id = ts_params->valid_devs[0];
1234 	struct rte_cryptodev_info dev_info;
1235 	uint64_t feat_flags;
1236 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1237 		RTE_CRYPTO_CIPHER_NULL,
1238 		RTE_CRYPTO_CIPHER_AES_CTR,
1239 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
1240 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1241 	};
1242 	const enum rte_crypto_auth_algorithm auths[] = {
1243 		RTE_CRYPTO_AUTH_NULL,
1244 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1245 		RTE_CRYPTO_AUTH_AES_CMAC,
1246 		RTE_CRYPTO_AUTH_ZUC_EIA3
1247 	};
1248 
1249 	rte_cryptodev_info_get(dev_id, &dev_info);
1250 	feat_flags = dev_info.feature_flags;
1251 
1252 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1253 			(global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1254 		RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1255 				"Cipher Hash testsuite not met\n");
1256 		return TEST_SKIPPED;
1257 	}
1258 
1259 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1260 			&& check_auth_capabilities_supported(auths,
1261 			RTE_DIM(auths)) != 0) {
1262 		RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1263 				"Cipher Hash testsuite not met\n");
1264 		return TEST_SKIPPED;
1265 	}
1266 
1267 	return 0;
1268 }
1269 
1270 static int
1271 esn_testsuite_setup(void)
1272 {
1273 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1274 	uint8_t dev_id = ts_params->valid_devs[0];
1275 	struct rte_cryptodev_info dev_info;
1276 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1277 		RTE_CRYPTO_CIPHER_AES_CBC
1278 	};
1279 	const enum rte_crypto_auth_algorithm auths[] = {
1280 		RTE_CRYPTO_AUTH_SHA1_HMAC
1281 	};
1282 
1283 	rte_cryptodev_info_get(dev_id, &dev_info);
1284 
1285 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1286 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1287 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1288 		RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1289 				"testsuite not met\n");
1290 		return TEST_SKIPPED;
1291 	}
1292 
1293 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1294 			&& check_auth_capabilities_supported(auths,
1295 			RTE_DIM(auths)) != 0) {
1296 		RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1297 				"testsuite not met\n");
1298 		return TEST_SKIPPED;
1299 	}
1300 
1301 	return 0;
1302 }
1303 
1304 static int
1305 multi_session_testsuite_setup(void)
1306 {
1307 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1308 	uint8_t dev_id = ts_params->valid_devs[0];
1309 	struct rte_cryptodev_info dev_info;
1310 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1311 		RTE_CRYPTO_CIPHER_AES_CBC
1312 	};
1313 	const enum rte_crypto_auth_algorithm auths[] = {
1314 		RTE_CRYPTO_AUTH_SHA512_HMAC
1315 	};
1316 
1317 	rte_cryptodev_info_get(dev_id, &dev_info);
1318 
1319 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1320 		RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1321 				"Session testsuite not met\n");
1322 		return TEST_SKIPPED;
1323 	}
1324 
1325 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1326 			&& check_auth_capabilities_supported(auths,
1327 			RTE_DIM(auths)) != 0) {
1328 		RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1329 				"Session testsuite not met\n");
1330 		return TEST_SKIPPED;
1331 	}
1332 
1333 	return 0;
1334 }
1335 
1336 static int
1337 negative_hmac_sha1_testsuite_setup(void)
1338 {
1339 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1340 	uint8_t dev_id = ts_params->valid_devs[0];
1341 	struct rte_cryptodev_info dev_info;
1342 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1343 		RTE_CRYPTO_CIPHER_AES_CBC
1344 	};
1345 	const enum rte_crypto_auth_algorithm auths[] = {
1346 		RTE_CRYPTO_AUTH_SHA1_HMAC
1347 	};
1348 
1349 	rte_cryptodev_info_get(dev_id, &dev_info);
1350 
1351 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1352 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1353 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1354 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1355 				"HMAC SHA1 testsuite not met\n");
1356 		return TEST_SKIPPED;
1357 	}
1358 
1359 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1360 			&& check_auth_capabilities_supported(auths,
1361 			RTE_DIM(auths)) != 0) {
1362 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1363 				"HMAC SHA1 testsuite not met\n");
1364 		return TEST_SKIPPED;
1365 	}
1366 
1367 	return 0;
1368 }
1369 
1370 static int
1371 dev_configure_and_start(uint64_t ff_disable)
1372 {
1373 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1374 	struct crypto_unittest_params *ut_params = &unittest_params;
1375 
1376 	uint16_t qp_id;
1377 
1378 	/* Clear unit test parameters before running test */
1379 	memset(ut_params, 0, sizeof(*ut_params));
1380 
1381 	/* Reconfigure device to default parameters */
1382 	ts_params->conf.socket_id = SOCKET_ID_ANY;
1383 	ts_params->conf.ff_disable = ff_disable;
1384 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1385 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
1386 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
1387 
1388 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1389 			&ts_params->conf),
1390 			"Failed to configure cryptodev %u",
1391 			ts_params->valid_devs[0]);
1392 
1393 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1394 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1395 			ts_params->valid_devs[0], qp_id,
1396 			&ts_params->qp_conf,
1397 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1398 			"Failed to setup queue pair %u on cryptodev %u",
1399 			qp_id, ts_params->valid_devs[0]);
1400 	}
1401 
1402 
1403 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1404 
1405 	/* Start the device */
1406 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1407 			"Failed to start cryptodev %u",
1408 			ts_params->valid_devs[0]);
1409 
1410 	return TEST_SUCCESS;
1411 }
1412 
1413 int
1414 ut_setup(void)
1415 {
1416 	/* Configure and start the device with security feature disabled */
1417 	return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1418 }
1419 
1420 static int
1421 ut_setup_security(void)
1422 {
1423 	/* Configure and start the device with no features disabled */
1424 	return dev_configure_and_start(0);
1425 }
1426 
1427 void
1428 ut_teardown(void)
1429 {
1430 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1431 	struct crypto_unittest_params *ut_params = &unittest_params;
1432 
1433 	/* free crypto session structure */
1434 #ifdef RTE_LIB_SECURITY
1435 	if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1436 		if (ut_params->sec_session) {
1437 			rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1438 						(ts_params->valid_devs[0]),
1439 						ut_params->sec_session);
1440 			ut_params->sec_session = NULL;
1441 		}
1442 	} else
1443 #endif
1444 	{
1445 		if (ut_params->sess) {
1446 			rte_cryptodev_sym_session_clear(
1447 					ts_params->valid_devs[0],
1448 					ut_params->sess);
1449 			rte_cryptodev_sym_session_free(ut_params->sess);
1450 			ut_params->sess = NULL;
1451 		}
1452 	}
1453 
1454 	/* free crypto operation structure */
1455 	if (ut_params->op)
1456 		rte_crypto_op_free(ut_params->op);
1457 
1458 	/*
1459 	 * free mbuf - both obuf and ibuf are usually the same,
1460 	 * so check if they point at the same address is necessary,
1461 	 * to avoid freeing the mbuf twice.
1462 	 */
1463 	if (ut_params->obuf) {
1464 		rte_pktmbuf_free(ut_params->obuf);
1465 		if (ut_params->ibuf == ut_params->obuf)
1466 			ut_params->ibuf = 0;
1467 		ut_params->obuf = 0;
1468 	}
1469 	if (ut_params->ibuf) {
1470 		rte_pktmbuf_free(ut_params->ibuf);
1471 		ut_params->ibuf = 0;
1472 	}
1473 
1474 	if (ts_params->mbuf_pool != NULL)
1475 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1476 			rte_mempool_avail_count(ts_params->mbuf_pool));
1477 
1478 	/* Stop the device */
1479 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1480 }
1481 
1482 static int
1483 test_device_configure_invalid_dev_id(void)
1484 {
1485 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1486 	uint16_t dev_id, num_devs = 0;
1487 
1488 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1489 			"Need at least %d devices for test", 1);
1490 
1491 	/* valid dev_id values */
1492 	dev_id = ts_params->valid_devs[0];
1493 
1494 	/* Stop the device in case it's started so it can be configured */
1495 	rte_cryptodev_stop(dev_id);
1496 
1497 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1498 			"Failed test for rte_cryptodev_configure: "
1499 			"invalid dev_num %u", dev_id);
1500 
1501 	/* invalid dev_id values */
1502 	dev_id = num_devs;
1503 
1504 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1505 			"Failed test for rte_cryptodev_configure: "
1506 			"invalid dev_num %u", dev_id);
1507 
1508 	dev_id = 0xff;
1509 
1510 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1511 			"Failed test for rte_cryptodev_configure:"
1512 			"invalid dev_num %u", dev_id);
1513 
1514 	return TEST_SUCCESS;
1515 }
1516 
1517 static int
1518 test_device_configure_invalid_queue_pair_ids(void)
1519 {
1520 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1521 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1522 
1523 	/* Stop the device in case it's started so it can be configured */
1524 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1525 
1526 	/* valid - max value queue pairs */
1527 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1528 
1529 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1530 			&ts_params->conf),
1531 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1532 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1533 
1534 	/* valid - one queue pairs */
1535 	ts_params->conf.nb_queue_pairs = 1;
1536 
1537 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1538 			&ts_params->conf),
1539 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1540 			ts_params->valid_devs[0],
1541 			ts_params->conf.nb_queue_pairs);
1542 
1543 
1544 	/* invalid - zero queue pairs */
1545 	ts_params->conf.nb_queue_pairs = 0;
1546 
1547 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1548 			&ts_params->conf),
1549 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1550 			" invalid qps: %u",
1551 			ts_params->valid_devs[0],
1552 			ts_params->conf.nb_queue_pairs);
1553 
1554 
1555 	/* invalid - max value supported by field queue pairs */
1556 	ts_params->conf.nb_queue_pairs = UINT16_MAX;
1557 
1558 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1559 			&ts_params->conf),
1560 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1561 			" invalid qps: %u",
1562 			ts_params->valid_devs[0],
1563 			ts_params->conf.nb_queue_pairs);
1564 
1565 
1566 	/* invalid - max value + 1 queue pairs */
1567 	ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1568 
1569 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1570 			&ts_params->conf),
1571 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1572 			" invalid qps: %u",
1573 			ts_params->valid_devs[0],
1574 			ts_params->conf.nb_queue_pairs);
1575 
1576 	/* revert to original testsuite value */
1577 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1578 
1579 	return TEST_SUCCESS;
1580 }
1581 
1582 static int
1583 test_queue_pair_descriptor_setup(void)
1584 {
1585 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1586 	struct rte_cryptodev_qp_conf qp_conf = {
1587 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
1588 	};
1589 	uint16_t qp_id;
1590 
1591 	/* Stop the device in case it's started so it can be configured */
1592 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1593 
1594 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1595 			&ts_params->conf),
1596 			"Failed to configure cryptodev %u",
1597 			ts_params->valid_devs[0]);
1598 
1599 	/*
1600 	 * Test various ring sizes on this device. memzones can't be
1601 	 * freed so are re-used if ring is released and re-created.
1602 	 */
1603 	qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1604 	qp_conf.mp_session = ts_params->session_mpool;
1605 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
1606 
1607 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1608 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1609 				ts_params->valid_devs[0], qp_id, &qp_conf,
1610 				rte_cryptodev_socket_id(
1611 						ts_params->valid_devs[0])),
1612 				"Failed test for "
1613 				"rte_cryptodev_queue_pair_setup: num_inflights "
1614 				"%u on qp %u on cryptodev %u",
1615 				qp_conf.nb_descriptors, qp_id,
1616 				ts_params->valid_devs[0]);
1617 	}
1618 
1619 	qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1620 
1621 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1622 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1623 				ts_params->valid_devs[0], qp_id, &qp_conf,
1624 				rte_cryptodev_socket_id(
1625 						ts_params->valid_devs[0])),
1626 				"Failed test for"
1627 				" rte_cryptodev_queue_pair_setup: num_inflights"
1628 				" %u on qp %u on cryptodev %u",
1629 				qp_conf.nb_descriptors, qp_id,
1630 				ts_params->valid_devs[0]);
1631 	}
1632 
1633 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1634 
1635 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1636 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1637 				ts_params->valid_devs[0], qp_id, &qp_conf,
1638 				rte_cryptodev_socket_id(
1639 						ts_params->valid_devs[0])),
1640 				"Failed test for "
1641 				"rte_cryptodev_queue_pair_setup: num_inflights"
1642 				" %u on qp %u on cryptodev %u",
1643 				qp_conf.nb_descriptors, qp_id,
1644 				ts_params->valid_devs[0]);
1645 	}
1646 
1647 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1648 
1649 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1650 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1651 				ts_params->valid_devs[0], qp_id, &qp_conf,
1652 				rte_cryptodev_socket_id(
1653 						ts_params->valid_devs[0])),
1654 				"Failed test for"
1655 				" rte_cryptodev_queue_pair_setup:"
1656 				"num_inflights %u on qp %u on cryptodev %u",
1657 				qp_conf.nb_descriptors, qp_id,
1658 				ts_params->valid_devs[0]);
1659 	}
1660 
1661 	/* test invalid queue pair id */
1662 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;	/*valid */
1663 
1664 	qp_id = ts_params->conf.nb_queue_pairs;		/*invalid */
1665 
1666 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1667 			ts_params->valid_devs[0],
1668 			qp_id, &qp_conf,
1669 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1670 			"Failed test for rte_cryptodev_queue_pair_setup:"
1671 			"invalid qp %u on cryptodev %u",
1672 			qp_id, ts_params->valid_devs[0]);
1673 
1674 	qp_id = 0xffff; /*invalid*/
1675 
1676 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1677 			ts_params->valid_devs[0],
1678 			qp_id, &qp_conf,
1679 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1680 			"Failed test for rte_cryptodev_queue_pair_setup:"
1681 			"invalid qp %u on cryptodev %u",
1682 			qp_id, ts_params->valid_devs[0]);
1683 
1684 	return TEST_SUCCESS;
1685 }
1686 
1687 /* ***** Plaintext data for tests ***** */
1688 
1689 const char catch_22_quote_1[] =
1690 		"There was only one catch and that was Catch-22, which "
1691 		"specified that a concern for one's safety in the face of "
1692 		"dangers that were real and immediate was the process of a "
1693 		"rational mind. Orr was crazy and could be grounded. All he "
1694 		"had to do was ask; and as soon as he did, he would no longer "
1695 		"be crazy and would have to fly more missions. Orr would be "
1696 		"crazy to fly more missions and sane if he didn't, but if he "
1697 		"was sane he had to fly them. If he flew them he was crazy "
1698 		"and didn't have to; but if he didn't want to he was sane and "
1699 		"had to. Yossarian was moved very deeply by the absolute "
1700 		"simplicity of this clause of Catch-22 and let out a "
1701 		"respectful whistle. \"That's some catch, that Catch-22\", he "
1702 		"observed. \"It's the best there is,\" Doc Daneeka agreed.";
1703 
1704 const char catch_22_quote[] =
1705 		"What a lousy earth! He wondered how many people were "
1706 		"destitute that same night even in his own prosperous country, "
1707 		"how many homes were shanties, how many husbands were drunk "
1708 		"and wives socked, and how many children were bullied, abused, "
1709 		"or abandoned. How many families hungered for food they could "
1710 		"not afford to buy? How many hearts were broken? How many "
1711 		"suicides would take place that same night, how many people "
1712 		"would go insane? How many cockroaches and landlords would "
1713 		"triumph? How many winners were losers, successes failures, "
1714 		"and rich men poor men? How many wise guys were stupid? How "
1715 		"many happy endings were unhappy endings? How many honest men "
1716 		"were liars, brave men cowards, loyal men traitors, how many "
1717 		"sainted men were corrupt, how many people in positions of "
1718 		"trust had sold their souls to bodyguards, how many had never "
1719 		"had souls? How many straight-and-narrow paths were crooked "
1720 		"paths? How many best families were worst families and how "
1721 		"many good people were bad people? When you added them all up "
1722 		"and then subtracted, you might be left with only the children, "
1723 		"and perhaps with Albert Einstein and an old violinist or "
1724 		"sculptor somewhere.";
1725 
1726 #define QUOTE_480_BYTES		(480)
1727 #define QUOTE_512_BYTES		(512)
1728 #define QUOTE_768_BYTES		(768)
1729 #define QUOTE_1024_BYTES	(1024)
1730 
1731 
1732 
1733 /* ***** SHA1 Hash Tests ***** */
1734 
1735 #define HMAC_KEY_LENGTH_SHA1	(DIGEST_BYTE_LENGTH_SHA1)
1736 
1737 static uint8_t hmac_sha1_key[] = {
1738 	0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1739 	0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1740 	0xDE, 0xF4, 0xDE, 0xAD };
1741 
1742 /* ***** SHA224 Hash Tests ***** */
1743 
1744 #define HMAC_KEY_LENGTH_SHA224	(DIGEST_BYTE_LENGTH_SHA224)
1745 
1746 
1747 /* ***** AES-CBC Cipher Tests ***** */
1748 
1749 #define CIPHER_KEY_LENGTH_AES_CBC	(16)
1750 #define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
1751 
1752 static uint8_t aes_cbc_key[] = {
1753 	0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1754 	0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1755 
1756 static uint8_t aes_cbc_iv[] = {
1757 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1758 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1759 
1760 
1761 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1762 
1763 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1764 	0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1765 	0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1766 	0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1767 	0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1768 	0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1769 	0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1770 	0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1771 	0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1772 	0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1773 	0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1774 	0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1775 	0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1776 	0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1777 	0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1778 	0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1779 	0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1780 	0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1781 	0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1782 	0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1783 	0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1784 	0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1785 	0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1786 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1787 	0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1788 	0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1789 	0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1790 	0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1791 	0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1792 	0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1793 	0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1794 	0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1795 	0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1796 	0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1797 	0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1798 	0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1799 	0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1800 	0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1801 	0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1802 	0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1803 	0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1804 	0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1805 	0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1806 	0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1807 	0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1808 	0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1809 	0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1810 	0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1811 	0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1812 	0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1813 	0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1814 	0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1815 	0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1816 	0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1817 	0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1818 	0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1819 	0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1820 	0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1821 	0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1822 	0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1823 	0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1824 	0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1825 	0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1826 	0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1827 	0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1828 };
1829 
1830 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1831 	0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1832 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1833 	0x18, 0x8c, 0x1d, 0x32
1834 };
1835 
1836 
1837 /* Multisession Vector context Test */
1838 /*Begin Session 0 */
1839 static uint8_t ms_aes_cbc_key0[] = {
1840 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1841 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1842 };
1843 
1844 static uint8_t ms_aes_cbc_iv0[] = {
1845 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1846 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1847 };
1848 
1849 static const uint8_t ms_aes_cbc_cipher0[] = {
1850 		0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1851 		0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1852 		0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1853 		0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1854 		0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1855 		0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1856 		0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1857 		0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1858 		0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1859 		0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1860 		0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1861 		0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1862 		0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1863 		0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1864 		0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1865 		0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1866 		0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1867 		0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1868 		0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1869 		0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1870 		0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1871 		0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1872 		0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1873 		0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1874 		0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1875 		0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1876 		0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1877 		0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1878 		0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1879 		0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1880 		0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1881 		0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1882 		0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1883 		0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1884 		0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1885 		0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1886 		0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1887 		0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1888 		0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1889 		0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1890 		0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1891 		0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1892 		0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1893 		0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1894 		0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1895 		0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1896 		0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1897 		0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1898 		0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1899 		0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1900 		0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1901 		0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1902 		0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1903 		0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1904 		0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1905 		0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1906 		0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1907 		0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1908 		0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1909 		0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1910 		0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1911 		0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1912 		0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1913 		0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1914 };
1915 
1916 
1917 static  uint8_t ms_hmac_key0[] = {
1918 		0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1919 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1920 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1921 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1922 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1923 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1924 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1925 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1926 };
1927 
1928 static const uint8_t ms_hmac_digest0[] = {
1929 		0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1930 		0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1931 		0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1932 		0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1933 		0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1934 		0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1935 		0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1936 		0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1937 		};
1938 
1939 /* End Session 0 */
1940 /* Begin session 1 */
1941 
1942 static  uint8_t ms_aes_cbc_key1[] = {
1943 		0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1944 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1945 };
1946 
1947 static  uint8_t ms_aes_cbc_iv1[] = {
1948 	0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1949 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1950 };
1951 
1952 static const uint8_t ms_aes_cbc_cipher1[] = {
1953 		0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1954 		0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1955 		0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1956 		0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1957 		0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1958 		0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1959 		0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1960 		0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1961 		0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1962 		0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1963 		0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1964 		0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1965 		0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1966 		0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1967 		0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1968 		0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1969 		0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1970 		0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1971 		0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1972 		0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1973 		0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1974 		0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1975 		0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1976 		0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1977 		0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1978 		0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1979 		0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1980 		0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1981 		0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1982 		0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1983 		0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1984 		0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1985 		0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1986 		0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1987 		0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1988 		0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1989 		0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1990 		0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1991 		0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1992 		0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1993 		0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1994 		0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1995 		0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1996 		0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1997 		0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1998 		0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1999 		0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
2000 		0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
2001 		0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
2002 		0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
2003 		0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
2004 		0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
2005 		0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
2006 		0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
2007 		0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
2008 		0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
2009 		0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
2010 		0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
2011 		0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
2012 		0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
2013 		0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
2014 		0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
2015 		0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
2016 		0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
2017 
2018 };
2019 
2020 static uint8_t ms_hmac_key1[] = {
2021 		0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2022 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2023 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2024 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2025 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2026 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2027 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2028 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2029 };
2030 
2031 static const uint8_t ms_hmac_digest1[] = {
2032 		0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
2033 		0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
2034 		0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
2035 		0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
2036 		0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
2037 		0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
2038 		0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
2039 		0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
2040 };
2041 /* End Session 1  */
2042 /* Begin Session 2 */
2043 static  uint8_t ms_aes_cbc_key2[] = {
2044 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2045 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2046 };
2047 
2048 static  uint8_t ms_aes_cbc_iv2[] = {
2049 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2050 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2051 };
2052 
2053 static const uint8_t ms_aes_cbc_cipher2[] = {
2054 		0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
2055 		0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
2056 		0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
2057 		0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
2058 		0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
2059 		0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
2060 		0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
2061 		0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
2062 		0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
2063 		0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
2064 		0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
2065 		0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
2066 		0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
2067 		0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
2068 		0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
2069 		0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
2070 		0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
2071 		0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
2072 		0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
2073 		0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
2074 		0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
2075 		0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
2076 		0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
2077 		0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
2078 		0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
2079 		0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
2080 		0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
2081 		0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
2082 		0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
2083 		0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
2084 		0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
2085 		0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
2086 		0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
2087 		0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
2088 		0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
2089 		0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
2090 		0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
2091 		0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
2092 		0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
2093 		0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
2094 		0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
2095 		0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
2096 		0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
2097 		0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
2098 		0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
2099 		0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
2100 		0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2101 		0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2102 		0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2103 		0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2104 		0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2105 		0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2106 		0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2107 		0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2108 		0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2109 		0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2110 		0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2111 		0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2112 		0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2113 		0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2114 		0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2115 		0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2116 		0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2117 		0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2118 };
2119 
2120 static  uint8_t ms_hmac_key2[] = {
2121 		0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2122 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2123 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2124 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2125 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2126 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2127 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2128 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2129 };
2130 
2131 static const uint8_t ms_hmac_digest2[] = {
2132 		0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2133 		0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2134 		0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2135 		0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2136 		0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2137 		0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2138 		0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2139 		0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2140 };
2141 
2142 /* End Session 2 */
2143 
2144 
2145 static int
2146 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2147 {
2148 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2149 	struct crypto_unittest_params *ut_params = &unittest_params;
2150 	int status;
2151 
2152 	/* Verify the capabilities */
2153 	struct rte_cryptodev_sym_capability_idx cap_idx;
2154 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2155 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2156 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2157 			&cap_idx) == NULL)
2158 		return TEST_SKIPPED;
2159 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2160 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2161 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2162 			&cap_idx) == NULL)
2163 		return TEST_SKIPPED;
2164 
2165 	/* Generate test mbuf data and space for digest */
2166 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2167 			catch_22_quote,	QUOTE_512_BYTES, 0);
2168 
2169 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2170 			DIGEST_BYTE_LENGTH_SHA1);
2171 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2172 
2173 	/* Setup Cipher Parameters */
2174 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2175 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2176 
2177 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2178 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2179 	ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2180 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2181 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2182 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2183 
2184 	/* Setup HMAC Parameters */
2185 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2186 
2187 	ut_params->auth_xform.next = NULL;
2188 
2189 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2190 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2191 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2192 	ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2193 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2194 
2195 	ut_params->sess = rte_cryptodev_sym_session_create(
2196 			ts_params->session_mpool);
2197 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2198 
2199 	/* Create crypto session*/
2200 	status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
2201 			ut_params->sess, &ut_params->cipher_xform,
2202 			ts_params->session_priv_mpool);
2203 
2204 	if (status == -ENOTSUP)
2205 		return TEST_SKIPPED;
2206 
2207 	TEST_ASSERT_EQUAL(status, 0, "Session init failed");
2208 
2209 	/* Generate crypto op data structure */
2210 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2211 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2212 	TEST_ASSERT_NOT_NULL(ut_params->op,
2213 			"Failed to allocate symmetric crypto operation struct");
2214 
2215 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2216 
2217 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2218 
2219 	/* set crypto operation source mbuf */
2220 	sym_op->m_src = ut_params->ibuf;
2221 
2222 	/* Set crypto operation authentication parameters */
2223 	sym_op->auth.digest.data = ut_params->digest;
2224 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2225 			ut_params->ibuf, QUOTE_512_BYTES);
2226 
2227 	sym_op->auth.data.offset = 0;
2228 	sym_op->auth.data.length = QUOTE_512_BYTES;
2229 
2230 	/* Copy IV at the end of the crypto operation */
2231 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2232 			aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2233 
2234 	/* Set crypto operation cipher parameters */
2235 	sym_op->cipher.data.offset = 0;
2236 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2237 
2238 	/* Process crypto operation */
2239 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2240 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2241 			ut_params->op);
2242 	else
2243 		TEST_ASSERT_NOT_NULL(
2244 			process_crypto_request(ts_params->valid_devs[0],
2245 				ut_params->op),
2246 				"failed to process sym crypto op");
2247 
2248 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2249 			"crypto op processing failed");
2250 
2251 	/* Validate obuf */
2252 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2253 			uint8_t *);
2254 
2255 	TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2256 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2257 			QUOTE_512_BYTES,
2258 			"ciphertext data not as expected");
2259 
2260 	uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2261 
2262 	TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2263 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2264 			gbl_driver_id == rte_cryptodev_driver_id_get(
2265 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2266 					TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2267 					DIGEST_BYTE_LENGTH_SHA1,
2268 			"Generated digest data not as expected");
2269 
2270 	return TEST_SUCCESS;
2271 }
2272 
2273 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2274 
2275 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
2276 
2277 static uint8_t hmac_sha512_key[] = {
2278 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2279 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2280 	0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2281 	0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2282 	0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2283 	0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2284 	0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2285 	0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2286 
2287 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2288 	0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2289 	0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2290 	0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2291 	0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2292 	0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2293 	0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2294 	0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2295 	0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2296 
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 static int
2306 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2307 		struct crypto_unittest_params *ut_params,
2308 		struct crypto_testsuite_params *ts_params,
2309 		const uint8_t *cipher,
2310 		const uint8_t *digest,
2311 		const uint8_t *iv);
2312 
2313 
2314 static int
2315 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2316 		struct crypto_unittest_params *ut_params,
2317 		uint8_t *cipher_key,
2318 		uint8_t *hmac_key)
2319 {
2320 
2321 	/* Setup Cipher Parameters */
2322 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2323 	ut_params->cipher_xform.next = NULL;
2324 
2325 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2326 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2327 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2328 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2329 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2330 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2331 
2332 	/* Setup HMAC Parameters */
2333 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2334 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2335 
2336 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2337 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2338 	ut_params->auth_xform.auth.key.data = hmac_key;
2339 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2340 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2341 
2342 	return TEST_SUCCESS;
2343 }
2344 
2345 
2346 static int
2347 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2348 		struct crypto_unittest_params *ut_params,
2349 		struct crypto_testsuite_params *ts_params,
2350 		const uint8_t *cipher,
2351 		const uint8_t *digest,
2352 		const uint8_t *iv)
2353 {
2354 	/* Generate test mbuf data and digest */
2355 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2356 			(const char *)
2357 			cipher,
2358 			QUOTE_512_BYTES, 0);
2359 
2360 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2361 			DIGEST_BYTE_LENGTH_SHA512);
2362 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2363 
2364 	rte_memcpy(ut_params->digest,
2365 			digest,
2366 			DIGEST_BYTE_LENGTH_SHA512);
2367 
2368 	/* Generate Crypto op data structure */
2369 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2370 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2371 	TEST_ASSERT_NOT_NULL(ut_params->op,
2372 			"Failed to allocate symmetric crypto operation struct");
2373 
2374 	rte_crypto_op_attach_sym_session(ut_params->op, sess);
2375 
2376 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2377 
2378 	/* set crypto operation source mbuf */
2379 	sym_op->m_src = ut_params->ibuf;
2380 
2381 	sym_op->auth.digest.data = ut_params->digest;
2382 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2383 			ut_params->ibuf, QUOTE_512_BYTES);
2384 
2385 	sym_op->auth.data.offset = 0;
2386 	sym_op->auth.data.length = QUOTE_512_BYTES;
2387 
2388 	/* Copy IV at the end of the crypto operation */
2389 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2390 			iv, CIPHER_IV_LENGTH_AES_CBC);
2391 
2392 	sym_op->cipher.data.offset = 0;
2393 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2394 
2395 	/* Process crypto operation */
2396 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2397 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2398 			ut_params->op);
2399 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2400 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2401 				ut_params->op, 1, 1, 0, 0);
2402 	else
2403 		TEST_ASSERT_NOT_NULL(
2404 				process_crypto_request(ts_params->valid_devs[0],
2405 					ut_params->op),
2406 					"failed to process sym crypto op");
2407 
2408 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2409 			"crypto op processing failed");
2410 
2411 	ut_params->obuf = ut_params->op->sym->m_src;
2412 
2413 	/* Validate obuf */
2414 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2415 			rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2416 			catch_22_quote,
2417 			QUOTE_512_BYTES,
2418 			"Plaintext data not as expected");
2419 
2420 	/* Validate obuf */
2421 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2422 			"Digest verification failed");
2423 
2424 	return TEST_SUCCESS;
2425 }
2426 
2427 /* ***** SNOW 3G Tests ***** */
2428 static int
2429 create_wireless_algo_hash_session(uint8_t dev_id,
2430 	const uint8_t *key, const uint8_t key_len,
2431 	const uint8_t iv_len, const uint8_t auth_len,
2432 	enum rte_crypto_auth_operation op,
2433 	enum rte_crypto_auth_algorithm algo)
2434 {
2435 	uint8_t hash_key[key_len];
2436 	int status;
2437 
2438 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2439 	struct crypto_unittest_params *ut_params = &unittest_params;
2440 
2441 	memcpy(hash_key, key, key_len);
2442 
2443 	debug_hexdump(stdout, "key:", key, key_len);
2444 
2445 	/* Setup Authentication Parameters */
2446 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2447 	ut_params->auth_xform.next = NULL;
2448 
2449 	ut_params->auth_xform.auth.op = op;
2450 	ut_params->auth_xform.auth.algo = algo;
2451 	ut_params->auth_xform.auth.key.length = key_len;
2452 	ut_params->auth_xform.auth.key.data = hash_key;
2453 	ut_params->auth_xform.auth.digest_length = auth_len;
2454 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2455 	ut_params->auth_xform.auth.iv.length = iv_len;
2456 	ut_params->sess = rte_cryptodev_sym_session_create(
2457 			ts_params->session_mpool);
2458 
2459 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2460 			&ut_params->auth_xform,
2461 			ts_params->session_priv_mpool);
2462 	if (status == -ENOTSUP)
2463 		return TEST_SKIPPED;
2464 
2465 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2466 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2467 	return 0;
2468 }
2469 
2470 static int
2471 create_wireless_algo_cipher_session(uint8_t dev_id,
2472 			enum rte_crypto_cipher_operation op,
2473 			enum rte_crypto_cipher_algorithm algo,
2474 			const uint8_t *key, const uint8_t key_len,
2475 			uint8_t iv_len)
2476 {
2477 	uint8_t cipher_key[key_len];
2478 	int status;
2479 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2480 	struct crypto_unittest_params *ut_params = &unittest_params;
2481 
2482 	memcpy(cipher_key, key, key_len);
2483 
2484 	/* Setup Cipher Parameters */
2485 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2486 	ut_params->cipher_xform.next = NULL;
2487 
2488 	ut_params->cipher_xform.cipher.algo = algo;
2489 	ut_params->cipher_xform.cipher.op = op;
2490 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2491 	ut_params->cipher_xform.cipher.key.length = key_len;
2492 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2493 	ut_params->cipher_xform.cipher.iv.length = iv_len;
2494 
2495 	debug_hexdump(stdout, "key:", key, key_len);
2496 
2497 	/* Create Crypto session */
2498 	ut_params->sess = rte_cryptodev_sym_session_create(
2499 			ts_params->session_mpool);
2500 
2501 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2502 			&ut_params->cipher_xform,
2503 			ts_params->session_priv_mpool);
2504 	if (status == -ENOTSUP)
2505 		return TEST_SKIPPED;
2506 
2507 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2508 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2509 	return 0;
2510 }
2511 
2512 static int
2513 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2514 			unsigned int cipher_len,
2515 			unsigned int cipher_offset)
2516 {
2517 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2518 	struct crypto_unittest_params *ut_params = &unittest_params;
2519 
2520 	/* Generate Crypto op data structure */
2521 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2522 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2523 	TEST_ASSERT_NOT_NULL(ut_params->op,
2524 				"Failed to allocate pktmbuf offload");
2525 
2526 	/* Set crypto operation data parameters */
2527 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2528 
2529 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2530 
2531 	/* set crypto operation source mbuf */
2532 	sym_op->m_src = ut_params->ibuf;
2533 
2534 	/* iv */
2535 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2536 			iv, iv_len);
2537 	sym_op->cipher.data.length = cipher_len;
2538 	sym_op->cipher.data.offset = cipher_offset;
2539 	return 0;
2540 }
2541 
2542 static int
2543 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2544 			unsigned int cipher_len,
2545 			unsigned int cipher_offset)
2546 {
2547 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2548 	struct crypto_unittest_params *ut_params = &unittest_params;
2549 
2550 	/* Generate Crypto op data structure */
2551 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2552 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2553 	TEST_ASSERT_NOT_NULL(ut_params->op,
2554 				"Failed to allocate pktmbuf offload");
2555 
2556 	/* Set crypto operation data parameters */
2557 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2558 
2559 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2560 
2561 	/* set crypto operation source mbuf */
2562 	sym_op->m_src = ut_params->ibuf;
2563 	sym_op->m_dst = ut_params->obuf;
2564 
2565 	/* iv */
2566 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2567 			iv, iv_len);
2568 	sym_op->cipher.data.length = cipher_len;
2569 	sym_op->cipher.data.offset = cipher_offset;
2570 	return 0;
2571 }
2572 
2573 static int
2574 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2575 		enum rte_crypto_cipher_operation cipher_op,
2576 		enum rte_crypto_auth_operation auth_op,
2577 		enum rte_crypto_auth_algorithm auth_algo,
2578 		enum rte_crypto_cipher_algorithm cipher_algo,
2579 		const uint8_t *key, uint8_t key_len,
2580 		uint8_t auth_iv_len, uint8_t auth_len,
2581 		uint8_t cipher_iv_len)
2582 
2583 {
2584 	uint8_t cipher_auth_key[key_len];
2585 	int status;
2586 
2587 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2588 	struct crypto_unittest_params *ut_params = &unittest_params;
2589 
2590 	memcpy(cipher_auth_key, key, key_len);
2591 
2592 	/* Setup Authentication Parameters */
2593 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2594 	ut_params->auth_xform.next = NULL;
2595 
2596 	ut_params->auth_xform.auth.op = auth_op;
2597 	ut_params->auth_xform.auth.algo = auth_algo;
2598 	ut_params->auth_xform.auth.key.length = key_len;
2599 	/* Hash key = cipher key */
2600 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2601 	ut_params->auth_xform.auth.digest_length = auth_len;
2602 	/* Auth IV will be after cipher IV */
2603 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2604 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2605 
2606 	/* Setup Cipher Parameters */
2607 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2608 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2609 
2610 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2611 	ut_params->cipher_xform.cipher.op = cipher_op;
2612 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2613 	ut_params->cipher_xform.cipher.key.length = key_len;
2614 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2615 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2616 
2617 	debug_hexdump(stdout, "key:", key, key_len);
2618 
2619 	/* Create Crypto session*/
2620 	ut_params->sess = rte_cryptodev_sym_session_create(
2621 			ts_params->session_mpool);
2622 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2623 
2624 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2625 			&ut_params->cipher_xform,
2626 			ts_params->session_priv_mpool);
2627 	if (status == -ENOTSUP)
2628 		return TEST_SKIPPED;
2629 
2630 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2631 	return 0;
2632 }
2633 
2634 static int
2635 create_wireless_cipher_auth_session(uint8_t dev_id,
2636 		enum rte_crypto_cipher_operation cipher_op,
2637 		enum rte_crypto_auth_operation auth_op,
2638 		enum rte_crypto_auth_algorithm auth_algo,
2639 		enum rte_crypto_cipher_algorithm cipher_algo,
2640 		const struct wireless_test_data *tdata)
2641 {
2642 	const uint8_t key_len = tdata->key.len;
2643 	uint8_t cipher_auth_key[key_len];
2644 	int status;
2645 
2646 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2647 	struct crypto_unittest_params *ut_params = &unittest_params;
2648 	const uint8_t *key = tdata->key.data;
2649 	const uint8_t auth_len = tdata->digest.len;
2650 	uint8_t cipher_iv_len = tdata->cipher_iv.len;
2651 	uint8_t auth_iv_len = tdata->auth_iv.len;
2652 
2653 	memcpy(cipher_auth_key, key, key_len);
2654 
2655 	/* Setup Authentication Parameters */
2656 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2657 	ut_params->auth_xform.next = NULL;
2658 
2659 	ut_params->auth_xform.auth.op = auth_op;
2660 	ut_params->auth_xform.auth.algo = auth_algo;
2661 	ut_params->auth_xform.auth.key.length = key_len;
2662 	/* Hash key = cipher key */
2663 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2664 	ut_params->auth_xform.auth.digest_length = auth_len;
2665 	/* Auth IV will be after cipher IV */
2666 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2667 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2668 
2669 	/* Setup Cipher Parameters */
2670 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2671 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2672 
2673 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2674 	ut_params->cipher_xform.cipher.op = cipher_op;
2675 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2676 	ut_params->cipher_xform.cipher.key.length = key_len;
2677 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2678 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2679 
2680 
2681 	debug_hexdump(stdout, "key:", key, key_len);
2682 
2683 	/* Create Crypto session*/
2684 	ut_params->sess = rte_cryptodev_sym_session_create(
2685 			ts_params->session_mpool);
2686 
2687 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2688 			&ut_params->cipher_xform,
2689 			ts_params->session_priv_mpool);
2690 	if (status == -ENOTSUP)
2691 		return TEST_SKIPPED;
2692 
2693 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2694 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2695 	return 0;
2696 }
2697 
2698 static int
2699 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2700 		const struct wireless_test_data *tdata)
2701 {
2702 	return create_wireless_cipher_auth_session(dev_id,
2703 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2704 		RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2705 		RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2706 }
2707 
2708 static int
2709 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2710 		enum rte_crypto_cipher_operation cipher_op,
2711 		enum rte_crypto_auth_operation auth_op,
2712 		enum rte_crypto_auth_algorithm auth_algo,
2713 		enum rte_crypto_cipher_algorithm cipher_algo,
2714 		const uint8_t *key, const uint8_t key_len,
2715 		uint8_t auth_iv_len, uint8_t auth_len,
2716 		uint8_t cipher_iv_len)
2717 {
2718 	uint8_t auth_cipher_key[key_len];
2719 	int status;
2720 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2721 	struct crypto_unittest_params *ut_params = &unittest_params;
2722 
2723 	memcpy(auth_cipher_key, key, key_len);
2724 
2725 	/* Setup Authentication Parameters */
2726 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2727 	ut_params->auth_xform.auth.op = auth_op;
2728 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2729 	ut_params->auth_xform.auth.algo = auth_algo;
2730 	ut_params->auth_xform.auth.key.length = key_len;
2731 	ut_params->auth_xform.auth.key.data = auth_cipher_key;
2732 	ut_params->auth_xform.auth.digest_length = auth_len;
2733 	/* Auth IV will be after cipher IV */
2734 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2735 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2736 
2737 	/* Setup Cipher Parameters */
2738 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2739 	ut_params->cipher_xform.next = NULL;
2740 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2741 	ut_params->cipher_xform.cipher.op = cipher_op;
2742 	ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2743 	ut_params->cipher_xform.cipher.key.length = key_len;
2744 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2745 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2746 
2747 	debug_hexdump(stdout, "key:", key, key_len);
2748 
2749 	/* Create Crypto session*/
2750 	ut_params->sess = rte_cryptodev_sym_session_create(
2751 			ts_params->session_mpool);
2752 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2753 
2754 	if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2755 		ut_params->auth_xform.next = NULL;
2756 		ut_params->cipher_xform.next = &ut_params->auth_xform;
2757 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2758 				&ut_params->cipher_xform,
2759 				ts_params->session_priv_mpool);
2760 
2761 	} else
2762 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2763 				&ut_params->auth_xform,
2764 				ts_params->session_priv_mpool);
2765 
2766 	if (status == -ENOTSUP)
2767 		return TEST_SKIPPED;
2768 
2769 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2770 
2771 	return 0;
2772 }
2773 
2774 static int
2775 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2776 		unsigned int auth_tag_len,
2777 		const uint8_t *iv, unsigned int iv_len,
2778 		unsigned int data_pad_len,
2779 		enum rte_crypto_auth_operation op,
2780 		unsigned int auth_len, unsigned int auth_offset)
2781 {
2782 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2783 
2784 	struct crypto_unittest_params *ut_params = &unittest_params;
2785 
2786 	/* Generate Crypto op data structure */
2787 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2788 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2789 	TEST_ASSERT_NOT_NULL(ut_params->op,
2790 		"Failed to allocate pktmbuf offload");
2791 
2792 	/* Set crypto operation data parameters */
2793 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2794 
2795 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2796 
2797 	/* set crypto operation source mbuf */
2798 	sym_op->m_src = ut_params->ibuf;
2799 
2800 	/* iv */
2801 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2802 			iv, iv_len);
2803 	/* digest */
2804 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2805 					ut_params->ibuf, auth_tag_len);
2806 
2807 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2808 				"no room to append auth tag");
2809 	ut_params->digest = sym_op->auth.digest.data;
2810 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2811 			ut_params->ibuf, data_pad_len);
2812 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2813 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2814 	else
2815 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2816 
2817 	debug_hexdump(stdout, "digest:",
2818 		sym_op->auth.digest.data,
2819 		auth_tag_len);
2820 
2821 	sym_op->auth.data.length = auth_len;
2822 	sym_op->auth.data.offset = auth_offset;
2823 
2824 	return 0;
2825 }
2826 
2827 static int
2828 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2829 	enum rte_crypto_auth_operation op)
2830 {
2831 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2832 	struct crypto_unittest_params *ut_params = &unittest_params;
2833 
2834 	const uint8_t *auth_tag = tdata->digest.data;
2835 	const unsigned int auth_tag_len = tdata->digest.len;
2836 	unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2837 	unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2838 
2839 	const uint8_t *cipher_iv = tdata->cipher_iv.data;
2840 	const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2841 	const uint8_t *auth_iv = tdata->auth_iv.data;
2842 	const uint8_t auth_iv_len = tdata->auth_iv.len;
2843 	const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2844 	const unsigned int auth_len = tdata->validAuthLenInBits.len;
2845 
2846 	/* Generate Crypto op data structure */
2847 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2848 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2849 	TEST_ASSERT_NOT_NULL(ut_params->op,
2850 			"Failed to allocate pktmbuf offload");
2851 	/* Set crypto operation data parameters */
2852 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2853 
2854 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2855 
2856 	/* set crypto operation source mbuf */
2857 	sym_op->m_src = ut_params->ibuf;
2858 
2859 	/* digest */
2860 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2861 			ut_params->ibuf, auth_tag_len);
2862 
2863 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2864 			"no room to append auth tag");
2865 	ut_params->digest = sym_op->auth.digest.data;
2866 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2867 			ut_params->ibuf, data_pad_len);
2868 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2869 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2870 	else
2871 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2872 
2873 	debug_hexdump(stdout, "digest:",
2874 		sym_op->auth.digest.data,
2875 		auth_tag_len);
2876 
2877 	/* Copy cipher and auth IVs at the end of the crypto operation */
2878 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2879 						IV_OFFSET);
2880 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2881 	iv_ptr += cipher_iv_len;
2882 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2883 
2884 	sym_op->cipher.data.length = cipher_len;
2885 	sym_op->cipher.data.offset = 0;
2886 	sym_op->auth.data.length = auth_len;
2887 	sym_op->auth.data.offset = 0;
2888 
2889 	return 0;
2890 }
2891 
2892 static int
2893 create_zuc_cipher_hash_generate_operation(
2894 		const struct wireless_test_data *tdata)
2895 {
2896 	return create_wireless_cipher_hash_operation(tdata,
2897 		RTE_CRYPTO_AUTH_OP_GENERATE);
2898 }
2899 
2900 static int
2901 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2902 		const unsigned auth_tag_len,
2903 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2904 		unsigned data_pad_len,
2905 		enum rte_crypto_auth_operation op,
2906 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2907 		const unsigned cipher_len, const unsigned cipher_offset,
2908 		const unsigned auth_len, const unsigned auth_offset)
2909 {
2910 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2911 	struct crypto_unittest_params *ut_params = &unittest_params;
2912 
2913 	enum rte_crypto_cipher_algorithm cipher_algo =
2914 			ut_params->cipher_xform.cipher.algo;
2915 	enum rte_crypto_auth_algorithm auth_algo =
2916 			ut_params->auth_xform.auth.algo;
2917 
2918 	/* Generate Crypto op data structure */
2919 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2920 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2921 	TEST_ASSERT_NOT_NULL(ut_params->op,
2922 			"Failed to allocate pktmbuf offload");
2923 	/* Set crypto operation data parameters */
2924 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2925 
2926 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2927 
2928 	/* set crypto operation source mbuf */
2929 	sym_op->m_src = ut_params->ibuf;
2930 
2931 	/* digest */
2932 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2933 			ut_params->ibuf, auth_tag_len);
2934 
2935 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2936 			"no room to append auth tag");
2937 	ut_params->digest = sym_op->auth.digest.data;
2938 
2939 	if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2940 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2941 				ut_params->ibuf, data_pad_len);
2942 	} else {
2943 		struct rte_mbuf *m = ut_params->ibuf;
2944 		unsigned int offset = data_pad_len;
2945 
2946 		while (offset > m->data_len && m->next != NULL) {
2947 			offset -= m->data_len;
2948 			m = m->next;
2949 		}
2950 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2951 			m, offset);
2952 	}
2953 
2954 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2955 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2956 	else
2957 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2958 
2959 	debug_hexdump(stdout, "digest:",
2960 		sym_op->auth.digest.data,
2961 		auth_tag_len);
2962 
2963 	/* Copy cipher and auth IVs at the end of the crypto operation */
2964 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2965 						IV_OFFSET);
2966 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2967 	iv_ptr += cipher_iv_len;
2968 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2969 
2970 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2971 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2972 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2973 		sym_op->cipher.data.length = cipher_len;
2974 		sym_op->cipher.data.offset = cipher_offset;
2975 	} else {
2976 		sym_op->cipher.data.length = cipher_len >> 3;
2977 		sym_op->cipher.data.offset = cipher_offset >> 3;
2978 	}
2979 
2980 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2981 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2982 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2983 		sym_op->auth.data.length = auth_len;
2984 		sym_op->auth.data.offset = auth_offset;
2985 	} else {
2986 		sym_op->auth.data.length = auth_len >> 3;
2987 		sym_op->auth.data.offset = auth_offset >> 3;
2988 	}
2989 
2990 	return 0;
2991 }
2992 
2993 static int
2994 create_wireless_algo_auth_cipher_operation(
2995 		const uint8_t *auth_tag, unsigned int auth_tag_len,
2996 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2997 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2998 		unsigned int data_pad_len,
2999 		unsigned int cipher_len, unsigned int cipher_offset,
3000 		unsigned int auth_len, unsigned int auth_offset,
3001 		uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
3002 {
3003 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3004 	struct crypto_unittest_params *ut_params = &unittest_params;
3005 
3006 	enum rte_crypto_cipher_algorithm cipher_algo =
3007 			ut_params->cipher_xform.cipher.algo;
3008 	enum rte_crypto_auth_algorithm auth_algo =
3009 			ut_params->auth_xform.auth.algo;
3010 
3011 	/* Generate Crypto op data structure */
3012 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
3013 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
3014 	TEST_ASSERT_NOT_NULL(ut_params->op,
3015 			"Failed to allocate pktmbuf offload");
3016 
3017 	/* Set crypto operation data parameters */
3018 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
3019 
3020 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
3021 
3022 	/* set crypto operation mbufs */
3023 	sym_op->m_src = ut_params->ibuf;
3024 	if (op_mode == OUT_OF_PLACE)
3025 		sym_op->m_dst = ut_params->obuf;
3026 
3027 	/* digest */
3028 	if (!do_sgl) {
3029 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
3030 			(op_mode == IN_PLACE ?
3031 				ut_params->ibuf : ut_params->obuf),
3032 			uint8_t *, data_pad_len);
3033 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
3034 			(op_mode == IN_PLACE ?
3035 				ut_params->ibuf : ut_params->obuf),
3036 			data_pad_len);
3037 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
3038 	} else {
3039 		uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
3040 		struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
3041 				sym_op->m_src : sym_op->m_dst);
3042 		while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
3043 			remaining_off -= rte_pktmbuf_data_len(sgl_buf);
3044 			sgl_buf = sgl_buf->next;
3045 		}
3046 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
3047 				uint8_t *, remaining_off);
3048 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
3049 				remaining_off);
3050 		memset(sym_op->auth.digest.data, 0, remaining_off);
3051 		while (sgl_buf->next != NULL) {
3052 			memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
3053 				0, rte_pktmbuf_data_len(sgl_buf));
3054 			sgl_buf = sgl_buf->next;
3055 		}
3056 	}
3057 
3058 	/* Copy digest for the verification */
3059 	if (verify)
3060 		memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
3061 
3062 	/* Copy cipher and auth IVs at the end of the crypto operation */
3063 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
3064 			ut_params->op, uint8_t *, IV_OFFSET);
3065 
3066 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3067 	iv_ptr += cipher_iv_len;
3068 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3069 
3070 	/* Only copy over the offset data needed from src to dst in OOP,
3071 	 * if the auth and cipher offsets are not aligned
3072 	 */
3073 	if (op_mode == OUT_OF_PLACE) {
3074 		if (cipher_offset > auth_offset)
3075 			rte_memcpy(
3076 				rte_pktmbuf_mtod_offset(
3077 					sym_op->m_dst,
3078 					uint8_t *, auth_offset >> 3),
3079 				rte_pktmbuf_mtod_offset(
3080 					sym_op->m_src,
3081 					uint8_t *, auth_offset >> 3),
3082 				((cipher_offset >> 3) - (auth_offset >> 3)));
3083 	}
3084 
3085 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3086 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3087 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3088 		sym_op->cipher.data.length = cipher_len;
3089 		sym_op->cipher.data.offset = cipher_offset;
3090 	} else {
3091 		sym_op->cipher.data.length = cipher_len >> 3;
3092 		sym_op->cipher.data.offset = cipher_offset >> 3;
3093 	}
3094 
3095 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3096 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3097 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3098 		sym_op->auth.data.length = auth_len;
3099 		sym_op->auth.data.offset = auth_offset;
3100 	} else {
3101 		sym_op->auth.data.length = auth_len >> 3;
3102 		sym_op->auth.data.offset = auth_offset >> 3;
3103 	}
3104 
3105 	return 0;
3106 }
3107 
3108 static int
3109 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
3110 {
3111 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3112 	struct crypto_unittest_params *ut_params = &unittest_params;
3113 
3114 	int retval;
3115 	unsigned plaintext_pad_len;
3116 	unsigned plaintext_len;
3117 	uint8_t *plaintext;
3118 	struct rte_cryptodev_info dev_info;
3119 
3120 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3121 	uint64_t feat_flags = dev_info.feature_flags;
3122 
3123 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3124 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3125 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3126 		return TEST_SKIPPED;
3127 	}
3128 
3129 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3130 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3131 		printf("Device doesn't support RAW data-path APIs.\n");
3132 		return TEST_SKIPPED;
3133 	}
3134 
3135 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3136 		return TEST_SKIPPED;
3137 
3138 	/* Verify the capabilities */
3139 	struct rte_cryptodev_sym_capability_idx cap_idx;
3140 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3141 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3142 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3143 			&cap_idx) == NULL)
3144 		return TEST_SKIPPED;
3145 
3146 	/* Create SNOW 3G session */
3147 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3148 			tdata->key.data, tdata->key.len,
3149 			tdata->auth_iv.len, tdata->digest.len,
3150 			RTE_CRYPTO_AUTH_OP_GENERATE,
3151 			RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3152 	if (retval < 0)
3153 		return retval;
3154 
3155 	/* alloc mbuf and set payload */
3156 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3157 
3158 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3159 	rte_pktmbuf_tailroom(ut_params->ibuf));
3160 
3161 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3162 	/* Append data which is padded to a multiple of */
3163 	/* the algorithms block size */
3164 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3165 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3166 				plaintext_pad_len);
3167 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3168 
3169 	/* Create SNOW 3G operation */
3170 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3171 			tdata->auth_iv.data, tdata->auth_iv.len,
3172 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3173 			tdata->validAuthLenInBits.len,
3174 			0);
3175 	if (retval < 0)
3176 		return retval;
3177 
3178 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3179 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3180 				ut_params->op, 0, 1, 1, 0);
3181 	else
3182 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3183 				ut_params->op);
3184 	ut_params->obuf = ut_params->op->sym->m_src;
3185 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3186 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3187 			+ plaintext_pad_len;
3188 
3189 	/* Validate obuf */
3190 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3191 	ut_params->digest,
3192 	tdata->digest.data,
3193 	DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3194 	"SNOW 3G Generated auth tag not as expected");
3195 
3196 	return 0;
3197 }
3198 
3199 static int
3200 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3201 {
3202 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3203 	struct crypto_unittest_params *ut_params = &unittest_params;
3204 
3205 	int retval;
3206 	unsigned plaintext_pad_len;
3207 	unsigned plaintext_len;
3208 	uint8_t *plaintext;
3209 	struct rte_cryptodev_info dev_info;
3210 
3211 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3212 	uint64_t feat_flags = dev_info.feature_flags;
3213 
3214 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3215 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3216 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3217 		return TEST_SKIPPED;
3218 	}
3219 
3220 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3221 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3222 		printf("Device doesn't support RAW data-path APIs.\n");
3223 		return TEST_SKIPPED;
3224 	}
3225 
3226 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3227 		return TEST_SKIPPED;
3228 
3229 	/* Verify the capabilities */
3230 	struct rte_cryptodev_sym_capability_idx cap_idx;
3231 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3232 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3233 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3234 			&cap_idx) == NULL)
3235 		return TEST_SKIPPED;
3236 
3237 	/* Create SNOW 3G session */
3238 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3239 				tdata->key.data, tdata->key.len,
3240 				tdata->auth_iv.len, tdata->digest.len,
3241 				RTE_CRYPTO_AUTH_OP_VERIFY,
3242 				RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3243 	if (retval < 0)
3244 		return retval;
3245 	/* alloc mbuf and set payload */
3246 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3247 
3248 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3249 	rte_pktmbuf_tailroom(ut_params->ibuf));
3250 
3251 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3252 	/* Append data which is padded to a multiple of */
3253 	/* the algorithms block size */
3254 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3255 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3256 				plaintext_pad_len);
3257 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3258 
3259 	/* Create SNOW 3G operation */
3260 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3261 			tdata->digest.len,
3262 			tdata->auth_iv.data, tdata->auth_iv.len,
3263 			plaintext_pad_len,
3264 			RTE_CRYPTO_AUTH_OP_VERIFY,
3265 			tdata->validAuthLenInBits.len,
3266 			0);
3267 	if (retval < 0)
3268 		return retval;
3269 
3270 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3271 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3272 				ut_params->op, 0, 1, 1, 0);
3273 	else
3274 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3275 				ut_params->op);
3276 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3277 	ut_params->obuf = ut_params->op->sym->m_src;
3278 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3279 				+ plaintext_pad_len;
3280 
3281 	/* Validate obuf */
3282 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3283 		return 0;
3284 	else
3285 		return -1;
3286 
3287 	return 0;
3288 }
3289 
3290 static int
3291 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3292 {
3293 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3294 	struct crypto_unittest_params *ut_params = &unittest_params;
3295 
3296 	int retval;
3297 	unsigned plaintext_pad_len;
3298 	unsigned plaintext_len;
3299 	uint8_t *plaintext;
3300 	struct rte_cryptodev_info dev_info;
3301 
3302 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3303 	uint64_t feat_flags = dev_info.feature_flags;
3304 
3305 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3306 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3307 		printf("Device doesn't support RAW data-path APIs.\n");
3308 		return TEST_SKIPPED;
3309 	}
3310 
3311 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3312 		return TEST_SKIPPED;
3313 
3314 	/* Verify the capabilities */
3315 	struct rte_cryptodev_sym_capability_idx cap_idx;
3316 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3317 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3318 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3319 			&cap_idx) == NULL)
3320 		return TEST_SKIPPED;
3321 
3322 	/* Create KASUMI session */
3323 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3324 			tdata->key.data, tdata->key.len,
3325 			0, tdata->digest.len,
3326 			RTE_CRYPTO_AUTH_OP_GENERATE,
3327 			RTE_CRYPTO_AUTH_KASUMI_F9);
3328 	if (retval < 0)
3329 		return retval;
3330 
3331 	/* alloc mbuf and set payload */
3332 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3333 
3334 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3335 	rte_pktmbuf_tailroom(ut_params->ibuf));
3336 
3337 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3338 	/* Append data which is padded to a multiple of */
3339 	/* the algorithms block size */
3340 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3341 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3342 				plaintext_pad_len);
3343 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3344 
3345 	/* Create KASUMI operation */
3346 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3347 			NULL, 0,
3348 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3349 			tdata->plaintext.len,
3350 			0);
3351 	if (retval < 0)
3352 		return retval;
3353 
3354 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3355 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3356 			ut_params->op);
3357 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3358 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3359 				ut_params->op, 0, 1, 1, 0);
3360 	else
3361 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3362 			ut_params->op);
3363 
3364 	ut_params->obuf = ut_params->op->sym->m_src;
3365 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3366 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3367 			+ plaintext_pad_len;
3368 
3369 	/* Validate obuf */
3370 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3371 	ut_params->digest,
3372 	tdata->digest.data,
3373 	DIGEST_BYTE_LENGTH_KASUMI_F9,
3374 	"KASUMI Generated auth tag not as expected");
3375 
3376 	return 0;
3377 }
3378 
3379 static int
3380 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3381 {
3382 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3383 	struct crypto_unittest_params *ut_params = &unittest_params;
3384 
3385 	int retval;
3386 	unsigned plaintext_pad_len;
3387 	unsigned plaintext_len;
3388 	uint8_t *plaintext;
3389 	struct rte_cryptodev_info dev_info;
3390 
3391 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3392 	uint64_t feat_flags = dev_info.feature_flags;
3393 
3394 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3395 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3396 		printf("Device doesn't support RAW data-path APIs.\n");
3397 		return TEST_SKIPPED;
3398 	}
3399 
3400 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3401 		return TEST_SKIPPED;
3402 
3403 	/* Verify the capabilities */
3404 	struct rte_cryptodev_sym_capability_idx cap_idx;
3405 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3406 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3407 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3408 			&cap_idx) == NULL)
3409 		return TEST_SKIPPED;
3410 
3411 	/* Create KASUMI session */
3412 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3413 				tdata->key.data, tdata->key.len,
3414 				0, tdata->digest.len,
3415 				RTE_CRYPTO_AUTH_OP_VERIFY,
3416 				RTE_CRYPTO_AUTH_KASUMI_F9);
3417 	if (retval < 0)
3418 		return retval;
3419 	/* alloc mbuf and set payload */
3420 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3421 
3422 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3423 	rte_pktmbuf_tailroom(ut_params->ibuf));
3424 
3425 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3426 	/* Append data which is padded to a multiple */
3427 	/* of the algorithms block size */
3428 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3429 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3430 				plaintext_pad_len);
3431 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3432 
3433 	/* Create KASUMI operation */
3434 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3435 			tdata->digest.len,
3436 			NULL, 0,
3437 			plaintext_pad_len,
3438 			RTE_CRYPTO_AUTH_OP_VERIFY,
3439 			tdata->plaintext.len,
3440 			0);
3441 	if (retval < 0)
3442 		return retval;
3443 
3444 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3445 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3446 				ut_params->op, 0, 1, 1, 0);
3447 	else
3448 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3449 				ut_params->op);
3450 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3451 	ut_params->obuf = ut_params->op->sym->m_src;
3452 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3453 				+ plaintext_pad_len;
3454 
3455 	/* Validate obuf */
3456 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3457 		return 0;
3458 	else
3459 		return -1;
3460 
3461 	return 0;
3462 }
3463 
3464 static int
3465 test_snow3g_hash_generate_test_case_1(void)
3466 {
3467 	return test_snow3g_authentication(&snow3g_hash_test_case_1);
3468 }
3469 
3470 static int
3471 test_snow3g_hash_generate_test_case_2(void)
3472 {
3473 	return test_snow3g_authentication(&snow3g_hash_test_case_2);
3474 }
3475 
3476 static int
3477 test_snow3g_hash_generate_test_case_3(void)
3478 {
3479 	return test_snow3g_authentication(&snow3g_hash_test_case_3);
3480 }
3481 
3482 static int
3483 test_snow3g_hash_generate_test_case_4(void)
3484 {
3485 	return test_snow3g_authentication(&snow3g_hash_test_case_4);
3486 }
3487 
3488 static int
3489 test_snow3g_hash_generate_test_case_5(void)
3490 {
3491 	return test_snow3g_authentication(&snow3g_hash_test_case_5);
3492 }
3493 
3494 static int
3495 test_snow3g_hash_generate_test_case_6(void)
3496 {
3497 	return test_snow3g_authentication(&snow3g_hash_test_case_6);
3498 }
3499 
3500 static int
3501 test_snow3g_hash_verify_test_case_1(void)
3502 {
3503 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3504 
3505 }
3506 
3507 static int
3508 test_snow3g_hash_verify_test_case_2(void)
3509 {
3510 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3511 }
3512 
3513 static int
3514 test_snow3g_hash_verify_test_case_3(void)
3515 {
3516 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3517 }
3518 
3519 static int
3520 test_snow3g_hash_verify_test_case_4(void)
3521 {
3522 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3523 }
3524 
3525 static int
3526 test_snow3g_hash_verify_test_case_5(void)
3527 {
3528 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3529 }
3530 
3531 static int
3532 test_snow3g_hash_verify_test_case_6(void)
3533 {
3534 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3535 }
3536 
3537 static int
3538 test_kasumi_hash_generate_test_case_1(void)
3539 {
3540 	return test_kasumi_authentication(&kasumi_hash_test_case_1);
3541 }
3542 
3543 static int
3544 test_kasumi_hash_generate_test_case_2(void)
3545 {
3546 	return test_kasumi_authentication(&kasumi_hash_test_case_2);
3547 }
3548 
3549 static int
3550 test_kasumi_hash_generate_test_case_3(void)
3551 {
3552 	return test_kasumi_authentication(&kasumi_hash_test_case_3);
3553 }
3554 
3555 static int
3556 test_kasumi_hash_generate_test_case_4(void)
3557 {
3558 	return test_kasumi_authentication(&kasumi_hash_test_case_4);
3559 }
3560 
3561 static int
3562 test_kasumi_hash_generate_test_case_5(void)
3563 {
3564 	return test_kasumi_authentication(&kasumi_hash_test_case_5);
3565 }
3566 
3567 static int
3568 test_kasumi_hash_generate_test_case_6(void)
3569 {
3570 	return test_kasumi_authentication(&kasumi_hash_test_case_6);
3571 }
3572 
3573 static int
3574 test_kasumi_hash_verify_test_case_1(void)
3575 {
3576 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3577 }
3578 
3579 static int
3580 test_kasumi_hash_verify_test_case_2(void)
3581 {
3582 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3583 }
3584 
3585 static int
3586 test_kasumi_hash_verify_test_case_3(void)
3587 {
3588 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3589 }
3590 
3591 static int
3592 test_kasumi_hash_verify_test_case_4(void)
3593 {
3594 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3595 }
3596 
3597 static int
3598 test_kasumi_hash_verify_test_case_5(void)
3599 {
3600 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3601 }
3602 
3603 static int
3604 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3605 {
3606 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3607 	struct crypto_unittest_params *ut_params = &unittest_params;
3608 
3609 	int retval;
3610 	uint8_t *plaintext, *ciphertext;
3611 	unsigned plaintext_pad_len;
3612 	unsigned plaintext_len;
3613 	struct rte_cryptodev_info dev_info;
3614 
3615 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3616 	uint64_t feat_flags = dev_info.feature_flags;
3617 
3618 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3619 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3620 		printf("Device doesn't support RAW data-path APIs.\n");
3621 		return TEST_SKIPPED;
3622 	}
3623 
3624 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3625 		return TEST_SKIPPED;
3626 
3627 	/* Verify the capabilities */
3628 	struct rte_cryptodev_sym_capability_idx cap_idx;
3629 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3630 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3631 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3632 			&cap_idx) == NULL)
3633 		return TEST_SKIPPED;
3634 
3635 	/* Create KASUMI session */
3636 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3637 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3638 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3639 					tdata->key.data, tdata->key.len,
3640 					tdata->cipher_iv.len);
3641 	if (retval < 0)
3642 		return retval;
3643 
3644 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3645 
3646 	/* Clear mbuf payload */
3647 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3648 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3649 
3650 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3651 	/* Append data which is padded to a multiple */
3652 	/* of the algorithms block size */
3653 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3654 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3655 				plaintext_pad_len);
3656 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3657 
3658 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3659 
3660 	/* Create KASUMI operation */
3661 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3662 				tdata->cipher_iv.len,
3663 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3664 				tdata->validCipherOffsetInBits.len);
3665 	if (retval < 0)
3666 		return retval;
3667 
3668 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3669 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3670 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3671 	else
3672 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3673 				ut_params->op);
3674 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3675 
3676 	ut_params->obuf = ut_params->op->sym->m_dst;
3677 	if (ut_params->obuf)
3678 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3679 	else
3680 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3681 
3682 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3683 
3684 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3685 				(tdata->validCipherOffsetInBits.len >> 3);
3686 	/* Validate obuf */
3687 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3688 		ciphertext,
3689 		reference_ciphertext,
3690 		tdata->validCipherLenInBits.len,
3691 		"KASUMI Ciphertext data not as expected");
3692 	return 0;
3693 }
3694 
3695 static int
3696 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3697 {
3698 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3699 	struct crypto_unittest_params *ut_params = &unittest_params;
3700 
3701 	int retval;
3702 
3703 	unsigned int plaintext_pad_len;
3704 	unsigned int plaintext_len;
3705 
3706 	uint8_t buffer[10000];
3707 	const uint8_t *ciphertext;
3708 
3709 	struct rte_cryptodev_info dev_info;
3710 
3711 	/* Verify the capabilities */
3712 	struct rte_cryptodev_sym_capability_idx cap_idx;
3713 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3714 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3715 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3716 			&cap_idx) == NULL)
3717 		return TEST_SKIPPED;
3718 
3719 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3720 
3721 	uint64_t feat_flags = dev_info.feature_flags;
3722 
3723 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3724 		printf("Device doesn't support in-place scatter-gather. "
3725 				"Test Skipped.\n");
3726 		return TEST_SKIPPED;
3727 	}
3728 
3729 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3730 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3731 		printf("Device doesn't support RAW data-path APIs.\n");
3732 		return TEST_SKIPPED;
3733 	}
3734 
3735 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3736 		return TEST_SKIPPED;
3737 
3738 	/* Create KASUMI session */
3739 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3740 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3741 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3742 					tdata->key.data, tdata->key.len,
3743 					tdata->cipher_iv.len);
3744 	if (retval < 0)
3745 		return retval;
3746 
3747 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3748 
3749 
3750 	/* Append data which is padded to a multiple */
3751 	/* of the algorithms block size */
3752 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3753 
3754 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3755 			plaintext_pad_len, 10, 0);
3756 
3757 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3758 
3759 	/* Create KASUMI operation */
3760 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3761 				tdata->cipher_iv.len,
3762 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3763 				tdata->validCipherOffsetInBits.len);
3764 	if (retval < 0)
3765 		return retval;
3766 
3767 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3768 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3769 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3770 	else
3771 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3772 						ut_params->op);
3773 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3774 
3775 	ut_params->obuf = ut_params->op->sym->m_dst;
3776 
3777 	if (ut_params->obuf)
3778 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3779 				plaintext_len, buffer);
3780 	else
3781 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3782 				tdata->validCipherOffsetInBits.len >> 3,
3783 				plaintext_len, buffer);
3784 
3785 	/* Validate obuf */
3786 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3787 
3788 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3789 				(tdata->validCipherOffsetInBits.len >> 3);
3790 	/* Validate obuf */
3791 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3792 		ciphertext,
3793 		reference_ciphertext,
3794 		tdata->validCipherLenInBits.len,
3795 		"KASUMI Ciphertext data not as expected");
3796 	return 0;
3797 }
3798 
3799 static int
3800 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3801 {
3802 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3803 	struct crypto_unittest_params *ut_params = &unittest_params;
3804 
3805 	int retval;
3806 	uint8_t *plaintext, *ciphertext;
3807 	unsigned plaintext_pad_len;
3808 	unsigned plaintext_len;
3809 
3810 	/* Verify the capabilities */
3811 	struct rte_cryptodev_sym_capability_idx cap_idx;
3812 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3813 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3814 	/* Data-path service does not support OOP */
3815 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3816 			&cap_idx) == NULL)
3817 		return TEST_SKIPPED;
3818 
3819 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3820 		return TEST_SKIPPED;
3821 
3822 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3823 		return TEST_SKIPPED;
3824 
3825 	/* Create KASUMI session */
3826 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3827 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3828 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3829 					tdata->key.data, tdata->key.len,
3830 					tdata->cipher_iv.len);
3831 	if (retval < 0)
3832 		return retval;
3833 
3834 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3835 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3836 
3837 	/* Clear mbuf payload */
3838 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3839 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3840 
3841 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3842 	/* Append data which is padded to a multiple */
3843 	/* of the algorithms block size */
3844 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3845 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3846 				plaintext_pad_len);
3847 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3848 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3849 
3850 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3851 
3852 	/* Create KASUMI operation */
3853 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3854 				tdata->cipher_iv.len,
3855 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3856 				tdata->validCipherOffsetInBits.len);
3857 	if (retval < 0)
3858 		return retval;
3859 
3860 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3861 						ut_params->op);
3862 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3863 
3864 	ut_params->obuf = ut_params->op->sym->m_dst;
3865 	if (ut_params->obuf)
3866 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3867 	else
3868 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3869 
3870 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3871 
3872 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3873 				(tdata->validCipherOffsetInBits.len >> 3);
3874 	/* Validate obuf */
3875 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3876 		ciphertext,
3877 		reference_ciphertext,
3878 		tdata->validCipherLenInBits.len,
3879 		"KASUMI Ciphertext data not as expected");
3880 	return 0;
3881 }
3882 
3883 static int
3884 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3885 {
3886 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3887 	struct crypto_unittest_params *ut_params = &unittest_params;
3888 
3889 	int retval;
3890 	unsigned int plaintext_pad_len;
3891 	unsigned int plaintext_len;
3892 
3893 	const uint8_t *ciphertext;
3894 	uint8_t buffer[2048];
3895 
3896 	struct rte_cryptodev_info dev_info;
3897 
3898 	/* Verify the capabilities */
3899 	struct rte_cryptodev_sym_capability_idx cap_idx;
3900 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3901 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3902 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3903 			&cap_idx) == NULL)
3904 		return TEST_SKIPPED;
3905 
3906 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3907 		return TEST_SKIPPED;
3908 
3909 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3910 		return TEST_SKIPPED;
3911 
3912 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3913 
3914 	uint64_t feat_flags = dev_info.feature_flags;
3915 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3916 		printf("Device doesn't support out-of-place scatter-gather "
3917 				"in both input and output mbufs. "
3918 				"Test Skipped.\n");
3919 		return TEST_SKIPPED;
3920 	}
3921 
3922 	/* Create KASUMI session */
3923 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3924 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3925 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3926 					tdata->key.data, tdata->key.len,
3927 					tdata->cipher_iv.len);
3928 	if (retval < 0)
3929 		return retval;
3930 
3931 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3932 	/* Append data which is padded to a multiple */
3933 	/* of the algorithms block size */
3934 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3935 
3936 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3937 			plaintext_pad_len, 10, 0);
3938 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3939 			plaintext_pad_len, 3, 0);
3940 
3941 	/* Append data which is padded to a multiple */
3942 	/* of the algorithms block size */
3943 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3944 
3945 	/* Create KASUMI operation */
3946 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3947 				tdata->cipher_iv.len,
3948 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3949 				tdata->validCipherOffsetInBits.len);
3950 	if (retval < 0)
3951 		return retval;
3952 
3953 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3954 						ut_params->op);
3955 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3956 
3957 	ut_params->obuf = ut_params->op->sym->m_dst;
3958 	if (ut_params->obuf)
3959 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3960 				plaintext_pad_len, buffer);
3961 	else
3962 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3963 				tdata->validCipherOffsetInBits.len >> 3,
3964 				plaintext_pad_len, buffer);
3965 
3966 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3967 				(tdata->validCipherOffsetInBits.len >> 3);
3968 	/* Validate obuf */
3969 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3970 		ciphertext,
3971 		reference_ciphertext,
3972 		tdata->validCipherLenInBits.len,
3973 		"KASUMI Ciphertext data not as expected");
3974 	return 0;
3975 }
3976 
3977 
3978 static int
3979 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3980 {
3981 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3982 	struct crypto_unittest_params *ut_params = &unittest_params;
3983 
3984 	int retval;
3985 	uint8_t *ciphertext, *plaintext;
3986 	unsigned ciphertext_pad_len;
3987 	unsigned ciphertext_len;
3988 
3989 	/* Verify the capabilities */
3990 	struct rte_cryptodev_sym_capability_idx cap_idx;
3991 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3992 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3993 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3994 			&cap_idx) == NULL)
3995 		return TEST_SKIPPED;
3996 
3997 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3998 		return TEST_SKIPPED;
3999 
4000 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4001 		return TEST_SKIPPED;
4002 
4003 	/* Create KASUMI session */
4004 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4005 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4006 					RTE_CRYPTO_CIPHER_KASUMI_F8,
4007 					tdata->key.data, tdata->key.len,
4008 					tdata->cipher_iv.len);
4009 	if (retval < 0)
4010 		return retval;
4011 
4012 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4013 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4014 
4015 	/* Clear mbuf payload */
4016 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4017 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4018 
4019 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4020 	/* Append data which is padded to a multiple */
4021 	/* of the algorithms block size */
4022 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4023 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4024 				ciphertext_pad_len);
4025 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4026 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4027 
4028 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4029 
4030 	/* Create KASUMI operation */
4031 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4032 				tdata->cipher_iv.len,
4033 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4034 				tdata->validCipherOffsetInBits.len);
4035 	if (retval < 0)
4036 		return retval;
4037 
4038 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4039 						ut_params->op);
4040 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4041 
4042 	ut_params->obuf = ut_params->op->sym->m_dst;
4043 	if (ut_params->obuf)
4044 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4045 	else
4046 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4047 
4048 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4049 
4050 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4051 				(tdata->validCipherOffsetInBits.len >> 3);
4052 	/* Validate obuf */
4053 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4054 		plaintext,
4055 		reference_plaintext,
4056 		tdata->validCipherLenInBits.len,
4057 		"KASUMI Plaintext data not as expected");
4058 	return 0;
4059 }
4060 
4061 static int
4062 test_kasumi_decryption(const struct kasumi_test_data *tdata)
4063 {
4064 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4065 	struct crypto_unittest_params *ut_params = &unittest_params;
4066 
4067 	int retval;
4068 	uint8_t *ciphertext, *plaintext;
4069 	unsigned ciphertext_pad_len;
4070 	unsigned ciphertext_len;
4071 	struct rte_cryptodev_info dev_info;
4072 
4073 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4074 	uint64_t feat_flags = dev_info.feature_flags;
4075 
4076 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4077 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4078 		printf("Device doesn't support RAW data-path APIs.\n");
4079 		return TEST_SKIPPED;
4080 	}
4081 
4082 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4083 		return TEST_SKIPPED;
4084 
4085 	/* Verify the capabilities */
4086 	struct rte_cryptodev_sym_capability_idx cap_idx;
4087 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4088 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4089 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4090 			&cap_idx) == NULL)
4091 		return TEST_SKIPPED;
4092 
4093 	/* Create KASUMI session */
4094 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4095 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4096 					RTE_CRYPTO_CIPHER_KASUMI_F8,
4097 					tdata->key.data, tdata->key.len,
4098 					tdata->cipher_iv.len);
4099 	if (retval < 0)
4100 		return retval;
4101 
4102 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4103 
4104 	/* Clear mbuf payload */
4105 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4106 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4107 
4108 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4109 	/* Append data which is padded to a multiple */
4110 	/* of the algorithms block size */
4111 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4112 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4113 				ciphertext_pad_len);
4114 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4115 
4116 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4117 
4118 	/* Create KASUMI operation */
4119 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4120 			tdata->cipher_iv.len,
4121 			RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4122 			tdata->validCipherOffsetInBits.len);
4123 	if (retval < 0)
4124 		return retval;
4125 
4126 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4127 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4128 				ut_params->op, 1, 0, 1, 0);
4129 	else
4130 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4131 						ut_params->op);
4132 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4133 
4134 	ut_params->obuf = ut_params->op->sym->m_dst;
4135 	if (ut_params->obuf)
4136 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4137 	else
4138 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4139 
4140 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4141 
4142 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4143 				(tdata->validCipherOffsetInBits.len >> 3);
4144 	/* Validate obuf */
4145 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4146 		plaintext,
4147 		reference_plaintext,
4148 		tdata->validCipherLenInBits.len,
4149 		"KASUMI Plaintext data not as expected");
4150 	return 0;
4151 }
4152 
4153 static int
4154 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4155 {
4156 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4157 	struct crypto_unittest_params *ut_params = &unittest_params;
4158 
4159 	int retval;
4160 	uint8_t *plaintext, *ciphertext;
4161 	unsigned plaintext_pad_len;
4162 	unsigned plaintext_len;
4163 	struct rte_cryptodev_info dev_info;
4164 
4165 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4166 	uint64_t feat_flags = dev_info.feature_flags;
4167 
4168 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4169 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4170 		printf("Device doesn't support RAW data-path APIs.\n");
4171 		return TEST_SKIPPED;
4172 	}
4173 
4174 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4175 		return TEST_SKIPPED;
4176 
4177 	/* Verify the capabilities */
4178 	struct rte_cryptodev_sym_capability_idx cap_idx;
4179 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4180 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4181 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4182 			&cap_idx) == NULL)
4183 		return TEST_SKIPPED;
4184 
4185 	/* Create SNOW 3G session */
4186 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4187 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4188 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4189 					tdata->key.data, tdata->key.len,
4190 					tdata->cipher_iv.len);
4191 	if (retval < 0)
4192 		return retval;
4193 
4194 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4195 
4196 	/* Clear mbuf payload */
4197 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4198 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4199 
4200 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4201 	/* Append data which is padded to a multiple of */
4202 	/* the algorithms block size */
4203 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4204 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4205 				plaintext_pad_len);
4206 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4207 
4208 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4209 
4210 	/* Create SNOW 3G operation */
4211 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4212 					tdata->cipher_iv.len,
4213 					tdata->validCipherLenInBits.len,
4214 					0);
4215 	if (retval < 0)
4216 		return retval;
4217 
4218 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4219 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4220 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4221 	else
4222 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4223 						ut_params->op);
4224 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4225 
4226 	ut_params->obuf = ut_params->op->sym->m_dst;
4227 	if (ut_params->obuf)
4228 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4229 	else
4230 		ciphertext = plaintext;
4231 
4232 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4233 
4234 	/* Validate obuf */
4235 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4236 		ciphertext,
4237 		tdata->ciphertext.data,
4238 		tdata->validDataLenInBits.len,
4239 		"SNOW 3G Ciphertext data not as expected");
4240 	return 0;
4241 }
4242 
4243 
4244 static int
4245 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4246 {
4247 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4248 	struct crypto_unittest_params *ut_params = &unittest_params;
4249 	uint8_t *plaintext, *ciphertext;
4250 
4251 	int retval;
4252 	unsigned plaintext_pad_len;
4253 	unsigned plaintext_len;
4254 	struct rte_cryptodev_info dev_info;
4255 
4256 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4257 	uint64_t feat_flags = dev_info.feature_flags;
4258 
4259 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4260 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4261 		printf("Device does not support RAW data-path APIs.\n");
4262 		return -ENOTSUP;
4263 	}
4264 
4265 	/* Verify the capabilities */
4266 	struct rte_cryptodev_sym_capability_idx cap_idx;
4267 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4268 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4269 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4270 			&cap_idx) == NULL)
4271 		return TEST_SKIPPED;
4272 
4273 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4274 		return TEST_SKIPPED;
4275 
4276 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4277 		return TEST_SKIPPED;
4278 
4279 	/* Create SNOW 3G session */
4280 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4281 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4282 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4283 					tdata->key.data, tdata->key.len,
4284 					tdata->cipher_iv.len);
4285 	if (retval < 0)
4286 		return retval;
4287 
4288 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4289 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4290 
4291 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4292 			"Failed to allocate input buffer in mempool");
4293 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4294 			"Failed to allocate output buffer in mempool");
4295 
4296 	/* Clear mbuf payload */
4297 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4298 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4299 
4300 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4301 	/* Append data which is padded to a multiple of */
4302 	/* the algorithms block size */
4303 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4304 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4305 				plaintext_pad_len);
4306 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4307 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4308 
4309 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4310 
4311 	/* Create SNOW 3G operation */
4312 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4313 					tdata->cipher_iv.len,
4314 					tdata->validCipherLenInBits.len,
4315 					0);
4316 	if (retval < 0)
4317 		return retval;
4318 
4319 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4320 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4321 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4322 	else
4323 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4324 						ut_params->op);
4325 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4326 
4327 	ut_params->obuf = ut_params->op->sym->m_dst;
4328 	if (ut_params->obuf)
4329 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4330 	else
4331 		ciphertext = plaintext;
4332 
4333 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4334 
4335 	/* Validate obuf */
4336 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4337 		ciphertext,
4338 		tdata->ciphertext.data,
4339 		tdata->validDataLenInBits.len,
4340 		"SNOW 3G Ciphertext data not as expected");
4341 	return 0;
4342 }
4343 
4344 static int
4345 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4346 {
4347 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4348 	struct crypto_unittest_params *ut_params = &unittest_params;
4349 
4350 	int retval;
4351 	unsigned int plaintext_pad_len;
4352 	unsigned int plaintext_len;
4353 	uint8_t buffer[10000];
4354 	const uint8_t *ciphertext;
4355 
4356 	struct rte_cryptodev_info dev_info;
4357 
4358 	/* Verify the capabilities */
4359 	struct rte_cryptodev_sym_capability_idx cap_idx;
4360 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4361 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4362 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4363 			&cap_idx) == NULL)
4364 		return TEST_SKIPPED;
4365 
4366 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4367 		return TEST_SKIPPED;
4368 
4369 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4370 		return TEST_SKIPPED;
4371 
4372 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4373 
4374 	uint64_t feat_flags = dev_info.feature_flags;
4375 
4376 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4377 		printf("Device doesn't support out-of-place scatter-gather "
4378 				"in both input and output mbufs. "
4379 				"Test Skipped.\n");
4380 		return TEST_SKIPPED;
4381 	}
4382 
4383 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4384 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4385 		printf("Device does not support RAW data-path APIs.\n");
4386 		return -ENOTSUP;
4387 	}
4388 
4389 	/* Create SNOW 3G session */
4390 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4391 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4392 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4393 					tdata->key.data, tdata->key.len,
4394 					tdata->cipher_iv.len);
4395 	if (retval < 0)
4396 		return retval;
4397 
4398 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4399 	/* Append data which is padded to a multiple of */
4400 	/* the algorithms block size */
4401 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4402 
4403 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4404 			plaintext_pad_len, 10, 0);
4405 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4406 			plaintext_pad_len, 3, 0);
4407 
4408 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4409 			"Failed to allocate input buffer in mempool");
4410 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4411 			"Failed to allocate output buffer in mempool");
4412 
4413 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4414 
4415 	/* Create SNOW 3G operation */
4416 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4417 					tdata->cipher_iv.len,
4418 					tdata->validCipherLenInBits.len,
4419 					0);
4420 	if (retval < 0)
4421 		return retval;
4422 
4423 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4424 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4425 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4426 	else
4427 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4428 						ut_params->op);
4429 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4430 
4431 	ut_params->obuf = ut_params->op->sym->m_dst;
4432 	if (ut_params->obuf)
4433 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4434 				plaintext_len, buffer);
4435 	else
4436 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4437 				plaintext_len, buffer);
4438 
4439 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4440 
4441 	/* Validate obuf */
4442 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4443 		ciphertext,
4444 		tdata->ciphertext.data,
4445 		tdata->validDataLenInBits.len,
4446 		"SNOW 3G Ciphertext data not as expected");
4447 
4448 	return 0;
4449 }
4450 
4451 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4452 static void
4453 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4454 {
4455 	uint8_t curr_byte, prev_byte;
4456 	uint32_t length_in_bytes = ceil_byte_length(length + offset);
4457 	uint8_t lower_byte_mask = (1 << offset) - 1;
4458 	unsigned i;
4459 
4460 	prev_byte = buffer[0];
4461 	buffer[0] >>= offset;
4462 
4463 	for (i = 1; i < length_in_bytes; i++) {
4464 		curr_byte = buffer[i];
4465 		buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4466 				(curr_byte >> offset);
4467 		prev_byte = curr_byte;
4468 	}
4469 }
4470 
4471 static int
4472 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4473 {
4474 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4475 	struct crypto_unittest_params *ut_params = &unittest_params;
4476 	uint8_t *plaintext, *ciphertext;
4477 	int retval;
4478 	uint32_t plaintext_len;
4479 	uint32_t plaintext_pad_len;
4480 	uint8_t extra_offset = 4;
4481 	uint8_t *expected_ciphertext_shifted;
4482 	struct rte_cryptodev_info dev_info;
4483 
4484 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4485 	uint64_t feat_flags = dev_info.feature_flags;
4486 
4487 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4488 			((tdata->validDataLenInBits.len % 8) != 0)) {
4489 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4490 		return TEST_SKIPPED;
4491 	}
4492 
4493 	/* Verify the capabilities */
4494 	struct rte_cryptodev_sym_capability_idx cap_idx;
4495 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4496 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4497 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4498 			&cap_idx) == NULL)
4499 		return TEST_SKIPPED;
4500 
4501 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4502 		return TEST_SKIPPED;
4503 
4504 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4505 		return TEST_SKIPPED;
4506 
4507 	/* Create SNOW 3G session */
4508 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4509 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4510 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4511 					tdata->key.data, tdata->key.len,
4512 					tdata->cipher_iv.len);
4513 	if (retval < 0)
4514 		return retval;
4515 
4516 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4517 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4518 
4519 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4520 			"Failed to allocate input buffer in mempool");
4521 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4522 			"Failed to allocate output buffer in mempool");
4523 
4524 	/* Clear mbuf payload */
4525 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4526 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4527 
4528 	plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4529 	/*
4530 	 * Append data which is padded to a
4531 	 * multiple of the algorithms block size
4532 	 */
4533 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4534 
4535 	plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4536 						plaintext_pad_len);
4537 
4538 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4539 
4540 	memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4541 	buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4542 
4543 #ifdef RTE_APP_TEST_DEBUG
4544 	rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4545 #endif
4546 	/* Create SNOW 3G operation */
4547 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4548 					tdata->cipher_iv.len,
4549 					tdata->validCipherLenInBits.len,
4550 					extra_offset);
4551 	if (retval < 0)
4552 		return retval;
4553 
4554 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4555 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4556 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4557 	else
4558 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4559 						ut_params->op);
4560 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4561 
4562 	ut_params->obuf = ut_params->op->sym->m_dst;
4563 	if (ut_params->obuf)
4564 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4565 	else
4566 		ciphertext = plaintext;
4567 
4568 #ifdef RTE_APP_TEST_DEBUG
4569 	rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4570 #endif
4571 
4572 	expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4573 
4574 	TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4575 			"failed to reserve memory for ciphertext shifted\n");
4576 
4577 	memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4578 			ceil_byte_length(tdata->ciphertext.len));
4579 	buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4580 			extra_offset);
4581 	/* Validate obuf */
4582 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4583 		ciphertext,
4584 		expected_ciphertext_shifted,
4585 		tdata->validDataLenInBits.len,
4586 		extra_offset,
4587 		"SNOW 3G Ciphertext data not as expected");
4588 	return 0;
4589 }
4590 
4591 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4592 {
4593 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4594 	struct crypto_unittest_params *ut_params = &unittest_params;
4595 
4596 	int retval;
4597 
4598 	uint8_t *plaintext, *ciphertext;
4599 	unsigned ciphertext_pad_len;
4600 	unsigned ciphertext_len;
4601 	struct rte_cryptodev_info dev_info;
4602 
4603 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4604 	uint64_t feat_flags = dev_info.feature_flags;
4605 
4606 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4607 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4608 		printf("Device doesn't support RAW data-path APIs.\n");
4609 		return TEST_SKIPPED;
4610 	}
4611 
4612 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4613 		return TEST_SKIPPED;
4614 
4615 	/* Verify the capabilities */
4616 	struct rte_cryptodev_sym_capability_idx cap_idx;
4617 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4618 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4619 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4620 			&cap_idx) == NULL)
4621 		return TEST_SKIPPED;
4622 
4623 	/* Create SNOW 3G session */
4624 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4625 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4626 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4627 					tdata->key.data, tdata->key.len,
4628 					tdata->cipher_iv.len);
4629 	if (retval < 0)
4630 		return retval;
4631 
4632 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4633 
4634 	/* Clear mbuf payload */
4635 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4636 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4637 
4638 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4639 	/* Append data which is padded to a multiple of */
4640 	/* the algorithms block size */
4641 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4642 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4643 				ciphertext_pad_len);
4644 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4645 
4646 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4647 
4648 	/* Create SNOW 3G operation */
4649 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4650 					tdata->cipher_iv.len,
4651 					tdata->validCipherLenInBits.len,
4652 					tdata->cipher.offset_bits);
4653 	if (retval < 0)
4654 		return retval;
4655 
4656 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4657 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4658 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4659 	else
4660 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4661 						ut_params->op);
4662 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4663 	ut_params->obuf = ut_params->op->sym->m_dst;
4664 	if (ut_params->obuf)
4665 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4666 	else
4667 		plaintext = ciphertext;
4668 
4669 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4670 
4671 	/* Validate obuf */
4672 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4673 				tdata->plaintext.data,
4674 				tdata->validDataLenInBits.len,
4675 				"SNOW 3G Plaintext data not as expected");
4676 	return 0;
4677 }
4678 
4679 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4680 {
4681 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4682 	struct crypto_unittest_params *ut_params = &unittest_params;
4683 
4684 	int retval;
4685 
4686 	uint8_t *plaintext, *ciphertext;
4687 	unsigned ciphertext_pad_len;
4688 	unsigned ciphertext_len;
4689 	struct rte_cryptodev_info dev_info;
4690 
4691 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4692 	uint64_t feat_flags = dev_info.feature_flags;
4693 
4694 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4695 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4696 		printf("Device does not support RAW data-path APIs.\n");
4697 		return -ENOTSUP;
4698 	}
4699 	/* Verify the capabilities */
4700 	struct rte_cryptodev_sym_capability_idx cap_idx;
4701 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4702 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4703 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4704 			&cap_idx) == NULL)
4705 		return TEST_SKIPPED;
4706 
4707 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4708 		return TEST_SKIPPED;
4709 
4710 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4711 		return TEST_SKIPPED;
4712 
4713 	/* Create SNOW 3G session */
4714 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4715 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4716 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4717 					tdata->key.data, tdata->key.len,
4718 					tdata->cipher_iv.len);
4719 	if (retval < 0)
4720 		return retval;
4721 
4722 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4723 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4724 
4725 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4726 			"Failed to allocate input buffer");
4727 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4728 			"Failed to allocate output buffer");
4729 
4730 	/* Clear mbuf payload */
4731 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4732 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4733 
4734 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4735 		       rte_pktmbuf_tailroom(ut_params->obuf));
4736 
4737 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4738 	/* Append data which is padded to a multiple of */
4739 	/* the algorithms block size */
4740 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4741 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4742 				ciphertext_pad_len);
4743 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4744 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4745 
4746 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4747 
4748 	/* Create SNOW 3G operation */
4749 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4750 					tdata->cipher_iv.len,
4751 					tdata->validCipherLenInBits.len,
4752 					0);
4753 	if (retval < 0)
4754 		return retval;
4755 
4756 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4757 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4758 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4759 	else
4760 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4761 						ut_params->op);
4762 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4763 	ut_params->obuf = ut_params->op->sym->m_dst;
4764 	if (ut_params->obuf)
4765 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4766 	else
4767 		plaintext = ciphertext;
4768 
4769 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4770 
4771 	/* Validate obuf */
4772 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4773 				tdata->plaintext.data,
4774 				tdata->validDataLenInBits.len,
4775 				"SNOW 3G Plaintext data not as expected");
4776 	return 0;
4777 }
4778 
4779 static int
4780 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4781 {
4782 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4783 	struct crypto_unittest_params *ut_params = &unittest_params;
4784 
4785 	int retval;
4786 
4787 	uint8_t *plaintext, *ciphertext;
4788 	unsigned int plaintext_pad_len;
4789 	unsigned int plaintext_len;
4790 
4791 	struct rte_cryptodev_info dev_info;
4792 	struct rte_cryptodev_sym_capability_idx cap_idx;
4793 
4794 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4795 	uint64_t feat_flags = dev_info.feature_flags;
4796 
4797 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4798 			((tdata->validAuthLenInBits.len % 8 != 0) ||
4799 			(tdata->validDataLenInBits.len % 8 != 0))) {
4800 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4801 		return TEST_SKIPPED;
4802 	}
4803 
4804 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4805 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4806 		printf("Device doesn't support RAW data-path APIs.\n");
4807 		return TEST_SKIPPED;
4808 	}
4809 
4810 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4811 		return TEST_SKIPPED;
4812 
4813 	/* Check if device supports ZUC EEA3 */
4814 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4815 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4816 
4817 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4818 			&cap_idx) == NULL)
4819 		return TEST_SKIPPED;
4820 
4821 	/* Check if device supports ZUC EIA3 */
4822 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4823 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4824 
4825 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4826 			&cap_idx) == NULL)
4827 		return TEST_SKIPPED;
4828 
4829 	/* Create ZUC session */
4830 	retval = create_zuc_cipher_auth_encrypt_generate_session(
4831 			ts_params->valid_devs[0],
4832 			tdata);
4833 	if (retval != 0)
4834 		return retval;
4835 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4836 
4837 	/* clear mbuf payload */
4838 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4839 			rte_pktmbuf_tailroom(ut_params->ibuf));
4840 
4841 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4842 	/* Append data which is padded to a multiple of */
4843 	/* the algorithms block size */
4844 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4845 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4846 				plaintext_pad_len);
4847 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4848 
4849 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4850 
4851 	/* Create ZUC operation */
4852 	retval = create_zuc_cipher_hash_generate_operation(tdata);
4853 	if (retval < 0)
4854 		return retval;
4855 
4856 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4857 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4858 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4859 	else
4860 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4861 			ut_params->op);
4862 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4863 	ut_params->obuf = ut_params->op->sym->m_src;
4864 	if (ut_params->obuf)
4865 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4866 	else
4867 		ciphertext = plaintext;
4868 
4869 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4870 	/* Validate obuf */
4871 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4872 			ciphertext,
4873 			tdata->ciphertext.data,
4874 			tdata->validDataLenInBits.len,
4875 			"ZUC Ciphertext data not as expected");
4876 
4877 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4878 	    + plaintext_pad_len;
4879 
4880 	/* Validate obuf */
4881 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4882 			ut_params->digest,
4883 			tdata->digest.data,
4884 			4,
4885 			"ZUC Generated auth tag not as expected");
4886 	return 0;
4887 }
4888 
4889 static int
4890 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4891 {
4892 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4893 	struct crypto_unittest_params *ut_params = &unittest_params;
4894 
4895 	int retval;
4896 
4897 	uint8_t *plaintext, *ciphertext;
4898 	unsigned plaintext_pad_len;
4899 	unsigned plaintext_len;
4900 	struct rte_cryptodev_info dev_info;
4901 
4902 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4903 	uint64_t feat_flags = dev_info.feature_flags;
4904 
4905 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4906 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4907 		printf("Device doesn't support RAW data-path APIs.\n");
4908 		return TEST_SKIPPED;
4909 	}
4910 
4911 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4912 		return TEST_SKIPPED;
4913 
4914 	/* Verify the capabilities */
4915 	struct rte_cryptodev_sym_capability_idx cap_idx;
4916 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4917 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4918 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4919 			&cap_idx) == NULL)
4920 		return TEST_SKIPPED;
4921 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4922 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4923 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4924 			&cap_idx) == NULL)
4925 		return TEST_SKIPPED;
4926 
4927 	/* Create SNOW 3G session */
4928 	retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4929 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4930 			RTE_CRYPTO_AUTH_OP_GENERATE,
4931 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4932 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4933 			tdata->key.data, tdata->key.len,
4934 			tdata->auth_iv.len, tdata->digest.len,
4935 			tdata->cipher_iv.len);
4936 	if (retval != 0)
4937 		return retval;
4938 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4939 
4940 	/* clear mbuf payload */
4941 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4942 			rte_pktmbuf_tailroom(ut_params->ibuf));
4943 
4944 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4945 	/* Append data which is padded to a multiple of */
4946 	/* the algorithms block size */
4947 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4948 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4949 				plaintext_pad_len);
4950 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4951 
4952 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4953 
4954 	/* Create SNOW 3G operation */
4955 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4956 			tdata->digest.len, tdata->auth_iv.data,
4957 			tdata->auth_iv.len,
4958 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4959 			tdata->cipher_iv.data, tdata->cipher_iv.len,
4960 			tdata->validCipherLenInBits.len,
4961 			0,
4962 			tdata->validAuthLenInBits.len,
4963 			0
4964 			);
4965 	if (retval < 0)
4966 		return retval;
4967 
4968 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4969 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4970 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4971 	else
4972 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4973 			ut_params->op);
4974 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4975 	ut_params->obuf = ut_params->op->sym->m_src;
4976 	if (ut_params->obuf)
4977 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4978 	else
4979 		ciphertext = plaintext;
4980 
4981 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4982 	/* Validate obuf */
4983 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4984 			ciphertext,
4985 			tdata->ciphertext.data,
4986 			tdata->validDataLenInBits.len,
4987 			"SNOW 3G Ciphertext data not as expected");
4988 
4989 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4990 	    + plaintext_pad_len;
4991 
4992 	/* Validate obuf */
4993 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4994 			ut_params->digest,
4995 			tdata->digest.data,
4996 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4997 			"SNOW 3G Generated auth tag not as expected");
4998 	return 0;
4999 }
5000 
5001 static int
5002 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
5003 	uint8_t op_mode, uint8_t verify)
5004 {
5005 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5006 	struct crypto_unittest_params *ut_params = &unittest_params;
5007 
5008 	int retval;
5009 
5010 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5011 	unsigned int plaintext_pad_len;
5012 	unsigned int plaintext_len;
5013 	unsigned int ciphertext_pad_len;
5014 	unsigned int ciphertext_len;
5015 
5016 	struct rte_cryptodev_info dev_info;
5017 
5018 	/* Verify the capabilities */
5019 	struct rte_cryptodev_sym_capability_idx cap_idx;
5020 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5021 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5022 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5023 			&cap_idx) == NULL)
5024 		return TEST_SKIPPED;
5025 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5026 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5027 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5028 			&cap_idx) == NULL)
5029 		return TEST_SKIPPED;
5030 
5031 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5032 		return TEST_SKIPPED;
5033 
5034 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5035 
5036 	uint64_t feat_flags = dev_info.feature_flags;
5037 
5038 	if (op_mode == OUT_OF_PLACE) {
5039 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5040 			printf("Device doesn't support digest encrypted.\n");
5041 			return TEST_SKIPPED;
5042 		}
5043 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5044 			return TEST_SKIPPED;
5045 	}
5046 
5047 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5048 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5049 		printf("Device doesn't support RAW data-path APIs.\n");
5050 		return TEST_SKIPPED;
5051 	}
5052 
5053 	/* Create SNOW 3G session */
5054 	retval = create_wireless_algo_auth_cipher_session(
5055 			ts_params->valid_devs[0],
5056 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5057 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5058 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5059 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5060 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5061 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5062 			tdata->key.data, tdata->key.len,
5063 			tdata->auth_iv.len, tdata->digest.len,
5064 			tdata->cipher_iv.len);
5065 	if (retval != 0)
5066 		return retval;
5067 
5068 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5069 	if (op_mode == OUT_OF_PLACE)
5070 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5071 
5072 	/* clear mbuf payload */
5073 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5074 		rte_pktmbuf_tailroom(ut_params->ibuf));
5075 	if (op_mode == OUT_OF_PLACE)
5076 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5077 			rte_pktmbuf_tailroom(ut_params->obuf));
5078 
5079 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5080 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5081 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5082 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5083 
5084 	if (verify) {
5085 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5086 					ciphertext_pad_len);
5087 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5088 		if (op_mode == OUT_OF_PLACE)
5089 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5090 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5091 			ciphertext_len);
5092 	} else {
5093 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5094 					plaintext_pad_len);
5095 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5096 		if (op_mode == OUT_OF_PLACE)
5097 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5098 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5099 	}
5100 
5101 	/* Create SNOW 3G operation */
5102 	retval = create_wireless_algo_auth_cipher_operation(
5103 		tdata->digest.data, tdata->digest.len,
5104 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5105 		tdata->auth_iv.data, tdata->auth_iv.len,
5106 		(tdata->digest.offset_bytes == 0 ?
5107 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5108 			: tdata->digest.offset_bytes),
5109 		tdata->validCipherLenInBits.len,
5110 		tdata->cipher.offset_bits,
5111 		tdata->validAuthLenInBits.len,
5112 		tdata->auth.offset_bits,
5113 		op_mode, 0, verify);
5114 
5115 	if (retval < 0)
5116 		return retval;
5117 
5118 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5119 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5120 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5121 	else
5122 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5123 			ut_params->op);
5124 
5125 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5126 
5127 	ut_params->obuf = (op_mode == IN_PLACE ?
5128 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5129 
5130 	if (verify) {
5131 		if (ut_params->obuf)
5132 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5133 							uint8_t *);
5134 		else
5135 			plaintext = ciphertext +
5136 				(tdata->cipher.offset_bits >> 3);
5137 
5138 		debug_hexdump(stdout, "plaintext:", plaintext,
5139 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5140 		debug_hexdump(stdout, "plaintext expected:",
5141 			tdata->plaintext.data,
5142 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5143 	} else {
5144 		if (ut_params->obuf)
5145 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5146 							uint8_t *);
5147 		else
5148 			ciphertext = plaintext;
5149 
5150 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5151 			ciphertext_len);
5152 		debug_hexdump(stdout, "ciphertext expected:",
5153 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5154 
5155 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5156 			+ (tdata->digest.offset_bytes == 0 ?
5157 		plaintext_pad_len : tdata->digest.offset_bytes);
5158 
5159 		debug_hexdump(stdout, "digest:", ut_params->digest,
5160 			tdata->digest.len);
5161 		debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5162 				tdata->digest.len);
5163 	}
5164 
5165 	/* Validate obuf */
5166 	if (verify) {
5167 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5168 			plaintext,
5169 			tdata->plaintext.data,
5170 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5171 			 (tdata->digest.len << 3)),
5172 			tdata->cipher.offset_bits,
5173 			"SNOW 3G Plaintext data not as expected");
5174 	} else {
5175 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5176 			ciphertext,
5177 			tdata->ciphertext.data,
5178 			(tdata->validDataLenInBits.len -
5179 			 tdata->cipher.offset_bits),
5180 			tdata->cipher.offset_bits,
5181 			"SNOW 3G Ciphertext data not as expected");
5182 
5183 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5184 			ut_params->digest,
5185 			tdata->digest.data,
5186 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5187 			"SNOW 3G Generated auth tag not as expected");
5188 	}
5189 	return 0;
5190 }
5191 
5192 static int
5193 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5194 	uint8_t op_mode, uint8_t verify)
5195 {
5196 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5197 	struct crypto_unittest_params *ut_params = &unittest_params;
5198 
5199 	int retval;
5200 
5201 	const uint8_t *plaintext = NULL;
5202 	const uint8_t *ciphertext = NULL;
5203 	const uint8_t *digest = NULL;
5204 	unsigned int plaintext_pad_len;
5205 	unsigned int plaintext_len;
5206 	unsigned int ciphertext_pad_len;
5207 	unsigned int ciphertext_len;
5208 	uint8_t buffer[10000];
5209 	uint8_t digest_buffer[10000];
5210 
5211 	struct rte_cryptodev_info dev_info;
5212 
5213 	/* Verify the capabilities */
5214 	struct rte_cryptodev_sym_capability_idx cap_idx;
5215 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5216 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5217 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5218 			&cap_idx) == NULL)
5219 		return TEST_SKIPPED;
5220 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5221 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5222 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5223 			&cap_idx) == NULL)
5224 		return TEST_SKIPPED;
5225 
5226 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5227 		return TEST_SKIPPED;
5228 
5229 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5230 
5231 	uint64_t feat_flags = dev_info.feature_flags;
5232 
5233 	if (op_mode == IN_PLACE) {
5234 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5235 			printf("Device doesn't support in-place scatter-gather "
5236 					"in both input and output mbufs.\n");
5237 			return TEST_SKIPPED;
5238 		}
5239 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5240 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5241 			printf("Device doesn't support RAW data-path APIs.\n");
5242 			return TEST_SKIPPED;
5243 		}
5244 	} else {
5245 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5246 			return TEST_SKIPPED;
5247 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5248 			printf("Device doesn't support out-of-place scatter-gather "
5249 					"in both input and output mbufs.\n");
5250 			return TEST_SKIPPED;
5251 		}
5252 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5253 			printf("Device doesn't support digest encrypted.\n");
5254 			return TEST_SKIPPED;
5255 		}
5256 	}
5257 
5258 	/* Create SNOW 3G session */
5259 	retval = create_wireless_algo_auth_cipher_session(
5260 			ts_params->valid_devs[0],
5261 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5262 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5263 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5264 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5265 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5266 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5267 			tdata->key.data, tdata->key.len,
5268 			tdata->auth_iv.len, tdata->digest.len,
5269 			tdata->cipher_iv.len);
5270 
5271 	if (retval != 0)
5272 		return retval;
5273 
5274 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5275 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5276 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5277 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5278 
5279 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5280 			plaintext_pad_len, 15, 0);
5281 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5282 			"Failed to allocate input buffer in mempool");
5283 
5284 	if (op_mode == OUT_OF_PLACE) {
5285 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5286 				plaintext_pad_len, 15, 0);
5287 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5288 				"Failed to allocate output buffer in mempool");
5289 	}
5290 
5291 	if (verify) {
5292 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5293 			tdata->ciphertext.data);
5294 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5295 					ciphertext_len, buffer);
5296 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5297 			ciphertext_len);
5298 	} else {
5299 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5300 			tdata->plaintext.data);
5301 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5302 					plaintext_len, buffer);
5303 		debug_hexdump(stdout, "plaintext:", plaintext,
5304 			plaintext_len);
5305 	}
5306 	memset(buffer, 0, sizeof(buffer));
5307 
5308 	/* Create SNOW 3G operation */
5309 	retval = create_wireless_algo_auth_cipher_operation(
5310 		tdata->digest.data, tdata->digest.len,
5311 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5312 		tdata->auth_iv.data, tdata->auth_iv.len,
5313 		(tdata->digest.offset_bytes == 0 ?
5314 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5315 			: tdata->digest.offset_bytes),
5316 		tdata->validCipherLenInBits.len,
5317 		tdata->cipher.offset_bits,
5318 		tdata->validAuthLenInBits.len,
5319 		tdata->auth.offset_bits,
5320 		op_mode, 1, verify);
5321 
5322 	if (retval < 0)
5323 		return retval;
5324 
5325 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5326 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5327 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5328 	else
5329 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5330 			ut_params->op);
5331 
5332 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5333 
5334 	ut_params->obuf = (op_mode == IN_PLACE ?
5335 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5336 
5337 	if (verify) {
5338 		if (ut_params->obuf)
5339 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5340 					plaintext_len, buffer);
5341 		else
5342 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5343 					plaintext_len, buffer);
5344 
5345 		debug_hexdump(stdout, "plaintext:", plaintext,
5346 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5347 		debug_hexdump(stdout, "plaintext expected:",
5348 			tdata->plaintext.data,
5349 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5350 	} else {
5351 		if (ut_params->obuf)
5352 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5353 					ciphertext_len, buffer);
5354 		else
5355 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5356 					ciphertext_len, buffer);
5357 
5358 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5359 			ciphertext_len);
5360 		debug_hexdump(stdout, "ciphertext expected:",
5361 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5362 
5363 		if (ut_params->obuf)
5364 			digest = rte_pktmbuf_read(ut_params->obuf,
5365 				(tdata->digest.offset_bytes == 0 ?
5366 				plaintext_pad_len : tdata->digest.offset_bytes),
5367 				tdata->digest.len, digest_buffer);
5368 		else
5369 			digest = rte_pktmbuf_read(ut_params->ibuf,
5370 				(tdata->digest.offset_bytes == 0 ?
5371 				plaintext_pad_len : tdata->digest.offset_bytes),
5372 				tdata->digest.len, digest_buffer);
5373 
5374 		debug_hexdump(stdout, "digest:", digest,
5375 			tdata->digest.len);
5376 		debug_hexdump(stdout, "digest expected:",
5377 			tdata->digest.data, tdata->digest.len);
5378 	}
5379 
5380 	/* Validate obuf */
5381 	if (verify) {
5382 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5383 			plaintext,
5384 			tdata->plaintext.data,
5385 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5386 			 (tdata->digest.len << 3)),
5387 			tdata->cipher.offset_bits,
5388 			"SNOW 3G Plaintext data not as expected");
5389 	} else {
5390 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5391 			ciphertext,
5392 			tdata->ciphertext.data,
5393 			(tdata->validDataLenInBits.len -
5394 			 tdata->cipher.offset_bits),
5395 			tdata->cipher.offset_bits,
5396 			"SNOW 3G Ciphertext data not as expected");
5397 
5398 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5399 			digest,
5400 			tdata->digest.data,
5401 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5402 			"SNOW 3G Generated auth tag not as expected");
5403 	}
5404 	return 0;
5405 }
5406 
5407 static int
5408 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5409 	uint8_t op_mode, uint8_t verify)
5410 {
5411 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5412 	struct crypto_unittest_params *ut_params = &unittest_params;
5413 
5414 	int retval;
5415 
5416 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5417 	unsigned int plaintext_pad_len;
5418 	unsigned int plaintext_len;
5419 	unsigned int ciphertext_pad_len;
5420 	unsigned int ciphertext_len;
5421 
5422 	struct rte_cryptodev_info dev_info;
5423 
5424 	/* Verify the capabilities */
5425 	struct rte_cryptodev_sym_capability_idx cap_idx;
5426 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5427 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5428 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5429 			&cap_idx) == NULL)
5430 		return TEST_SKIPPED;
5431 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5432 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5433 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5434 			&cap_idx) == NULL)
5435 		return TEST_SKIPPED;
5436 
5437 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5438 
5439 	uint64_t feat_flags = dev_info.feature_flags;
5440 
5441 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5442 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5443 		printf("Device doesn't support RAW data-path APIs.\n");
5444 		return TEST_SKIPPED;
5445 	}
5446 
5447 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5448 		return TEST_SKIPPED;
5449 
5450 	if (op_mode == OUT_OF_PLACE) {
5451 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5452 			return TEST_SKIPPED;
5453 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5454 			printf("Device doesn't support digest encrypted.\n");
5455 			return TEST_SKIPPED;
5456 		}
5457 	}
5458 
5459 	/* Create KASUMI session */
5460 	retval = create_wireless_algo_auth_cipher_session(
5461 			ts_params->valid_devs[0],
5462 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5463 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5464 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5465 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5466 			RTE_CRYPTO_AUTH_KASUMI_F9,
5467 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5468 			tdata->key.data, tdata->key.len,
5469 			0, tdata->digest.len,
5470 			tdata->cipher_iv.len);
5471 
5472 	if (retval != 0)
5473 		return retval;
5474 
5475 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5476 	if (op_mode == OUT_OF_PLACE)
5477 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5478 
5479 	/* clear mbuf payload */
5480 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5481 		rte_pktmbuf_tailroom(ut_params->ibuf));
5482 	if (op_mode == OUT_OF_PLACE)
5483 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5484 			rte_pktmbuf_tailroom(ut_params->obuf));
5485 
5486 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5487 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5488 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5489 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5490 
5491 	if (verify) {
5492 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5493 					ciphertext_pad_len);
5494 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5495 		if (op_mode == OUT_OF_PLACE)
5496 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5497 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5498 			ciphertext_len);
5499 	} else {
5500 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5501 					plaintext_pad_len);
5502 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5503 		if (op_mode == OUT_OF_PLACE)
5504 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5505 		debug_hexdump(stdout, "plaintext:", plaintext,
5506 			plaintext_len);
5507 	}
5508 
5509 	/* Create KASUMI operation */
5510 	retval = create_wireless_algo_auth_cipher_operation(
5511 		tdata->digest.data, tdata->digest.len,
5512 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5513 		NULL, 0,
5514 		(tdata->digest.offset_bytes == 0 ?
5515 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5516 			: tdata->digest.offset_bytes),
5517 		tdata->validCipherLenInBits.len,
5518 		tdata->validCipherOffsetInBits.len,
5519 		tdata->validAuthLenInBits.len,
5520 		0,
5521 		op_mode, 0, verify);
5522 
5523 	if (retval < 0)
5524 		return retval;
5525 
5526 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5527 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5528 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5529 	else
5530 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5531 			ut_params->op);
5532 
5533 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5534 
5535 	ut_params->obuf = (op_mode == IN_PLACE ?
5536 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5537 
5538 
5539 	if (verify) {
5540 		if (ut_params->obuf)
5541 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5542 							uint8_t *);
5543 		else
5544 			plaintext = ciphertext;
5545 
5546 		debug_hexdump(stdout, "plaintext:", plaintext,
5547 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5548 		debug_hexdump(stdout, "plaintext expected:",
5549 			tdata->plaintext.data,
5550 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5551 	} else {
5552 		if (ut_params->obuf)
5553 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5554 							uint8_t *);
5555 		else
5556 			ciphertext = plaintext;
5557 
5558 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5559 			ciphertext_len);
5560 		debug_hexdump(stdout, "ciphertext expected:",
5561 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5562 
5563 		ut_params->digest = rte_pktmbuf_mtod(
5564 			ut_params->obuf, uint8_t *) +
5565 			(tdata->digest.offset_bytes == 0 ?
5566 			plaintext_pad_len : tdata->digest.offset_bytes);
5567 
5568 		debug_hexdump(stdout, "digest:", ut_params->digest,
5569 			tdata->digest.len);
5570 		debug_hexdump(stdout, "digest expected:",
5571 			tdata->digest.data, tdata->digest.len);
5572 	}
5573 
5574 	/* Validate obuf */
5575 	if (verify) {
5576 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5577 			plaintext,
5578 			tdata->plaintext.data,
5579 			tdata->plaintext.len >> 3,
5580 			"KASUMI Plaintext data not as expected");
5581 	} else {
5582 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5583 			ciphertext,
5584 			tdata->ciphertext.data,
5585 			tdata->ciphertext.len >> 3,
5586 			"KASUMI Ciphertext data not as expected");
5587 
5588 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5589 			ut_params->digest,
5590 			tdata->digest.data,
5591 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5592 			"KASUMI Generated auth tag not as expected");
5593 	}
5594 	return 0;
5595 }
5596 
5597 static int
5598 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5599 	uint8_t op_mode, uint8_t verify)
5600 {
5601 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5602 	struct crypto_unittest_params *ut_params = &unittest_params;
5603 
5604 	int retval;
5605 
5606 	const uint8_t *plaintext = NULL;
5607 	const uint8_t *ciphertext = NULL;
5608 	const uint8_t *digest = NULL;
5609 	unsigned int plaintext_pad_len;
5610 	unsigned int plaintext_len;
5611 	unsigned int ciphertext_pad_len;
5612 	unsigned int ciphertext_len;
5613 	uint8_t buffer[10000];
5614 	uint8_t digest_buffer[10000];
5615 
5616 	struct rte_cryptodev_info dev_info;
5617 
5618 	/* Verify the capabilities */
5619 	struct rte_cryptodev_sym_capability_idx cap_idx;
5620 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5621 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5622 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5623 			&cap_idx) == NULL)
5624 		return TEST_SKIPPED;
5625 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5626 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5627 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5628 			&cap_idx) == NULL)
5629 		return TEST_SKIPPED;
5630 
5631 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5632 		return TEST_SKIPPED;
5633 
5634 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5635 
5636 	uint64_t feat_flags = dev_info.feature_flags;
5637 
5638 	if (op_mode == IN_PLACE) {
5639 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5640 			printf("Device doesn't support in-place scatter-gather "
5641 					"in both input and output mbufs.\n");
5642 			return TEST_SKIPPED;
5643 		}
5644 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5645 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5646 			printf("Device doesn't support RAW data-path APIs.\n");
5647 			return TEST_SKIPPED;
5648 		}
5649 	} else {
5650 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5651 			return TEST_SKIPPED;
5652 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5653 			printf("Device doesn't support out-of-place scatter-gather "
5654 					"in both input and output mbufs.\n");
5655 			return TEST_SKIPPED;
5656 		}
5657 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5658 			printf("Device doesn't support digest encrypted.\n");
5659 			return TEST_SKIPPED;
5660 		}
5661 	}
5662 
5663 	/* Create KASUMI session */
5664 	retval = create_wireless_algo_auth_cipher_session(
5665 			ts_params->valid_devs[0],
5666 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5667 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5668 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5669 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5670 			RTE_CRYPTO_AUTH_KASUMI_F9,
5671 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5672 			tdata->key.data, tdata->key.len,
5673 			0, tdata->digest.len,
5674 			tdata->cipher_iv.len);
5675 
5676 	if (retval != 0)
5677 		return retval;
5678 
5679 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5680 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5681 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5682 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5683 
5684 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5685 			plaintext_pad_len, 15, 0);
5686 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5687 			"Failed to allocate input buffer in mempool");
5688 
5689 	if (op_mode == OUT_OF_PLACE) {
5690 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5691 				plaintext_pad_len, 15, 0);
5692 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5693 				"Failed to allocate output buffer in mempool");
5694 	}
5695 
5696 	if (verify) {
5697 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5698 			tdata->ciphertext.data);
5699 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5700 					ciphertext_len, buffer);
5701 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5702 			ciphertext_len);
5703 	} else {
5704 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5705 			tdata->plaintext.data);
5706 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5707 					plaintext_len, buffer);
5708 		debug_hexdump(stdout, "plaintext:", plaintext,
5709 			plaintext_len);
5710 	}
5711 	memset(buffer, 0, sizeof(buffer));
5712 
5713 	/* Create KASUMI operation */
5714 	retval = create_wireless_algo_auth_cipher_operation(
5715 		tdata->digest.data, tdata->digest.len,
5716 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5717 		NULL, 0,
5718 		(tdata->digest.offset_bytes == 0 ?
5719 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5720 			: tdata->digest.offset_bytes),
5721 		tdata->validCipherLenInBits.len,
5722 		tdata->validCipherOffsetInBits.len,
5723 		tdata->validAuthLenInBits.len,
5724 		0,
5725 		op_mode, 1, verify);
5726 
5727 	if (retval < 0)
5728 		return retval;
5729 
5730 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5731 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5732 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5733 	else
5734 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5735 			ut_params->op);
5736 
5737 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5738 
5739 	ut_params->obuf = (op_mode == IN_PLACE ?
5740 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5741 
5742 	if (verify) {
5743 		if (ut_params->obuf)
5744 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5745 					plaintext_len, buffer);
5746 		else
5747 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5748 					plaintext_len, buffer);
5749 
5750 		debug_hexdump(stdout, "plaintext:", plaintext,
5751 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5752 		debug_hexdump(stdout, "plaintext expected:",
5753 			tdata->plaintext.data,
5754 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5755 	} else {
5756 		if (ut_params->obuf)
5757 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5758 					ciphertext_len, buffer);
5759 		else
5760 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5761 					ciphertext_len, buffer);
5762 
5763 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5764 			ciphertext_len);
5765 		debug_hexdump(stdout, "ciphertext expected:",
5766 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5767 
5768 		if (ut_params->obuf)
5769 			digest = rte_pktmbuf_read(ut_params->obuf,
5770 				(tdata->digest.offset_bytes == 0 ?
5771 				plaintext_pad_len : tdata->digest.offset_bytes),
5772 				tdata->digest.len, digest_buffer);
5773 		else
5774 			digest = rte_pktmbuf_read(ut_params->ibuf,
5775 				(tdata->digest.offset_bytes == 0 ?
5776 				plaintext_pad_len : tdata->digest.offset_bytes),
5777 				tdata->digest.len, digest_buffer);
5778 
5779 		debug_hexdump(stdout, "digest:", digest,
5780 			tdata->digest.len);
5781 		debug_hexdump(stdout, "digest expected:",
5782 			tdata->digest.data, tdata->digest.len);
5783 	}
5784 
5785 	/* Validate obuf */
5786 	if (verify) {
5787 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5788 			plaintext,
5789 			tdata->plaintext.data,
5790 			tdata->plaintext.len >> 3,
5791 			"KASUMI Plaintext data not as expected");
5792 	} else {
5793 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5794 			ciphertext,
5795 			tdata->ciphertext.data,
5796 			tdata->validDataLenInBits.len,
5797 			"KASUMI Ciphertext data not as expected");
5798 
5799 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5800 			digest,
5801 			tdata->digest.data,
5802 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5803 			"KASUMI Generated auth tag not as expected");
5804 	}
5805 	return 0;
5806 }
5807 
5808 static int
5809 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5810 {
5811 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5812 	struct crypto_unittest_params *ut_params = &unittest_params;
5813 
5814 	int retval;
5815 
5816 	uint8_t *plaintext, *ciphertext;
5817 	unsigned plaintext_pad_len;
5818 	unsigned plaintext_len;
5819 	struct rte_cryptodev_info dev_info;
5820 
5821 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5822 	uint64_t feat_flags = dev_info.feature_flags;
5823 
5824 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5825 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5826 		printf("Device doesn't support RAW data-path APIs.\n");
5827 		return TEST_SKIPPED;
5828 	}
5829 
5830 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5831 		return TEST_SKIPPED;
5832 
5833 	/* Verify the capabilities */
5834 	struct rte_cryptodev_sym_capability_idx cap_idx;
5835 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5836 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5837 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5838 			&cap_idx) == NULL)
5839 		return TEST_SKIPPED;
5840 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5841 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5842 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5843 			&cap_idx) == NULL)
5844 		return TEST_SKIPPED;
5845 
5846 	/* Create KASUMI session */
5847 	retval = create_wireless_algo_cipher_auth_session(
5848 			ts_params->valid_devs[0],
5849 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5850 			RTE_CRYPTO_AUTH_OP_GENERATE,
5851 			RTE_CRYPTO_AUTH_KASUMI_F9,
5852 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5853 			tdata->key.data, tdata->key.len,
5854 			0, tdata->digest.len,
5855 			tdata->cipher_iv.len);
5856 	if (retval != 0)
5857 		return retval;
5858 
5859 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5860 
5861 	/* clear mbuf payload */
5862 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5863 			rte_pktmbuf_tailroom(ut_params->ibuf));
5864 
5865 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5866 	/* Append data which is padded to a multiple of */
5867 	/* the algorithms block size */
5868 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5869 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5870 				plaintext_pad_len);
5871 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5872 
5873 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5874 
5875 	/* Create KASUMI operation */
5876 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5877 				tdata->digest.len, NULL, 0,
5878 				plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5879 				tdata->cipher_iv.data, tdata->cipher_iv.len,
5880 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5881 				tdata->validCipherOffsetInBits.len,
5882 				tdata->validAuthLenInBits.len,
5883 				0
5884 				);
5885 	if (retval < 0)
5886 		return retval;
5887 
5888 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5889 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5890 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5891 	else
5892 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5893 			ut_params->op);
5894 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5895 
5896 	if (ut_params->op->sym->m_dst)
5897 		ut_params->obuf = ut_params->op->sym->m_dst;
5898 	else
5899 		ut_params->obuf = ut_params->op->sym->m_src;
5900 
5901 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5902 				tdata->validCipherOffsetInBits.len >> 3);
5903 
5904 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5905 			+ plaintext_pad_len;
5906 
5907 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5908 				(tdata->validCipherOffsetInBits.len >> 3);
5909 	/* Validate obuf */
5910 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5911 		ciphertext,
5912 		reference_ciphertext,
5913 		tdata->validCipherLenInBits.len,
5914 		"KASUMI Ciphertext data not as expected");
5915 
5916 	/* Validate obuf */
5917 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5918 		ut_params->digest,
5919 		tdata->digest.data,
5920 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5921 		"KASUMI Generated auth tag not as expected");
5922 	return 0;
5923 }
5924 
5925 static int
5926 check_cipher_capability(const struct crypto_testsuite_params *ts_params,
5927 			const enum rte_crypto_cipher_algorithm cipher_algo,
5928 			const uint16_t key_size, const uint16_t iv_size)
5929 {
5930 	struct rte_cryptodev_sym_capability_idx cap_idx;
5931 	const struct rte_cryptodev_symmetric_capability *cap;
5932 
5933 	/* Check if device supports the algorithm */
5934 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5935 	cap_idx.algo.cipher = cipher_algo;
5936 
5937 	cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5938 			&cap_idx);
5939 
5940 	if (cap == NULL)
5941 		return -1;
5942 
5943 	/* Check if device supports key size and IV size */
5944 	if (rte_cryptodev_sym_capability_check_cipher(cap, key_size,
5945 			iv_size) < 0) {
5946 		return -1;
5947 	}
5948 
5949 	return 0;
5950 }
5951 
5952 static int
5953 check_auth_capability(const struct crypto_testsuite_params *ts_params,
5954 			const enum rte_crypto_auth_algorithm auth_algo,
5955 			const uint16_t key_size, const uint16_t iv_size,
5956 			const uint16_t tag_size)
5957 {
5958 	struct rte_cryptodev_sym_capability_idx cap_idx;
5959 	const struct rte_cryptodev_symmetric_capability *cap;
5960 
5961 	/* Check if device supports the algorithm */
5962 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5963 	cap_idx.algo.auth = auth_algo;
5964 
5965 	cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5966 			&cap_idx);
5967 
5968 	if (cap == NULL)
5969 		return -1;
5970 
5971 	/* Check if device supports key size and IV size */
5972 	if (rte_cryptodev_sym_capability_check_auth(cap, key_size,
5973 			tag_size, iv_size) < 0) {
5974 		return -1;
5975 	}
5976 
5977 	return 0;
5978 }
5979 
5980 static int
5981 test_zuc_encryption(const struct wireless_test_data *tdata)
5982 {
5983 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5984 	struct crypto_unittest_params *ut_params = &unittest_params;
5985 
5986 	int retval;
5987 	uint8_t *plaintext, *ciphertext;
5988 	unsigned plaintext_pad_len;
5989 	unsigned plaintext_len;
5990 	struct rte_cryptodev_info dev_info;
5991 
5992 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5993 	uint64_t feat_flags = dev_info.feature_flags;
5994 
5995 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5996 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5997 		printf("Device doesn't support RAW data-path APIs.\n");
5998 		return TEST_SKIPPED;
5999 	}
6000 
6001 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6002 		return TEST_SKIPPED;
6003 
6004 	/* Check if device supports ZUC EEA3 */
6005 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6006 			tdata->key.len, tdata->cipher_iv.len) < 0)
6007 		return TEST_SKIPPED;
6008 
6009 	/* Create ZUC session */
6010 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6011 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6012 					RTE_CRYPTO_CIPHER_ZUC_EEA3,
6013 					tdata->key.data, tdata->key.len,
6014 					tdata->cipher_iv.len);
6015 	if (retval != 0)
6016 		return retval;
6017 
6018 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6019 
6020 	/* Clear mbuf payload */
6021 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6022 	       rte_pktmbuf_tailroom(ut_params->ibuf));
6023 
6024 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6025 	/* Append data which is padded to a multiple */
6026 	/* of the algorithms block size */
6027 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6028 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6029 				plaintext_pad_len);
6030 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6031 
6032 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6033 
6034 	/* Create ZUC operation */
6035 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6036 					tdata->cipher_iv.len,
6037 					tdata->plaintext.len,
6038 					0);
6039 	if (retval < 0)
6040 		return retval;
6041 
6042 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6043 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6044 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6045 	else
6046 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6047 						ut_params->op);
6048 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6049 
6050 	ut_params->obuf = ut_params->op->sym->m_dst;
6051 	if (ut_params->obuf)
6052 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
6053 	else
6054 		ciphertext = plaintext;
6055 
6056 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6057 
6058 	/* Validate obuf */
6059 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6060 		ciphertext,
6061 		tdata->ciphertext.data,
6062 		tdata->validCipherLenInBits.len,
6063 		"ZUC Ciphertext data not as expected");
6064 	return 0;
6065 }
6066 
6067 static int
6068 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
6069 {
6070 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6071 	struct crypto_unittest_params *ut_params = &unittest_params;
6072 
6073 	int retval;
6074 
6075 	unsigned int plaintext_pad_len;
6076 	unsigned int plaintext_len;
6077 	const uint8_t *ciphertext;
6078 	uint8_t ciphertext_buffer[2048];
6079 	struct rte_cryptodev_info dev_info;
6080 
6081 	/* Check if device supports ZUC EEA3 */
6082 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6083 			tdata->key.len, tdata->cipher_iv.len) < 0)
6084 		return TEST_SKIPPED;
6085 
6086 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6087 		return TEST_SKIPPED;
6088 
6089 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6090 
6091 	uint64_t feat_flags = dev_info.feature_flags;
6092 
6093 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6094 		printf("Device doesn't support in-place scatter-gather. "
6095 				"Test Skipped.\n");
6096 		return TEST_SKIPPED;
6097 	}
6098 
6099 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6100 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6101 		printf("Device doesn't support RAW data-path APIs.\n");
6102 		return TEST_SKIPPED;
6103 	}
6104 
6105 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6106 
6107 	/* Append data which is padded to a multiple */
6108 	/* of the algorithms block size */
6109 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6110 
6111 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6112 			plaintext_pad_len, 10, 0);
6113 
6114 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6115 			tdata->plaintext.data);
6116 
6117 	/* Create ZUC session */
6118 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6119 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6120 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6121 			tdata->key.data, tdata->key.len,
6122 			tdata->cipher_iv.len);
6123 	if (retval < 0)
6124 		return retval;
6125 
6126 	/* Clear mbuf payload */
6127 
6128 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
6129 
6130 	/* Create ZUC operation */
6131 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6132 			tdata->cipher_iv.len, tdata->plaintext.len,
6133 			0);
6134 	if (retval < 0)
6135 		return retval;
6136 
6137 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6138 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6139 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6140 	else
6141 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6142 						ut_params->op);
6143 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6144 
6145 	ut_params->obuf = ut_params->op->sym->m_dst;
6146 	if (ut_params->obuf)
6147 		ciphertext = rte_pktmbuf_read(ut_params->obuf,
6148 			0, plaintext_len, ciphertext_buffer);
6149 	else
6150 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
6151 			0, plaintext_len, ciphertext_buffer);
6152 
6153 	/* Validate obuf */
6154 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6155 
6156 	/* Validate obuf */
6157 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6158 		ciphertext,
6159 		tdata->ciphertext.data,
6160 		tdata->validCipherLenInBits.len,
6161 		"ZUC Ciphertext data not as expected");
6162 
6163 	return 0;
6164 }
6165 
6166 static int
6167 test_zuc_authentication(const struct wireless_test_data *tdata)
6168 {
6169 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6170 	struct crypto_unittest_params *ut_params = &unittest_params;
6171 
6172 	int retval;
6173 	unsigned plaintext_pad_len;
6174 	unsigned plaintext_len;
6175 	uint8_t *plaintext;
6176 
6177 	struct rte_cryptodev_info dev_info;
6178 
6179 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6180 	uint64_t feat_flags = dev_info.feature_flags;
6181 
6182 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
6183 			(tdata->validAuthLenInBits.len % 8 != 0)) {
6184 		printf("Device doesn't support NON-Byte Aligned Data.\n");
6185 		return TEST_SKIPPED;
6186 	}
6187 
6188 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6189 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6190 		printf("Device doesn't support RAW data-path APIs.\n");
6191 		return TEST_SKIPPED;
6192 	}
6193 
6194 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6195 		return TEST_SKIPPED;
6196 
6197 	/* Check if device supports ZUC EIA3 */
6198 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6199 			tdata->key.len, tdata->auth_iv.len,
6200 			tdata->digest.len) < 0)
6201 		return TEST_SKIPPED;
6202 
6203 	/* Create ZUC session */
6204 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6205 			tdata->key.data, tdata->key.len,
6206 			tdata->auth_iv.len, tdata->digest.len,
6207 			RTE_CRYPTO_AUTH_OP_GENERATE,
6208 			RTE_CRYPTO_AUTH_ZUC_EIA3);
6209 	if (retval != 0)
6210 		return retval;
6211 
6212 	/* alloc mbuf and set payload */
6213 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6214 
6215 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6216 	rte_pktmbuf_tailroom(ut_params->ibuf));
6217 
6218 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6219 	/* Append data which is padded to a multiple of */
6220 	/* the algorithms block size */
6221 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6222 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6223 				plaintext_pad_len);
6224 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6225 
6226 	/* Create ZUC operation */
6227 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6228 			tdata->auth_iv.data, tdata->auth_iv.len,
6229 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6230 			tdata->validAuthLenInBits.len,
6231 			0);
6232 	if (retval < 0)
6233 		return retval;
6234 
6235 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6236 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6237 				ut_params->op, 0, 1, 1, 0);
6238 	else
6239 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6240 				ut_params->op);
6241 	ut_params->obuf = ut_params->op->sym->m_src;
6242 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6243 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6244 			+ plaintext_pad_len;
6245 
6246 	/* Validate obuf */
6247 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
6248 	ut_params->digest,
6249 	tdata->digest.data,
6250 	tdata->digest.len,
6251 	"ZUC Generated auth tag not as expected");
6252 
6253 	return 0;
6254 }
6255 
6256 static int
6257 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6258 	uint8_t op_mode, uint8_t verify)
6259 {
6260 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6261 	struct crypto_unittest_params *ut_params = &unittest_params;
6262 
6263 	int retval;
6264 
6265 	uint8_t *plaintext = NULL, *ciphertext = NULL;
6266 	unsigned int plaintext_pad_len;
6267 	unsigned int plaintext_len;
6268 	unsigned int ciphertext_pad_len;
6269 	unsigned int ciphertext_len;
6270 
6271 	struct rte_cryptodev_info dev_info;
6272 
6273 	/* Check if device supports ZUC EEA3 */
6274 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6275 			tdata->key.len, tdata->cipher_iv.len) < 0)
6276 		return TEST_SKIPPED;
6277 
6278 	/* Check if device supports ZUC EIA3 */
6279 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6280 			tdata->key.len, tdata->auth_iv.len,
6281 			tdata->digest.len) < 0)
6282 		return TEST_SKIPPED;
6283 
6284 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6285 
6286 	uint64_t feat_flags = dev_info.feature_flags;
6287 
6288 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6289 		printf("Device doesn't support digest encrypted.\n");
6290 		return TEST_SKIPPED;
6291 	}
6292 	if (op_mode == IN_PLACE) {
6293 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6294 			printf("Device doesn't support in-place scatter-gather "
6295 					"in both input and output mbufs.\n");
6296 			return TEST_SKIPPED;
6297 		}
6298 
6299 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6300 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6301 			printf("Device doesn't support RAW data-path APIs.\n");
6302 			return TEST_SKIPPED;
6303 		}
6304 	} else {
6305 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6306 			return TEST_SKIPPED;
6307 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6308 			printf("Device doesn't support out-of-place scatter-gather "
6309 					"in both input and output mbufs.\n");
6310 			return TEST_SKIPPED;
6311 		}
6312 	}
6313 
6314 	/* Create ZUC session */
6315 	retval = create_wireless_algo_auth_cipher_session(
6316 			ts_params->valid_devs[0],
6317 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6318 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6319 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6320 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6321 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6322 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6323 			tdata->key.data, tdata->key.len,
6324 			tdata->auth_iv.len, tdata->digest.len,
6325 			tdata->cipher_iv.len);
6326 
6327 	if (retval != 0)
6328 		return retval;
6329 
6330 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6331 	if (op_mode == OUT_OF_PLACE)
6332 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6333 
6334 	/* clear mbuf payload */
6335 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6336 		rte_pktmbuf_tailroom(ut_params->ibuf));
6337 	if (op_mode == OUT_OF_PLACE)
6338 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6339 			rte_pktmbuf_tailroom(ut_params->obuf));
6340 
6341 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6342 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6343 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6344 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6345 
6346 	if (verify) {
6347 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6348 					ciphertext_pad_len);
6349 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6350 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6351 			ciphertext_len);
6352 	} else {
6353 		/* make sure enough space to cover partial digest verify case */
6354 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6355 					ciphertext_pad_len);
6356 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6357 		debug_hexdump(stdout, "plaintext:", plaintext,
6358 			plaintext_len);
6359 	}
6360 
6361 	if (op_mode == OUT_OF_PLACE)
6362 		rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6363 
6364 	/* Create ZUC operation */
6365 	retval = create_wireless_algo_auth_cipher_operation(
6366 		tdata->digest.data, tdata->digest.len,
6367 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6368 		tdata->auth_iv.data, tdata->auth_iv.len,
6369 		(tdata->digest.offset_bytes == 0 ?
6370 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6371 			: tdata->digest.offset_bytes),
6372 		tdata->validCipherLenInBits.len,
6373 		tdata->validCipherOffsetInBits.len,
6374 		tdata->validAuthLenInBits.len,
6375 		0,
6376 		op_mode, 0, verify);
6377 
6378 	if (retval < 0)
6379 		return retval;
6380 
6381 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6382 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6383 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6384 	else
6385 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6386 			ut_params->op);
6387 
6388 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6389 
6390 	ut_params->obuf = (op_mode == IN_PLACE ?
6391 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6392 
6393 
6394 	if (verify) {
6395 		if (ut_params->obuf)
6396 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6397 							uint8_t *);
6398 		else
6399 			plaintext = ciphertext;
6400 
6401 		debug_hexdump(stdout, "plaintext:", plaintext,
6402 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6403 		debug_hexdump(stdout, "plaintext expected:",
6404 			tdata->plaintext.data,
6405 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6406 	} else {
6407 		if (ut_params->obuf)
6408 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6409 							uint8_t *);
6410 		else
6411 			ciphertext = plaintext;
6412 
6413 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6414 			ciphertext_len);
6415 		debug_hexdump(stdout, "ciphertext expected:",
6416 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6417 
6418 		ut_params->digest = rte_pktmbuf_mtod(
6419 			ut_params->obuf, uint8_t *) +
6420 			(tdata->digest.offset_bytes == 0 ?
6421 			plaintext_pad_len : tdata->digest.offset_bytes);
6422 
6423 		debug_hexdump(stdout, "digest:", ut_params->digest,
6424 			tdata->digest.len);
6425 		debug_hexdump(stdout, "digest expected:",
6426 			tdata->digest.data, tdata->digest.len);
6427 	}
6428 
6429 	/* Validate obuf */
6430 	if (verify) {
6431 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6432 			plaintext,
6433 			tdata->plaintext.data,
6434 			tdata->plaintext.len >> 3,
6435 			"ZUC Plaintext data not as expected");
6436 	} else {
6437 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6438 			ciphertext,
6439 			tdata->ciphertext.data,
6440 			tdata->ciphertext.len >> 3,
6441 			"ZUC Ciphertext data not as expected");
6442 
6443 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6444 			ut_params->digest,
6445 			tdata->digest.data,
6446 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6447 			"ZUC Generated auth tag not as expected");
6448 	}
6449 	return 0;
6450 }
6451 
6452 static int
6453 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6454 	uint8_t op_mode, uint8_t verify)
6455 {
6456 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6457 	struct crypto_unittest_params *ut_params = &unittest_params;
6458 
6459 	int retval;
6460 
6461 	const uint8_t *plaintext = NULL;
6462 	const uint8_t *ciphertext = NULL;
6463 	const uint8_t *digest = NULL;
6464 	unsigned int plaintext_pad_len;
6465 	unsigned int plaintext_len;
6466 	unsigned int ciphertext_pad_len;
6467 	unsigned int ciphertext_len;
6468 	uint8_t buffer[10000];
6469 	uint8_t digest_buffer[10000];
6470 
6471 	struct rte_cryptodev_info dev_info;
6472 
6473 	/* Check if device supports ZUC EEA3 */
6474 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6475 			tdata->key.len, tdata->cipher_iv.len) < 0)
6476 		return TEST_SKIPPED;
6477 
6478 	/* Check if device supports ZUC EIA3 */
6479 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6480 			tdata->key.len, tdata->auth_iv.len,
6481 			tdata->digest.len) < 0)
6482 		return TEST_SKIPPED;
6483 
6484 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6485 
6486 	uint64_t feat_flags = dev_info.feature_flags;
6487 
6488 	if (op_mode == IN_PLACE) {
6489 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6490 			printf("Device doesn't support in-place scatter-gather "
6491 					"in both input and output mbufs.\n");
6492 			return TEST_SKIPPED;
6493 		}
6494 
6495 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6496 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6497 			printf("Device doesn't support RAW data-path APIs.\n");
6498 			return TEST_SKIPPED;
6499 		}
6500 	} else {
6501 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6502 			return TEST_SKIPPED;
6503 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6504 			printf("Device doesn't support out-of-place scatter-gather "
6505 					"in both input and output mbufs.\n");
6506 			return TEST_SKIPPED;
6507 		}
6508 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6509 			printf("Device doesn't support digest encrypted.\n");
6510 			return TEST_SKIPPED;
6511 		}
6512 	}
6513 
6514 	/* Create ZUC session */
6515 	retval = create_wireless_algo_auth_cipher_session(
6516 			ts_params->valid_devs[0],
6517 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6518 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6519 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6520 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6521 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6522 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6523 			tdata->key.data, tdata->key.len,
6524 			tdata->auth_iv.len, tdata->digest.len,
6525 			tdata->cipher_iv.len);
6526 
6527 	if (retval != 0)
6528 		return retval;
6529 
6530 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6531 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6532 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6533 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6534 
6535 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6536 			plaintext_pad_len, 15, 0);
6537 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6538 			"Failed to allocate input buffer in mempool");
6539 
6540 	if (op_mode == OUT_OF_PLACE) {
6541 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6542 				plaintext_pad_len, 15, 0);
6543 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
6544 				"Failed to allocate output buffer in mempool");
6545 	}
6546 
6547 	if (verify) {
6548 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6549 			tdata->ciphertext.data);
6550 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6551 					ciphertext_len, buffer);
6552 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6553 			ciphertext_len);
6554 	} else {
6555 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6556 			tdata->plaintext.data);
6557 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6558 					plaintext_len, buffer);
6559 		debug_hexdump(stdout, "plaintext:", plaintext,
6560 			plaintext_len);
6561 	}
6562 	memset(buffer, 0, sizeof(buffer));
6563 
6564 	/* Create ZUC operation */
6565 	retval = create_wireless_algo_auth_cipher_operation(
6566 		tdata->digest.data, tdata->digest.len,
6567 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6568 		NULL, 0,
6569 		(tdata->digest.offset_bytes == 0 ?
6570 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6571 			: tdata->digest.offset_bytes),
6572 		tdata->validCipherLenInBits.len,
6573 		tdata->validCipherOffsetInBits.len,
6574 		tdata->validAuthLenInBits.len,
6575 		0,
6576 		op_mode, 1, verify);
6577 
6578 	if (retval < 0)
6579 		return retval;
6580 
6581 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6582 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6583 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6584 	else
6585 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6586 			ut_params->op);
6587 
6588 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6589 
6590 	ut_params->obuf = (op_mode == IN_PLACE ?
6591 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6592 
6593 	if (verify) {
6594 		if (ut_params->obuf)
6595 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6596 					plaintext_len, buffer);
6597 		else
6598 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6599 					plaintext_len, buffer);
6600 
6601 		debug_hexdump(stdout, "plaintext:", plaintext,
6602 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6603 		debug_hexdump(stdout, "plaintext expected:",
6604 			tdata->plaintext.data,
6605 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6606 	} else {
6607 		if (ut_params->obuf)
6608 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6609 					ciphertext_len, buffer);
6610 		else
6611 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6612 					ciphertext_len, buffer);
6613 
6614 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6615 			ciphertext_len);
6616 		debug_hexdump(stdout, "ciphertext expected:",
6617 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6618 
6619 		if (ut_params->obuf)
6620 			digest = rte_pktmbuf_read(ut_params->obuf,
6621 				(tdata->digest.offset_bytes == 0 ?
6622 				plaintext_pad_len : tdata->digest.offset_bytes),
6623 				tdata->digest.len, digest_buffer);
6624 		else
6625 			digest = rte_pktmbuf_read(ut_params->ibuf,
6626 				(tdata->digest.offset_bytes == 0 ?
6627 				plaintext_pad_len : tdata->digest.offset_bytes),
6628 				tdata->digest.len, digest_buffer);
6629 
6630 		debug_hexdump(stdout, "digest:", digest,
6631 			tdata->digest.len);
6632 		debug_hexdump(stdout, "digest expected:",
6633 			tdata->digest.data, tdata->digest.len);
6634 	}
6635 
6636 	/* Validate obuf */
6637 	if (verify) {
6638 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6639 			plaintext,
6640 			tdata->plaintext.data,
6641 			tdata->plaintext.len >> 3,
6642 			"ZUC Plaintext data not as expected");
6643 	} else {
6644 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6645 			ciphertext,
6646 			tdata->ciphertext.data,
6647 			tdata->validDataLenInBits.len,
6648 			"ZUC Ciphertext data not as expected");
6649 
6650 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6651 			digest,
6652 			tdata->digest.data,
6653 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6654 			"ZUC Generated auth tag not as expected");
6655 	}
6656 	return 0;
6657 }
6658 
6659 static int
6660 test_kasumi_encryption_test_case_1(void)
6661 {
6662 	return test_kasumi_encryption(&kasumi_test_case_1);
6663 }
6664 
6665 static int
6666 test_kasumi_encryption_test_case_1_sgl(void)
6667 {
6668 	return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6669 }
6670 
6671 static int
6672 test_kasumi_encryption_test_case_1_oop(void)
6673 {
6674 	return test_kasumi_encryption_oop(&kasumi_test_case_1);
6675 }
6676 
6677 static int
6678 test_kasumi_encryption_test_case_1_oop_sgl(void)
6679 {
6680 	return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6681 }
6682 
6683 static int
6684 test_kasumi_encryption_test_case_2(void)
6685 {
6686 	return test_kasumi_encryption(&kasumi_test_case_2);
6687 }
6688 
6689 static int
6690 test_kasumi_encryption_test_case_3(void)
6691 {
6692 	return test_kasumi_encryption(&kasumi_test_case_3);
6693 }
6694 
6695 static int
6696 test_kasumi_encryption_test_case_4(void)
6697 {
6698 	return test_kasumi_encryption(&kasumi_test_case_4);
6699 }
6700 
6701 static int
6702 test_kasumi_encryption_test_case_5(void)
6703 {
6704 	return test_kasumi_encryption(&kasumi_test_case_5);
6705 }
6706 
6707 static int
6708 test_kasumi_decryption_test_case_1(void)
6709 {
6710 	return test_kasumi_decryption(&kasumi_test_case_1);
6711 }
6712 
6713 static int
6714 test_kasumi_decryption_test_case_1_oop(void)
6715 {
6716 	return test_kasumi_decryption_oop(&kasumi_test_case_1);
6717 }
6718 
6719 static int
6720 test_kasumi_decryption_test_case_2(void)
6721 {
6722 	return test_kasumi_decryption(&kasumi_test_case_2);
6723 }
6724 
6725 static int
6726 test_kasumi_decryption_test_case_3(void)
6727 {
6728 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6729 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6730 		return TEST_SKIPPED;
6731 	return test_kasumi_decryption(&kasumi_test_case_3);
6732 }
6733 
6734 static int
6735 test_kasumi_decryption_test_case_4(void)
6736 {
6737 	return test_kasumi_decryption(&kasumi_test_case_4);
6738 }
6739 
6740 static int
6741 test_kasumi_decryption_test_case_5(void)
6742 {
6743 	return test_kasumi_decryption(&kasumi_test_case_5);
6744 }
6745 static int
6746 test_snow3g_encryption_test_case_1(void)
6747 {
6748 	return test_snow3g_encryption(&snow3g_test_case_1);
6749 }
6750 
6751 static int
6752 test_snow3g_encryption_test_case_1_oop(void)
6753 {
6754 	return test_snow3g_encryption_oop(&snow3g_test_case_1);
6755 }
6756 
6757 static int
6758 test_snow3g_encryption_test_case_1_oop_sgl(void)
6759 {
6760 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6761 }
6762 
6763 
6764 static int
6765 test_snow3g_encryption_test_case_1_offset_oop(void)
6766 {
6767 	return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6768 }
6769 
6770 static int
6771 test_snow3g_encryption_test_case_2(void)
6772 {
6773 	return test_snow3g_encryption(&snow3g_test_case_2);
6774 }
6775 
6776 static int
6777 test_snow3g_encryption_test_case_3(void)
6778 {
6779 	return test_snow3g_encryption(&snow3g_test_case_3);
6780 }
6781 
6782 static int
6783 test_snow3g_encryption_test_case_4(void)
6784 {
6785 	return test_snow3g_encryption(&snow3g_test_case_4);
6786 }
6787 
6788 static int
6789 test_snow3g_encryption_test_case_5(void)
6790 {
6791 	return test_snow3g_encryption(&snow3g_test_case_5);
6792 }
6793 
6794 static int
6795 test_snow3g_decryption_test_case_1(void)
6796 {
6797 	return test_snow3g_decryption(&snow3g_test_case_1);
6798 }
6799 
6800 static int
6801 test_snow3g_decryption_test_case_1_oop(void)
6802 {
6803 	return test_snow3g_decryption_oop(&snow3g_test_case_1);
6804 }
6805 
6806 static int
6807 test_snow3g_decryption_test_case_2(void)
6808 {
6809 	return test_snow3g_decryption(&snow3g_test_case_2);
6810 }
6811 
6812 static int
6813 test_snow3g_decryption_test_case_3(void)
6814 {
6815 	return test_snow3g_decryption(&snow3g_test_case_3);
6816 }
6817 
6818 static int
6819 test_snow3g_decryption_test_case_4(void)
6820 {
6821 	return test_snow3g_decryption(&snow3g_test_case_4);
6822 }
6823 
6824 static int
6825 test_snow3g_decryption_test_case_5(void)
6826 {
6827 	return test_snow3g_decryption(&snow3g_test_case_5);
6828 }
6829 
6830 /*
6831  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6832  * Pattern digest from snow3g_test_data must be allocated as
6833  * 4 last bytes in plaintext.
6834  */
6835 static void
6836 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6837 		struct snow3g_hash_test_data *output)
6838 {
6839 	if ((pattern != NULL) && (output != NULL)) {
6840 		output->key.len = pattern->key.len;
6841 
6842 		memcpy(output->key.data,
6843 		pattern->key.data, pattern->key.len);
6844 
6845 		output->auth_iv.len = pattern->auth_iv.len;
6846 
6847 		memcpy(output->auth_iv.data,
6848 		pattern->auth_iv.data, pattern->auth_iv.len);
6849 
6850 		output->plaintext.len = pattern->plaintext.len;
6851 
6852 		memcpy(output->plaintext.data,
6853 		pattern->plaintext.data, pattern->plaintext.len >> 3);
6854 
6855 		output->digest.len = pattern->digest.len;
6856 
6857 		memcpy(output->digest.data,
6858 		&pattern->plaintext.data[pattern->digest.offset_bytes],
6859 		pattern->digest.len);
6860 
6861 		output->validAuthLenInBits.len =
6862 		pattern->validAuthLenInBits.len;
6863 	}
6864 }
6865 
6866 /*
6867  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6868  */
6869 static int
6870 test_snow3g_decryption_with_digest_test_case_1(void)
6871 {
6872 	struct snow3g_hash_test_data snow3g_hash_data;
6873 	struct rte_cryptodev_info dev_info;
6874 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6875 
6876 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6877 	uint64_t feat_flags = dev_info.feature_flags;
6878 
6879 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6880 		printf("Device doesn't support encrypted digest operations.\n");
6881 		return TEST_SKIPPED;
6882 	}
6883 
6884 	/*
6885 	 * Function prepare data for hash verification test case.
6886 	 * Digest is allocated in 4 last bytes in plaintext, pattern.
6887 	 */
6888 	snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6889 
6890 	return test_snow3g_decryption(&snow3g_test_case_7) &
6891 			test_snow3g_authentication_verify(&snow3g_hash_data);
6892 }
6893 
6894 static int
6895 test_snow3g_cipher_auth_test_case_1(void)
6896 {
6897 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
6898 }
6899 
6900 static int
6901 test_snow3g_auth_cipher_test_case_1(void)
6902 {
6903 	return test_snow3g_auth_cipher(
6904 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6905 }
6906 
6907 static int
6908 test_snow3g_auth_cipher_test_case_2(void)
6909 {
6910 	return test_snow3g_auth_cipher(
6911 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6912 }
6913 
6914 static int
6915 test_snow3g_auth_cipher_test_case_2_oop(void)
6916 {
6917 	return test_snow3g_auth_cipher(
6918 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6919 }
6920 
6921 static int
6922 test_snow3g_auth_cipher_part_digest_enc(void)
6923 {
6924 	return test_snow3g_auth_cipher(
6925 		&snow3g_auth_cipher_partial_digest_encryption,
6926 			IN_PLACE, 0);
6927 }
6928 
6929 static int
6930 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6931 {
6932 	return test_snow3g_auth_cipher(
6933 		&snow3g_auth_cipher_partial_digest_encryption,
6934 			OUT_OF_PLACE, 0);
6935 }
6936 
6937 static int
6938 test_snow3g_auth_cipher_test_case_3_sgl(void)
6939 {
6940 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6941 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6942 		return TEST_SKIPPED;
6943 	return test_snow3g_auth_cipher_sgl(
6944 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6945 }
6946 
6947 static int
6948 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6949 {
6950 	return test_snow3g_auth_cipher_sgl(
6951 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6952 }
6953 
6954 static int
6955 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6956 {
6957 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6958 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6959 		return TEST_SKIPPED;
6960 	return test_snow3g_auth_cipher_sgl(
6961 		&snow3g_auth_cipher_partial_digest_encryption,
6962 			IN_PLACE, 0);
6963 }
6964 
6965 static int
6966 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6967 {
6968 	return test_snow3g_auth_cipher_sgl(
6969 		&snow3g_auth_cipher_partial_digest_encryption,
6970 			OUT_OF_PLACE, 0);
6971 }
6972 
6973 static int
6974 test_snow3g_auth_cipher_verify_test_case_1(void)
6975 {
6976 	return test_snow3g_auth_cipher(
6977 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6978 }
6979 
6980 static int
6981 test_snow3g_auth_cipher_verify_test_case_2(void)
6982 {
6983 	return test_snow3g_auth_cipher(
6984 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6985 }
6986 
6987 static int
6988 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6989 {
6990 	return test_snow3g_auth_cipher(
6991 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6992 }
6993 
6994 static int
6995 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6996 {
6997 	return test_snow3g_auth_cipher(
6998 		&snow3g_auth_cipher_partial_digest_encryption,
6999 			IN_PLACE, 1);
7000 }
7001 
7002 static int
7003 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
7004 {
7005 	return test_snow3g_auth_cipher(
7006 		&snow3g_auth_cipher_partial_digest_encryption,
7007 			OUT_OF_PLACE, 1);
7008 }
7009 
7010 static int
7011 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
7012 {
7013 	return test_snow3g_auth_cipher_sgl(
7014 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
7015 }
7016 
7017 static int
7018 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
7019 {
7020 	return test_snow3g_auth_cipher_sgl(
7021 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
7022 }
7023 
7024 static int
7025 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
7026 {
7027 	return test_snow3g_auth_cipher_sgl(
7028 		&snow3g_auth_cipher_partial_digest_encryption,
7029 			IN_PLACE, 1);
7030 }
7031 
7032 static int
7033 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
7034 {
7035 	return test_snow3g_auth_cipher_sgl(
7036 		&snow3g_auth_cipher_partial_digest_encryption,
7037 			OUT_OF_PLACE, 1);
7038 }
7039 
7040 static int
7041 test_snow3g_auth_cipher_with_digest_test_case_1(void)
7042 {
7043 	return test_snow3g_auth_cipher(
7044 		&snow3g_test_case_7, IN_PLACE, 0);
7045 }
7046 
7047 static int
7048 test_kasumi_auth_cipher_test_case_1(void)
7049 {
7050 	return test_kasumi_auth_cipher(
7051 		&kasumi_test_case_3, IN_PLACE, 0);
7052 }
7053 
7054 static int
7055 test_kasumi_auth_cipher_test_case_2(void)
7056 {
7057 	return test_kasumi_auth_cipher(
7058 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7059 }
7060 
7061 static int
7062 test_kasumi_auth_cipher_test_case_2_oop(void)
7063 {
7064 	return test_kasumi_auth_cipher(
7065 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7066 }
7067 
7068 static int
7069 test_kasumi_auth_cipher_test_case_2_sgl(void)
7070 {
7071 	return test_kasumi_auth_cipher_sgl(
7072 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7073 }
7074 
7075 static int
7076 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
7077 {
7078 	return test_kasumi_auth_cipher_sgl(
7079 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7080 }
7081 
7082 static int
7083 test_kasumi_auth_cipher_verify_test_case_1(void)
7084 {
7085 	return test_kasumi_auth_cipher(
7086 		&kasumi_test_case_3, IN_PLACE, 1);
7087 }
7088 
7089 static int
7090 test_kasumi_auth_cipher_verify_test_case_2(void)
7091 {
7092 	return test_kasumi_auth_cipher(
7093 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7094 }
7095 
7096 static int
7097 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
7098 {
7099 	return test_kasumi_auth_cipher(
7100 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7101 }
7102 
7103 static int
7104 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
7105 {
7106 	return test_kasumi_auth_cipher_sgl(
7107 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7108 }
7109 
7110 static int
7111 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
7112 {
7113 	return test_kasumi_auth_cipher_sgl(
7114 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7115 }
7116 
7117 static int
7118 test_kasumi_cipher_auth_test_case_1(void)
7119 {
7120 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
7121 }
7122 
7123 static int
7124 test_zuc_encryption_test_case_1(void)
7125 {
7126 	return test_zuc_encryption(&zuc_test_case_cipher_193b);
7127 }
7128 
7129 static int
7130 test_zuc_encryption_test_case_2(void)
7131 {
7132 	return test_zuc_encryption(&zuc_test_case_cipher_800b);
7133 }
7134 
7135 static int
7136 test_zuc_encryption_test_case_3(void)
7137 {
7138 	return test_zuc_encryption(&zuc_test_case_cipher_1570b);
7139 }
7140 
7141 static int
7142 test_zuc_encryption_test_case_4(void)
7143 {
7144 	return test_zuc_encryption(&zuc_test_case_cipher_2798b);
7145 }
7146 
7147 static int
7148 test_zuc_encryption_test_case_5(void)
7149 {
7150 	return test_zuc_encryption(&zuc_test_case_cipher_4019b);
7151 }
7152 
7153 static int
7154 test_zuc_encryption_test_case_6_sgl(void)
7155 {
7156 	return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
7157 }
7158 
7159 static int
7160 test_zuc_hash_generate_test_case_1(void)
7161 {
7162 	return test_zuc_authentication(&zuc_test_case_auth_1b);
7163 }
7164 
7165 static int
7166 test_zuc_hash_generate_test_case_2(void)
7167 {
7168 	return test_zuc_authentication(&zuc_test_case_auth_90b);
7169 }
7170 
7171 static int
7172 test_zuc_hash_generate_test_case_3(void)
7173 {
7174 	return test_zuc_authentication(&zuc_test_case_auth_577b);
7175 }
7176 
7177 static int
7178 test_zuc_hash_generate_test_case_4(void)
7179 {
7180 	return test_zuc_authentication(&zuc_test_case_auth_2079b);
7181 }
7182 
7183 static int
7184 test_zuc_hash_generate_test_case_5(void)
7185 {
7186 	return test_zuc_authentication(&zuc_test_auth_5670b);
7187 }
7188 
7189 static int
7190 test_zuc_hash_generate_test_case_6(void)
7191 {
7192 	return test_zuc_authentication(&zuc_test_case_auth_128b);
7193 }
7194 
7195 static int
7196 test_zuc_hash_generate_test_case_7(void)
7197 {
7198 	return test_zuc_authentication(&zuc_test_case_auth_2080b);
7199 }
7200 
7201 static int
7202 test_zuc_hash_generate_test_case_8(void)
7203 {
7204 	return test_zuc_authentication(&zuc_test_case_auth_584b);
7205 }
7206 
7207 static int
7208 test_zuc_hash_generate_test_case_9(void)
7209 {
7210 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_32b);
7211 }
7212 
7213 static int
7214 test_zuc_hash_generate_test_case_10(void)
7215 {
7216 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_64b);
7217 }
7218 
7219 static int
7220 test_zuc_hash_generate_test_case_11(void)
7221 {
7222 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_128b);
7223 }
7224 
7225 static int
7226 test_zuc_cipher_auth_test_case_1(void)
7227 {
7228 	return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7229 }
7230 
7231 static int
7232 test_zuc_cipher_auth_test_case_2(void)
7233 {
7234 	return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7235 }
7236 
7237 static int
7238 test_zuc_auth_cipher_test_case_1(void)
7239 {
7240 	return test_zuc_auth_cipher(
7241 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7242 }
7243 
7244 static int
7245 test_zuc_auth_cipher_test_case_1_oop(void)
7246 {
7247 	return test_zuc_auth_cipher(
7248 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7249 }
7250 
7251 static int
7252 test_zuc_auth_cipher_test_case_1_sgl(void)
7253 {
7254 	return test_zuc_auth_cipher_sgl(
7255 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7256 }
7257 
7258 static int
7259 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7260 {
7261 	return test_zuc_auth_cipher_sgl(
7262 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7263 }
7264 
7265 static int
7266 test_zuc_auth_cipher_verify_test_case_1(void)
7267 {
7268 	return test_zuc_auth_cipher(
7269 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7270 }
7271 
7272 static int
7273 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7274 {
7275 	return test_zuc_auth_cipher(
7276 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7277 }
7278 
7279 static int
7280 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7281 {
7282 	return test_zuc_auth_cipher_sgl(
7283 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7284 }
7285 
7286 static int
7287 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7288 {
7289 	return test_zuc_auth_cipher_sgl(
7290 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7291 }
7292 
7293 static int
7294 test_zuc256_encryption_test_case_1(void)
7295 {
7296 	return test_zuc_encryption(&zuc256_test_case_cipher_1);
7297 }
7298 
7299 static int
7300 test_zuc256_encryption_test_case_2(void)
7301 {
7302 	return test_zuc_encryption(&zuc256_test_case_cipher_2);
7303 }
7304 
7305 static int
7306 test_zuc256_authentication_test_case_1(void)
7307 {
7308 	return test_zuc_authentication(&zuc256_test_case_auth_1);
7309 }
7310 
7311 static int
7312 test_zuc256_authentication_test_case_2(void)
7313 {
7314 	return test_zuc_authentication(&zuc256_test_case_auth_2);
7315 }
7316 
7317 static int
7318 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7319 {
7320 	uint8_t dev_id = testsuite_params.valid_devs[0];
7321 
7322 	struct rte_cryptodev_sym_capability_idx cap_idx;
7323 
7324 	/* Check if device supports particular cipher algorithm */
7325 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7326 	cap_idx.algo.cipher = tdata->cipher_algo;
7327 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7328 		return TEST_SKIPPED;
7329 
7330 	/* Check if device supports particular hash algorithm */
7331 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7332 	cap_idx.algo.auth = tdata->auth_algo;
7333 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7334 		return TEST_SKIPPED;
7335 
7336 	return 0;
7337 }
7338 
7339 static int
7340 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7341 	uint8_t op_mode, uint8_t verify)
7342 {
7343 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7344 	struct crypto_unittest_params *ut_params = &unittest_params;
7345 
7346 	int retval;
7347 
7348 	uint8_t *plaintext = NULL, *ciphertext = NULL;
7349 	unsigned int plaintext_pad_len;
7350 	unsigned int plaintext_len;
7351 	unsigned int ciphertext_pad_len;
7352 	unsigned int ciphertext_len;
7353 
7354 	struct rte_cryptodev_info dev_info;
7355 	struct rte_crypto_op *op;
7356 
7357 	/* Check if device supports particular algorithms separately */
7358 	if (test_mixed_check_if_unsupported(tdata))
7359 		return TEST_SKIPPED;
7360 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7361 		return TEST_SKIPPED;
7362 
7363 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7364 
7365 	uint64_t feat_flags = dev_info.feature_flags;
7366 
7367 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7368 		printf("Device doesn't support digest encrypted.\n");
7369 		return TEST_SKIPPED;
7370 	}
7371 
7372 	/* Create the session */
7373 	if (verify)
7374 		retval = create_wireless_algo_cipher_auth_session(
7375 				ts_params->valid_devs[0],
7376 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7377 				RTE_CRYPTO_AUTH_OP_VERIFY,
7378 				tdata->auth_algo,
7379 				tdata->cipher_algo,
7380 				tdata->auth_key.data, tdata->auth_key.len,
7381 				tdata->auth_iv.len, tdata->digest_enc.len,
7382 				tdata->cipher_iv.len);
7383 	else
7384 		retval = create_wireless_algo_auth_cipher_session(
7385 				ts_params->valid_devs[0],
7386 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7387 				RTE_CRYPTO_AUTH_OP_GENERATE,
7388 				tdata->auth_algo,
7389 				tdata->cipher_algo,
7390 				tdata->auth_key.data, tdata->auth_key.len,
7391 				tdata->auth_iv.len, tdata->digest_enc.len,
7392 				tdata->cipher_iv.len);
7393 	if (retval != 0)
7394 		return retval;
7395 
7396 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7397 	if (op_mode == OUT_OF_PLACE)
7398 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7399 
7400 	/* clear mbuf payload */
7401 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7402 		rte_pktmbuf_tailroom(ut_params->ibuf));
7403 	if (op_mode == OUT_OF_PLACE) {
7404 
7405 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7406 				rte_pktmbuf_tailroom(ut_params->obuf));
7407 	}
7408 
7409 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7410 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7411 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7412 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7413 
7414 	if (verify) {
7415 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7416 				ciphertext_pad_len);
7417 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7418 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7419 				ciphertext_len);
7420 	} else {
7421 		/* make sure enough space to cover partial digest verify case */
7422 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7423 				ciphertext_pad_len);
7424 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7425 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7426 	}
7427 
7428 	if (op_mode == OUT_OF_PLACE)
7429 		rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7430 
7431 	/* Create the operation */
7432 	retval = create_wireless_algo_auth_cipher_operation(
7433 			tdata->digest_enc.data, tdata->digest_enc.len,
7434 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7435 			tdata->auth_iv.data, tdata->auth_iv.len,
7436 			(tdata->digest_enc.offset == 0 ?
7437 				plaintext_pad_len
7438 				: tdata->digest_enc.offset),
7439 			tdata->validCipherLen.len_bits,
7440 			tdata->cipher.offset_bits,
7441 			tdata->validAuthLen.len_bits,
7442 			tdata->auth.offset_bits,
7443 			op_mode, 0, verify);
7444 
7445 	if (retval < 0)
7446 		return retval;
7447 
7448 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7449 
7450 	/* Check if the op failed because the device doesn't */
7451 	/* support this particular combination of algorithms */
7452 	if (op == NULL && ut_params->op->status ==
7453 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7454 		printf("Device doesn't support this mixed combination. "
7455 				"Test Skipped.\n");
7456 		return TEST_SKIPPED;
7457 	}
7458 	ut_params->op = op;
7459 
7460 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7461 
7462 	ut_params->obuf = (op_mode == IN_PLACE ?
7463 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7464 
7465 	if (verify) {
7466 		if (ut_params->obuf)
7467 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7468 							uint8_t *);
7469 		else
7470 			plaintext = ciphertext +
7471 					(tdata->cipher.offset_bits >> 3);
7472 
7473 		debug_hexdump(stdout, "plaintext:", plaintext,
7474 				tdata->plaintext.len_bits >> 3);
7475 		debug_hexdump(stdout, "plaintext expected:",
7476 				tdata->plaintext.data,
7477 				tdata->plaintext.len_bits >> 3);
7478 	} else {
7479 		if (ut_params->obuf)
7480 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7481 					uint8_t *);
7482 		else
7483 			ciphertext = plaintext;
7484 
7485 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7486 				ciphertext_len);
7487 		debug_hexdump(stdout, "ciphertext expected:",
7488 				tdata->ciphertext.data,
7489 				tdata->ciphertext.len_bits >> 3);
7490 
7491 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7492 				+ (tdata->digest_enc.offset == 0 ?
7493 		plaintext_pad_len : tdata->digest_enc.offset);
7494 
7495 		debug_hexdump(stdout, "digest:", ut_params->digest,
7496 				tdata->digest_enc.len);
7497 		debug_hexdump(stdout, "digest expected:",
7498 				tdata->digest_enc.data,
7499 				tdata->digest_enc.len);
7500 	}
7501 
7502 	if (!verify) {
7503 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7504 				ut_params->digest,
7505 				tdata->digest_enc.data,
7506 				tdata->digest_enc.len,
7507 				"Generated auth tag not as expected");
7508 	}
7509 
7510 	if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
7511 		if (verify) {
7512 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7513 					plaintext,
7514 					tdata->plaintext.data,
7515 					tdata->plaintext.len_bits >> 3,
7516 					"Plaintext data not as expected");
7517 		} else {
7518 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7519 					ciphertext,
7520 					tdata->ciphertext.data,
7521 					tdata->validDataLen.len_bits,
7522 					"Ciphertext data not as expected");
7523 		}
7524 	}
7525 
7526 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7527 			"crypto op processing failed");
7528 
7529 	return 0;
7530 }
7531 
7532 static int
7533 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7534 	uint8_t op_mode, uint8_t verify)
7535 {
7536 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7537 	struct crypto_unittest_params *ut_params = &unittest_params;
7538 
7539 	int retval;
7540 
7541 	const uint8_t *plaintext = NULL;
7542 	const uint8_t *ciphertext = NULL;
7543 	const uint8_t *digest = NULL;
7544 	unsigned int plaintext_pad_len;
7545 	unsigned int plaintext_len;
7546 	unsigned int ciphertext_pad_len;
7547 	unsigned int ciphertext_len;
7548 	uint8_t buffer[10000];
7549 	uint8_t digest_buffer[10000];
7550 
7551 	struct rte_cryptodev_info dev_info;
7552 	struct rte_crypto_op *op;
7553 
7554 	/* Check if device supports particular algorithms */
7555 	if (test_mixed_check_if_unsupported(tdata))
7556 		return TEST_SKIPPED;
7557 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7558 		return TEST_SKIPPED;
7559 
7560 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7561 
7562 	uint64_t feat_flags = dev_info.feature_flags;
7563 
7564 	if (op_mode == IN_PLACE) {
7565 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7566 			printf("Device doesn't support in-place scatter-gather "
7567 					"in both input and output mbufs.\n");
7568 			return TEST_SKIPPED;
7569 		}
7570 	} else {
7571 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7572 			printf("Device doesn't support out-of-place scatter-gather "
7573 					"in both input and output mbufs.\n");
7574 			return TEST_SKIPPED;
7575 		}
7576 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7577 			printf("Device doesn't support digest encrypted.\n");
7578 			return TEST_SKIPPED;
7579 		}
7580 	}
7581 
7582 	/* Create the session */
7583 	if (verify)
7584 		retval = create_wireless_algo_cipher_auth_session(
7585 				ts_params->valid_devs[0],
7586 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7587 				RTE_CRYPTO_AUTH_OP_VERIFY,
7588 				tdata->auth_algo,
7589 				tdata->cipher_algo,
7590 				tdata->auth_key.data, tdata->auth_key.len,
7591 				tdata->auth_iv.len, tdata->digest_enc.len,
7592 				tdata->cipher_iv.len);
7593 	else
7594 		retval = create_wireless_algo_auth_cipher_session(
7595 				ts_params->valid_devs[0],
7596 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7597 				RTE_CRYPTO_AUTH_OP_GENERATE,
7598 				tdata->auth_algo,
7599 				tdata->cipher_algo,
7600 				tdata->auth_key.data, tdata->auth_key.len,
7601 				tdata->auth_iv.len, tdata->digest_enc.len,
7602 				tdata->cipher_iv.len);
7603 	if (retval != 0)
7604 		return retval;
7605 
7606 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7607 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7608 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7609 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7610 
7611 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7612 			ciphertext_pad_len, 15, 0);
7613 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7614 			"Failed to allocate input buffer in mempool");
7615 
7616 	if (op_mode == OUT_OF_PLACE) {
7617 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7618 				plaintext_pad_len, 15, 0);
7619 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
7620 				"Failed to allocate output buffer in mempool");
7621 	}
7622 
7623 	if (verify) {
7624 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7625 			tdata->ciphertext.data);
7626 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7627 					ciphertext_len, buffer);
7628 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7629 			ciphertext_len);
7630 	} else {
7631 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7632 			tdata->plaintext.data);
7633 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7634 					plaintext_len, buffer);
7635 		debug_hexdump(stdout, "plaintext:", plaintext,
7636 			plaintext_len);
7637 	}
7638 	memset(buffer, 0, sizeof(buffer));
7639 
7640 	/* Create the operation */
7641 	retval = create_wireless_algo_auth_cipher_operation(
7642 			tdata->digest_enc.data, tdata->digest_enc.len,
7643 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7644 			tdata->auth_iv.data, tdata->auth_iv.len,
7645 			(tdata->digest_enc.offset == 0 ?
7646 				plaintext_pad_len
7647 				: tdata->digest_enc.offset),
7648 			tdata->validCipherLen.len_bits,
7649 			tdata->cipher.offset_bits,
7650 			tdata->validAuthLen.len_bits,
7651 			tdata->auth.offset_bits,
7652 			op_mode, 1, verify);
7653 
7654 	if (retval < 0)
7655 		return retval;
7656 
7657 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7658 
7659 	/* Check if the op failed because the device doesn't */
7660 	/* support this particular combination of algorithms */
7661 	if (op == NULL && ut_params->op->status ==
7662 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7663 		printf("Device doesn't support this mixed combination. "
7664 				"Test Skipped.\n");
7665 		return TEST_SKIPPED;
7666 	}
7667 	ut_params->op = op;
7668 
7669 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7670 
7671 	ut_params->obuf = (op_mode == IN_PLACE ?
7672 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7673 
7674 	if (verify) {
7675 		if (ut_params->obuf)
7676 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7677 					plaintext_len, buffer);
7678 		else
7679 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7680 					plaintext_len, buffer);
7681 
7682 		debug_hexdump(stdout, "plaintext:", plaintext,
7683 				(tdata->plaintext.len_bits >> 3) -
7684 				tdata->digest_enc.len);
7685 		debug_hexdump(stdout, "plaintext expected:",
7686 				tdata->plaintext.data,
7687 				(tdata->plaintext.len_bits >> 3) -
7688 				tdata->digest_enc.len);
7689 	} else {
7690 		if (ut_params->obuf)
7691 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7692 					ciphertext_len, buffer);
7693 		else
7694 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7695 					ciphertext_len, buffer);
7696 
7697 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7698 			ciphertext_len);
7699 		debug_hexdump(stdout, "ciphertext expected:",
7700 			tdata->ciphertext.data,
7701 			tdata->ciphertext.len_bits >> 3);
7702 
7703 		if (ut_params->obuf)
7704 			digest = rte_pktmbuf_read(ut_params->obuf,
7705 					(tdata->digest_enc.offset == 0 ?
7706 						plaintext_pad_len :
7707 						tdata->digest_enc.offset),
7708 					tdata->digest_enc.len, digest_buffer);
7709 		else
7710 			digest = rte_pktmbuf_read(ut_params->ibuf,
7711 					(tdata->digest_enc.offset == 0 ?
7712 						plaintext_pad_len :
7713 						tdata->digest_enc.offset),
7714 					tdata->digest_enc.len, digest_buffer);
7715 
7716 		debug_hexdump(stdout, "digest:", digest,
7717 				tdata->digest_enc.len);
7718 		debug_hexdump(stdout, "digest expected:",
7719 				tdata->digest_enc.data, tdata->digest_enc.len);
7720 	}
7721 
7722 	if (!verify) {
7723 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7724 				digest,
7725 				tdata->digest_enc.data,
7726 				tdata->digest_enc.len,
7727 				"Generated auth tag not as expected");
7728 	}
7729 
7730 	if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
7731 		if (verify) {
7732 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7733 					plaintext,
7734 					tdata->plaintext.data,
7735 					tdata->plaintext.len_bits >> 3,
7736 					"Plaintext data not as expected");
7737 		} else {
7738 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7739 					ciphertext,
7740 					tdata->ciphertext.data,
7741 					tdata->validDataLen.len_bits,
7742 					"Ciphertext data not as expected");
7743 		}
7744 	}
7745 
7746 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7747 			"crypto op processing failed");
7748 
7749 	return 0;
7750 }
7751 
7752 /** AUTH AES CMAC + CIPHER AES CTR */
7753 
7754 static int
7755 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7756 {
7757 	return test_mixed_auth_cipher(
7758 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7759 }
7760 
7761 static int
7762 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7763 {
7764 	return test_mixed_auth_cipher(
7765 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7766 }
7767 
7768 static int
7769 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7770 {
7771 	return test_mixed_auth_cipher_sgl(
7772 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7773 }
7774 
7775 static int
7776 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7777 {
7778 	return test_mixed_auth_cipher_sgl(
7779 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7780 }
7781 
7782 static int
7783 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7784 {
7785 	return test_mixed_auth_cipher(
7786 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7787 }
7788 
7789 static int
7790 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7791 {
7792 	return test_mixed_auth_cipher(
7793 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7794 }
7795 
7796 static int
7797 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7798 {
7799 	return test_mixed_auth_cipher_sgl(
7800 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7801 }
7802 
7803 static int
7804 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7805 {
7806 	return test_mixed_auth_cipher_sgl(
7807 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7808 }
7809 
7810 /** MIXED AUTH + CIPHER */
7811 
7812 static int
7813 test_auth_zuc_cipher_snow_test_case_1(void)
7814 {
7815 	return test_mixed_auth_cipher(
7816 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7817 }
7818 
7819 static int
7820 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7821 {
7822 	return test_mixed_auth_cipher(
7823 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7824 }
7825 
7826 static int
7827 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7828 {
7829 	return test_mixed_auth_cipher(
7830 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7831 }
7832 
7833 static int
7834 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7835 {
7836 	return test_mixed_auth_cipher(
7837 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7838 }
7839 
7840 static int
7841 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7842 {
7843 	return test_mixed_auth_cipher(
7844 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7845 }
7846 
7847 static int
7848 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7849 {
7850 	return test_mixed_auth_cipher(
7851 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7852 }
7853 
7854 static int
7855 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7856 {
7857 	return test_mixed_auth_cipher(
7858 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7859 }
7860 
7861 static int
7862 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7863 {
7864 	return test_mixed_auth_cipher(
7865 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7866 }
7867 
7868 static int
7869 test_auth_snow_cipher_zuc_test_case_1(void)
7870 {
7871 	return test_mixed_auth_cipher(
7872 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7873 }
7874 
7875 static int
7876 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7877 {
7878 	return test_mixed_auth_cipher(
7879 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7880 }
7881 
7882 static int
7883 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7884 {
7885 	return test_mixed_auth_cipher(
7886 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7887 }
7888 
7889 static int
7890 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7891 {
7892 	return test_mixed_auth_cipher(
7893 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7894 }
7895 
7896 static int
7897 test_auth_null_cipher_snow_test_case_1(void)
7898 {
7899 	return test_mixed_auth_cipher(
7900 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7901 }
7902 
7903 static int
7904 test_verify_auth_null_cipher_snow_test_case_1(void)
7905 {
7906 	return test_mixed_auth_cipher(
7907 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7908 }
7909 
7910 static int
7911 test_auth_null_cipher_zuc_test_case_1(void)
7912 {
7913 	return test_mixed_auth_cipher(
7914 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7915 }
7916 
7917 static int
7918 test_verify_auth_null_cipher_zuc_test_case_1(void)
7919 {
7920 	return test_mixed_auth_cipher(
7921 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7922 }
7923 
7924 static int
7925 test_auth_snow_cipher_null_test_case_1(void)
7926 {
7927 	return test_mixed_auth_cipher(
7928 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7929 }
7930 
7931 static int
7932 test_verify_auth_snow_cipher_null_test_case_1(void)
7933 {
7934 	return test_mixed_auth_cipher(
7935 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7936 }
7937 
7938 static int
7939 test_auth_zuc_cipher_null_test_case_1(void)
7940 {
7941 	return test_mixed_auth_cipher(
7942 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7943 }
7944 
7945 static int
7946 test_verify_auth_zuc_cipher_null_test_case_1(void)
7947 {
7948 	return test_mixed_auth_cipher(
7949 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7950 }
7951 
7952 static int
7953 test_auth_null_cipher_aes_ctr_test_case_1(void)
7954 {
7955 	return test_mixed_auth_cipher(
7956 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7957 }
7958 
7959 static int
7960 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7961 {
7962 	return test_mixed_auth_cipher(
7963 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7964 }
7965 
7966 static int
7967 test_auth_aes_cmac_cipher_null_test_case_1(void)
7968 {
7969 	return test_mixed_auth_cipher(
7970 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7971 }
7972 
7973 static int
7974 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7975 {
7976 	return test_mixed_auth_cipher(
7977 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7978 }
7979 
7980 /* ***** AEAD algorithm Tests ***** */
7981 
7982 static int
7983 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7984 		enum rte_crypto_aead_operation op,
7985 		const uint8_t *key, const uint8_t key_len,
7986 		const uint16_t aad_len, const uint8_t auth_len,
7987 		uint8_t iv_len)
7988 {
7989 	uint8_t aead_key[key_len];
7990 	int status;
7991 
7992 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7993 	struct crypto_unittest_params *ut_params = &unittest_params;
7994 
7995 	memcpy(aead_key, key, key_len);
7996 
7997 	/* Setup AEAD Parameters */
7998 	ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7999 	ut_params->aead_xform.next = NULL;
8000 	ut_params->aead_xform.aead.algo = algo;
8001 	ut_params->aead_xform.aead.op = op;
8002 	ut_params->aead_xform.aead.key.data = aead_key;
8003 	ut_params->aead_xform.aead.key.length = key_len;
8004 	ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
8005 	ut_params->aead_xform.aead.iv.length = iv_len;
8006 	ut_params->aead_xform.aead.digest_length = auth_len;
8007 	ut_params->aead_xform.aead.aad_length = aad_len;
8008 
8009 	debug_hexdump(stdout, "key:", key, key_len);
8010 
8011 	/* Create Crypto session*/
8012 	ut_params->sess = rte_cryptodev_sym_session_create(
8013 			ts_params->session_mpool);
8014 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
8015 
8016 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
8017 			&ut_params->aead_xform,
8018 			ts_params->session_priv_mpool);
8019 
8020 	return status;
8021 }
8022 
8023 static int
8024 create_aead_xform(struct rte_crypto_op *op,
8025 		enum rte_crypto_aead_algorithm algo,
8026 		enum rte_crypto_aead_operation aead_op,
8027 		uint8_t *key, const uint8_t key_len,
8028 		const uint8_t aad_len, const uint8_t auth_len,
8029 		uint8_t iv_len)
8030 {
8031 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
8032 			"failed to allocate space for crypto transform");
8033 
8034 	struct rte_crypto_sym_op *sym_op = op->sym;
8035 
8036 	/* Setup AEAD Parameters */
8037 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
8038 	sym_op->xform->next = NULL;
8039 	sym_op->xform->aead.algo = algo;
8040 	sym_op->xform->aead.op = aead_op;
8041 	sym_op->xform->aead.key.data = key;
8042 	sym_op->xform->aead.key.length = key_len;
8043 	sym_op->xform->aead.iv.offset = IV_OFFSET;
8044 	sym_op->xform->aead.iv.length = iv_len;
8045 	sym_op->xform->aead.digest_length = auth_len;
8046 	sym_op->xform->aead.aad_length = aad_len;
8047 
8048 	debug_hexdump(stdout, "key:", key, key_len);
8049 
8050 	return 0;
8051 }
8052 
8053 static int
8054 create_aead_operation(enum rte_crypto_aead_operation op,
8055 		const struct aead_test_data *tdata)
8056 {
8057 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8058 	struct crypto_unittest_params *ut_params = &unittest_params;
8059 
8060 	uint8_t *plaintext, *ciphertext;
8061 	unsigned int aad_pad_len, plaintext_pad_len;
8062 
8063 	/* Generate Crypto op data structure */
8064 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8065 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8066 	TEST_ASSERT_NOT_NULL(ut_params->op,
8067 			"Failed to allocate symmetric crypto operation struct");
8068 
8069 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
8070 
8071 	/* Append aad data */
8072 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
8073 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 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 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
8082 		memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
8083 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8084 			tdata->aad.len);
8085 
8086 		/* Append IV at the end of the crypto operation*/
8087 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8088 				uint8_t *, IV_OFFSET);
8089 
8090 		/* Copy IV 1 byte after the IV pointer, according to the API */
8091 		rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
8092 		debug_hexdump(stdout, "iv:", iv_ptr,
8093 			tdata->iv.len);
8094 	} else {
8095 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
8096 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8097 				aad_pad_len);
8098 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8099 				"no room to append aad");
8100 
8101 		sym_op->aead.aad.phys_addr =
8102 				rte_pktmbuf_iova(ut_params->ibuf);
8103 		memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
8104 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8105 			tdata->aad.len);
8106 
8107 		/* Append IV at the end of the crypto operation*/
8108 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8109 				uint8_t *, IV_OFFSET);
8110 
8111 		if (tdata->iv.len == 0) {
8112 			rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
8113 			debug_hexdump(stdout, "iv:", iv_ptr,
8114 				AES_GCM_J0_LENGTH);
8115 		} else {
8116 			rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
8117 			debug_hexdump(stdout, "iv:", iv_ptr,
8118 				tdata->iv.len);
8119 		}
8120 	}
8121 
8122 	/* Append plaintext/ciphertext */
8123 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8124 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8125 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8126 				plaintext_pad_len);
8127 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
8128 
8129 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
8130 		debug_hexdump(stdout, "plaintext:", plaintext,
8131 				tdata->plaintext.len);
8132 
8133 		if (ut_params->obuf) {
8134 			ciphertext = (uint8_t *)rte_pktmbuf_append(
8135 					ut_params->obuf,
8136 					plaintext_pad_len + aad_pad_len);
8137 			TEST_ASSERT_NOT_NULL(ciphertext,
8138 					"no room to append ciphertext");
8139 
8140 			memset(ciphertext + aad_pad_len, 0,
8141 					tdata->ciphertext.len);
8142 		}
8143 	} else {
8144 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
8145 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8146 				plaintext_pad_len);
8147 		TEST_ASSERT_NOT_NULL(ciphertext,
8148 				"no room to append ciphertext");
8149 
8150 		memcpy(ciphertext, tdata->ciphertext.data,
8151 				tdata->ciphertext.len);
8152 		debug_hexdump(stdout, "ciphertext:", ciphertext,
8153 				tdata->ciphertext.len);
8154 
8155 		if (ut_params->obuf) {
8156 			plaintext = (uint8_t *)rte_pktmbuf_append(
8157 					ut_params->obuf,
8158 					plaintext_pad_len + aad_pad_len);
8159 			TEST_ASSERT_NOT_NULL(plaintext,
8160 					"no room to append plaintext");
8161 
8162 			memset(plaintext + aad_pad_len, 0,
8163 					tdata->plaintext.len);
8164 		}
8165 	}
8166 
8167 	/* Append digest data */
8168 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8169 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8170 				ut_params->obuf ? ut_params->obuf :
8171 						ut_params->ibuf,
8172 						tdata->auth_tag.len);
8173 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8174 				"no room to append digest");
8175 		memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
8176 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8177 				ut_params->obuf ? ut_params->obuf :
8178 						ut_params->ibuf,
8179 						plaintext_pad_len +
8180 						aad_pad_len);
8181 	} else {
8182 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8183 				ut_params->ibuf, tdata->auth_tag.len);
8184 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8185 				"no room to append digest");
8186 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8187 				ut_params->ibuf,
8188 				plaintext_pad_len + aad_pad_len);
8189 
8190 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
8191 			tdata->auth_tag.len);
8192 		debug_hexdump(stdout, "digest:",
8193 			sym_op->aead.digest.data,
8194 			tdata->auth_tag.len);
8195 	}
8196 
8197 	sym_op->aead.data.length = tdata->plaintext.len;
8198 	sym_op->aead.data.offset = aad_pad_len;
8199 
8200 	return 0;
8201 }
8202 
8203 static int
8204 test_authenticated_encryption(const struct aead_test_data *tdata)
8205 {
8206 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8207 	struct crypto_unittest_params *ut_params = &unittest_params;
8208 
8209 	int retval;
8210 	uint8_t *ciphertext, *auth_tag;
8211 	uint16_t plaintext_pad_len;
8212 	uint32_t i;
8213 	struct rte_cryptodev_info dev_info;
8214 
8215 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8216 	uint64_t feat_flags = dev_info.feature_flags;
8217 
8218 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8219 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8220 		printf("Device doesn't support RAW data-path APIs.\n");
8221 		return TEST_SKIPPED;
8222 	}
8223 
8224 	/* Verify the capabilities */
8225 	struct rte_cryptodev_sym_capability_idx cap_idx;
8226 	const struct rte_cryptodev_symmetric_capability *capability;
8227 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8228 	cap_idx.algo.aead = tdata->algo;
8229 	capability = rte_cryptodev_sym_capability_get(
8230 			ts_params->valid_devs[0], &cap_idx);
8231 	if (capability == NULL)
8232 		return TEST_SKIPPED;
8233 	if (rte_cryptodev_sym_capability_check_aead(
8234 			capability, tdata->key.len, tdata->auth_tag.len,
8235 			tdata->aad.len, tdata->iv.len))
8236 		return TEST_SKIPPED;
8237 
8238 	/* Create AEAD session */
8239 	retval = create_aead_session(ts_params->valid_devs[0],
8240 			tdata->algo,
8241 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
8242 			tdata->key.data, tdata->key.len,
8243 			tdata->aad.len, tdata->auth_tag.len,
8244 			tdata->iv.len);
8245 	if (retval < 0)
8246 		return retval;
8247 
8248 	if (tdata->aad.len > MBUF_SIZE) {
8249 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8250 		/* Populate full size of add data */
8251 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8252 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8253 	} else
8254 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8255 
8256 	/* clear mbuf payload */
8257 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8258 			rte_pktmbuf_tailroom(ut_params->ibuf));
8259 
8260 	/* Create AEAD operation */
8261 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8262 	if (retval < 0)
8263 		return retval;
8264 
8265 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8266 
8267 	ut_params->op->sym->m_src = ut_params->ibuf;
8268 
8269 	/* Process crypto operation */
8270 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8271 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8272 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8273 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8274 				ut_params->op, 0, 0, 0, 0);
8275 	else
8276 		TEST_ASSERT_NOT_NULL(
8277 			process_crypto_request(ts_params->valid_devs[0],
8278 			ut_params->op), "failed to process sym crypto op");
8279 
8280 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8281 			"crypto op processing failed");
8282 
8283 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8284 
8285 	if (ut_params->op->sym->m_dst) {
8286 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8287 				uint8_t *);
8288 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8289 				uint8_t *, plaintext_pad_len);
8290 	} else {
8291 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8292 				uint8_t *,
8293 				ut_params->op->sym->cipher.data.offset);
8294 		auth_tag = ciphertext + plaintext_pad_len;
8295 	}
8296 
8297 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8298 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8299 
8300 	/* Validate obuf */
8301 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8302 			ciphertext,
8303 			tdata->ciphertext.data,
8304 			tdata->ciphertext.len,
8305 			"Ciphertext data not as expected");
8306 
8307 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8308 			auth_tag,
8309 			tdata->auth_tag.data,
8310 			tdata->auth_tag.len,
8311 			"Generated auth tag not as expected");
8312 
8313 	return 0;
8314 
8315 }
8316 
8317 #ifdef RTE_LIB_SECURITY
8318 static int
8319 security_proto_supported(enum rte_security_session_action_type action,
8320 	enum rte_security_session_protocol proto)
8321 {
8322 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8323 
8324 	const struct rte_security_capability *capabilities;
8325 	const struct rte_security_capability *capability;
8326 	uint16_t i = 0;
8327 
8328 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8329 				rte_cryptodev_get_sec_ctx(
8330 				ts_params->valid_devs[0]);
8331 
8332 
8333 	capabilities = rte_security_capabilities_get(ctx);
8334 
8335 	if (capabilities == NULL)
8336 		return -ENOTSUP;
8337 
8338 	while ((capability = &capabilities[i++])->action !=
8339 			RTE_SECURITY_ACTION_TYPE_NONE) {
8340 		if (capability->action == action &&
8341 				capability->protocol == proto)
8342 			return 0;
8343 	}
8344 
8345 	return -ENOTSUP;
8346 }
8347 
8348 /* Basic algorithm run function for async inplace mode.
8349  * Creates a session from input parameters and runs one operation
8350  * on input_vec. Checks the output of the crypto operation against
8351  * output_vec.
8352  */
8353 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8354 			   enum rte_crypto_auth_operation opa,
8355 			   const uint8_t *input_vec, unsigned int input_vec_len,
8356 			   const uint8_t *output_vec,
8357 			   unsigned int output_vec_len,
8358 			   enum rte_crypto_cipher_algorithm cipher_alg,
8359 			   const uint8_t *cipher_key, uint32_t cipher_key_len,
8360 			   enum rte_crypto_auth_algorithm auth_alg,
8361 			   const uint8_t *auth_key, uint32_t auth_key_len,
8362 			   uint8_t bearer, enum rte_security_pdcp_domain domain,
8363 			   uint8_t packet_direction, uint8_t sn_size,
8364 			   uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8365 {
8366 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8367 	struct crypto_unittest_params *ut_params = &unittest_params;
8368 	uint8_t *plaintext;
8369 	int ret = TEST_SUCCESS;
8370 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8371 				rte_cryptodev_get_sec_ctx(
8372 				ts_params->valid_devs[0]);
8373 
8374 	/* Verify the capabilities */
8375 	struct rte_security_capability_idx sec_cap_idx;
8376 
8377 	sec_cap_idx.action = ut_params->type;
8378 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8379 	sec_cap_idx.pdcp.domain = domain;
8380 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8381 		return TEST_SKIPPED;
8382 
8383 	/* Generate test mbuf data */
8384 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8385 
8386 	/* clear mbuf payload */
8387 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8388 			rte_pktmbuf_tailroom(ut_params->ibuf));
8389 
8390 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8391 						  input_vec_len);
8392 	memcpy(plaintext, input_vec, input_vec_len);
8393 
8394 	/* Out of place support */
8395 	if (oop) {
8396 		/*
8397 		 * For out-op-place we need to alloc another mbuf
8398 		 */
8399 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8400 		rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8401 	}
8402 
8403 	/* Setup Cipher Parameters */
8404 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8405 	ut_params->cipher_xform.cipher.algo = cipher_alg;
8406 	ut_params->cipher_xform.cipher.op = opc;
8407 	ut_params->cipher_xform.cipher.key.data = cipher_key;
8408 	ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8409 	ut_params->cipher_xform.cipher.iv.length =
8410 				packet_direction ? 4 : 0;
8411 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8412 
8413 	/* Setup HMAC Parameters if ICV header is required */
8414 	if (auth_alg != 0) {
8415 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8416 		ut_params->auth_xform.next = NULL;
8417 		ut_params->auth_xform.auth.algo = auth_alg;
8418 		ut_params->auth_xform.auth.op = opa;
8419 		ut_params->auth_xform.auth.key.data = auth_key;
8420 		ut_params->auth_xform.auth.key.length = auth_key_len;
8421 
8422 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8423 	} else {
8424 		ut_params->cipher_xform.next = NULL;
8425 	}
8426 
8427 	struct rte_security_session_conf sess_conf = {
8428 		.action_type = ut_params->type,
8429 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8430 		{.pdcp = {
8431 			.bearer = bearer,
8432 			.domain = domain,
8433 			.pkt_dir = packet_direction,
8434 			.sn_size = sn_size,
8435 			.hfn = packet_direction ? 0 : hfn,
8436 			/**
8437 			 * hfn can be set as pdcp_test_hfn[i]
8438 			 * if hfn_ovrd is not set. Here, PDCP
8439 			 * packet direction is just used to
8440 			 * run half of the cases with session
8441 			 * HFN and other half with per packet
8442 			 * HFN.
8443 			 */
8444 			.hfn_threshold = hfn_threshold,
8445 			.hfn_ovrd = packet_direction ? 1 : 0,
8446 			.sdap_enabled = sdap,
8447 		} },
8448 		.crypto_xform = &ut_params->cipher_xform
8449 	};
8450 
8451 	/* Create security session */
8452 	ut_params->sec_session = rte_security_session_create(ctx,
8453 				&sess_conf, ts_params->session_mpool,
8454 				ts_params->session_priv_mpool);
8455 
8456 	if (!ut_params->sec_session) {
8457 		printf("TestCase %s()-%d line %d failed %s: ",
8458 			__func__, i, __LINE__, "Failed to allocate session");
8459 		ret = TEST_FAILED;
8460 		goto on_err;
8461 	}
8462 
8463 	/* Generate crypto op data structure */
8464 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8465 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8466 	if (!ut_params->op) {
8467 		printf("TestCase %s()-%d line %d failed %s: ",
8468 			__func__, i, __LINE__,
8469 			"Failed to allocate symmetric crypto operation struct");
8470 		ret = TEST_FAILED;
8471 		goto on_err;
8472 	}
8473 
8474 	uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8475 					uint32_t *, IV_OFFSET);
8476 	*per_pkt_hfn = packet_direction ? hfn : 0;
8477 
8478 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8479 
8480 	/* set crypto operation source mbuf */
8481 	ut_params->op->sym->m_src = ut_params->ibuf;
8482 	if (oop)
8483 		ut_params->op->sym->m_dst = ut_params->obuf;
8484 
8485 	/* Process crypto operation */
8486 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8487 		== NULL) {
8488 		printf("TestCase %s()-%d line %d failed %s: ",
8489 			__func__, i, __LINE__,
8490 			"failed to process sym crypto op");
8491 		ret = TEST_FAILED;
8492 		goto on_err;
8493 	}
8494 
8495 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8496 		printf("TestCase %s()-%d line %d failed %s: ",
8497 			__func__, i, __LINE__, "crypto op processing failed");
8498 		ret = TEST_FAILED;
8499 		goto on_err;
8500 	}
8501 
8502 	/* Validate obuf */
8503 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8504 			uint8_t *);
8505 	if (oop) {
8506 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8507 				uint8_t *);
8508 	}
8509 
8510 	if (memcmp(ciphertext, output_vec, output_vec_len)) {
8511 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8512 		rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8513 		rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8514 		ret = TEST_FAILED;
8515 		goto on_err;
8516 	}
8517 
8518 on_err:
8519 	rte_crypto_op_free(ut_params->op);
8520 	ut_params->op = NULL;
8521 
8522 	if (ut_params->sec_session)
8523 		rte_security_session_destroy(ctx, ut_params->sec_session);
8524 	ut_params->sec_session = NULL;
8525 
8526 	rte_pktmbuf_free(ut_params->ibuf);
8527 	ut_params->ibuf = NULL;
8528 	if (oop) {
8529 		rte_pktmbuf_free(ut_params->obuf);
8530 		ut_params->obuf = NULL;
8531 	}
8532 
8533 	return ret;
8534 }
8535 
8536 static int
8537 test_pdcp_proto_SGL(int i, int oop,
8538 	enum rte_crypto_cipher_operation opc,
8539 	enum rte_crypto_auth_operation opa,
8540 	uint8_t *input_vec,
8541 	unsigned int input_vec_len,
8542 	uint8_t *output_vec,
8543 	unsigned int output_vec_len,
8544 	uint32_t fragsz,
8545 	uint32_t fragsz_oop)
8546 {
8547 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8548 	struct crypto_unittest_params *ut_params = &unittest_params;
8549 	uint8_t *plaintext;
8550 	struct rte_mbuf *buf, *buf_oop = NULL;
8551 	int ret = TEST_SUCCESS;
8552 	int to_trn = 0;
8553 	int to_trn_tbl[16];
8554 	int segs = 1;
8555 	unsigned int trn_data = 0;
8556 	struct rte_cryptodev_info dev_info;
8557 	uint64_t feat_flags;
8558 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8559 				rte_cryptodev_get_sec_ctx(
8560 				ts_params->valid_devs[0]);
8561 	struct rte_mbuf *temp_mbuf;
8562 
8563 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8564 	feat_flags = dev_info.feature_flags;
8565 
8566 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8567 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8568 		printf("Device does not support RAW data-path APIs.\n");
8569 		return -ENOTSUP;
8570 	}
8571 	/* Verify the capabilities */
8572 	struct rte_security_capability_idx sec_cap_idx;
8573 
8574 	sec_cap_idx.action = ut_params->type;
8575 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8576 	sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8577 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8578 		return TEST_SKIPPED;
8579 
8580 	if (fragsz > input_vec_len)
8581 		fragsz = input_vec_len;
8582 
8583 	uint16_t plaintext_len = fragsz;
8584 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8585 
8586 	if (fragsz_oop > output_vec_len)
8587 		frag_size_oop = output_vec_len;
8588 
8589 	int ecx = 0;
8590 	if (input_vec_len % fragsz != 0) {
8591 		if (input_vec_len / fragsz + 1 > 16)
8592 			return 1;
8593 	} else if (input_vec_len / fragsz > 16)
8594 		return 1;
8595 
8596 	/* Out of place support */
8597 	if (oop) {
8598 		/*
8599 		 * For out-op-place we need to alloc another mbuf
8600 		 */
8601 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8602 		rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8603 		buf_oop = ut_params->obuf;
8604 	}
8605 
8606 	/* Generate test mbuf data */
8607 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8608 
8609 	/* clear mbuf payload */
8610 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8611 			rte_pktmbuf_tailroom(ut_params->ibuf));
8612 
8613 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8614 						  plaintext_len);
8615 	memcpy(plaintext, input_vec, plaintext_len);
8616 	trn_data += plaintext_len;
8617 
8618 	buf = ut_params->ibuf;
8619 
8620 	/*
8621 	 * Loop until no more fragments
8622 	 */
8623 
8624 	while (trn_data < input_vec_len) {
8625 		++segs;
8626 		to_trn = (input_vec_len - trn_data < fragsz) ?
8627 				(input_vec_len - trn_data) : fragsz;
8628 
8629 		to_trn_tbl[ecx++] = to_trn;
8630 
8631 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8632 		buf = buf->next;
8633 
8634 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8635 				rte_pktmbuf_tailroom(buf));
8636 
8637 		/* OOP */
8638 		if (oop && !fragsz_oop) {
8639 			buf_oop->next =
8640 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
8641 			buf_oop = buf_oop->next;
8642 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8643 					0, rte_pktmbuf_tailroom(buf_oop));
8644 			rte_pktmbuf_append(buf_oop, to_trn);
8645 		}
8646 
8647 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8648 				to_trn);
8649 
8650 		memcpy(plaintext, input_vec + trn_data, to_trn);
8651 		trn_data += to_trn;
8652 	}
8653 
8654 	ut_params->ibuf->nb_segs = segs;
8655 
8656 	segs = 1;
8657 	if (fragsz_oop && oop) {
8658 		to_trn = 0;
8659 		ecx = 0;
8660 
8661 		trn_data = frag_size_oop;
8662 		while (trn_data < output_vec_len) {
8663 			++segs;
8664 			to_trn =
8665 				(output_vec_len - trn_data <
8666 						frag_size_oop) ?
8667 				(output_vec_len - trn_data) :
8668 						frag_size_oop;
8669 
8670 			to_trn_tbl[ecx++] = to_trn;
8671 
8672 			buf_oop->next =
8673 				rte_pktmbuf_alloc(ts_params->mbuf_pool);
8674 			buf_oop = buf_oop->next;
8675 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8676 					0, rte_pktmbuf_tailroom(buf_oop));
8677 			rte_pktmbuf_append(buf_oop, to_trn);
8678 
8679 			trn_data += to_trn;
8680 		}
8681 		ut_params->obuf->nb_segs = segs;
8682 	}
8683 
8684 	/* Setup Cipher Parameters */
8685 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8686 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8687 	ut_params->cipher_xform.cipher.op = opc;
8688 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8689 	ut_params->cipher_xform.cipher.key.length =
8690 					pdcp_test_params[i].cipher_key_len;
8691 	ut_params->cipher_xform.cipher.iv.length = 0;
8692 
8693 	/* Setup HMAC Parameters if ICV header is required */
8694 	if (pdcp_test_params[i].auth_alg != 0) {
8695 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8696 		ut_params->auth_xform.next = NULL;
8697 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8698 		ut_params->auth_xform.auth.op = opa;
8699 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8700 		ut_params->auth_xform.auth.key.length =
8701 					pdcp_test_params[i].auth_key_len;
8702 
8703 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8704 	} else {
8705 		ut_params->cipher_xform.next = NULL;
8706 	}
8707 
8708 	struct rte_security_session_conf sess_conf = {
8709 		.action_type = ut_params->type,
8710 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8711 		{.pdcp = {
8712 			.bearer = pdcp_test_bearer[i],
8713 			.domain = pdcp_test_params[i].domain,
8714 			.pkt_dir = pdcp_test_packet_direction[i],
8715 			.sn_size = pdcp_test_data_sn_size[i],
8716 			.hfn = pdcp_test_hfn[i],
8717 			.hfn_threshold = pdcp_test_hfn_threshold[i],
8718 			.hfn_ovrd = 0,
8719 		} },
8720 		.crypto_xform = &ut_params->cipher_xform
8721 	};
8722 
8723 	/* Create security session */
8724 	ut_params->sec_session = rte_security_session_create(ctx,
8725 				&sess_conf, ts_params->session_mpool,
8726 				ts_params->session_priv_mpool);
8727 
8728 	if (!ut_params->sec_session) {
8729 		printf("TestCase %s()-%d line %d failed %s: ",
8730 			__func__, i, __LINE__, "Failed to allocate session");
8731 		ret = TEST_FAILED;
8732 		goto on_err;
8733 	}
8734 
8735 	/* Generate crypto op data structure */
8736 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8737 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8738 	if (!ut_params->op) {
8739 		printf("TestCase %s()-%d line %d failed %s: ",
8740 			__func__, i, __LINE__,
8741 			"Failed to allocate symmetric crypto operation struct");
8742 		ret = TEST_FAILED;
8743 		goto on_err;
8744 	}
8745 
8746 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8747 
8748 	/* set crypto operation source mbuf */
8749 	ut_params->op->sym->m_src = ut_params->ibuf;
8750 	if (oop)
8751 		ut_params->op->sym->m_dst = ut_params->obuf;
8752 
8753 	/* Process crypto operation */
8754 	temp_mbuf = ut_params->op->sym->m_src;
8755 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
8756 		/* filling lengths */
8757 		while (temp_mbuf) {
8758 			ut_params->op->sym->cipher.data.length
8759 				+= temp_mbuf->pkt_len;
8760 			ut_params->op->sym->auth.data.length
8761 				+= temp_mbuf->pkt_len;
8762 			temp_mbuf = temp_mbuf->next;
8763 		}
8764 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8765 			ut_params->op, 1, 1, 0, 0);
8766 	} else {
8767 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
8768 							ut_params->op);
8769 	}
8770 	if (ut_params->op == NULL) {
8771 		printf("TestCase %s()-%d line %d failed %s: ",
8772 			__func__, i, __LINE__,
8773 			"failed to process sym crypto op");
8774 		ret = TEST_FAILED;
8775 		goto on_err;
8776 	}
8777 
8778 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8779 		printf("TestCase %s()-%d line %d failed %s: ",
8780 			__func__, i, __LINE__, "crypto op processing failed");
8781 		ret = TEST_FAILED;
8782 		goto on_err;
8783 	}
8784 
8785 	/* Validate obuf */
8786 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8787 			uint8_t *);
8788 	if (oop) {
8789 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8790 				uint8_t *);
8791 	}
8792 	if (fragsz_oop)
8793 		fragsz = frag_size_oop;
8794 	if (memcmp(ciphertext, output_vec, fragsz)) {
8795 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8796 		rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8797 		rte_hexdump(stdout, "reference", output_vec, fragsz);
8798 		ret = TEST_FAILED;
8799 		goto on_err;
8800 	}
8801 
8802 	buf = ut_params->op->sym->m_src->next;
8803 	if (oop)
8804 		buf = ut_params->op->sym->m_dst->next;
8805 
8806 	unsigned int off = fragsz;
8807 
8808 	ecx = 0;
8809 	while (buf) {
8810 		ciphertext = rte_pktmbuf_mtod(buf,
8811 				uint8_t *);
8812 		if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8813 			printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8814 			rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8815 			rte_hexdump(stdout, "reference", output_vec + off,
8816 					to_trn_tbl[ecx]);
8817 			ret = TEST_FAILED;
8818 			goto on_err;
8819 		}
8820 		off += to_trn_tbl[ecx++];
8821 		buf = buf->next;
8822 	}
8823 on_err:
8824 	rte_crypto_op_free(ut_params->op);
8825 	ut_params->op = NULL;
8826 
8827 	if (ut_params->sec_session)
8828 		rte_security_session_destroy(ctx, ut_params->sec_session);
8829 	ut_params->sec_session = NULL;
8830 
8831 	rte_pktmbuf_free(ut_params->ibuf);
8832 	ut_params->ibuf = NULL;
8833 	if (oop) {
8834 		rte_pktmbuf_free(ut_params->obuf);
8835 		ut_params->obuf = NULL;
8836 	}
8837 
8838 	return ret;
8839 }
8840 
8841 int
8842 test_pdcp_proto_cplane_encap(int i)
8843 {
8844 	return test_pdcp_proto(
8845 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8846 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8847 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8848 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8849 		pdcp_test_params[i].cipher_key_len,
8850 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8851 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8852 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8853 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8854 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8855 }
8856 
8857 int
8858 test_pdcp_proto_uplane_encap(int i)
8859 {
8860 	return test_pdcp_proto(
8861 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8862 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8863 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8864 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8865 		pdcp_test_params[i].cipher_key_len,
8866 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8867 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8868 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8869 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8870 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8871 }
8872 
8873 int
8874 test_pdcp_proto_uplane_encap_with_int(int i)
8875 {
8876 	return test_pdcp_proto(
8877 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8878 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8879 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8880 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8881 		pdcp_test_params[i].cipher_key_len,
8882 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8883 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8884 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8885 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8886 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8887 }
8888 
8889 int
8890 test_pdcp_proto_cplane_decap(int i)
8891 {
8892 	return test_pdcp_proto(
8893 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8894 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8895 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8896 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8897 		pdcp_test_params[i].cipher_key_len,
8898 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8899 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8900 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8901 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8902 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8903 }
8904 
8905 int
8906 test_pdcp_proto_uplane_decap(int i)
8907 {
8908 	return test_pdcp_proto(
8909 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8910 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8911 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8912 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8913 		pdcp_test_params[i].cipher_key_len,
8914 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8915 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8916 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8917 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8918 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8919 }
8920 
8921 int
8922 test_pdcp_proto_uplane_decap_with_int(int i)
8923 {
8924 	return test_pdcp_proto(
8925 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8926 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8927 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8928 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8929 		pdcp_test_params[i].cipher_key_len,
8930 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8931 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8932 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8933 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8934 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8935 }
8936 
8937 static int
8938 test_PDCP_PROTO_SGL_in_place_32B(void)
8939 {
8940 	/* i can be used for running any PDCP case
8941 	 * In this case it is uplane 12-bit AES-SNOW DL encap
8942 	 */
8943 	int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8944 	return test_pdcp_proto_SGL(i, IN_PLACE,
8945 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8946 			RTE_CRYPTO_AUTH_OP_GENERATE,
8947 			pdcp_test_data_in[i],
8948 			pdcp_test_data_in_len[i],
8949 			pdcp_test_data_out[i],
8950 			pdcp_test_data_in_len[i]+4,
8951 			32, 0);
8952 }
8953 static int
8954 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8955 {
8956 	/* i can be used for running any PDCP case
8957 	 * In this case it is uplane 18-bit NULL-NULL DL encap
8958 	 */
8959 	int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8960 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8961 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8962 			RTE_CRYPTO_AUTH_OP_GENERATE,
8963 			pdcp_test_data_in[i],
8964 			pdcp_test_data_in_len[i],
8965 			pdcp_test_data_out[i],
8966 			pdcp_test_data_in_len[i]+4,
8967 			32, 128);
8968 }
8969 static int
8970 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8971 {
8972 	/* i can be used for running any PDCP case
8973 	 * In this case it is uplane 18-bit AES DL encap
8974 	 */
8975 	int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8976 			+ DOWNLINK;
8977 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8978 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8979 			RTE_CRYPTO_AUTH_OP_GENERATE,
8980 			pdcp_test_data_in[i],
8981 			pdcp_test_data_in_len[i],
8982 			pdcp_test_data_out[i],
8983 			pdcp_test_data_in_len[i],
8984 			32, 40);
8985 }
8986 static int
8987 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8988 {
8989 	/* i can be used for running any PDCP case
8990 	 * In this case it is cplane 12-bit AES-ZUC DL encap
8991 	 */
8992 	int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8993 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8994 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8995 			RTE_CRYPTO_AUTH_OP_GENERATE,
8996 			pdcp_test_data_in[i],
8997 			pdcp_test_data_in_len[i],
8998 			pdcp_test_data_out[i],
8999 			pdcp_test_data_in_len[i]+4,
9000 			128, 32);
9001 }
9002 
9003 static int
9004 test_PDCP_SDAP_PROTO_encap_all(void)
9005 {
9006 	int i = 0, size = 0;
9007 	int err, all_err = TEST_SUCCESS;
9008 	const struct pdcp_sdap_test *cur_test;
9009 
9010 	size = RTE_DIM(list_pdcp_sdap_tests);
9011 
9012 	for (i = 0; i < size; i++) {
9013 		cur_test = &list_pdcp_sdap_tests[i];
9014 		err = test_pdcp_proto(
9015 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9016 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9017 			cur_test->in_len, cur_test->data_out,
9018 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9019 			cur_test->param.cipher_alg, cur_test->cipher_key,
9020 			cur_test->param.cipher_key_len,
9021 			cur_test->param.auth_alg,
9022 			cur_test->auth_key, cur_test->param.auth_key_len,
9023 			cur_test->bearer, cur_test->param.domain,
9024 			cur_test->packet_direction, cur_test->sn_size,
9025 			cur_test->hfn,
9026 			cur_test->hfn_threshold, SDAP_ENABLED);
9027 		if (err) {
9028 			printf("\t%d) %s: Encapsulation failed\n",
9029 					cur_test->test_idx,
9030 					cur_test->param.name);
9031 			err = TEST_FAILED;
9032 		} else {
9033 			printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
9034 					cur_test->param.name);
9035 			err = TEST_SUCCESS;
9036 		}
9037 		all_err += err;
9038 	}
9039 
9040 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9041 
9042 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9043 }
9044 
9045 static int
9046 test_PDCP_PROTO_short_mac(void)
9047 {
9048 	int i = 0, size = 0;
9049 	int err, all_err = TEST_SUCCESS;
9050 	const struct pdcp_short_mac_test *cur_test;
9051 
9052 	size = RTE_DIM(list_pdcp_smac_tests);
9053 
9054 	for (i = 0; i < size; i++) {
9055 		cur_test = &list_pdcp_smac_tests[i];
9056 		err = test_pdcp_proto(
9057 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9058 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9059 			cur_test->in_len, cur_test->data_out,
9060 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9061 			RTE_CRYPTO_CIPHER_NULL, NULL,
9062 			0, cur_test->param.auth_alg,
9063 			cur_test->auth_key, cur_test->param.auth_key_len,
9064 			0, cur_test->param.domain, 0, 0,
9065 			0, 0, 0);
9066 		if (err) {
9067 			printf("\t%d) %s: Short MAC test failed\n",
9068 					cur_test->test_idx,
9069 					cur_test->param.name);
9070 			err = TEST_FAILED;
9071 		} else {
9072 			printf("\t%d) %s: Short MAC test PASS\n",
9073 					cur_test->test_idx,
9074 					cur_test->param.name);
9075 			rte_hexdump(stdout, "MAC I",
9076 				    cur_test->data_out + cur_test->in_len + 2,
9077 				    2);
9078 			err = TEST_SUCCESS;
9079 		}
9080 		all_err += err;
9081 	}
9082 
9083 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9084 
9085 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9086 
9087 }
9088 
9089 static int
9090 test_PDCP_SDAP_PROTO_decap_all(void)
9091 {
9092 	int i = 0, size = 0;
9093 	int err, all_err = TEST_SUCCESS;
9094 	const struct pdcp_sdap_test *cur_test;
9095 
9096 	size = RTE_DIM(list_pdcp_sdap_tests);
9097 
9098 	for (i = 0; i < size; i++) {
9099 		cur_test = &list_pdcp_sdap_tests[i];
9100 		err = test_pdcp_proto(
9101 			i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
9102 			RTE_CRYPTO_AUTH_OP_VERIFY,
9103 			cur_test->data_out,
9104 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9105 			cur_test->data_in, cur_test->in_len,
9106 			cur_test->param.cipher_alg,
9107 			cur_test->cipher_key, cur_test->param.cipher_key_len,
9108 			cur_test->param.auth_alg, cur_test->auth_key,
9109 			cur_test->param.auth_key_len, cur_test->bearer,
9110 			cur_test->param.domain, cur_test->packet_direction,
9111 			cur_test->sn_size, cur_test->hfn,
9112 			cur_test->hfn_threshold, SDAP_ENABLED);
9113 		if (err) {
9114 			printf("\t%d) %s: Decapsulation failed\n",
9115 					cur_test->test_idx,
9116 					cur_test->param.name);
9117 			err = TEST_FAILED;
9118 		} else {
9119 			printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
9120 					cur_test->param.name);
9121 			err = TEST_SUCCESS;
9122 		}
9123 		all_err += err;
9124 	}
9125 
9126 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9127 
9128 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9129 }
9130 
9131 static int
9132 test_ipsec_proto_process(const struct ipsec_test_data td[],
9133 			 struct ipsec_test_data res_d[],
9134 			 int nb_td,
9135 			 bool silent,
9136 			 const struct ipsec_test_flags *flags)
9137 {
9138 	uint16_t v6_src[8] = {0x2607, 0xf8b0, 0x400c, 0x0c03, 0x0000, 0x0000,
9139 				0x0000, 0x001a};
9140 	uint16_t v6_dst[8] = {0x2001, 0x0470, 0xe5bf, 0xdead, 0x4957, 0x2174,
9141 				0xe82c, 0x4887};
9142 	const struct rte_ipv4_hdr *ipv4 =
9143 			(const struct rte_ipv4_hdr *)td[0].output_text.data;
9144 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9145 	struct crypto_unittest_params *ut_params = &unittest_params;
9146 	struct rte_security_capability_idx sec_cap_idx;
9147 	const struct rte_security_capability *sec_cap;
9148 	struct rte_security_ipsec_xform ipsec_xform;
9149 	uint8_t dev_id = ts_params->valid_devs[0];
9150 	enum rte_security_ipsec_sa_direction dir;
9151 	struct ipsec_test_data *res_d_tmp = NULL;
9152 	int salt_len, i, ret = TEST_SUCCESS;
9153 	struct rte_security_ctx *ctx;
9154 	uint8_t *input_text;
9155 	uint32_t src, dst;
9156 	uint32_t verify;
9157 
9158 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9159 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9160 
9161 	/* Use first test data to create session */
9162 
9163 	/* Copy IPsec xform */
9164 	memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform));
9165 
9166 	dir = ipsec_xform.direction;
9167 	verify = flags->tunnel_hdr_verify;
9168 
9169 	memcpy(&src, &ipv4->src_addr, sizeof(ipv4->src_addr));
9170 	memcpy(&dst, &ipv4->dst_addr, sizeof(ipv4->dst_addr));
9171 
9172 	if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) {
9173 		if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR)
9174 			src += 1;
9175 		else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR)
9176 			dst += 1;
9177 	}
9178 
9179 	if (td->ipsec_xform.mode == RTE_SECURITY_IPSEC_SA_MODE_TUNNEL) {
9180 		if (td->ipsec_xform.tunnel.type ==
9181 				RTE_SECURITY_IPSEC_TUNNEL_IPV4) {
9182 			memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src,
9183 			       sizeof(src));
9184 			memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst,
9185 			       sizeof(dst));
9186 
9187 			if (flags->df == TEST_IPSEC_SET_DF_0_INNER_1)
9188 				ipsec_xform.tunnel.ipv4.df = 0;
9189 
9190 			if (flags->df == TEST_IPSEC_SET_DF_1_INNER_0)
9191 				ipsec_xform.tunnel.ipv4.df = 1;
9192 
9193 			if (flags->dscp == TEST_IPSEC_SET_DSCP_0_INNER_1)
9194 				ipsec_xform.tunnel.ipv4.dscp = 0;
9195 
9196 			if (flags->dscp == TEST_IPSEC_SET_DSCP_1_INNER_0)
9197 				ipsec_xform.tunnel.ipv4.dscp =
9198 						TEST_IPSEC_DSCP_VAL;
9199 
9200 		} else {
9201 			if (flags->dscp == TEST_IPSEC_SET_DSCP_0_INNER_1)
9202 				ipsec_xform.tunnel.ipv6.dscp = 0;
9203 
9204 			if (flags->dscp == TEST_IPSEC_SET_DSCP_1_INNER_0)
9205 				ipsec_xform.tunnel.ipv6.dscp =
9206 						TEST_IPSEC_DSCP_VAL;
9207 
9208 			memcpy(&ipsec_xform.tunnel.ipv6.src_addr, &v6_src,
9209 			       sizeof(v6_src));
9210 			memcpy(&ipsec_xform.tunnel.ipv6.dst_addr, &v6_dst,
9211 			       sizeof(v6_dst));
9212 		}
9213 	}
9214 
9215 	ctx = rte_cryptodev_get_sec_ctx(dev_id);
9216 
9217 	sec_cap_idx.action = ut_params->type;
9218 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
9219 	sec_cap_idx.ipsec.proto = ipsec_xform.proto;
9220 	sec_cap_idx.ipsec.mode = ipsec_xform.mode;
9221 	sec_cap_idx.ipsec.direction = ipsec_xform.direction;
9222 
9223 	if (flags->udp_encap)
9224 		ipsec_xform.options.udp_encap = 1;
9225 
9226 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9227 	if (sec_cap == NULL)
9228 		return TEST_SKIPPED;
9229 
9230 	/* Copy cipher session parameters */
9231 	if (td[0].aead) {
9232 		memcpy(&ut_params->aead_xform, &td[0].xform.aead,
9233 		       sizeof(ut_params->aead_xform));
9234 		ut_params->aead_xform.aead.key.data = td[0].key.data;
9235 		ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
9236 
9237 		/* Verify crypto capabilities */
9238 		if (test_ipsec_crypto_caps_aead_verify(
9239 				sec_cap,
9240 				&ut_params->aead_xform) != 0) {
9241 			if (!silent)
9242 				RTE_LOG(INFO, USER1,
9243 					"Crypto capabilities not supported\n");
9244 			return TEST_SKIPPED;
9245 		}
9246 	} else if (td[0].auth_only) {
9247 		memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth,
9248 		       sizeof(ut_params->auth_xform));
9249 		ut_params->auth_xform.auth.key.data = td[0].auth_key.data;
9250 
9251 		if (test_ipsec_crypto_caps_auth_verify(
9252 				sec_cap,
9253 				&ut_params->auth_xform) != 0) {
9254 			if (!silent)
9255 				RTE_LOG(INFO, USER1,
9256 					"Auth crypto capabilities not supported\n");
9257 			return TEST_SKIPPED;
9258 		}
9259 	} else {
9260 		memcpy(&ut_params->cipher_xform, &td[0].xform.chain.cipher,
9261 		       sizeof(ut_params->cipher_xform));
9262 		memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth,
9263 		       sizeof(ut_params->auth_xform));
9264 		ut_params->cipher_xform.cipher.key.data = td[0].key.data;
9265 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9266 		ut_params->auth_xform.auth.key.data = td[0].auth_key.data;
9267 
9268 		/* Verify crypto capabilities */
9269 
9270 		if (test_ipsec_crypto_caps_cipher_verify(
9271 				sec_cap,
9272 				&ut_params->cipher_xform) != 0) {
9273 			if (!silent)
9274 				RTE_LOG(INFO, USER1,
9275 					"Cipher crypto capabilities not supported\n");
9276 			return TEST_SKIPPED;
9277 		}
9278 
9279 		if (test_ipsec_crypto_caps_auth_verify(
9280 				sec_cap,
9281 				&ut_params->auth_xform) != 0) {
9282 			if (!silent)
9283 				RTE_LOG(INFO, USER1,
9284 					"Auth crypto capabilities not supported\n");
9285 			return TEST_SKIPPED;
9286 		}
9287 	}
9288 
9289 	if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
9290 		return TEST_SKIPPED;
9291 
9292 	struct rte_security_session_conf sess_conf = {
9293 		.action_type = ut_params->type,
9294 		.protocol = RTE_SECURITY_PROTOCOL_IPSEC,
9295 	};
9296 
9297 	if (td[0].aead || td[0].aes_gmac) {
9298 		salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
9299 		memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
9300 	}
9301 
9302 	if (td[0].aead) {
9303 		sess_conf.ipsec = ipsec_xform;
9304 		sess_conf.crypto_xform = &ut_params->aead_xform;
9305 	} else if (td[0].auth_only) {
9306 		sess_conf.ipsec = ipsec_xform;
9307 		sess_conf.crypto_xform = &ut_params->auth_xform;
9308 	} else {
9309 		sess_conf.ipsec = ipsec_xform;
9310 		if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) {
9311 			sess_conf.crypto_xform = &ut_params->cipher_xform;
9312 			ut_params->cipher_xform.next = &ut_params->auth_xform;
9313 		} else {
9314 			sess_conf.crypto_xform = &ut_params->auth_xform;
9315 			ut_params->auth_xform.next = &ut_params->cipher_xform;
9316 		}
9317 	}
9318 
9319 	/* Create security session */
9320 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9321 					ts_params->session_mpool,
9322 					ts_params->session_priv_mpool);
9323 
9324 	if (ut_params->sec_session == NULL)
9325 		return TEST_SKIPPED;
9326 
9327 	for (i = 0; i < nb_td; i++) {
9328 		if (flags->antireplay &&
9329 		    (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)) {
9330 			sess_conf.ipsec.esn.value = td[i].ipsec_xform.esn.value;
9331 			ret = rte_security_session_update(ctx,
9332 				ut_params->sec_session, &sess_conf);
9333 			if (ret) {
9334 				printf("Could not update sequence number in "
9335 				       "session\n");
9336 				return TEST_SKIPPED;
9337 			}
9338 		}
9339 
9340 		/* Setup source mbuf payload */
9341 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9342 		memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9343 				rte_pktmbuf_tailroom(ut_params->ibuf));
9344 
9345 		input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9346 				td[i].input_text.len);
9347 
9348 		memcpy(input_text, td[i].input_text.data,
9349 		       td[i].input_text.len);
9350 
9351 		if (test_ipsec_pkt_update(input_text, flags))
9352 			return TEST_FAILED;
9353 
9354 		/* Generate crypto op data structure */
9355 		ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9356 					RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9357 		if (!ut_params->op) {
9358 			printf("TestCase %s line %d: %s\n",
9359 				__func__, __LINE__,
9360 				"failed to allocate crypto op");
9361 			ret = TEST_FAILED;
9362 			goto crypto_op_free;
9363 		}
9364 
9365 		/* Attach session to operation */
9366 		rte_security_attach_session(ut_params->op,
9367 					    ut_params->sec_session);
9368 
9369 		/* Set crypto operation mbufs */
9370 		ut_params->op->sym->m_src = ut_params->ibuf;
9371 		ut_params->op->sym->m_dst = NULL;
9372 
9373 		/* Copy IV in crypto operation when IV generation is disabled */
9374 		if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
9375 		    ipsec_xform.options.iv_gen_disable == 1) {
9376 			uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
9377 								uint8_t *,
9378 								IV_OFFSET);
9379 			int len;
9380 
9381 			if (td[i].aead)
9382 				len = td[i].xform.aead.aead.iv.length;
9383 			else if (td[i].aes_gmac)
9384 				len = td[i].xform.chain.auth.auth.iv.length;
9385 			else
9386 				len = td[i].xform.chain.cipher.cipher.iv.length;
9387 
9388 			memcpy(iv, td[i].iv.data, len);
9389 		}
9390 
9391 		/* Process crypto operation */
9392 		process_crypto_request(dev_id, ut_params->op);
9393 
9394 		ret = test_ipsec_status_check(&td[i], ut_params->op, flags, dir,
9395 					      i + 1);
9396 		if (ret != TEST_SUCCESS)
9397 			goto crypto_op_free;
9398 
9399 		if (res_d != NULL)
9400 			res_d_tmp = &res_d[i];
9401 
9402 		ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
9403 					      res_d_tmp, silent, flags);
9404 		if (ret != TEST_SUCCESS)
9405 			goto crypto_op_free;
9406 
9407 		ret = test_ipsec_stats_verify(ctx, ut_params->sec_session,
9408 					      flags, dir);
9409 		if (ret != TEST_SUCCESS)
9410 			goto crypto_op_free;
9411 
9412 		rte_crypto_op_free(ut_params->op);
9413 		ut_params->op = NULL;
9414 
9415 		rte_pktmbuf_free(ut_params->ibuf);
9416 		ut_params->ibuf = NULL;
9417 	}
9418 
9419 crypto_op_free:
9420 	rte_crypto_op_free(ut_params->op);
9421 	ut_params->op = NULL;
9422 
9423 	rte_pktmbuf_free(ut_params->ibuf);
9424 	ut_params->ibuf = NULL;
9425 
9426 	if (ut_params->sec_session)
9427 		rte_security_session_destroy(ctx, ut_params->sec_session);
9428 	ut_params->sec_session = NULL;
9429 
9430 	return ret;
9431 }
9432 
9433 static int
9434 test_ipsec_proto_known_vec(const void *test_data)
9435 {
9436 	struct ipsec_test_data td_outb;
9437 	struct ipsec_test_flags flags;
9438 
9439 	memset(&flags, 0, sizeof(flags));
9440 
9441 	memcpy(&td_outb, test_data, sizeof(td_outb));
9442 
9443 	if (td_outb.aes_gmac || td_outb.aead ||
9444 	    ((td_outb.ipsec_xform.proto != RTE_SECURITY_IPSEC_SA_PROTO_AH) &&
9445 	     (td_outb.xform.chain.cipher.cipher.algo != RTE_CRYPTO_CIPHER_NULL))) {
9446 		/* Disable IV gen to be able to test with known vectors */
9447 		td_outb.ipsec_xform.options.iv_gen_disable = 1;
9448 	}
9449 
9450 	return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9451 }
9452 
9453 static int
9454 test_ipsec_proto_known_vec_inb(const void *test_data)
9455 {
9456 	const struct ipsec_test_data *td = test_data;
9457 	struct ipsec_test_flags flags;
9458 	struct ipsec_test_data td_inb;
9459 
9460 	memset(&flags, 0, sizeof(flags));
9461 
9462 	if (td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)
9463 		test_ipsec_td_in_from_out(td, &td_inb);
9464 	else
9465 		memcpy(&td_inb, td, sizeof(td_inb));
9466 
9467 	return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
9468 }
9469 
9470 static int
9471 test_ipsec_proto_known_vec_fragmented(const void *test_data)
9472 {
9473 	struct ipsec_test_data td_outb;
9474 	struct ipsec_test_flags flags;
9475 
9476 	memset(&flags, 0, sizeof(flags));
9477 	flags.fragment = true;
9478 
9479 	memcpy(&td_outb, test_data, sizeof(td_outb));
9480 
9481 	/* Disable IV gen to be able to test with known vectors */
9482 	td_outb.ipsec_xform.options.iv_gen_disable = 1;
9483 
9484 	return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9485 }
9486 
9487 static int
9488 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
9489 {
9490 	struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9491 	struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9492 	unsigned int i, nb_pkts = 1, pass_cnt = 0;
9493 	int ret;
9494 
9495 	if (flags->iv_gen ||
9496 	    flags->sa_expiry_pkts_soft ||
9497 	    flags->sa_expiry_pkts_hard)
9498 		nb_pkts = IPSEC_TEST_PACKETS_MAX;
9499 
9500 	for (i = 0; i < RTE_DIM(alg_list); i++) {
9501 		test_ipsec_td_prepare(alg_list[i].param1,
9502 				      alg_list[i].param2,
9503 				      flags,
9504 				      td_outb,
9505 				      nb_pkts);
9506 
9507 		if (!td_outb->aead) {
9508 			enum rte_crypto_cipher_algorithm cipher_alg;
9509 			enum rte_crypto_auth_algorithm auth_alg;
9510 
9511 			cipher_alg = td_outb->xform.chain.cipher.cipher.algo;
9512 			auth_alg = td_outb->xform.chain.auth.auth.algo;
9513 
9514 			if (td_outb->aes_gmac && cipher_alg != RTE_CRYPTO_CIPHER_NULL)
9515 				continue;
9516 
9517 			/* ICV is not applicable for NULL auth */
9518 			if (flags->icv_corrupt &&
9519 			    auth_alg == RTE_CRYPTO_AUTH_NULL)
9520 				continue;
9521 
9522 			/* IV is not applicable for NULL cipher */
9523 			if (flags->iv_gen &&
9524 			    cipher_alg == RTE_CRYPTO_CIPHER_NULL)
9525 				continue;
9526 		}
9527 
9528 		ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9529 					       flags);
9530 		if (ret == TEST_SKIPPED)
9531 			continue;
9532 
9533 		if (ret == TEST_FAILED)
9534 			return TEST_FAILED;
9535 
9536 		test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9537 
9538 		ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9539 					       flags);
9540 		if (ret == TEST_SKIPPED)
9541 			continue;
9542 
9543 		if (ret == TEST_FAILED)
9544 			return TEST_FAILED;
9545 
9546 		if (flags->display_alg)
9547 			test_ipsec_display_alg(alg_list[i].param1,
9548 					       alg_list[i].param2);
9549 
9550 		pass_cnt++;
9551 	}
9552 
9553 	if (pass_cnt > 0)
9554 		return TEST_SUCCESS;
9555 	else
9556 		return TEST_SKIPPED;
9557 }
9558 
9559 static int
9560 test_ipsec_ah_proto_all(const struct ipsec_test_flags *flags)
9561 {
9562 	struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9563 	struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9564 	unsigned int i, nb_pkts = 1, pass_cnt = 0;
9565 	int ret;
9566 
9567 	for (i = 0; i < RTE_DIM(ah_alg_list); i++) {
9568 		test_ipsec_td_prepare(ah_alg_list[i].param1,
9569 				      ah_alg_list[i].param2,
9570 				      flags,
9571 				      td_outb,
9572 				      nb_pkts);
9573 
9574 		ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9575 					       flags);
9576 		if (ret == TEST_SKIPPED)
9577 			continue;
9578 
9579 		if (ret == TEST_FAILED)
9580 			return TEST_FAILED;
9581 
9582 		test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9583 
9584 		ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9585 					       flags);
9586 		if (ret == TEST_SKIPPED)
9587 			continue;
9588 
9589 		if (ret == TEST_FAILED)
9590 			return TEST_FAILED;
9591 
9592 		if (flags->display_alg)
9593 			test_ipsec_display_alg(ah_alg_list[i].param1,
9594 					       ah_alg_list[i].param2);
9595 
9596 		pass_cnt++;
9597 	}
9598 
9599 	if (pass_cnt > 0)
9600 		return TEST_SUCCESS;
9601 	else
9602 		return TEST_SKIPPED;
9603 }
9604 
9605 static int
9606 test_ipsec_proto_display_list(const void *data __rte_unused)
9607 {
9608 	struct ipsec_test_flags flags;
9609 
9610 	memset(&flags, 0, sizeof(flags));
9611 
9612 	flags.display_alg = true;
9613 
9614 	return test_ipsec_proto_all(&flags);
9615 }
9616 
9617 static int
9618 test_ipsec_proto_ah_tunnel_ipv4(const void *data __rte_unused)
9619 {
9620 	struct ipsec_test_flags flags;
9621 
9622 	memset(&flags, 0, sizeof(flags));
9623 
9624 	flags.ah = true;
9625 	flags.display_alg = true;
9626 
9627 	return test_ipsec_ah_proto_all(&flags);
9628 }
9629 
9630 static int
9631 test_ipsec_proto_ah_transport_ipv4(const void *data __rte_unused)
9632 {
9633 	struct ipsec_test_flags flags;
9634 
9635 	memset(&flags, 0, sizeof(flags));
9636 
9637 	flags.ah = true;
9638 	flags.transport = true;
9639 
9640 	return test_ipsec_ah_proto_all(&flags);
9641 }
9642 
9643 static int
9644 test_ipsec_proto_iv_gen(const void *data __rte_unused)
9645 {
9646 	struct ipsec_test_flags flags;
9647 
9648 	memset(&flags, 0, sizeof(flags));
9649 
9650 	flags.iv_gen = true;
9651 
9652 	return test_ipsec_proto_all(&flags);
9653 }
9654 
9655 static int
9656 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused)
9657 {
9658 	struct ipsec_test_flags flags;
9659 
9660 	memset(&flags, 0, sizeof(flags));
9661 
9662 	flags.sa_expiry_pkts_soft = true;
9663 
9664 	return test_ipsec_proto_all(&flags);
9665 }
9666 
9667 static int
9668 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused)
9669 {
9670 	struct ipsec_test_flags flags;
9671 
9672 	memset(&flags, 0, sizeof(flags));
9673 
9674 	flags.sa_expiry_pkts_hard = true;
9675 
9676 	return test_ipsec_proto_all(&flags);
9677 }
9678 
9679 static int
9680 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused)
9681 {
9682 	struct ipsec_test_flags flags;
9683 
9684 	memset(&flags, 0, sizeof(flags));
9685 
9686 	flags.icv_corrupt = true;
9687 
9688 	return test_ipsec_proto_all(&flags);
9689 }
9690 
9691 static int
9692 test_ipsec_proto_udp_encap(const void *data __rte_unused)
9693 {
9694 	struct ipsec_test_flags flags;
9695 
9696 	memset(&flags, 0, sizeof(flags));
9697 
9698 	flags.udp_encap = true;
9699 
9700 	return test_ipsec_proto_all(&flags);
9701 }
9702 
9703 static int
9704 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused)
9705 {
9706 	struct ipsec_test_flags flags;
9707 
9708 	memset(&flags, 0, sizeof(flags));
9709 
9710 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
9711 
9712 	return test_ipsec_proto_all(&flags);
9713 }
9714 
9715 static int
9716 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
9717 {
9718 	struct ipsec_test_flags flags;
9719 
9720 	memset(&flags, 0, sizeof(flags));
9721 
9722 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
9723 
9724 	return test_ipsec_proto_all(&flags);
9725 }
9726 
9727 static int
9728 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused)
9729 {
9730 	struct ipsec_test_flags flags;
9731 
9732 	memset(&flags, 0, sizeof(flags));
9733 
9734 	flags.udp_encap = true;
9735 	flags.udp_ports_verify = true;
9736 
9737 	return test_ipsec_proto_all(&flags);
9738 }
9739 
9740 static int
9741 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused)
9742 {
9743 	struct ipsec_test_flags flags;
9744 
9745 	memset(&flags, 0, sizeof(flags));
9746 
9747 	flags.ip_csum = true;
9748 
9749 	return test_ipsec_proto_all(&flags);
9750 }
9751 
9752 static int
9753 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused)
9754 {
9755 	struct ipsec_test_flags flags;
9756 
9757 	memset(&flags, 0, sizeof(flags));
9758 
9759 	flags.l4_csum = true;
9760 
9761 	return test_ipsec_proto_all(&flags);
9762 }
9763 
9764 static int
9765 test_ipsec_proto_tunnel_v4_in_v4(const void *data __rte_unused)
9766 {
9767 	struct ipsec_test_flags flags;
9768 
9769 	memset(&flags, 0, sizeof(flags));
9770 
9771 	flags.ipv6 = false;
9772 	flags.tunnel_ipv6 = false;
9773 
9774 	return test_ipsec_proto_all(&flags);
9775 }
9776 
9777 static int
9778 test_ipsec_proto_tunnel_v6_in_v6(const void *data __rte_unused)
9779 {
9780 	struct ipsec_test_flags flags;
9781 
9782 	memset(&flags, 0, sizeof(flags));
9783 
9784 	flags.ipv6 = true;
9785 	flags.tunnel_ipv6 = true;
9786 
9787 	return test_ipsec_proto_all(&flags);
9788 }
9789 
9790 static int
9791 test_ipsec_proto_tunnel_v4_in_v6(const void *data __rte_unused)
9792 {
9793 	struct ipsec_test_flags flags;
9794 
9795 	memset(&flags, 0, sizeof(flags));
9796 
9797 	flags.ipv6 = false;
9798 	flags.tunnel_ipv6 = true;
9799 
9800 	return test_ipsec_proto_all(&flags);
9801 }
9802 
9803 static int
9804 test_ipsec_proto_tunnel_v6_in_v4(const void *data __rte_unused)
9805 {
9806 	struct ipsec_test_flags flags;
9807 
9808 	memset(&flags, 0, sizeof(flags));
9809 
9810 	flags.ipv6 = true;
9811 	flags.tunnel_ipv6 = false;
9812 
9813 	return test_ipsec_proto_all(&flags);
9814 }
9815 
9816 static int
9817 test_ipsec_proto_transport_v4(const void *data __rte_unused)
9818 {
9819 	struct ipsec_test_flags flags;
9820 
9821 	memset(&flags, 0, sizeof(flags));
9822 
9823 	flags.ipv6 = false;
9824 	flags.transport = true;
9825 
9826 	return test_ipsec_proto_all(&flags);
9827 }
9828 
9829 static int
9830 test_ipsec_proto_transport_l4_csum(const void *data __rte_unused)
9831 {
9832 	struct ipsec_test_flags flags = {
9833 		.l4_csum = true,
9834 		.transport = true,
9835 	};
9836 
9837 	return test_ipsec_proto_all(&flags);
9838 }
9839 
9840 static int
9841 test_ipsec_proto_stats(const void *data __rte_unused)
9842 {
9843 	struct ipsec_test_flags flags;
9844 
9845 	memset(&flags, 0, sizeof(flags));
9846 
9847 	flags.stats_success = true;
9848 
9849 	return test_ipsec_proto_all(&flags);
9850 }
9851 
9852 static int
9853 test_ipsec_proto_pkt_fragment(const void *data __rte_unused)
9854 {
9855 	struct ipsec_test_flags flags;
9856 
9857 	memset(&flags, 0, sizeof(flags));
9858 
9859 	flags.fragment = true;
9860 
9861 	return test_ipsec_proto_all(&flags);
9862 
9863 }
9864 
9865 static int
9866 test_ipsec_proto_copy_df_inner_0(const void *data __rte_unused)
9867 {
9868 	struct ipsec_test_flags flags;
9869 
9870 	memset(&flags, 0, sizeof(flags));
9871 
9872 	flags.df = TEST_IPSEC_COPY_DF_INNER_0;
9873 
9874 	return test_ipsec_proto_all(&flags);
9875 }
9876 
9877 static int
9878 test_ipsec_proto_copy_df_inner_1(const void *data __rte_unused)
9879 {
9880 	struct ipsec_test_flags flags;
9881 
9882 	memset(&flags, 0, sizeof(flags));
9883 
9884 	flags.df = TEST_IPSEC_COPY_DF_INNER_1;
9885 
9886 	return test_ipsec_proto_all(&flags);
9887 }
9888 
9889 static int
9890 test_ipsec_proto_set_df_0_inner_1(const void *data __rte_unused)
9891 {
9892 	struct ipsec_test_flags flags;
9893 
9894 	memset(&flags, 0, sizeof(flags));
9895 
9896 	flags.df = TEST_IPSEC_SET_DF_0_INNER_1;
9897 
9898 	return test_ipsec_proto_all(&flags);
9899 }
9900 
9901 static int
9902 test_ipsec_proto_set_df_1_inner_0(const void *data __rte_unused)
9903 {
9904 	struct ipsec_test_flags flags;
9905 
9906 	memset(&flags, 0, sizeof(flags));
9907 
9908 	flags.df = TEST_IPSEC_SET_DF_1_INNER_0;
9909 
9910 	return test_ipsec_proto_all(&flags);
9911 }
9912 
9913 static int
9914 test_ipsec_proto_ipv4_copy_dscp_inner_0(const void *data __rte_unused)
9915 {
9916 	struct ipsec_test_flags flags;
9917 
9918 	memset(&flags, 0, sizeof(flags));
9919 
9920 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
9921 
9922 	return test_ipsec_proto_all(&flags);
9923 }
9924 
9925 static int
9926 test_ipsec_proto_ipv4_copy_dscp_inner_1(const void *data __rte_unused)
9927 {
9928 	struct ipsec_test_flags flags;
9929 
9930 	memset(&flags, 0, sizeof(flags));
9931 
9932 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
9933 
9934 	return test_ipsec_proto_all(&flags);
9935 }
9936 
9937 static int
9938 test_ipsec_proto_ipv4_set_dscp_0_inner_1(const void *data __rte_unused)
9939 {
9940 	struct ipsec_test_flags flags;
9941 
9942 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
9943 			RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
9944 		return TEST_SKIPPED;
9945 
9946 	memset(&flags, 0, sizeof(flags));
9947 
9948 	flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
9949 
9950 	return test_ipsec_proto_all(&flags);
9951 }
9952 
9953 static int
9954 test_ipsec_proto_ipv4_set_dscp_1_inner_0(const void *data __rte_unused)
9955 {
9956 	struct ipsec_test_flags flags;
9957 
9958 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
9959 			RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
9960 		return TEST_SKIPPED;
9961 
9962 	memset(&flags, 0, sizeof(flags));
9963 
9964 	flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
9965 
9966 	return test_ipsec_proto_all(&flags);
9967 }
9968 
9969 static int
9970 test_ipsec_proto_ipv6_copy_dscp_inner_0(const void *data __rte_unused)
9971 {
9972 	struct ipsec_test_flags flags;
9973 
9974 	memset(&flags, 0, sizeof(flags));
9975 
9976 	flags.ipv6 = true;
9977 	flags.tunnel_ipv6 = true;
9978 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
9979 
9980 	return test_ipsec_proto_all(&flags);
9981 }
9982 
9983 static int
9984 test_ipsec_proto_ipv6_copy_dscp_inner_1(const void *data __rte_unused)
9985 {
9986 	struct ipsec_test_flags flags;
9987 
9988 	memset(&flags, 0, sizeof(flags));
9989 
9990 	flags.ipv6 = true;
9991 	flags.tunnel_ipv6 = true;
9992 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
9993 
9994 	return test_ipsec_proto_all(&flags);
9995 }
9996 
9997 static int
9998 test_ipsec_proto_ipv6_set_dscp_0_inner_1(const void *data __rte_unused)
9999 {
10000 	struct ipsec_test_flags flags;
10001 
10002 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
10003 			RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
10004 		return TEST_SKIPPED;
10005 
10006 	memset(&flags, 0, sizeof(flags));
10007 
10008 	flags.ipv6 = true;
10009 	flags.tunnel_ipv6 = true;
10010 	flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
10011 
10012 	return test_ipsec_proto_all(&flags);
10013 }
10014 
10015 static int
10016 test_ipsec_proto_ipv6_set_dscp_1_inner_0(const void *data __rte_unused)
10017 {
10018 	struct ipsec_test_flags flags;
10019 
10020 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
10021 			RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
10022 		return TEST_SKIPPED;
10023 
10024 	memset(&flags, 0, sizeof(flags));
10025 
10026 	flags.ipv6 = true;
10027 	flags.tunnel_ipv6 = true;
10028 	flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
10029 
10030 	return test_ipsec_proto_all(&flags);
10031 }
10032 
10033 static int
10034 test_ipsec_pkt_replay(const void *test_data, const uint64_t esn[],
10035 		      bool replayed_pkt[], uint32_t nb_pkts, bool esn_en,
10036 		      uint64_t winsz)
10037 {
10038 	struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
10039 	struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
10040 	struct ipsec_test_flags flags;
10041 	uint32_t i = 0, ret = 0;
10042 
10043 	memset(&flags, 0, sizeof(flags));
10044 	flags.antireplay = true;
10045 
10046 	for (i = 0; i < nb_pkts; i++) {
10047 		memcpy(&td_outb[i], test_data, sizeof(td_outb[i]));
10048 		td_outb[i].ipsec_xform.options.iv_gen_disable = 1;
10049 		td_outb[i].ipsec_xform.replay_win_sz = winsz;
10050 		td_outb[i].ipsec_xform.options.esn = esn_en;
10051 	}
10052 
10053 	for (i = 0; i < nb_pkts; i++)
10054 		td_outb[i].ipsec_xform.esn.value = esn[i];
10055 
10056 	ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
10057 				       &flags);
10058 	if (ret != TEST_SUCCESS)
10059 		return ret;
10060 
10061 	test_ipsec_td_update(td_inb, td_outb, nb_pkts, &flags);
10062 
10063 	for (i = 0; i < nb_pkts; i++) {
10064 		td_inb[i].ipsec_xform.options.esn = esn_en;
10065 		/* Set antireplay flag for packets to be dropped */
10066 		td_inb[i].ar_packet = replayed_pkt[i];
10067 	}
10068 
10069 	ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
10070 				       &flags);
10071 
10072 	return ret;
10073 }
10074 
10075 static int
10076 test_ipsec_proto_pkt_antireplay(const void *test_data, uint64_t winsz)
10077 {
10078 
10079 	uint32_t nb_pkts = 5;
10080 	bool replayed_pkt[5];
10081 	uint64_t esn[5];
10082 
10083 	/* 1. Advance the TOP of the window to WS * 2 */
10084 	esn[0] = winsz * 2;
10085 	/* 2. Test sequence number within the new window(WS + 1) */
10086 	esn[1] = winsz + 1;
10087 	/* 3. Test sequence number less than the window BOTTOM */
10088 	esn[2] = winsz;
10089 	/* 4. Test sequence number in the middle of the window */
10090 	esn[3] = winsz + (winsz / 2);
10091 	/* 5. Test replay of the packet in the middle of the window */
10092 	esn[4] = winsz + (winsz / 2);
10093 
10094 	replayed_pkt[0] = false;
10095 	replayed_pkt[1] = false;
10096 	replayed_pkt[2] = true;
10097 	replayed_pkt[3] = false;
10098 	replayed_pkt[4] = true;
10099 
10100 	return test_ipsec_pkt_replay(test_data, esn, replayed_pkt, nb_pkts,
10101 				     false, winsz);
10102 }
10103 
10104 static int
10105 test_ipsec_proto_pkt_antireplay1024(const void *test_data)
10106 {
10107 	return test_ipsec_proto_pkt_antireplay(test_data, 1024);
10108 }
10109 
10110 static int
10111 test_ipsec_proto_pkt_antireplay2048(const void *test_data)
10112 {
10113 	return test_ipsec_proto_pkt_antireplay(test_data, 2048);
10114 }
10115 
10116 static int
10117 test_ipsec_proto_pkt_antireplay4096(const void *test_data)
10118 {
10119 	return test_ipsec_proto_pkt_antireplay(test_data, 4096);
10120 }
10121 
10122 static int
10123 test_ipsec_proto_pkt_esn_antireplay(const void *test_data, uint64_t winsz)
10124 {
10125 
10126 	uint32_t nb_pkts = 7;
10127 	bool replayed_pkt[7];
10128 	uint64_t esn[7];
10129 
10130 	/* Set the initial sequence number */
10131 	esn[0] = (uint64_t)(0xFFFFFFFF - winsz);
10132 	/* 1. Advance the TOP of the window to (1<<32 + WS/2) */
10133 	esn[1] = (uint64_t)((1ULL << 32) + (winsz / 2));
10134 	/* 2. Test sequence number within new window (1<<32 + WS/2 + 1) */
10135 	esn[2] = (uint64_t)((1ULL << 32) - (winsz / 2) + 1);
10136 	/* 3. Test with sequence number within window (1<<32 - 1) */
10137 	esn[3] = (uint64_t)((1ULL << 32) - 1);
10138 	/* 4. Test with sequence number within window (1<<32 - 1) */
10139 	esn[4] = (uint64_t)(1ULL << 32);
10140 	/* 5. Test with duplicate sequence number within
10141 	 * new window (1<<32 - 1)
10142 	 */
10143 	esn[5] = (uint64_t)((1ULL << 32) - 1);
10144 	/* 6. Test with duplicate sequence number within new window (1<<32) */
10145 	esn[6] = (uint64_t)(1ULL << 32);
10146 
10147 	replayed_pkt[0] = false;
10148 	replayed_pkt[1] = false;
10149 	replayed_pkt[2] = false;
10150 	replayed_pkt[3] = false;
10151 	replayed_pkt[4] = false;
10152 	replayed_pkt[5] = true;
10153 	replayed_pkt[6] = true;
10154 
10155 	return test_ipsec_pkt_replay(test_data, esn, replayed_pkt, nb_pkts,
10156 				     true, winsz);
10157 }
10158 
10159 static int
10160 test_ipsec_proto_pkt_esn_antireplay1024(const void *test_data)
10161 {
10162 	return test_ipsec_proto_pkt_esn_antireplay(test_data, 1024);
10163 }
10164 
10165 static int
10166 test_ipsec_proto_pkt_esn_antireplay2048(const void *test_data)
10167 {
10168 	return test_ipsec_proto_pkt_esn_antireplay(test_data, 2048);
10169 }
10170 
10171 static int
10172 test_ipsec_proto_pkt_esn_antireplay4096(const void *test_data)
10173 {
10174 	return test_ipsec_proto_pkt_esn_antireplay(test_data, 4096);
10175 }
10176 
10177 static int
10178 test_PDCP_PROTO_all(void)
10179 {
10180 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10181 	struct crypto_unittest_params *ut_params = &unittest_params;
10182 	struct rte_cryptodev_info dev_info;
10183 	int status;
10184 
10185 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10186 	uint64_t feat_flags = dev_info.feature_flags;
10187 
10188 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
10189 		return TEST_SKIPPED;
10190 
10191 	/* Set action type */
10192 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10193 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10194 		gbl_action_type;
10195 
10196 	if (security_proto_supported(ut_params->type,
10197 			RTE_SECURITY_PROTOCOL_PDCP) < 0)
10198 		return TEST_SKIPPED;
10199 
10200 	status = test_PDCP_PROTO_cplane_encap_all();
10201 	status += test_PDCP_PROTO_cplane_decap_all();
10202 	status += test_PDCP_PROTO_uplane_encap_all();
10203 	status += test_PDCP_PROTO_uplane_decap_all();
10204 	status += test_PDCP_PROTO_SGL_in_place_32B();
10205 	status += test_PDCP_PROTO_SGL_oop_32B_128B();
10206 	status += test_PDCP_PROTO_SGL_oop_32B_40B();
10207 	status += test_PDCP_PROTO_SGL_oop_128B_32B();
10208 	status += test_PDCP_SDAP_PROTO_encap_all();
10209 	status += test_PDCP_SDAP_PROTO_decap_all();
10210 	status += test_PDCP_PROTO_short_mac();
10211 
10212 	if (status)
10213 		return TEST_FAILED;
10214 	else
10215 		return TEST_SUCCESS;
10216 }
10217 
10218 static int
10219 test_ipsec_proto_ipv4_ttl_decrement(const void *data __rte_unused)
10220 {
10221 	struct ipsec_test_flags flags = {
10222 		.dec_ttl_or_hop_limit = true
10223 	};
10224 
10225 	return test_ipsec_proto_all(&flags);
10226 }
10227 
10228 static int
10229 test_ipsec_proto_ipv6_hop_limit_decrement(const void *data __rte_unused)
10230 {
10231 	struct ipsec_test_flags flags = {
10232 		.ipv6 = true,
10233 		.dec_ttl_or_hop_limit = true
10234 	};
10235 
10236 	return test_ipsec_proto_all(&flags);
10237 }
10238 
10239 static int
10240 test_docsis_proto_uplink(const void *data)
10241 {
10242 	const struct docsis_test_data *d_td = data;
10243 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10244 	struct crypto_unittest_params *ut_params = &unittest_params;
10245 	uint8_t *plaintext = NULL;
10246 	uint8_t *ciphertext = NULL;
10247 	uint8_t *iv_ptr;
10248 	int32_t cipher_len, crc_len;
10249 	uint32_t crc_data_len;
10250 	int ret = TEST_SUCCESS;
10251 
10252 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
10253 					rte_cryptodev_get_sec_ctx(
10254 						ts_params->valid_devs[0]);
10255 
10256 	/* Verify the capabilities */
10257 	struct rte_security_capability_idx sec_cap_idx;
10258 	const struct rte_security_capability *sec_cap;
10259 	const struct rte_cryptodev_capabilities *crypto_cap;
10260 	const struct rte_cryptodev_symmetric_capability *sym_cap;
10261 	int j = 0;
10262 
10263 	/* Set action type */
10264 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10265 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10266 		gbl_action_type;
10267 
10268 	if (security_proto_supported(ut_params->type,
10269 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
10270 		return TEST_SKIPPED;
10271 
10272 	sec_cap_idx.action = ut_params->type;
10273 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
10274 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
10275 
10276 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
10277 	if (sec_cap == NULL)
10278 		return TEST_SKIPPED;
10279 
10280 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
10281 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
10282 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
10283 				crypto_cap->sym.xform_type ==
10284 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
10285 				crypto_cap->sym.cipher.algo ==
10286 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
10287 			sym_cap = &crypto_cap->sym;
10288 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
10289 						d_td->key.len,
10290 						d_td->iv.len) == 0)
10291 				break;
10292 		}
10293 	}
10294 
10295 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
10296 		return TEST_SKIPPED;
10297 
10298 	/* Setup source mbuf payload */
10299 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10300 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10301 			rte_pktmbuf_tailroom(ut_params->ibuf));
10302 
10303 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10304 			d_td->ciphertext.len);
10305 
10306 	memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
10307 
10308 	/* Setup cipher session parameters */
10309 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10310 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
10311 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
10312 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
10313 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
10314 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
10315 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10316 	ut_params->cipher_xform.next = NULL;
10317 
10318 	/* Setup DOCSIS session parameters */
10319 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
10320 
10321 	struct rte_security_session_conf sess_conf = {
10322 		.action_type = ut_params->type,
10323 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
10324 		.docsis = ut_params->docsis_xform,
10325 		.crypto_xform = &ut_params->cipher_xform,
10326 	};
10327 
10328 	/* Create security session */
10329 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
10330 					ts_params->session_mpool,
10331 					ts_params->session_priv_mpool);
10332 
10333 	if (!ut_params->sec_session) {
10334 		printf("Test function %s line %u: failed to allocate session\n",
10335 			__func__, __LINE__);
10336 		ret = TEST_FAILED;
10337 		goto on_err;
10338 	}
10339 
10340 	/* Generate crypto op data structure */
10341 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10342 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10343 	if (!ut_params->op) {
10344 		printf("Test function %s line %u: failed to allocate symmetric "
10345 			"crypto operation\n", __func__, __LINE__);
10346 		ret = TEST_FAILED;
10347 		goto on_err;
10348 	}
10349 
10350 	/* Setup CRC operation parameters */
10351 	crc_len = d_td->ciphertext.no_crc == false ?
10352 			(d_td->ciphertext.len -
10353 				d_td->ciphertext.crc_offset -
10354 				RTE_ETHER_CRC_LEN) :
10355 			0;
10356 	crc_len = crc_len > 0 ? crc_len : 0;
10357 	crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
10358 	ut_params->op->sym->auth.data.length = crc_len;
10359 	ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
10360 
10361 	/* Setup cipher operation parameters */
10362 	cipher_len = d_td->ciphertext.no_cipher == false ?
10363 			(d_td->ciphertext.len -
10364 				d_td->ciphertext.cipher_offset) :
10365 			0;
10366 	cipher_len = cipher_len > 0 ? cipher_len : 0;
10367 	ut_params->op->sym->cipher.data.length = cipher_len;
10368 	ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
10369 
10370 	/* Setup cipher IV */
10371 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
10372 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
10373 
10374 	/* Attach session to operation */
10375 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
10376 
10377 	/* Set crypto operation mbufs */
10378 	ut_params->op->sym->m_src = ut_params->ibuf;
10379 	ut_params->op->sym->m_dst = NULL;
10380 
10381 	/* Process crypto operation */
10382 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
10383 			NULL) {
10384 		printf("Test function %s line %u: failed to process security "
10385 			"crypto op\n", __func__, __LINE__);
10386 		ret = TEST_FAILED;
10387 		goto on_err;
10388 	}
10389 
10390 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
10391 		printf("Test function %s line %u: failed to process crypto op\n",
10392 			__func__, __LINE__);
10393 		ret = TEST_FAILED;
10394 		goto on_err;
10395 	}
10396 
10397 	/* Validate plaintext */
10398 	plaintext = ciphertext;
10399 
10400 	if (memcmp(plaintext, d_td->plaintext.data,
10401 			d_td->plaintext.len - crc_data_len)) {
10402 		printf("Test function %s line %u: plaintext not as expected\n",
10403 			__func__, __LINE__);
10404 		rte_hexdump(stdout, "expected", d_td->plaintext.data,
10405 				d_td->plaintext.len);
10406 		rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
10407 		ret = TEST_FAILED;
10408 		goto on_err;
10409 	}
10410 
10411 on_err:
10412 	rte_crypto_op_free(ut_params->op);
10413 	ut_params->op = NULL;
10414 
10415 	if (ut_params->sec_session)
10416 		rte_security_session_destroy(ctx, ut_params->sec_session);
10417 	ut_params->sec_session = NULL;
10418 
10419 	rte_pktmbuf_free(ut_params->ibuf);
10420 	ut_params->ibuf = NULL;
10421 
10422 	return ret;
10423 }
10424 
10425 static int
10426 test_docsis_proto_downlink(const void *data)
10427 {
10428 	const struct docsis_test_data *d_td = data;
10429 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10430 	struct crypto_unittest_params *ut_params = &unittest_params;
10431 	uint8_t *plaintext = NULL;
10432 	uint8_t *ciphertext = NULL;
10433 	uint8_t *iv_ptr;
10434 	int32_t cipher_len, crc_len;
10435 	int ret = TEST_SUCCESS;
10436 
10437 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
10438 					rte_cryptodev_get_sec_ctx(
10439 						ts_params->valid_devs[0]);
10440 
10441 	/* Verify the capabilities */
10442 	struct rte_security_capability_idx sec_cap_idx;
10443 	const struct rte_security_capability *sec_cap;
10444 	const struct rte_cryptodev_capabilities *crypto_cap;
10445 	const struct rte_cryptodev_symmetric_capability *sym_cap;
10446 	int j = 0;
10447 
10448 	/* Set action type */
10449 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10450 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10451 		gbl_action_type;
10452 
10453 	if (security_proto_supported(ut_params->type,
10454 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
10455 		return TEST_SKIPPED;
10456 
10457 	sec_cap_idx.action = ut_params->type;
10458 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
10459 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
10460 
10461 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
10462 	if (sec_cap == NULL)
10463 		return TEST_SKIPPED;
10464 
10465 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
10466 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
10467 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
10468 				crypto_cap->sym.xform_type ==
10469 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
10470 				crypto_cap->sym.cipher.algo ==
10471 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
10472 			sym_cap = &crypto_cap->sym;
10473 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
10474 						d_td->key.len,
10475 						d_td->iv.len) == 0)
10476 				break;
10477 		}
10478 	}
10479 
10480 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
10481 		return TEST_SKIPPED;
10482 
10483 	/* Setup source mbuf payload */
10484 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10485 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10486 			rte_pktmbuf_tailroom(ut_params->ibuf));
10487 
10488 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10489 			d_td->plaintext.len);
10490 
10491 	memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
10492 
10493 	/* Setup cipher session parameters */
10494 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10495 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
10496 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10497 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
10498 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
10499 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
10500 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10501 	ut_params->cipher_xform.next = NULL;
10502 
10503 	/* Setup DOCSIS session parameters */
10504 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
10505 
10506 	struct rte_security_session_conf sess_conf = {
10507 		.action_type = ut_params->type,
10508 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
10509 		.docsis = ut_params->docsis_xform,
10510 		.crypto_xform = &ut_params->cipher_xform,
10511 	};
10512 
10513 	/* Create security session */
10514 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
10515 					ts_params->session_mpool,
10516 					ts_params->session_priv_mpool);
10517 
10518 	if (!ut_params->sec_session) {
10519 		printf("Test function %s line %u: failed to allocate session\n",
10520 			__func__, __LINE__);
10521 		ret = TEST_FAILED;
10522 		goto on_err;
10523 	}
10524 
10525 	/* Generate crypto op data structure */
10526 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10527 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10528 	if (!ut_params->op) {
10529 		printf("Test function %s line %u: failed to allocate symmetric "
10530 			"crypto operation\n", __func__, __LINE__);
10531 		ret = TEST_FAILED;
10532 		goto on_err;
10533 	}
10534 
10535 	/* Setup CRC operation parameters */
10536 	crc_len = d_td->plaintext.no_crc == false ?
10537 			(d_td->plaintext.len -
10538 				d_td->plaintext.crc_offset -
10539 				RTE_ETHER_CRC_LEN) :
10540 			0;
10541 	crc_len = crc_len > 0 ? crc_len : 0;
10542 	ut_params->op->sym->auth.data.length = crc_len;
10543 	ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
10544 
10545 	/* Setup cipher operation parameters */
10546 	cipher_len = d_td->plaintext.no_cipher == false ?
10547 			(d_td->plaintext.len -
10548 				d_td->plaintext.cipher_offset) :
10549 			0;
10550 	cipher_len = cipher_len > 0 ? cipher_len : 0;
10551 	ut_params->op->sym->cipher.data.length = cipher_len;
10552 	ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
10553 
10554 	/* Setup cipher IV */
10555 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
10556 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
10557 
10558 	/* Attach session to operation */
10559 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
10560 
10561 	/* Set crypto operation mbufs */
10562 	ut_params->op->sym->m_src = ut_params->ibuf;
10563 	ut_params->op->sym->m_dst = NULL;
10564 
10565 	/* Process crypto operation */
10566 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
10567 			NULL) {
10568 		printf("Test function %s line %u: failed to process crypto op\n",
10569 			__func__, __LINE__);
10570 		ret = TEST_FAILED;
10571 		goto on_err;
10572 	}
10573 
10574 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
10575 		printf("Test function %s line %u: crypto op processing failed\n",
10576 			__func__, __LINE__);
10577 		ret = TEST_FAILED;
10578 		goto on_err;
10579 	}
10580 
10581 	/* Validate ciphertext */
10582 	ciphertext = plaintext;
10583 
10584 	if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
10585 		printf("Test function %s line %u: plaintext not as expected\n",
10586 			__func__, __LINE__);
10587 		rte_hexdump(stdout, "expected", d_td->ciphertext.data,
10588 				d_td->ciphertext.len);
10589 		rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
10590 		ret = TEST_FAILED;
10591 		goto on_err;
10592 	}
10593 
10594 on_err:
10595 	rte_crypto_op_free(ut_params->op);
10596 	ut_params->op = NULL;
10597 
10598 	if (ut_params->sec_session)
10599 		rte_security_session_destroy(ctx, ut_params->sec_session);
10600 	ut_params->sec_session = NULL;
10601 
10602 	rte_pktmbuf_free(ut_params->ibuf);
10603 	ut_params->ibuf = NULL;
10604 
10605 	return ret;
10606 }
10607 #endif
10608 
10609 static int
10610 test_AES_GCM_authenticated_encryption_test_case_1(void)
10611 {
10612 	return test_authenticated_encryption(&gcm_test_case_1);
10613 }
10614 
10615 static int
10616 test_AES_GCM_authenticated_encryption_test_case_2(void)
10617 {
10618 	return test_authenticated_encryption(&gcm_test_case_2);
10619 }
10620 
10621 static int
10622 test_AES_GCM_authenticated_encryption_test_case_3(void)
10623 {
10624 	return test_authenticated_encryption(&gcm_test_case_3);
10625 }
10626 
10627 static int
10628 test_AES_GCM_authenticated_encryption_test_case_4(void)
10629 {
10630 	return test_authenticated_encryption(&gcm_test_case_4);
10631 }
10632 
10633 static int
10634 test_AES_GCM_authenticated_encryption_test_case_5(void)
10635 {
10636 	return test_authenticated_encryption(&gcm_test_case_5);
10637 }
10638 
10639 static int
10640 test_AES_GCM_authenticated_encryption_test_case_6(void)
10641 {
10642 	return test_authenticated_encryption(&gcm_test_case_6);
10643 }
10644 
10645 static int
10646 test_AES_GCM_authenticated_encryption_test_case_7(void)
10647 {
10648 	return test_authenticated_encryption(&gcm_test_case_7);
10649 }
10650 
10651 static int
10652 test_AES_GCM_authenticated_encryption_test_case_8(void)
10653 {
10654 	return test_authenticated_encryption(&gcm_test_case_8);
10655 }
10656 
10657 static int
10658 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
10659 {
10660 	return test_authenticated_encryption(&gcm_J0_test_case_1);
10661 }
10662 
10663 static int
10664 test_AES_GCM_auth_encryption_test_case_192_1(void)
10665 {
10666 	return test_authenticated_encryption(&gcm_test_case_192_1);
10667 }
10668 
10669 static int
10670 test_AES_GCM_auth_encryption_test_case_192_2(void)
10671 {
10672 	return test_authenticated_encryption(&gcm_test_case_192_2);
10673 }
10674 
10675 static int
10676 test_AES_GCM_auth_encryption_test_case_192_3(void)
10677 {
10678 	return test_authenticated_encryption(&gcm_test_case_192_3);
10679 }
10680 
10681 static int
10682 test_AES_GCM_auth_encryption_test_case_192_4(void)
10683 {
10684 	return test_authenticated_encryption(&gcm_test_case_192_4);
10685 }
10686 
10687 static int
10688 test_AES_GCM_auth_encryption_test_case_192_5(void)
10689 {
10690 	return test_authenticated_encryption(&gcm_test_case_192_5);
10691 }
10692 
10693 static int
10694 test_AES_GCM_auth_encryption_test_case_192_6(void)
10695 {
10696 	return test_authenticated_encryption(&gcm_test_case_192_6);
10697 }
10698 
10699 static int
10700 test_AES_GCM_auth_encryption_test_case_192_7(void)
10701 {
10702 	return test_authenticated_encryption(&gcm_test_case_192_7);
10703 }
10704 
10705 static int
10706 test_AES_GCM_auth_encryption_test_case_256_1(void)
10707 {
10708 	return test_authenticated_encryption(&gcm_test_case_256_1);
10709 }
10710 
10711 static int
10712 test_AES_GCM_auth_encryption_test_case_256_2(void)
10713 {
10714 	return test_authenticated_encryption(&gcm_test_case_256_2);
10715 }
10716 
10717 static int
10718 test_AES_GCM_auth_encryption_test_case_256_3(void)
10719 {
10720 	return test_authenticated_encryption(&gcm_test_case_256_3);
10721 }
10722 
10723 static int
10724 test_AES_GCM_auth_encryption_test_case_256_4(void)
10725 {
10726 	return test_authenticated_encryption(&gcm_test_case_256_4);
10727 }
10728 
10729 static int
10730 test_AES_GCM_auth_encryption_test_case_256_5(void)
10731 {
10732 	return test_authenticated_encryption(&gcm_test_case_256_5);
10733 }
10734 
10735 static int
10736 test_AES_GCM_auth_encryption_test_case_256_6(void)
10737 {
10738 	return test_authenticated_encryption(&gcm_test_case_256_6);
10739 }
10740 
10741 static int
10742 test_AES_GCM_auth_encryption_test_case_256_7(void)
10743 {
10744 	return test_authenticated_encryption(&gcm_test_case_256_7);
10745 }
10746 
10747 static int
10748 test_AES_GCM_auth_encryption_test_case_aad_1(void)
10749 {
10750 	return test_authenticated_encryption(&gcm_test_case_aad_1);
10751 }
10752 
10753 static int
10754 test_AES_GCM_auth_encryption_test_case_aad_2(void)
10755 {
10756 	return test_authenticated_encryption(&gcm_test_case_aad_2);
10757 }
10758 
10759 static int
10760 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
10761 {
10762 	struct aead_test_data tdata;
10763 	int res;
10764 
10765 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10766 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10767 	tdata.iv.data[0] += 1;
10768 	res = test_authenticated_encryption(&tdata);
10769 	if (res == TEST_SKIPPED)
10770 		return res;
10771 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10772 	return TEST_SUCCESS;
10773 }
10774 
10775 static int
10776 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
10777 {
10778 	struct aead_test_data tdata;
10779 	int res;
10780 
10781 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10782 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10783 	tdata.plaintext.data[0] += 1;
10784 	res = test_authenticated_encryption(&tdata);
10785 	if (res == TEST_SKIPPED)
10786 		return res;
10787 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10788 	return TEST_SUCCESS;
10789 }
10790 
10791 static int
10792 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
10793 {
10794 	struct aead_test_data tdata;
10795 	int res;
10796 
10797 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10798 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10799 	tdata.ciphertext.data[0] += 1;
10800 	res = test_authenticated_encryption(&tdata);
10801 	if (res == TEST_SKIPPED)
10802 		return res;
10803 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10804 	return TEST_SUCCESS;
10805 }
10806 
10807 static int
10808 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
10809 {
10810 	struct aead_test_data tdata;
10811 	int res;
10812 
10813 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10814 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10815 	tdata.aad.len += 1;
10816 	res = test_authenticated_encryption(&tdata);
10817 	if (res == TEST_SKIPPED)
10818 		return res;
10819 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10820 	return TEST_SUCCESS;
10821 }
10822 
10823 static int
10824 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
10825 {
10826 	struct aead_test_data tdata;
10827 	uint8_t aad[gcm_test_case_7.aad.len];
10828 	int res;
10829 
10830 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10831 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10832 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10833 	aad[0] += 1;
10834 	tdata.aad.data = aad;
10835 	res = test_authenticated_encryption(&tdata);
10836 	if (res == TEST_SKIPPED)
10837 		return res;
10838 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10839 	return TEST_SUCCESS;
10840 }
10841 
10842 static int
10843 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
10844 {
10845 	struct aead_test_data tdata;
10846 	int res;
10847 
10848 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10849 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10850 	tdata.auth_tag.data[0] += 1;
10851 	res = test_authenticated_encryption(&tdata);
10852 	if (res == TEST_SKIPPED)
10853 		return res;
10854 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10855 	return TEST_SUCCESS;
10856 }
10857 
10858 static int
10859 test_authenticated_decryption(const struct aead_test_data *tdata)
10860 {
10861 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10862 	struct crypto_unittest_params *ut_params = &unittest_params;
10863 
10864 	int retval;
10865 	uint8_t *plaintext;
10866 	uint32_t i;
10867 	struct rte_cryptodev_info dev_info;
10868 
10869 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10870 	uint64_t feat_flags = dev_info.feature_flags;
10871 
10872 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10873 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10874 		printf("Device doesn't support RAW data-path APIs.\n");
10875 		return TEST_SKIPPED;
10876 	}
10877 
10878 	/* Verify the capabilities */
10879 	struct rte_cryptodev_sym_capability_idx cap_idx;
10880 	const struct rte_cryptodev_symmetric_capability *capability;
10881 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10882 	cap_idx.algo.aead = tdata->algo;
10883 	capability = rte_cryptodev_sym_capability_get(
10884 			ts_params->valid_devs[0], &cap_idx);
10885 	if (capability == NULL)
10886 		return TEST_SKIPPED;
10887 	if (rte_cryptodev_sym_capability_check_aead(
10888 			capability, tdata->key.len, tdata->auth_tag.len,
10889 			tdata->aad.len, tdata->iv.len))
10890 		return TEST_SKIPPED;
10891 
10892 	/* Create AEAD session */
10893 	retval = create_aead_session(ts_params->valid_devs[0],
10894 			tdata->algo,
10895 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10896 			tdata->key.data, tdata->key.len,
10897 			tdata->aad.len, tdata->auth_tag.len,
10898 			tdata->iv.len);
10899 	if (retval < 0)
10900 		return retval;
10901 
10902 	/* alloc mbuf and set payload */
10903 	if (tdata->aad.len > MBUF_SIZE) {
10904 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10905 		/* Populate full size of add data */
10906 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
10907 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
10908 	} else
10909 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10910 
10911 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10912 			rte_pktmbuf_tailroom(ut_params->ibuf));
10913 
10914 	/* Create AEAD operation */
10915 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10916 	if (retval < 0)
10917 		return retval;
10918 
10919 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10920 
10921 	ut_params->op->sym->m_src = ut_params->ibuf;
10922 
10923 	/* Process crypto operation */
10924 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10925 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
10926 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10927 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10928 				ut_params->op, 0, 0, 0, 0);
10929 	else
10930 		TEST_ASSERT_NOT_NULL(
10931 			process_crypto_request(ts_params->valid_devs[0],
10932 			ut_params->op), "failed to process sym crypto op");
10933 
10934 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10935 			"crypto op processing failed");
10936 
10937 	if (ut_params->op->sym->m_dst)
10938 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
10939 				uint8_t *);
10940 	else
10941 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
10942 				uint8_t *,
10943 				ut_params->op->sym->cipher.data.offset);
10944 
10945 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10946 
10947 	/* Validate obuf */
10948 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10949 			plaintext,
10950 			tdata->plaintext.data,
10951 			tdata->plaintext.len,
10952 			"Plaintext data not as expected");
10953 
10954 	TEST_ASSERT_EQUAL(ut_params->op->status,
10955 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10956 			"Authentication failed");
10957 
10958 	return 0;
10959 }
10960 
10961 static int
10962 test_AES_GCM_authenticated_decryption_test_case_1(void)
10963 {
10964 	return test_authenticated_decryption(&gcm_test_case_1);
10965 }
10966 
10967 static int
10968 test_AES_GCM_authenticated_decryption_test_case_2(void)
10969 {
10970 	return test_authenticated_decryption(&gcm_test_case_2);
10971 }
10972 
10973 static int
10974 test_AES_GCM_authenticated_decryption_test_case_3(void)
10975 {
10976 	return test_authenticated_decryption(&gcm_test_case_3);
10977 }
10978 
10979 static int
10980 test_AES_GCM_authenticated_decryption_test_case_4(void)
10981 {
10982 	return test_authenticated_decryption(&gcm_test_case_4);
10983 }
10984 
10985 static int
10986 test_AES_GCM_authenticated_decryption_test_case_5(void)
10987 {
10988 	return test_authenticated_decryption(&gcm_test_case_5);
10989 }
10990 
10991 static int
10992 test_AES_GCM_authenticated_decryption_test_case_6(void)
10993 {
10994 	return test_authenticated_decryption(&gcm_test_case_6);
10995 }
10996 
10997 static int
10998 test_AES_GCM_authenticated_decryption_test_case_7(void)
10999 {
11000 	return test_authenticated_decryption(&gcm_test_case_7);
11001 }
11002 
11003 static int
11004 test_AES_GCM_authenticated_decryption_test_case_8(void)
11005 {
11006 	return test_authenticated_decryption(&gcm_test_case_8);
11007 }
11008 
11009 static int
11010 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
11011 {
11012 	return test_authenticated_decryption(&gcm_J0_test_case_1);
11013 }
11014 
11015 static int
11016 test_AES_GCM_auth_decryption_test_case_192_1(void)
11017 {
11018 	return test_authenticated_decryption(&gcm_test_case_192_1);
11019 }
11020 
11021 static int
11022 test_AES_GCM_auth_decryption_test_case_192_2(void)
11023 {
11024 	return test_authenticated_decryption(&gcm_test_case_192_2);
11025 }
11026 
11027 static int
11028 test_AES_GCM_auth_decryption_test_case_192_3(void)
11029 {
11030 	return test_authenticated_decryption(&gcm_test_case_192_3);
11031 }
11032 
11033 static int
11034 test_AES_GCM_auth_decryption_test_case_192_4(void)
11035 {
11036 	return test_authenticated_decryption(&gcm_test_case_192_4);
11037 }
11038 
11039 static int
11040 test_AES_GCM_auth_decryption_test_case_192_5(void)
11041 {
11042 	return test_authenticated_decryption(&gcm_test_case_192_5);
11043 }
11044 
11045 static int
11046 test_AES_GCM_auth_decryption_test_case_192_6(void)
11047 {
11048 	return test_authenticated_decryption(&gcm_test_case_192_6);
11049 }
11050 
11051 static int
11052 test_AES_GCM_auth_decryption_test_case_192_7(void)
11053 {
11054 	return test_authenticated_decryption(&gcm_test_case_192_7);
11055 }
11056 
11057 static int
11058 test_AES_GCM_auth_decryption_test_case_256_1(void)
11059 {
11060 	return test_authenticated_decryption(&gcm_test_case_256_1);
11061 }
11062 
11063 static int
11064 test_AES_GCM_auth_decryption_test_case_256_2(void)
11065 {
11066 	return test_authenticated_decryption(&gcm_test_case_256_2);
11067 }
11068 
11069 static int
11070 test_AES_GCM_auth_decryption_test_case_256_3(void)
11071 {
11072 	return test_authenticated_decryption(&gcm_test_case_256_3);
11073 }
11074 
11075 static int
11076 test_AES_GCM_auth_decryption_test_case_256_4(void)
11077 {
11078 	return test_authenticated_decryption(&gcm_test_case_256_4);
11079 }
11080 
11081 static int
11082 test_AES_GCM_auth_decryption_test_case_256_5(void)
11083 {
11084 	return test_authenticated_decryption(&gcm_test_case_256_5);
11085 }
11086 
11087 static int
11088 test_AES_GCM_auth_decryption_test_case_256_6(void)
11089 {
11090 	return test_authenticated_decryption(&gcm_test_case_256_6);
11091 }
11092 
11093 static int
11094 test_AES_GCM_auth_decryption_test_case_256_7(void)
11095 {
11096 	return test_authenticated_decryption(&gcm_test_case_256_7);
11097 }
11098 
11099 static int
11100 test_AES_GCM_auth_decryption_test_case_aad_1(void)
11101 {
11102 	return test_authenticated_decryption(&gcm_test_case_aad_1);
11103 }
11104 
11105 static int
11106 test_AES_GCM_auth_decryption_test_case_aad_2(void)
11107 {
11108 	return test_authenticated_decryption(&gcm_test_case_aad_2);
11109 }
11110 
11111 static int
11112 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
11113 {
11114 	struct aead_test_data tdata;
11115 	int res;
11116 
11117 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11118 	tdata.iv.data[0] += 1;
11119 	res = test_authenticated_decryption(&tdata);
11120 	if (res == TEST_SKIPPED)
11121 		return res;
11122 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11123 	return TEST_SUCCESS;
11124 }
11125 
11126 static int
11127 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
11128 {
11129 	struct aead_test_data tdata;
11130 	int res;
11131 
11132 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
11133 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11134 	tdata.plaintext.data[0] += 1;
11135 	res = test_authenticated_decryption(&tdata);
11136 	if (res == TEST_SKIPPED)
11137 		return res;
11138 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11139 	return TEST_SUCCESS;
11140 }
11141 
11142 static int
11143 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
11144 {
11145 	struct aead_test_data tdata;
11146 	int res;
11147 
11148 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11149 	tdata.ciphertext.data[0] += 1;
11150 	res = test_authenticated_decryption(&tdata);
11151 	if (res == TEST_SKIPPED)
11152 		return res;
11153 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11154 	return TEST_SUCCESS;
11155 }
11156 
11157 static int
11158 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
11159 {
11160 	struct aead_test_data tdata;
11161 	int res;
11162 
11163 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11164 	tdata.aad.len += 1;
11165 	res = test_authenticated_decryption(&tdata);
11166 	if (res == TEST_SKIPPED)
11167 		return res;
11168 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11169 	return TEST_SUCCESS;
11170 }
11171 
11172 static int
11173 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
11174 {
11175 	struct aead_test_data tdata;
11176 	uint8_t aad[gcm_test_case_7.aad.len];
11177 	int res;
11178 
11179 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11180 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
11181 	aad[0] += 1;
11182 	tdata.aad.data = aad;
11183 	res = test_authenticated_decryption(&tdata);
11184 	if (res == TEST_SKIPPED)
11185 		return res;
11186 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11187 	return TEST_SUCCESS;
11188 }
11189 
11190 static int
11191 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
11192 {
11193 	struct aead_test_data tdata;
11194 	int res;
11195 
11196 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11197 	tdata.auth_tag.data[0] += 1;
11198 	res = test_authenticated_decryption(&tdata);
11199 	if (res == TEST_SKIPPED)
11200 		return res;
11201 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
11202 	return TEST_SUCCESS;
11203 }
11204 
11205 static int
11206 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
11207 {
11208 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11209 	struct crypto_unittest_params *ut_params = &unittest_params;
11210 
11211 	int retval;
11212 	uint8_t *ciphertext, *auth_tag;
11213 	uint16_t plaintext_pad_len;
11214 	struct rte_cryptodev_info dev_info;
11215 
11216 	/* Verify the capabilities */
11217 	struct rte_cryptodev_sym_capability_idx cap_idx;
11218 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11219 	cap_idx.algo.aead = tdata->algo;
11220 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11221 			&cap_idx) == NULL)
11222 		return TEST_SKIPPED;
11223 
11224 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11225 	uint64_t feat_flags = dev_info.feature_flags;
11226 
11227 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11228 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)))
11229 		return TEST_SKIPPED;
11230 
11231 	/* not supported with CPU crypto */
11232 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11233 		return TEST_SKIPPED;
11234 
11235 	/* Create AEAD session */
11236 	retval = create_aead_session(ts_params->valid_devs[0],
11237 			tdata->algo,
11238 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
11239 			tdata->key.data, tdata->key.len,
11240 			tdata->aad.len, tdata->auth_tag.len,
11241 			tdata->iv.len);
11242 	if (retval < 0)
11243 		return retval;
11244 
11245 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11246 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11247 
11248 	/* clear mbuf payload */
11249 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11250 			rte_pktmbuf_tailroom(ut_params->ibuf));
11251 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
11252 			rte_pktmbuf_tailroom(ut_params->obuf));
11253 
11254 	/* Create AEAD operation */
11255 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
11256 	if (retval < 0)
11257 		return retval;
11258 
11259 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11260 
11261 	ut_params->op->sym->m_src = ut_params->ibuf;
11262 	ut_params->op->sym->m_dst = ut_params->obuf;
11263 
11264 	/* Process crypto operation */
11265 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11266 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11267 			ut_params->op, 0, 0, 0, 0);
11268 	else
11269 		TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11270 			ut_params->op), "failed to process sym crypto op");
11271 
11272 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11273 			"crypto op processing failed");
11274 
11275 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11276 
11277 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
11278 			ut_params->op->sym->cipher.data.offset);
11279 	auth_tag = ciphertext + plaintext_pad_len;
11280 
11281 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
11282 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
11283 
11284 	/* Validate obuf */
11285 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11286 			ciphertext,
11287 			tdata->ciphertext.data,
11288 			tdata->ciphertext.len,
11289 			"Ciphertext data not as expected");
11290 
11291 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11292 			auth_tag,
11293 			tdata->auth_tag.data,
11294 			tdata->auth_tag.len,
11295 			"Generated auth tag not as expected");
11296 
11297 	return 0;
11298 
11299 }
11300 
11301 static int
11302 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
11303 {
11304 	return test_authenticated_encryption_oop(&gcm_test_case_5);
11305 }
11306 
11307 static int
11308 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
11309 {
11310 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11311 	struct crypto_unittest_params *ut_params = &unittest_params;
11312 
11313 	int retval;
11314 	uint8_t *plaintext;
11315 	struct rte_cryptodev_info dev_info;
11316 
11317 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11318 	uint64_t feat_flags = dev_info.feature_flags;
11319 
11320 	/* Verify the capabilities */
11321 	struct rte_cryptodev_sym_capability_idx cap_idx;
11322 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11323 	cap_idx.algo.aead = tdata->algo;
11324 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11325 			&cap_idx) == NULL)
11326 		return TEST_SKIPPED;
11327 
11328 	/* not supported with CPU crypto and raw data-path APIs*/
11329 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
11330 			global_api_test_type == CRYPTODEV_RAW_API_TEST)
11331 		return TEST_SKIPPED;
11332 
11333 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11334 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11335 		printf("Device does not support RAW data-path APIs.\n");
11336 		return TEST_SKIPPED;
11337 	}
11338 
11339 	/* Create AEAD session */
11340 	retval = create_aead_session(ts_params->valid_devs[0],
11341 			tdata->algo,
11342 			RTE_CRYPTO_AEAD_OP_DECRYPT,
11343 			tdata->key.data, tdata->key.len,
11344 			tdata->aad.len, tdata->auth_tag.len,
11345 			tdata->iv.len);
11346 	if (retval < 0)
11347 		return retval;
11348 
11349 	/* alloc mbuf and set payload */
11350 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11351 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11352 
11353 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11354 			rte_pktmbuf_tailroom(ut_params->ibuf));
11355 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
11356 			rte_pktmbuf_tailroom(ut_params->obuf));
11357 
11358 	/* Create AEAD operation */
11359 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
11360 	if (retval < 0)
11361 		return retval;
11362 
11363 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11364 
11365 	ut_params->op->sym->m_src = ut_params->ibuf;
11366 	ut_params->op->sym->m_dst = ut_params->obuf;
11367 
11368 	/* Process crypto operation */
11369 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11370 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11371 				ut_params->op, 0, 0, 0, 0);
11372 	else
11373 		TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11374 			ut_params->op), "failed to process sym crypto op");
11375 
11376 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11377 			"crypto op processing failed");
11378 
11379 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
11380 			ut_params->op->sym->cipher.data.offset);
11381 
11382 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
11383 
11384 	/* Validate obuf */
11385 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11386 			plaintext,
11387 			tdata->plaintext.data,
11388 			tdata->plaintext.len,
11389 			"Plaintext data not as expected");
11390 
11391 	TEST_ASSERT_EQUAL(ut_params->op->status,
11392 			RTE_CRYPTO_OP_STATUS_SUCCESS,
11393 			"Authentication failed");
11394 	return 0;
11395 }
11396 
11397 static int
11398 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
11399 {
11400 	return test_authenticated_decryption_oop(&gcm_test_case_5);
11401 }
11402 
11403 static int
11404 test_authenticated_encryption_sessionless(
11405 		const struct aead_test_data *tdata)
11406 {
11407 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11408 	struct crypto_unittest_params *ut_params = &unittest_params;
11409 
11410 	int retval;
11411 	uint8_t *ciphertext, *auth_tag;
11412 	uint16_t plaintext_pad_len;
11413 	uint8_t key[tdata->key.len + 1];
11414 	struct rte_cryptodev_info dev_info;
11415 
11416 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11417 	uint64_t feat_flags = dev_info.feature_flags;
11418 
11419 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
11420 		printf("Device doesn't support Sessionless ops.\n");
11421 		return TEST_SKIPPED;
11422 	}
11423 
11424 	/* not supported with CPU crypto */
11425 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11426 		return TEST_SKIPPED;
11427 
11428 	/* Verify the capabilities */
11429 	struct rte_cryptodev_sym_capability_idx cap_idx;
11430 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11431 	cap_idx.algo.aead = tdata->algo;
11432 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11433 			&cap_idx) == NULL)
11434 		return TEST_SKIPPED;
11435 
11436 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11437 
11438 	/* clear mbuf payload */
11439 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11440 			rte_pktmbuf_tailroom(ut_params->ibuf));
11441 
11442 	/* Create AEAD operation */
11443 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
11444 	if (retval < 0)
11445 		return retval;
11446 
11447 	/* Create GCM xform */
11448 	memcpy(key, tdata->key.data, tdata->key.len);
11449 	retval = create_aead_xform(ut_params->op,
11450 			tdata->algo,
11451 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
11452 			key, tdata->key.len,
11453 			tdata->aad.len, tdata->auth_tag.len,
11454 			tdata->iv.len);
11455 	if (retval < 0)
11456 		return retval;
11457 
11458 	ut_params->op->sym->m_src = ut_params->ibuf;
11459 
11460 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
11461 			RTE_CRYPTO_OP_SESSIONLESS,
11462 			"crypto op session type not sessionless");
11463 
11464 	/* Process crypto operation */
11465 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11466 			ut_params->op), "failed to process sym crypto op");
11467 
11468 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
11469 
11470 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11471 			"crypto op status not success");
11472 
11473 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11474 
11475 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
11476 			ut_params->op->sym->cipher.data.offset);
11477 	auth_tag = ciphertext + plaintext_pad_len;
11478 
11479 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
11480 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
11481 
11482 	/* Validate obuf */
11483 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11484 			ciphertext,
11485 			tdata->ciphertext.data,
11486 			tdata->ciphertext.len,
11487 			"Ciphertext data not as expected");
11488 
11489 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11490 			auth_tag,
11491 			tdata->auth_tag.data,
11492 			tdata->auth_tag.len,
11493 			"Generated auth tag not as expected");
11494 
11495 	return 0;
11496 
11497 }
11498 
11499 static int
11500 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
11501 {
11502 	return test_authenticated_encryption_sessionless(
11503 			&gcm_test_case_5);
11504 }
11505 
11506 static int
11507 test_authenticated_decryption_sessionless(
11508 		const struct aead_test_data *tdata)
11509 {
11510 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11511 	struct crypto_unittest_params *ut_params = &unittest_params;
11512 
11513 	int retval;
11514 	uint8_t *plaintext;
11515 	uint8_t key[tdata->key.len + 1];
11516 	struct rte_cryptodev_info dev_info;
11517 
11518 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11519 	uint64_t feat_flags = dev_info.feature_flags;
11520 
11521 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
11522 		printf("Device doesn't support Sessionless ops.\n");
11523 		return TEST_SKIPPED;
11524 	}
11525 
11526 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11527 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11528 		printf("Device doesn't support RAW data-path APIs.\n");
11529 		return TEST_SKIPPED;
11530 	}
11531 
11532 	/* not supported with CPU crypto */
11533 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11534 		return TEST_SKIPPED;
11535 
11536 	/* Verify the capabilities */
11537 	struct rte_cryptodev_sym_capability_idx cap_idx;
11538 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11539 	cap_idx.algo.aead = tdata->algo;
11540 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11541 			&cap_idx) == NULL)
11542 		return TEST_SKIPPED;
11543 
11544 	/* alloc mbuf and set payload */
11545 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11546 
11547 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11548 			rte_pktmbuf_tailroom(ut_params->ibuf));
11549 
11550 	/* Create AEAD operation */
11551 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
11552 	if (retval < 0)
11553 		return retval;
11554 
11555 	/* Create AEAD xform */
11556 	memcpy(key, tdata->key.data, tdata->key.len);
11557 	retval = create_aead_xform(ut_params->op,
11558 			tdata->algo,
11559 			RTE_CRYPTO_AEAD_OP_DECRYPT,
11560 			key, tdata->key.len,
11561 			tdata->aad.len, tdata->auth_tag.len,
11562 			tdata->iv.len);
11563 	if (retval < 0)
11564 		return retval;
11565 
11566 	ut_params->op->sym->m_src = ut_params->ibuf;
11567 
11568 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
11569 			RTE_CRYPTO_OP_SESSIONLESS,
11570 			"crypto op session type not sessionless");
11571 
11572 	/* Process crypto operation */
11573 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11574 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11575 				ut_params->op, 0, 0, 0, 0);
11576 	else
11577 		TEST_ASSERT_NOT_NULL(process_crypto_request(
11578 			ts_params->valid_devs[0], ut_params->op),
11579 				"failed to process sym crypto op");
11580 
11581 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
11582 
11583 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11584 			"crypto op status not success");
11585 
11586 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
11587 			ut_params->op->sym->cipher.data.offset);
11588 
11589 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
11590 
11591 	/* Validate obuf */
11592 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11593 			plaintext,
11594 			tdata->plaintext.data,
11595 			tdata->plaintext.len,
11596 			"Plaintext data not as expected");
11597 
11598 	TEST_ASSERT_EQUAL(ut_params->op->status,
11599 			RTE_CRYPTO_OP_STATUS_SUCCESS,
11600 			"Authentication failed");
11601 	return 0;
11602 }
11603 
11604 static int
11605 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
11606 {
11607 	return test_authenticated_decryption_sessionless(
11608 			&gcm_test_case_5);
11609 }
11610 
11611 static int
11612 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
11613 {
11614 	return test_authenticated_encryption(&ccm_test_case_128_1);
11615 }
11616 
11617 static int
11618 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
11619 {
11620 	return test_authenticated_encryption(&ccm_test_case_128_2);
11621 }
11622 
11623 static int
11624 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
11625 {
11626 	return test_authenticated_encryption(&ccm_test_case_128_3);
11627 }
11628 
11629 static int
11630 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
11631 {
11632 	return test_authenticated_decryption(&ccm_test_case_128_1);
11633 }
11634 
11635 static int
11636 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
11637 {
11638 	return test_authenticated_decryption(&ccm_test_case_128_2);
11639 }
11640 
11641 static int
11642 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
11643 {
11644 	return test_authenticated_decryption(&ccm_test_case_128_3);
11645 }
11646 
11647 static int
11648 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
11649 {
11650 	return test_authenticated_encryption(&ccm_test_case_192_1);
11651 }
11652 
11653 static int
11654 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
11655 {
11656 	return test_authenticated_encryption(&ccm_test_case_192_2);
11657 }
11658 
11659 static int
11660 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
11661 {
11662 	return test_authenticated_encryption(&ccm_test_case_192_3);
11663 }
11664 
11665 static int
11666 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
11667 {
11668 	return test_authenticated_decryption(&ccm_test_case_192_1);
11669 }
11670 
11671 static int
11672 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
11673 {
11674 	return test_authenticated_decryption(&ccm_test_case_192_2);
11675 }
11676 
11677 static int
11678 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
11679 {
11680 	return test_authenticated_decryption(&ccm_test_case_192_3);
11681 }
11682 
11683 static int
11684 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
11685 {
11686 	return test_authenticated_encryption(&ccm_test_case_256_1);
11687 }
11688 
11689 static int
11690 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
11691 {
11692 	return test_authenticated_encryption(&ccm_test_case_256_2);
11693 }
11694 
11695 static int
11696 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
11697 {
11698 	return test_authenticated_encryption(&ccm_test_case_256_3);
11699 }
11700 
11701 static int
11702 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
11703 {
11704 	return test_authenticated_decryption(&ccm_test_case_256_1);
11705 }
11706 
11707 static int
11708 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
11709 {
11710 	return test_authenticated_decryption(&ccm_test_case_256_2);
11711 }
11712 
11713 static int
11714 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
11715 {
11716 	return test_authenticated_decryption(&ccm_test_case_256_3);
11717 }
11718 
11719 static int
11720 test_stats(void)
11721 {
11722 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11723 	struct rte_cryptodev_stats stats;
11724 
11725 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11726 		return TEST_SKIPPED;
11727 
11728 	/* Verify the capabilities */
11729 	struct rte_cryptodev_sym_capability_idx cap_idx;
11730 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11731 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
11732 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11733 			&cap_idx) == NULL)
11734 		return TEST_SKIPPED;
11735 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11736 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11737 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11738 			&cap_idx) == NULL)
11739 		return TEST_SKIPPED;
11740 
11741 	if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
11742 			== -ENOTSUP)
11743 		return TEST_SKIPPED;
11744 
11745 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11746 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
11747 			&stats) == -ENODEV),
11748 		"rte_cryptodev_stats_get invalid dev failed");
11749 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
11750 		"rte_cryptodev_stats_get invalid Param failed");
11751 
11752 	/* Test expected values */
11753 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
11754 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11755 			&stats),
11756 		"rte_cryptodev_stats_get failed");
11757 	TEST_ASSERT((stats.enqueued_count == 1),
11758 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11759 	TEST_ASSERT((stats.dequeued_count == 1),
11760 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11761 	TEST_ASSERT((stats.enqueue_err_count == 0),
11762 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11763 	TEST_ASSERT((stats.dequeue_err_count == 0),
11764 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11765 
11766 	/* invalid device but should ignore and not reset device stats*/
11767 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
11768 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11769 			&stats),
11770 		"rte_cryptodev_stats_get failed");
11771 	TEST_ASSERT((stats.enqueued_count == 1),
11772 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11773 
11774 	/* check that a valid reset clears stats */
11775 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11776 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11777 			&stats),
11778 					  "rte_cryptodev_stats_get failed");
11779 	TEST_ASSERT((stats.enqueued_count == 0),
11780 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11781 	TEST_ASSERT((stats.dequeued_count == 0),
11782 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11783 
11784 	return TEST_SUCCESS;
11785 }
11786 
11787 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
11788 				   struct crypto_unittest_params *ut_params,
11789 				   enum rte_crypto_auth_operation op,
11790 				   const struct HMAC_MD5_vector *test_case)
11791 {
11792 	uint8_t key[64];
11793 	int status;
11794 
11795 	memcpy(key, test_case->key.data, test_case->key.len);
11796 
11797 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11798 	ut_params->auth_xform.next = NULL;
11799 	ut_params->auth_xform.auth.op = op;
11800 
11801 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
11802 
11803 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
11804 	ut_params->auth_xform.auth.key.length = test_case->key.len;
11805 	ut_params->auth_xform.auth.key.data = key;
11806 
11807 	ut_params->sess = rte_cryptodev_sym_session_create(
11808 			ts_params->session_mpool);
11809 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11810 	if (ut_params->sess == NULL)
11811 		return TEST_FAILED;
11812 
11813 	status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11814 			ut_params->sess, &ut_params->auth_xform,
11815 			ts_params->session_priv_mpool);
11816 	if (status == -ENOTSUP)
11817 		return TEST_SKIPPED;
11818 
11819 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11820 
11821 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11822 			rte_pktmbuf_tailroom(ut_params->ibuf));
11823 
11824 	return 0;
11825 }
11826 
11827 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
11828 			      const struct HMAC_MD5_vector *test_case,
11829 			      uint8_t **plaintext)
11830 {
11831 	uint16_t plaintext_pad_len;
11832 
11833 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11834 
11835 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11836 				16);
11837 
11838 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11839 			plaintext_pad_len);
11840 	memcpy(*plaintext, test_case->plaintext.data,
11841 			test_case->plaintext.len);
11842 
11843 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11844 			ut_params->ibuf, MD5_DIGEST_LEN);
11845 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11846 			"no room to append digest");
11847 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11848 			ut_params->ibuf, plaintext_pad_len);
11849 
11850 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11851 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
11852 			   test_case->auth_tag.len);
11853 	}
11854 
11855 	sym_op->auth.data.offset = 0;
11856 	sym_op->auth.data.length = test_case->plaintext.len;
11857 
11858 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11859 	ut_params->op->sym->m_src = ut_params->ibuf;
11860 
11861 	return 0;
11862 }
11863 
11864 static int
11865 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
11866 {
11867 	uint16_t plaintext_pad_len;
11868 	uint8_t *plaintext, *auth_tag;
11869 
11870 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11871 	struct crypto_unittest_params *ut_params = &unittest_params;
11872 	struct rte_cryptodev_info dev_info;
11873 
11874 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11875 	uint64_t feat_flags = dev_info.feature_flags;
11876 
11877 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11878 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11879 		printf("Device doesn't support RAW data-path APIs.\n");
11880 		return TEST_SKIPPED;
11881 	}
11882 
11883 	/* Verify the capabilities */
11884 	struct rte_cryptodev_sym_capability_idx cap_idx;
11885 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11886 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11887 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11888 			&cap_idx) == NULL)
11889 		return TEST_SKIPPED;
11890 
11891 	if (MD5_HMAC_create_session(ts_params, ut_params,
11892 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
11893 		return TEST_FAILED;
11894 
11895 	/* Generate Crypto op data structure */
11896 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11897 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11898 	TEST_ASSERT_NOT_NULL(ut_params->op,
11899 			"Failed to allocate symmetric crypto operation struct");
11900 
11901 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11902 				16);
11903 
11904 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11905 		return TEST_FAILED;
11906 
11907 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11908 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11909 			ut_params->op);
11910 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11911 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11912 				ut_params->op, 0, 1, 0, 0);
11913 	else
11914 		TEST_ASSERT_NOT_NULL(
11915 			process_crypto_request(ts_params->valid_devs[0],
11916 				ut_params->op),
11917 				"failed to process sym crypto op");
11918 
11919 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11920 			"crypto op processing failed");
11921 
11922 	if (ut_params->op->sym->m_dst) {
11923 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11924 				uint8_t *, plaintext_pad_len);
11925 	} else {
11926 		auth_tag = plaintext + plaintext_pad_len;
11927 	}
11928 
11929 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11930 			auth_tag,
11931 			test_case->auth_tag.data,
11932 			test_case->auth_tag.len,
11933 			"HMAC_MD5 generated tag not as expected");
11934 
11935 	return TEST_SUCCESS;
11936 }
11937 
11938 static int
11939 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
11940 {
11941 	uint8_t *plaintext;
11942 
11943 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11944 	struct crypto_unittest_params *ut_params = &unittest_params;
11945 	struct rte_cryptodev_info dev_info;
11946 
11947 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11948 	uint64_t feat_flags = dev_info.feature_flags;
11949 
11950 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11951 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11952 		printf("Device doesn't support RAW data-path APIs.\n");
11953 		return TEST_SKIPPED;
11954 	}
11955 
11956 	/* Verify the capabilities */
11957 	struct rte_cryptodev_sym_capability_idx cap_idx;
11958 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11959 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11960 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11961 			&cap_idx) == NULL)
11962 		return TEST_SKIPPED;
11963 
11964 	if (MD5_HMAC_create_session(ts_params, ut_params,
11965 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
11966 		return TEST_FAILED;
11967 	}
11968 
11969 	/* Generate Crypto op data structure */
11970 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11971 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11972 	TEST_ASSERT_NOT_NULL(ut_params->op,
11973 			"Failed to allocate symmetric crypto operation struct");
11974 
11975 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11976 		return TEST_FAILED;
11977 
11978 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11979 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11980 			ut_params->op);
11981 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11982 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11983 				ut_params->op, 0, 1, 0, 0);
11984 	else
11985 		TEST_ASSERT_NOT_NULL(
11986 			process_crypto_request(ts_params->valid_devs[0],
11987 				ut_params->op),
11988 				"failed to process sym crypto op");
11989 
11990 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11991 			"HMAC_MD5 crypto op processing failed");
11992 
11993 	return TEST_SUCCESS;
11994 }
11995 
11996 static int
11997 test_MD5_HMAC_generate_case_1(void)
11998 {
11999 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
12000 }
12001 
12002 static int
12003 test_MD5_HMAC_verify_case_1(void)
12004 {
12005 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
12006 }
12007 
12008 static int
12009 test_MD5_HMAC_generate_case_2(void)
12010 {
12011 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
12012 }
12013 
12014 static int
12015 test_MD5_HMAC_verify_case_2(void)
12016 {
12017 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
12018 }
12019 
12020 static int
12021 test_multi_session(void)
12022 {
12023 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12024 	struct crypto_unittest_params *ut_params = &unittest_params;
12025 
12026 	struct rte_cryptodev_info dev_info;
12027 	struct rte_cryptodev_sym_session **sessions;
12028 
12029 	uint16_t i;
12030 	int status;
12031 
12032 	/* Verify the capabilities */
12033 	struct rte_cryptodev_sym_capability_idx cap_idx;
12034 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12035 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
12036 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12037 			&cap_idx) == NULL)
12038 		return TEST_SKIPPED;
12039 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12040 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
12041 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12042 			&cap_idx) == NULL)
12043 		return TEST_SKIPPED;
12044 
12045 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
12046 			aes_cbc_key, hmac_sha512_key);
12047 
12048 
12049 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12050 
12051 	sessions = rte_malloc(NULL,
12052 			sizeof(struct rte_cryptodev_sym_session *) *
12053 			(MAX_NB_SESSIONS + 1), 0);
12054 
12055 	/* Create multiple crypto sessions*/
12056 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
12057 
12058 		sessions[i] = rte_cryptodev_sym_session_create(
12059 				ts_params->session_mpool);
12060 		TEST_ASSERT_NOT_NULL(sessions[i],
12061 				"Session creation failed at session number %u",
12062 				i);
12063 
12064 		status = rte_cryptodev_sym_session_init(
12065 				ts_params->valid_devs[0],
12066 				sessions[i], &ut_params->auth_xform,
12067 				ts_params->session_priv_mpool);
12068 		if (status == -ENOTSUP)
12069 			return TEST_SKIPPED;
12070 
12071 		/* Attempt to send a request on each session */
12072 		TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
12073 			sessions[i],
12074 			ut_params,
12075 			ts_params,
12076 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
12077 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
12078 			aes_cbc_iv),
12079 			"Failed to perform decrypt on request number %u.", i);
12080 		/* free crypto operation structure */
12081 		if (ut_params->op)
12082 			rte_crypto_op_free(ut_params->op);
12083 
12084 		/*
12085 		 * free mbuf - both obuf and ibuf are usually the same,
12086 		 * so check if they point at the same address is necessary,
12087 		 * to avoid freeing the mbuf twice.
12088 		 */
12089 		if (ut_params->obuf) {
12090 			rte_pktmbuf_free(ut_params->obuf);
12091 			if (ut_params->ibuf == ut_params->obuf)
12092 				ut_params->ibuf = 0;
12093 			ut_params->obuf = 0;
12094 		}
12095 		if (ut_params->ibuf) {
12096 			rte_pktmbuf_free(ut_params->ibuf);
12097 			ut_params->ibuf = 0;
12098 		}
12099 	}
12100 
12101 	sessions[i] = NULL;
12102 	/* Next session create should fail */
12103 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12104 			sessions[i], &ut_params->auth_xform,
12105 			ts_params->session_priv_mpool);
12106 	TEST_ASSERT_NULL(sessions[i],
12107 			"Session creation succeeded unexpectedly!");
12108 
12109 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
12110 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
12111 				sessions[i]);
12112 		rte_cryptodev_sym_session_free(sessions[i]);
12113 	}
12114 
12115 	rte_free(sessions);
12116 
12117 	return TEST_SUCCESS;
12118 }
12119 
12120 struct multi_session_params {
12121 	struct crypto_unittest_params ut_params;
12122 	uint8_t *cipher_key;
12123 	uint8_t *hmac_key;
12124 	const uint8_t *cipher;
12125 	const uint8_t *digest;
12126 	uint8_t *iv;
12127 };
12128 
12129 #define MB_SESSION_NUMBER 3
12130 
12131 static int
12132 test_multi_session_random_usage(void)
12133 {
12134 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12135 	struct rte_cryptodev_info dev_info;
12136 	struct rte_cryptodev_sym_session **sessions;
12137 	uint32_t i, j;
12138 	struct multi_session_params ut_paramz[] = {
12139 
12140 		{
12141 			.cipher_key = ms_aes_cbc_key0,
12142 			.hmac_key = ms_hmac_key0,
12143 			.cipher = ms_aes_cbc_cipher0,
12144 			.digest = ms_hmac_digest0,
12145 			.iv = ms_aes_cbc_iv0
12146 		},
12147 		{
12148 			.cipher_key = ms_aes_cbc_key1,
12149 			.hmac_key = ms_hmac_key1,
12150 			.cipher = ms_aes_cbc_cipher1,
12151 			.digest = ms_hmac_digest1,
12152 			.iv = ms_aes_cbc_iv1
12153 		},
12154 		{
12155 			.cipher_key = ms_aes_cbc_key2,
12156 			.hmac_key = ms_hmac_key2,
12157 			.cipher = ms_aes_cbc_cipher2,
12158 			.digest = ms_hmac_digest2,
12159 			.iv = ms_aes_cbc_iv2
12160 		},
12161 
12162 	};
12163 	int status;
12164 
12165 	/* Verify the capabilities */
12166 	struct rte_cryptodev_sym_capability_idx cap_idx;
12167 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12168 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
12169 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12170 			&cap_idx) == NULL)
12171 		return TEST_SKIPPED;
12172 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12173 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
12174 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12175 			&cap_idx) == NULL)
12176 		return TEST_SKIPPED;
12177 
12178 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12179 
12180 	sessions = rte_malloc(NULL,
12181 			(sizeof(struct rte_cryptodev_sym_session *)
12182 					* MAX_NB_SESSIONS) + 1, 0);
12183 
12184 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
12185 		sessions[i] = rte_cryptodev_sym_session_create(
12186 				ts_params->session_mpool);
12187 		TEST_ASSERT_NOT_NULL(sessions[i],
12188 				"Session creation failed at session number %u",
12189 				i);
12190 
12191 		rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
12192 				sizeof(struct crypto_unittest_params));
12193 
12194 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
12195 				&ut_paramz[i].ut_params,
12196 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
12197 
12198 		/* Create multiple crypto sessions*/
12199 		status = rte_cryptodev_sym_session_init(
12200 				ts_params->valid_devs[0],
12201 				sessions[i],
12202 				&ut_paramz[i].ut_params.auth_xform,
12203 				ts_params->session_priv_mpool);
12204 
12205 		if (status == -ENOTSUP)
12206 			return TEST_SKIPPED;
12207 
12208 		TEST_ASSERT_EQUAL(status, 0, "Session init failed");
12209 	}
12210 
12211 	srand(time(NULL));
12212 	for (i = 0; i < 40000; i++) {
12213 
12214 		j = rand() % MB_SESSION_NUMBER;
12215 
12216 		TEST_ASSERT_SUCCESS(
12217 			test_AES_CBC_HMAC_SHA512_decrypt_perform(
12218 					sessions[j],
12219 					&ut_paramz[j].ut_params,
12220 					ts_params, ut_paramz[j].cipher,
12221 					ut_paramz[j].digest,
12222 					ut_paramz[j].iv),
12223 			"Failed to perform decrypt on request number %u.", i);
12224 
12225 		if (ut_paramz[j].ut_params.op)
12226 			rte_crypto_op_free(ut_paramz[j].ut_params.op);
12227 
12228 		/*
12229 		 * free mbuf - both obuf and ibuf are usually the same,
12230 		 * so check if they point at the same address is necessary,
12231 		 * to avoid freeing the mbuf twice.
12232 		 */
12233 		if (ut_paramz[j].ut_params.obuf) {
12234 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
12235 			if (ut_paramz[j].ut_params.ibuf
12236 					== ut_paramz[j].ut_params.obuf)
12237 				ut_paramz[j].ut_params.ibuf = 0;
12238 			ut_paramz[j].ut_params.obuf = 0;
12239 		}
12240 		if (ut_paramz[j].ut_params.ibuf) {
12241 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
12242 			ut_paramz[j].ut_params.ibuf = 0;
12243 		}
12244 	}
12245 
12246 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
12247 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
12248 				sessions[i]);
12249 		rte_cryptodev_sym_session_free(sessions[i]);
12250 	}
12251 
12252 	rte_free(sessions);
12253 
12254 	return TEST_SUCCESS;
12255 }
12256 
12257 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
12258 			0xab, 0xab, 0xab, 0xab,
12259 			0xab, 0xab, 0xab, 0xab,
12260 			0xab, 0xab, 0xab, 0xab};
12261 
12262 static int
12263 test_null_invalid_operation(void)
12264 {
12265 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12266 	struct crypto_unittest_params *ut_params = &unittest_params;
12267 	int ret;
12268 
12269 	/* This test is for NULL PMD only */
12270 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
12271 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
12272 		return TEST_SKIPPED;
12273 
12274 	/* Setup Cipher Parameters */
12275 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12276 	ut_params->cipher_xform.next = NULL;
12277 
12278 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
12279 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12280 
12281 	ut_params->sess = rte_cryptodev_sym_session_create(
12282 			ts_params->session_mpool);
12283 
12284 	/* Create Crypto session*/
12285 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12286 			ut_params->sess, &ut_params->cipher_xform,
12287 			ts_params->session_priv_mpool);
12288 	TEST_ASSERT(ret < 0,
12289 			"Session creation succeeded unexpectedly");
12290 
12291 
12292 	/* Setup HMAC Parameters */
12293 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12294 	ut_params->auth_xform.next = NULL;
12295 
12296 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
12297 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12298 
12299 	ut_params->sess = rte_cryptodev_sym_session_create(
12300 			ts_params->session_mpool);
12301 
12302 	/* Create Crypto session*/
12303 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12304 			ut_params->sess, &ut_params->auth_xform,
12305 			ts_params->session_priv_mpool);
12306 	TEST_ASSERT(ret < 0,
12307 			"Session creation succeeded unexpectedly");
12308 
12309 	return TEST_SUCCESS;
12310 }
12311 
12312 
12313 #define NULL_BURST_LENGTH (32)
12314 
12315 static int
12316 test_null_burst_operation(void)
12317 {
12318 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12319 	struct crypto_unittest_params *ut_params = &unittest_params;
12320 	int status;
12321 
12322 	unsigned i, burst_len = NULL_BURST_LENGTH;
12323 
12324 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
12325 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
12326 
12327 	/* This test is for NULL PMD only */
12328 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
12329 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
12330 		return TEST_SKIPPED;
12331 
12332 	/* Setup Cipher Parameters */
12333 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12334 	ut_params->cipher_xform.next = &ut_params->auth_xform;
12335 
12336 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
12337 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12338 
12339 	/* Setup HMAC Parameters */
12340 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12341 	ut_params->auth_xform.next = NULL;
12342 
12343 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
12344 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12345 
12346 	ut_params->sess = rte_cryptodev_sym_session_create(
12347 			ts_params->session_mpool);
12348 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12349 
12350 	/* Create Crypto session*/
12351 	status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12352 			ut_params->sess, &ut_params->cipher_xform,
12353 			ts_params->session_priv_mpool);
12354 
12355 	if (status == -ENOTSUP)
12356 		return TEST_SKIPPED;
12357 
12358 	TEST_ASSERT_EQUAL(status, 0, "Session init failed");
12359 
12360 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
12361 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
12362 			burst_len, "failed to generate burst of crypto ops");
12363 
12364 	/* Generate an operation for each mbuf in burst */
12365 	for (i = 0; i < burst_len; i++) {
12366 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12367 
12368 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
12369 
12370 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
12371 				sizeof(unsigned));
12372 		*data = i;
12373 
12374 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
12375 
12376 		burst[i]->sym->m_src = m;
12377 	}
12378 
12379 	/* Process crypto operation */
12380 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
12381 			0, burst, burst_len),
12382 			burst_len,
12383 			"Error enqueuing burst");
12384 
12385 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
12386 			0, burst_dequeued, burst_len),
12387 			burst_len,
12388 			"Error dequeuing burst");
12389 
12390 
12391 	for (i = 0; i < burst_len; i++) {
12392 		TEST_ASSERT_EQUAL(
12393 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
12394 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
12395 					uint32_t *),
12396 			"data not as expected");
12397 
12398 		rte_pktmbuf_free(burst[i]->sym->m_src);
12399 		rte_crypto_op_free(burst[i]);
12400 	}
12401 
12402 	return TEST_SUCCESS;
12403 }
12404 
12405 static uint16_t
12406 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
12407 		  uint16_t nb_ops, void *user_param)
12408 {
12409 	RTE_SET_USED(dev_id);
12410 	RTE_SET_USED(qp_id);
12411 	RTE_SET_USED(ops);
12412 	RTE_SET_USED(user_param);
12413 
12414 	printf("crypto enqueue callback called\n");
12415 	return nb_ops;
12416 }
12417 
12418 static uint16_t
12419 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
12420 		  uint16_t nb_ops, void *user_param)
12421 {
12422 	RTE_SET_USED(dev_id);
12423 	RTE_SET_USED(qp_id);
12424 	RTE_SET_USED(ops);
12425 	RTE_SET_USED(user_param);
12426 
12427 	printf("crypto dequeue callback called\n");
12428 	return nb_ops;
12429 }
12430 
12431 /*
12432  * Thread using enqueue/dequeue callback with RCU.
12433  */
12434 static int
12435 test_enqdeq_callback_thread(void *arg)
12436 {
12437 	RTE_SET_USED(arg);
12438 	/* DP thread calls rte_cryptodev_enqueue_burst()/
12439 	 * rte_cryptodev_dequeue_burst() and invokes callback.
12440 	 */
12441 	test_null_burst_operation();
12442 	return 0;
12443 }
12444 
12445 static int
12446 test_enq_callback_setup(void)
12447 {
12448 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12449 	struct rte_cryptodev_info dev_info;
12450 	struct rte_cryptodev_qp_conf qp_conf = {
12451 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
12452 	};
12453 
12454 	struct rte_cryptodev_cb *cb;
12455 	uint16_t qp_id = 0;
12456 
12457 	/* Stop the device in case it's started so it can be configured */
12458 	rte_cryptodev_stop(ts_params->valid_devs[0]);
12459 
12460 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12461 
12462 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
12463 			&ts_params->conf),
12464 			"Failed to configure cryptodev %u",
12465 			ts_params->valid_devs[0]);
12466 
12467 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
12468 	qp_conf.mp_session = ts_params->session_mpool;
12469 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
12470 
12471 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
12472 			ts_params->valid_devs[0], qp_id, &qp_conf,
12473 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
12474 			"Failed test for "
12475 			"rte_cryptodev_queue_pair_setup: num_inflights "
12476 			"%u on qp %u on cryptodev %u",
12477 			qp_conf.nb_descriptors, qp_id,
12478 			ts_params->valid_devs[0]);
12479 
12480 	/* Test with invalid crypto device */
12481 	cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
12482 			qp_id, test_enq_callback, NULL);
12483 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12484 			"cryptodev %u did not fail",
12485 			qp_id, RTE_CRYPTO_MAX_DEVS);
12486 
12487 	/* Test with invalid queue pair */
12488 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12489 			dev_info.max_nb_queue_pairs + 1,
12490 			test_enq_callback, NULL);
12491 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12492 			"cryptodev %u did not fail",
12493 			dev_info.max_nb_queue_pairs + 1,
12494 			ts_params->valid_devs[0]);
12495 
12496 	/* Test with NULL callback */
12497 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12498 			qp_id, NULL, NULL);
12499 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12500 			"cryptodev %u did not fail",
12501 			qp_id, ts_params->valid_devs[0]);
12502 
12503 	/* Test with valid configuration */
12504 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12505 			qp_id, test_enq_callback, NULL);
12506 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
12507 			"qp %u on cryptodev %u",
12508 			qp_id, ts_params->valid_devs[0]);
12509 
12510 	rte_cryptodev_start(ts_params->valid_devs[0]);
12511 
12512 	/* Launch a thread */
12513 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
12514 				rte_get_next_lcore(-1, 1, 0));
12515 
12516 	/* Wait until reader exited. */
12517 	rte_eal_mp_wait_lcore();
12518 
12519 	/* Test with invalid crypto device */
12520 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12521 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
12522 			"Expected call to fail as crypto device is invalid");
12523 
12524 	/* Test with invalid queue pair */
12525 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12526 			ts_params->valid_devs[0],
12527 			dev_info.max_nb_queue_pairs + 1, cb),
12528 			"Expected call to fail as queue pair is invalid");
12529 
12530 	/* Test with NULL callback */
12531 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12532 			ts_params->valid_devs[0], qp_id, NULL),
12533 			"Expected call to fail as callback is NULL");
12534 
12535 	/* Test with valid configuration */
12536 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
12537 			ts_params->valid_devs[0], qp_id, cb),
12538 			"Failed test to remove callback on "
12539 			"qp %u on cryptodev %u",
12540 			qp_id, ts_params->valid_devs[0]);
12541 
12542 	return TEST_SUCCESS;
12543 }
12544 
12545 static int
12546 test_deq_callback_setup(void)
12547 {
12548 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12549 	struct rte_cryptodev_info dev_info;
12550 	struct rte_cryptodev_qp_conf qp_conf = {
12551 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
12552 	};
12553 
12554 	struct rte_cryptodev_cb *cb;
12555 	uint16_t qp_id = 0;
12556 
12557 	/* Stop the device in case it's started so it can be configured */
12558 	rte_cryptodev_stop(ts_params->valid_devs[0]);
12559 
12560 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12561 
12562 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
12563 			&ts_params->conf),
12564 			"Failed to configure cryptodev %u",
12565 			ts_params->valid_devs[0]);
12566 
12567 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
12568 	qp_conf.mp_session = ts_params->session_mpool;
12569 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
12570 
12571 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
12572 			ts_params->valid_devs[0], qp_id, &qp_conf,
12573 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
12574 			"Failed test for "
12575 			"rte_cryptodev_queue_pair_setup: num_inflights "
12576 			"%u on qp %u on cryptodev %u",
12577 			qp_conf.nb_descriptors, qp_id,
12578 			ts_params->valid_devs[0]);
12579 
12580 	/* Test with invalid crypto device */
12581 	cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
12582 			qp_id, test_deq_callback, NULL);
12583 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12584 			"cryptodev %u did not fail",
12585 			qp_id, RTE_CRYPTO_MAX_DEVS);
12586 
12587 	/* Test with invalid queue pair */
12588 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12589 			dev_info.max_nb_queue_pairs + 1,
12590 			test_deq_callback, NULL);
12591 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12592 			"cryptodev %u did not fail",
12593 			dev_info.max_nb_queue_pairs + 1,
12594 			ts_params->valid_devs[0]);
12595 
12596 	/* Test with NULL callback */
12597 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12598 			qp_id, NULL, NULL);
12599 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12600 			"cryptodev %u did not fail",
12601 			qp_id, ts_params->valid_devs[0]);
12602 
12603 	/* Test with valid configuration */
12604 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12605 			qp_id, test_deq_callback, NULL);
12606 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
12607 			"qp %u on cryptodev %u",
12608 			qp_id, ts_params->valid_devs[0]);
12609 
12610 	rte_cryptodev_start(ts_params->valid_devs[0]);
12611 
12612 	/* Launch a thread */
12613 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
12614 				rte_get_next_lcore(-1, 1, 0));
12615 
12616 	/* Wait until reader exited. */
12617 	rte_eal_mp_wait_lcore();
12618 
12619 	/* Test with invalid crypto device */
12620 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12621 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
12622 			"Expected call to fail as crypto device is invalid");
12623 
12624 	/* Test with invalid queue pair */
12625 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12626 			ts_params->valid_devs[0],
12627 			dev_info.max_nb_queue_pairs + 1, cb),
12628 			"Expected call to fail as queue pair is invalid");
12629 
12630 	/* Test with NULL callback */
12631 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12632 			ts_params->valid_devs[0], qp_id, NULL),
12633 			"Expected call to fail as callback is NULL");
12634 
12635 	/* Test with valid configuration */
12636 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
12637 			ts_params->valid_devs[0], qp_id, cb),
12638 			"Failed test to remove callback on "
12639 			"qp %u on cryptodev %u",
12640 			qp_id, ts_params->valid_devs[0]);
12641 
12642 	return TEST_SUCCESS;
12643 }
12644 
12645 static void
12646 generate_gmac_large_plaintext(uint8_t *data)
12647 {
12648 	uint16_t i;
12649 
12650 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
12651 		memcpy(&data[i], &data[0], 32);
12652 }
12653 
12654 static int
12655 create_gmac_operation(enum rte_crypto_auth_operation op,
12656 		const struct gmac_test_data *tdata)
12657 {
12658 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12659 	struct crypto_unittest_params *ut_params = &unittest_params;
12660 	struct rte_crypto_sym_op *sym_op;
12661 
12662 	uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12663 
12664 	/* Generate Crypto op data structure */
12665 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12666 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12667 	TEST_ASSERT_NOT_NULL(ut_params->op,
12668 			"Failed to allocate symmetric crypto operation struct");
12669 
12670 	sym_op = ut_params->op->sym;
12671 
12672 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12673 			ut_params->ibuf, tdata->gmac_tag.len);
12674 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12675 			"no room to append digest");
12676 
12677 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12678 			ut_params->ibuf, plaintext_pad_len);
12679 
12680 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12681 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12682 				tdata->gmac_tag.len);
12683 		debug_hexdump(stdout, "digest:",
12684 				sym_op->auth.digest.data,
12685 				tdata->gmac_tag.len);
12686 	}
12687 
12688 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12689 			uint8_t *, IV_OFFSET);
12690 
12691 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12692 
12693 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12694 
12695 	sym_op->cipher.data.length = 0;
12696 	sym_op->cipher.data.offset = 0;
12697 
12698 	sym_op->auth.data.offset = 0;
12699 	sym_op->auth.data.length = tdata->plaintext.len;
12700 
12701 	return 0;
12702 }
12703 
12704 static int
12705 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
12706 		const struct gmac_test_data *tdata,
12707 		void *digest_mem, uint64_t digest_phys)
12708 {
12709 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12710 	struct crypto_unittest_params *ut_params = &unittest_params;
12711 	struct rte_crypto_sym_op *sym_op;
12712 
12713 	/* Generate Crypto op data structure */
12714 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12715 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12716 	TEST_ASSERT_NOT_NULL(ut_params->op,
12717 			"Failed to allocate symmetric crypto operation struct");
12718 
12719 	sym_op = ut_params->op->sym;
12720 
12721 	sym_op->auth.digest.data = digest_mem;
12722 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12723 			"no room to append digest");
12724 
12725 	sym_op->auth.digest.phys_addr = digest_phys;
12726 
12727 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12728 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12729 				tdata->gmac_tag.len);
12730 		debug_hexdump(stdout, "digest:",
12731 				sym_op->auth.digest.data,
12732 				tdata->gmac_tag.len);
12733 	}
12734 
12735 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12736 			uint8_t *, IV_OFFSET);
12737 
12738 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12739 
12740 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12741 
12742 	sym_op->cipher.data.length = 0;
12743 	sym_op->cipher.data.offset = 0;
12744 
12745 	sym_op->auth.data.offset = 0;
12746 	sym_op->auth.data.length = tdata->plaintext.len;
12747 
12748 	return 0;
12749 }
12750 
12751 static int create_gmac_session(uint8_t dev_id,
12752 		const struct gmac_test_data *tdata,
12753 		enum rte_crypto_auth_operation auth_op)
12754 {
12755 	uint8_t auth_key[tdata->key.len];
12756 	int status;
12757 
12758 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12759 	struct crypto_unittest_params *ut_params = &unittest_params;
12760 
12761 	memcpy(auth_key, tdata->key.data, tdata->key.len);
12762 
12763 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12764 	ut_params->auth_xform.next = NULL;
12765 
12766 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
12767 	ut_params->auth_xform.auth.op = auth_op;
12768 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
12769 	ut_params->auth_xform.auth.key.length = tdata->key.len;
12770 	ut_params->auth_xform.auth.key.data = auth_key;
12771 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12772 	ut_params->auth_xform.auth.iv.length = tdata->iv.len;
12773 
12774 
12775 	ut_params->sess = rte_cryptodev_sym_session_create(
12776 			ts_params->session_mpool);
12777 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12778 
12779 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12780 			&ut_params->auth_xform,
12781 			ts_params->session_priv_mpool);
12782 
12783 	return status;
12784 }
12785 
12786 static int
12787 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
12788 {
12789 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12790 	struct crypto_unittest_params *ut_params = &unittest_params;
12791 	struct rte_cryptodev_info dev_info;
12792 
12793 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12794 	uint64_t feat_flags = dev_info.feature_flags;
12795 
12796 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12797 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12798 		printf("Device doesn't support RAW data-path APIs.\n");
12799 		return TEST_SKIPPED;
12800 	}
12801 
12802 	int retval;
12803 
12804 	uint8_t *auth_tag, *plaintext;
12805 	uint16_t plaintext_pad_len;
12806 
12807 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12808 			      "No GMAC length in the source data");
12809 
12810 	/* Verify the capabilities */
12811 	struct rte_cryptodev_sym_capability_idx cap_idx;
12812 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12813 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12814 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12815 			&cap_idx) == NULL)
12816 		return TEST_SKIPPED;
12817 
12818 	retval = create_gmac_session(ts_params->valid_devs[0],
12819 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12820 
12821 	if (retval == -ENOTSUP)
12822 		return TEST_SKIPPED;
12823 	if (retval < 0)
12824 		return retval;
12825 
12826 	if (tdata->plaintext.len > MBUF_SIZE)
12827 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12828 	else
12829 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12830 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12831 			"Failed to allocate input buffer in mempool");
12832 
12833 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12834 			rte_pktmbuf_tailroom(ut_params->ibuf));
12835 
12836 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12837 	/*
12838 	 * Runtime generate the large plain text instead of use hard code
12839 	 * plain text vector. It is done to avoid create huge source file
12840 	 * with the test vector.
12841 	 */
12842 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12843 		generate_gmac_large_plaintext(tdata->plaintext.data);
12844 
12845 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12846 				plaintext_pad_len);
12847 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12848 
12849 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12850 	debug_hexdump(stdout, "plaintext:", plaintext,
12851 			tdata->plaintext.len);
12852 
12853 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
12854 			tdata);
12855 
12856 	if (retval < 0)
12857 		return retval;
12858 
12859 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12860 
12861 	ut_params->op->sym->m_src = ut_params->ibuf;
12862 
12863 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12864 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12865 			ut_params->op);
12866 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12867 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12868 				ut_params->op, 0, 1, 0, 0);
12869 	else
12870 		TEST_ASSERT_NOT_NULL(
12871 			process_crypto_request(ts_params->valid_devs[0],
12872 			ut_params->op), "failed to process sym crypto op");
12873 
12874 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12875 			"crypto op processing failed");
12876 
12877 	if (ut_params->op->sym->m_dst) {
12878 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12879 				uint8_t *, plaintext_pad_len);
12880 	} else {
12881 		auth_tag = plaintext + plaintext_pad_len;
12882 	}
12883 
12884 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12885 
12886 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12887 			auth_tag,
12888 			tdata->gmac_tag.data,
12889 			tdata->gmac_tag.len,
12890 			"GMAC Generated auth tag not as expected");
12891 
12892 	return 0;
12893 }
12894 
12895 static int
12896 test_AES_GMAC_authentication_test_case_1(void)
12897 {
12898 	return test_AES_GMAC_authentication(&gmac_test_case_1);
12899 }
12900 
12901 static int
12902 test_AES_GMAC_authentication_test_case_2(void)
12903 {
12904 	return test_AES_GMAC_authentication(&gmac_test_case_2);
12905 }
12906 
12907 static int
12908 test_AES_GMAC_authentication_test_case_3(void)
12909 {
12910 	return test_AES_GMAC_authentication(&gmac_test_case_3);
12911 }
12912 
12913 static int
12914 test_AES_GMAC_authentication_test_case_4(void)
12915 {
12916 	return test_AES_GMAC_authentication(&gmac_test_case_4);
12917 }
12918 
12919 static int
12920 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
12921 {
12922 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12923 	struct crypto_unittest_params *ut_params = &unittest_params;
12924 	int retval;
12925 	uint32_t plaintext_pad_len;
12926 	uint8_t *plaintext;
12927 	struct rte_cryptodev_info dev_info;
12928 
12929 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12930 	uint64_t feat_flags = dev_info.feature_flags;
12931 
12932 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12933 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12934 		printf("Device doesn't support RAW data-path APIs.\n");
12935 		return TEST_SKIPPED;
12936 	}
12937 
12938 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12939 			      "No GMAC length in the source data");
12940 
12941 	/* Verify the capabilities */
12942 	struct rte_cryptodev_sym_capability_idx cap_idx;
12943 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12944 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12945 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12946 			&cap_idx) == NULL)
12947 		return TEST_SKIPPED;
12948 
12949 	retval = create_gmac_session(ts_params->valid_devs[0],
12950 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
12951 
12952 	if (retval == -ENOTSUP)
12953 		return TEST_SKIPPED;
12954 	if (retval < 0)
12955 		return retval;
12956 
12957 	if (tdata->plaintext.len > MBUF_SIZE)
12958 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12959 	else
12960 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12961 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12962 			"Failed to allocate input buffer in mempool");
12963 
12964 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12965 			rte_pktmbuf_tailroom(ut_params->ibuf));
12966 
12967 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12968 
12969 	/*
12970 	 * Runtime generate the large plain text instead of use hard code
12971 	 * plain text vector. It is done to avoid create huge source file
12972 	 * with the test vector.
12973 	 */
12974 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12975 		generate_gmac_large_plaintext(tdata->plaintext.data);
12976 
12977 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12978 				plaintext_pad_len);
12979 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12980 
12981 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12982 	debug_hexdump(stdout, "plaintext:", plaintext,
12983 			tdata->plaintext.len);
12984 
12985 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
12986 			tdata);
12987 
12988 	if (retval < 0)
12989 		return retval;
12990 
12991 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12992 
12993 	ut_params->op->sym->m_src = ut_params->ibuf;
12994 
12995 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12996 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12997 			ut_params->op);
12998 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12999 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13000 				ut_params->op, 0, 1, 0, 0);
13001 	else
13002 		TEST_ASSERT_NOT_NULL(
13003 			process_crypto_request(ts_params->valid_devs[0],
13004 			ut_params->op), "failed to process sym crypto op");
13005 
13006 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13007 			"crypto op processing failed");
13008 
13009 	return 0;
13010 
13011 }
13012 
13013 static int
13014 test_AES_GMAC_authentication_verify_test_case_1(void)
13015 {
13016 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
13017 }
13018 
13019 static int
13020 test_AES_GMAC_authentication_verify_test_case_2(void)
13021 {
13022 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
13023 }
13024 
13025 static int
13026 test_AES_GMAC_authentication_verify_test_case_3(void)
13027 {
13028 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
13029 }
13030 
13031 static int
13032 test_AES_GMAC_authentication_verify_test_case_4(void)
13033 {
13034 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
13035 }
13036 
13037 static int
13038 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
13039 				uint32_t fragsz)
13040 {
13041 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13042 	struct crypto_unittest_params *ut_params = &unittest_params;
13043 	struct rte_cryptodev_info dev_info;
13044 	uint64_t feature_flags;
13045 	unsigned int trn_data = 0;
13046 	void *digest_mem = NULL;
13047 	uint32_t segs = 1;
13048 	unsigned int to_trn = 0;
13049 	struct rte_mbuf *buf = NULL;
13050 	uint8_t *auth_tag, *plaintext;
13051 	int retval;
13052 
13053 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
13054 			      "No GMAC length in the source data");
13055 
13056 	/* Verify the capabilities */
13057 	struct rte_cryptodev_sym_capability_idx cap_idx;
13058 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13059 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
13060 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13061 			&cap_idx) == NULL)
13062 		return TEST_SKIPPED;
13063 
13064 	/* Check for any input SGL support */
13065 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13066 	feature_flags = dev_info.feature_flags;
13067 
13068 	if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
13069 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
13070 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
13071 		return TEST_SKIPPED;
13072 
13073 	if (fragsz > tdata->plaintext.len)
13074 		fragsz = tdata->plaintext.len;
13075 
13076 	uint16_t plaintext_len = fragsz;
13077 
13078 	retval = create_gmac_session(ts_params->valid_devs[0],
13079 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
13080 
13081 	if (retval == -ENOTSUP)
13082 		return TEST_SKIPPED;
13083 	if (retval < 0)
13084 		return retval;
13085 
13086 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13087 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13088 			"Failed to allocate input buffer in mempool");
13089 
13090 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13091 			rte_pktmbuf_tailroom(ut_params->ibuf));
13092 
13093 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13094 				plaintext_len);
13095 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13096 
13097 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13098 
13099 	trn_data += plaintext_len;
13100 
13101 	buf = ut_params->ibuf;
13102 
13103 	/*
13104 	 * Loop until no more fragments
13105 	 */
13106 
13107 	while (trn_data < tdata->plaintext.len) {
13108 		++segs;
13109 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13110 				(tdata->plaintext.len - trn_data) : fragsz;
13111 
13112 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13113 		buf = buf->next;
13114 
13115 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13116 				rte_pktmbuf_tailroom(buf));
13117 
13118 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
13119 				to_trn);
13120 
13121 		memcpy(plaintext, tdata->plaintext.data + trn_data,
13122 				to_trn);
13123 		trn_data += to_trn;
13124 		if (trn_data  == tdata->plaintext.len)
13125 			digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
13126 					tdata->gmac_tag.len);
13127 	}
13128 	ut_params->ibuf->nb_segs = segs;
13129 
13130 	/*
13131 	 * Place digest at the end of the last buffer
13132 	 */
13133 	uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
13134 
13135 	if (!digest_mem) {
13136 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13137 				+ tdata->gmac_tag.len);
13138 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
13139 				tdata->plaintext.len);
13140 	}
13141 
13142 	retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
13143 			tdata, digest_mem, digest_phys);
13144 
13145 	if (retval < 0)
13146 		return retval;
13147 
13148 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13149 
13150 	ut_params->op->sym->m_src = ut_params->ibuf;
13151 
13152 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13153 		return TEST_SKIPPED;
13154 
13155 	TEST_ASSERT_NOT_NULL(
13156 		process_crypto_request(ts_params->valid_devs[0],
13157 		ut_params->op), "failed to process sym crypto op");
13158 
13159 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13160 			"crypto op processing failed");
13161 
13162 	auth_tag = digest_mem;
13163 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
13164 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13165 			auth_tag,
13166 			tdata->gmac_tag.data,
13167 			tdata->gmac_tag.len,
13168 			"GMAC Generated auth tag not as expected");
13169 
13170 	return 0;
13171 }
13172 
13173 /* Segment size not multiple of block size (16B) */
13174 static int
13175 test_AES_GMAC_authentication_SGL_40B(void)
13176 {
13177 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
13178 }
13179 
13180 static int
13181 test_AES_GMAC_authentication_SGL_80B(void)
13182 {
13183 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
13184 }
13185 
13186 static int
13187 test_AES_GMAC_authentication_SGL_2048B(void)
13188 {
13189 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
13190 }
13191 
13192 /* Segment size not multiple of block size (16B) */
13193 static int
13194 test_AES_GMAC_authentication_SGL_2047B(void)
13195 {
13196 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
13197 }
13198 
13199 struct test_crypto_vector {
13200 	enum rte_crypto_cipher_algorithm crypto_algo;
13201 	unsigned int cipher_offset;
13202 	unsigned int cipher_len;
13203 
13204 	struct {
13205 		uint8_t data[64];
13206 		unsigned int len;
13207 	} cipher_key;
13208 
13209 	struct {
13210 		uint8_t data[64];
13211 		unsigned int len;
13212 	} iv;
13213 
13214 	struct {
13215 		const uint8_t *data;
13216 		unsigned int len;
13217 	} plaintext;
13218 
13219 	struct {
13220 		const uint8_t *data;
13221 		unsigned int len;
13222 	} ciphertext;
13223 
13224 	enum rte_crypto_auth_algorithm auth_algo;
13225 	unsigned int auth_offset;
13226 
13227 	struct {
13228 		uint8_t data[128];
13229 		unsigned int len;
13230 	} auth_key;
13231 
13232 	struct {
13233 		const uint8_t *data;
13234 		unsigned int len;
13235 	} aad;
13236 
13237 	struct {
13238 		uint8_t data[128];
13239 		unsigned int len;
13240 	} digest;
13241 };
13242 
13243 static const struct test_crypto_vector
13244 hmac_sha1_test_crypto_vector = {
13245 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
13246 	.plaintext = {
13247 		.data = plaintext_hash,
13248 		.len = 512
13249 	},
13250 	.auth_key = {
13251 		.data = {
13252 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
13253 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
13254 			0xDE, 0xF4, 0xDE, 0xAD
13255 		},
13256 		.len = 20
13257 	},
13258 	.digest = {
13259 		.data = {
13260 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
13261 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
13262 			0x3F, 0x91, 0x64, 0x59
13263 		},
13264 		.len = 20
13265 	}
13266 };
13267 
13268 static const struct test_crypto_vector
13269 aes128_gmac_test_vector = {
13270 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
13271 	.plaintext = {
13272 		.data = plaintext_hash,
13273 		.len = 512
13274 	},
13275 	.iv = {
13276 		.data = {
13277 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
13278 			0x08, 0x09, 0x0A, 0x0B
13279 		},
13280 		.len = 12
13281 	},
13282 	.auth_key = {
13283 		.data = {
13284 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
13285 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
13286 		},
13287 		.len = 16
13288 	},
13289 	.digest = {
13290 		.data = {
13291 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
13292 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
13293 		},
13294 		.len = 16
13295 	}
13296 };
13297 
13298 static const struct test_crypto_vector
13299 aes128cbc_hmac_sha1_test_vector = {
13300 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
13301 	.cipher_offset = 0,
13302 	.cipher_len = 512,
13303 	.cipher_key = {
13304 		.data = {
13305 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
13306 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
13307 		},
13308 		.len = 16
13309 	},
13310 	.iv = {
13311 		.data = {
13312 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
13313 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
13314 		},
13315 		.len = 16
13316 	},
13317 	.plaintext = {
13318 		.data = plaintext_hash,
13319 		.len = 512
13320 	},
13321 	.ciphertext = {
13322 		.data = ciphertext512_aes128cbc,
13323 		.len = 512
13324 	},
13325 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
13326 	.auth_offset = 0,
13327 	.auth_key = {
13328 		.data = {
13329 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
13330 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
13331 			0xDE, 0xF4, 0xDE, 0xAD
13332 		},
13333 		.len = 20
13334 	},
13335 	.digest = {
13336 		.data = {
13337 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
13338 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
13339 			0x18, 0x8C, 0x1D, 0x32
13340 		},
13341 		.len = 20
13342 	}
13343 };
13344 
13345 static const struct test_crypto_vector
13346 aes128cbc_hmac_sha1_aad_test_vector = {
13347 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
13348 	.cipher_offset = 8,
13349 	.cipher_len = 496,
13350 	.cipher_key = {
13351 		.data = {
13352 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
13353 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
13354 		},
13355 		.len = 16
13356 	},
13357 	.iv = {
13358 		.data = {
13359 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
13360 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
13361 		},
13362 		.len = 16
13363 	},
13364 	.plaintext = {
13365 		.data = plaintext_hash,
13366 		.len = 512
13367 	},
13368 	.ciphertext = {
13369 		.data = ciphertext512_aes128cbc_aad,
13370 		.len = 512
13371 	},
13372 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
13373 	.auth_offset = 0,
13374 	.auth_key = {
13375 		.data = {
13376 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
13377 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
13378 			0xDE, 0xF4, 0xDE, 0xAD
13379 		},
13380 		.len = 20
13381 	},
13382 	.digest = {
13383 		.data = {
13384 			0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
13385 			0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
13386 			0x62, 0x0F, 0xFB, 0x10
13387 		},
13388 		.len = 20
13389 	}
13390 };
13391 
13392 static void
13393 data_corruption(uint8_t *data)
13394 {
13395 	data[0] += 1;
13396 }
13397 
13398 static void
13399 tag_corruption(uint8_t *data, unsigned int tag_offset)
13400 {
13401 	data[tag_offset] += 1;
13402 }
13403 
13404 static int
13405 create_auth_session(struct crypto_unittest_params *ut_params,
13406 		uint8_t dev_id,
13407 		const struct test_crypto_vector *reference,
13408 		enum rte_crypto_auth_operation auth_op)
13409 {
13410 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13411 	uint8_t auth_key[reference->auth_key.len + 1];
13412 	int status;
13413 
13414 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13415 
13416 	/* Setup Authentication Parameters */
13417 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13418 	ut_params->auth_xform.auth.op = auth_op;
13419 	ut_params->auth_xform.next = NULL;
13420 	ut_params->auth_xform.auth.algo = reference->auth_algo;
13421 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13422 	ut_params->auth_xform.auth.key.data = auth_key;
13423 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
13424 
13425 	/* Create Crypto session*/
13426 	ut_params->sess = rte_cryptodev_sym_session_create(
13427 			ts_params->session_mpool);
13428 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13429 
13430 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
13431 				&ut_params->auth_xform,
13432 				ts_params->session_priv_mpool);
13433 
13434 	return status;
13435 }
13436 
13437 static int
13438 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
13439 		uint8_t dev_id,
13440 		const struct test_crypto_vector *reference,
13441 		enum rte_crypto_auth_operation auth_op,
13442 		enum rte_crypto_cipher_operation cipher_op)
13443 {
13444 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13445 	uint8_t cipher_key[reference->cipher_key.len + 1];
13446 	uint8_t auth_key[reference->auth_key.len + 1];
13447 	int status;
13448 
13449 	memcpy(cipher_key, reference->cipher_key.data,
13450 			reference->cipher_key.len);
13451 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13452 
13453 	/* Setup Authentication Parameters */
13454 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13455 	ut_params->auth_xform.auth.op = auth_op;
13456 	ut_params->auth_xform.auth.algo = reference->auth_algo;
13457 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13458 	ut_params->auth_xform.auth.key.data = auth_key;
13459 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
13460 
13461 	if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
13462 		ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
13463 		ut_params->auth_xform.auth.iv.length = reference->iv.len;
13464 	} else {
13465 		ut_params->auth_xform.next = &ut_params->cipher_xform;
13466 
13467 		/* Setup Cipher Parameters */
13468 		ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13469 		ut_params->cipher_xform.next = NULL;
13470 		ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13471 		ut_params->cipher_xform.cipher.op = cipher_op;
13472 		ut_params->cipher_xform.cipher.key.data = cipher_key;
13473 		ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13474 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13475 		ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13476 	}
13477 
13478 	/* Create Crypto session*/
13479 	ut_params->sess = rte_cryptodev_sym_session_create(
13480 			ts_params->session_mpool);
13481 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13482 
13483 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
13484 				&ut_params->auth_xform,
13485 				ts_params->session_priv_mpool);
13486 
13487 	return status;
13488 }
13489 
13490 static int
13491 create_auth_operation(struct crypto_testsuite_params *ts_params,
13492 		struct crypto_unittest_params *ut_params,
13493 		const struct test_crypto_vector *reference,
13494 		unsigned int auth_generate)
13495 {
13496 	/* Generate Crypto op data structure */
13497 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13498 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13499 	TEST_ASSERT_NOT_NULL(ut_params->op,
13500 			"Failed to allocate pktmbuf offload");
13501 
13502 	/* Set crypto operation data parameters */
13503 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13504 
13505 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13506 
13507 	/* set crypto operation source mbuf */
13508 	sym_op->m_src = ut_params->ibuf;
13509 
13510 	/* digest */
13511 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13512 			ut_params->ibuf, reference->digest.len);
13513 
13514 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13515 			"no room to append auth tag");
13516 
13517 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13518 			ut_params->ibuf, reference->plaintext.len);
13519 
13520 	if (auth_generate)
13521 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
13522 	else
13523 		memcpy(sym_op->auth.digest.data,
13524 				reference->digest.data,
13525 				reference->digest.len);
13526 
13527 	debug_hexdump(stdout, "digest:",
13528 			sym_op->auth.digest.data,
13529 			reference->digest.len);
13530 
13531 	sym_op->auth.data.length = reference->plaintext.len;
13532 	sym_op->auth.data.offset = 0;
13533 
13534 	return 0;
13535 }
13536 
13537 static int
13538 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
13539 		struct crypto_unittest_params *ut_params,
13540 		const struct test_crypto_vector *reference,
13541 		unsigned int auth_generate)
13542 {
13543 	/* Generate Crypto op data structure */
13544 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13545 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13546 	TEST_ASSERT_NOT_NULL(ut_params->op,
13547 			"Failed to allocate pktmbuf offload");
13548 
13549 	/* Set crypto operation data parameters */
13550 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13551 
13552 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13553 
13554 	/* set crypto operation source mbuf */
13555 	sym_op->m_src = ut_params->ibuf;
13556 
13557 	/* digest */
13558 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13559 			ut_params->ibuf, reference->digest.len);
13560 
13561 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13562 			"no room to append auth tag");
13563 
13564 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13565 			ut_params->ibuf, reference->ciphertext.len);
13566 
13567 	if (auth_generate)
13568 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
13569 	else
13570 		memcpy(sym_op->auth.digest.data,
13571 				reference->digest.data,
13572 				reference->digest.len);
13573 
13574 	debug_hexdump(stdout, "digest:",
13575 			sym_op->auth.digest.data,
13576 			reference->digest.len);
13577 
13578 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
13579 			reference->iv.data, reference->iv.len);
13580 
13581 	sym_op->cipher.data.length = 0;
13582 	sym_op->cipher.data.offset = 0;
13583 
13584 	sym_op->auth.data.length = reference->plaintext.len;
13585 	sym_op->auth.data.offset = 0;
13586 
13587 	return 0;
13588 }
13589 
13590 static int
13591 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
13592 		struct crypto_unittest_params *ut_params,
13593 		const struct test_crypto_vector *reference,
13594 		unsigned int auth_generate)
13595 {
13596 	/* Generate Crypto op data structure */
13597 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13598 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13599 	TEST_ASSERT_NOT_NULL(ut_params->op,
13600 			"Failed to allocate pktmbuf offload");
13601 
13602 	/* Set crypto operation data parameters */
13603 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13604 
13605 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13606 
13607 	/* set crypto operation source mbuf */
13608 	sym_op->m_src = ut_params->ibuf;
13609 
13610 	/* digest */
13611 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13612 			ut_params->ibuf, reference->digest.len);
13613 
13614 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13615 			"no room to append auth tag");
13616 
13617 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13618 			ut_params->ibuf, reference->ciphertext.len);
13619 
13620 	if (auth_generate)
13621 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
13622 	else
13623 		memcpy(sym_op->auth.digest.data,
13624 				reference->digest.data,
13625 				reference->digest.len);
13626 
13627 	debug_hexdump(stdout, "digest:",
13628 			sym_op->auth.digest.data,
13629 			reference->digest.len);
13630 
13631 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
13632 			reference->iv.data, reference->iv.len);
13633 
13634 	sym_op->cipher.data.length = reference->cipher_len;
13635 	sym_op->cipher.data.offset = reference->cipher_offset;
13636 
13637 	sym_op->auth.data.length = reference->plaintext.len;
13638 	sym_op->auth.data.offset = reference->auth_offset;
13639 
13640 	return 0;
13641 }
13642 
13643 static int
13644 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13645 		struct crypto_unittest_params *ut_params,
13646 		const struct test_crypto_vector *reference)
13647 {
13648 	return create_auth_operation(ts_params, ut_params, reference, 0);
13649 }
13650 
13651 static int
13652 create_auth_verify_GMAC_operation(
13653 		struct crypto_testsuite_params *ts_params,
13654 		struct crypto_unittest_params *ut_params,
13655 		const struct test_crypto_vector *reference)
13656 {
13657 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
13658 }
13659 
13660 static int
13661 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13662 		struct crypto_unittest_params *ut_params,
13663 		const struct test_crypto_vector *reference)
13664 {
13665 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
13666 }
13667 
13668 static int
13669 test_authentication_verify_fail_when_data_corruption(
13670 		struct crypto_testsuite_params *ts_params,
13671 		struct crypto_unittest_params *ut_params,
13672 		const struct test_crypto_vector *reference,
13673 		unsigned int data_corrupted)
13674 {
13675 	int retval;
13676 
13677 	uint8_t *plaintext;
13678 	struct rte_cryptodev_info dev_info;
13679 
13680 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13681 	uint64_t feat_flags = dev_info.feature_flags;
13682 
13683 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13684 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13685 		printf("Device doesn't support RAW data-path APIs.\n");
13686 		return TEST_SKIPPED;
13687 	}
13688 
13689 	/* Verify the capabilities */
13690 	struct rte_cryptodev_sym_capability_idx cap_idx;
13691 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13692 	cap_idx.algo.auth = reference->auth_algo;
13693 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13694 			&cap_idx) == NULL)
13695 		return TEST_SKIPPED;
13696 
13697 
13698 	/* Create session */
13699 	retval = create_auth_session(ut_params,
13700 			ts_params->valid_devs[0],
13701 			reference,
13702 			RTE_CRYPTO_AUTH_OP_VERIFY);
13703 
13704 	if (retval == -ENOTSUP)
13705 		return TEST_SKIPPED;
13706 	if (retval < 0)
13707 		return retval;
13708 
13709 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13710 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13711 			"Failed to allocate input buffer in mempool");
13712 
13713 	/* clear mbuf payload */
13714 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13715 			rte_pktmbuf_tailroom(ut_params->ibuf));
13716 
13717 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13718 			reference->plaintext.len);
13719 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13720 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13721 
13722 	debug_hexdump(stdout, "plaintext:", plaintext,
13723 		reference->plaintext.len);
13724 
13725 	/* Create operation */
13726 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
13727 
13728 	if (retval < 0)
13729 		return retval;
13730 
13731 	if (data_corrupted)
13732 		data_corruption(plaintext);
13733 	else
13734 		tag_corruption(plaintext, reference->plaintext.len);
13735 
13736 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13737 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13738 			ut_params->op);
13739 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13740 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13741 			"authentication not failed");
13742 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13743 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13744 				ut_params->op, 0, 1, 0, 0);
13745 	else {
13746 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13747 			ut_params->op);
13748 	}
13749 	if (ut_params->op == NULL)
13750 		return 0;
13751 	else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
13752 		return 0;
13753 
13754 	return -1;
13755 }
13756 
13757 static int
13758 test_authentication_verify_GMAC_fail_when_corruption(
13759 		struct crypto_testsuite_params *ts_params,
13760 		struct crypto_unittest_params *ut_params,
13761 		const struct test_crypto_vector *reference,
13762 		unsigned int data_corrupted)
13763 {
13764 	int retval;
13765 	uint8_t *plaintext;
13766 	struct rte_cryptodev_info dev_info;
13767 
13768 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13769 	uint64_t feat_flags = dev_info.feature_flags;
13770 
13771 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13772 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13773 		printf("Device doesn't support RAW data-path APIs.\n");
13774 		return TEST_SKIPPED;
13775 	}
13776 
13777 	/* Verify the capabilities */
13778 	struct rte_cryptodev_sym_capability_idx cap_idx;
13779 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13780 	cap_idx.algo.auth = reference->auth_algo;
13781 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13782 			&cap_idx) == NULL)
13783 		return TEST_SKIPPED;
13784 
13785 	/* Create session */
13786 	retval = create_auth_cipher_session(ut_params,
13787 			ts_params->valid_devs[0],
13788 			reference,
13789 			RTE_CRYPTO_AUTH_OP_VERIFY,
13790 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
13791 	if (retval < 0)
13792 		return retval;
13793 
13794 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13795 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13796 			"Failed to allocate input buffer in mempool");
13797 
13798 	/* clear mbuf payload */
13799 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13800 			rte_pktmbuf_tailroom(ut_params->ibuf));
13801 
13802 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13803 			reference->plaintext.len);
13804 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13805 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13806 
13807 	debug_hexdump(stdout, "plaintext:", plaintext,
13808 		reference->plaintext.len);
13809 
13810 	/* Create operation */
13811 	retval = create_auth_verify_GMAC_operation(ts_params,
13812 			ut_params,
13813 			reference);
13814 
13815 	if (retval < 0)
13816 		return retval;
13817 
13818 	if (data_corrupted)
13819 		data_corruption(plaintext);
13820 	else
13821 		tag_corruption(plaintext, reference->aad.len);
13822 
13823 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13824 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13825 			ut_params->op);
13826 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13827 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13828 			"authentication not failed");
13829 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13830 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13831 				ut_params->op, 0, 1, 0, 0);
13832 	else {
13833 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13834 			ut_params->op);
13835 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13836 	}
13837 
13838 	return 0;
13839 }
13840 
13841 static int
13842 test_authenticated_decryption_fail_when_corruption(
13843 		struct crypto_testsuite_params *ts_params,
13844 		struct crypto_unittest_params *ut_params,
13845 		const struct test_crypto_vector *reference,
13846 		unsigned int data_corrupted)
13847 {
13848 	int retval;
13849 
13850 	uint8_t *ciphertext;
13851 	struct rte_cryptodev_info dev_info;
13852 
13853 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13854 	uint64_t feat_flags = dev_info.feature_flags;
13855 
13856 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13857 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13858 		printf("Device doesn't support RAW data-path APIs.\n");
13859 		return TEST_SKIPPED;
13860 	}
13861 
13862 	/* Verify the capabilities */
13863 	struct rte_cryptodev_sym_capability_idx cap_idx;
13864 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13865 	cap_idx.algo.auth = reference->auth_algo;
13866 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13867 			&cap_idx) == NULL)
13868 		return TEST_SKIPPED;
13869 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13870 	cap_idx.algo.cipher = reference->crypto_algo;
13871 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13872 			&cap_idx) == NULL)
13873 		return TEST_SKIPPED;
13874 
13875 	/* Create session */
13876 	retval = create_auth_cipher_session(ut_params,
13877 			ts_params->valid_devs[0],
13878 			reference,
13879 			RTE_CRYPTO_AUTH_OP_VERIFY,
13880 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
13881 
13882 	if (retval == -ENOTSUP)
13883 		return TEST_SKIPPED;
13884 	if (retval < 0)
13885 		return retval;
13886 
13887 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13888 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13889 			"Failed to allocate input buffer in mempool");
13890 
13891 	/* clear mbuf payload */
13892 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13893 			rte_pktmbuf_tailroom(ut_params->ibuf));
13894 
13895 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13896 			reference->ciphertext.len);
13897 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13898 	memcpy(ciphertext, reference->ciphertext.data,
13899 			reference->ciphertext.len);
13900 
13901 	/* Create operation */
13902 	retval = create_cipher_auth_verify_operation(ts_params,
13903 			ut_params,
13904 			reference);
13905 
13906 	if (retval < 0)
13907 		return retval;
13908 
13909 	if (data_corrupted)
13910 		data_corruption(ciphertext);
13911 	else
13912 		tag_corruption(ciphertext, reference->ciphertext.len);
13913 
13914 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13915 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13916 			ut_params->op);
13917 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13918 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13919 			"authentication not failed");
13920 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13921 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13922 				ut_params->op, 1, 1, 0, 0);
13923 	else {
13924 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13925 			ut_params->op);
13926 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13927 	}
13928 
13929 	return 0;
13930 }
13931 
13932 static int
13933 test_authenticated_encrypt_with_esn(
13934 		struct crypto_testsuite_params *ts_params,
13935 		struct crypto_unittest_params *ut_params,
13936 		const struct test_crypto_vector *reference)
13937 {
13938 	int retval;
13939 
13940 	uint8_t *authciphertext, *plaintext, *auth_tag;
13941 	uint16_t plaintext_pad_len;
13942 	uint8_t cipher_key[reference->cipher_key.len + 1];
13943 	uint8_t auth_key[reference->auth_key.len + 1];
13944 	struct rte_cryptodev_info dev_info;
13945 	int status;
13946 
13947 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13948 	uint64_t feat_flags = dev_info.feature_flags;
13949 
13950 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13951 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13952 		printf("Device doesn't support RAW data-path APIs.\n");
13953 		return TEST_SKIPPED;
13954 	}
13955 
13956 	/* Verify the capabilities */
13957 	struct rte_cryptodev_sym_capability_idx cap_idx;
13958 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13959 	cap_idx.algo.auth = reference->auth_algo;
13960 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13961 			&cap_idx) == NULL)
13962 		return TEST_SKIPPED;
13963 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13964 	cap_idx.algo.cipher = reference->crypto_algo;
13965 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13966 			&cap_idx) == NULL)
13967 		return TEST_SKIPPED;
13968 
13969 	/* Create session */
13970 	memcpy(cipher_key, reference->cipher_key.data,
13971 			reference->cipher_key.len);
13972 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13973 
13974 	/* Setup Cipher Parameters */
13975 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13976 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13977 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13978 	ut_params->cipher_xform.cipher.key.data = cipher_key;
13979 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13980 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13981 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13982 
13983 	ut_params->cipher_xform.next = &ut_params->auth_xform;
13984 
13985 	/* Setup Authentication Parameters */
13986 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13987 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13988 	ut_params->auth_xform.auth.algo = reference->auth_algo;
13989 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13990 	ut_params->auth_xform.auth.key.data = auth_key;
13991 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
13992 	ut_params->auth_xform.next = NULL;
13993 
13994 	/* Create Crypto session*/
13995 	ut_params->sess = rte_cryptodev_sym_session_create(
13996 			ts_params->session_mpool);
13997 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13998 
13999 	status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
14000 				ut_params->sess,
14001 				&ut_params->cipher_xform,
14002 				ts_params->session_priv_mpool);
14003 
14004 	if (status == -ENOTSUP)
14005 		return TEST_SKIPPED;
14006 
14007 	TEST_ASSERT_EQUAL(status, 0, "Session init failed");
14008 
14009 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14010 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
14011 			"Failed to allocate input buffer in mempool");
14012 
14013 	/* clear mbuf payload */
14014 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14015 			rte_pktmbuf_tailroom(ut_params->ibuf));
14016 
14017 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14018 			reference->plaintext.len);
14019 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
14020 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
14021 
14022 	/* Create operation */
14023 	retval = create_cipher_auth_operation(ts_params,
14024 			ut_params,
14025 			reference, 0);
14026 
14027 	if (retval < 0)
14028 		return retval;
14029 
14030 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14031 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
14032 			ut_params->op);
14033 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14034 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
14035 				ut_params->op, 1, 1, 0, 0);
14036 	else
14037 		ut_params->op = process_crypto_request(
14038 			ts_params->valid_devs[0], ut_params->op);
14039 
14040 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
14041 
14042 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
14043 			"crypto op processing failed");
14044 
14045 	plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
14046 
14047 	authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
14048 			ut_params->op->sym->auth.data.offset);
14049 	auth_tag = authciphertext + plaintext_pad_len;
14050 	debug_hexdump(stdout, "ciphertext:", authciphertext,
14051 			reference->ciphertext.len);
14052 	debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
14053 
14054 	/* Validate obuf */
14055 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
14056 			authciphertext,
14057 			reference->ciphertext.data,
14058 			reference->ciphertext.len,
14059 			"Ciphertext data not as expected");
14060 
14061 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
14062 			auth_tag,
14063 			reference->digest.data,
14064 			reference->digest.len,
14065 			"Generated digest not as expected");
14066 
14067 	return TEST_SUCCESS;
14068 
14069 }
14070 
14071 static int
14072 test_authenticated_decrypt_with_esn(
14073 		struct crypto_testsuite_params *ts_params,
14074 		struct crypto_unittest_params *ut_params,
14075 		const struct test_crypto_vector *reference)
14076 {
14077 	int retval;
14078 
14079 	uint8_t *ciphertext;
14080 	uint8_t cipher_key[reference->cipher_key.len + 1];
14081 	uint8_t auth_key[reference->auth_key.len + 1];
14082 	struct rte_cryptodev_info dev_info;
14083 
14084 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
14085 	uint64_t feat_flags = dev_info.feature_flags;
14086 
14087 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
14088 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
14089 		printf("Device doesn't support RAW data-path APIs.\n");
14090 		return TEST_SKIPPED;
14091 	}
14092 
14093 	/* Verify the capabilities */
14094 	struct rte_cryptodev_sym_capability_idx cap_idx;
14095 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
14096 	cap_idx.algo.auth = reference->auth_algo;
14097 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
14098 			&cap_idx) == NULL)
14099 		return TEST_SKIPPED;
14100 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
14101 	cap_idx.algo.cipher = reference->crypto_algo;
14102 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
14103 			&cap_idx) == NULL)
14104 		return TEST_SKIPPED;
14105 
14106 	/* Create session */
14107 	memcpy(cipher_key, reference->cipher_key.data,
14108 			reference->cipher_key.len);
14109 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
14110 
14111 	/* Setup Authentication Parameters */
14112 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
14113 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
14114 	ut_params->auth_xform.auth.algo = reference->auth_algo;
14115 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
14116 	ut_params->auth_xform.auth.key.data = auth_key;
14117 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
14118 	ut_params->auth_xform.next = &ut_params->cipher_xform;
14119 
14120 	/* Setup Cipher Parameters */
14121 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
14122 	ut_params->cipher_xform.next = NULL;
14123 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
14124 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
14125 	ut_params->cipher_xform.cipher.key.data = cipher_key;
14126 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
14127 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
14128 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
14129 
14130 	/* Create Crypto session*/
14131 	ut_params->sess = rte_cryptodev_sym_session_create(
14132 			ts_params->session_mpool);
14133 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
14134 
14135 	retval = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
14136 				ut_params->sess,
14137 				&ut_params->auth_xform,
14138 				ts_params->session_priv_mpool);
14139 
14140 	if (retval == -ENOTSUP)
14141 		return TEST_SKIPPED;
14142 
14143 	TEST_ASSERT_EQUAL(retval, 0, "Session init failed");
14144 
14145 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14146 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
14147 			"Failed to allocate input buffer in mempool");
14148 
14149 	/* clear mbuf payload */
14150 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14151 			rte_pktmbuf_tailroom(ut_params->ibuf));
14152 
14153 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14154 			reference->ciphertext.len);
14155 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
14156 	memcpy(ciphertext, reference->ciphertext.data,
14157 			reference->ciphertext.len);
14158 
14159 	/* Create operation */
14160 	retval = create_cipher_auth_verify_operation(ts_params,
14161 			ut_params,
14162 			reference);
14163 
14164 	if (retval < 0)
14165 		return retval;
14166 
14167 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14168 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
14169 			ut_params->op);
14170 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14171 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
14172 				ut_params->op, 1, 1, 0, 0);
14173 	else
14174 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
14175 			ut_params->op);
14176 
14177 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
14178 	TEST_ASSERT_EQUAL(ut_params->op->status,
14179 			RTE_CRYPTO_OP_STATUS_SUCCESS,
14180 			"crypto op processing passed");
14181 
14182 	ut_params->obuf = ut_params->op->sym->m_src;
14183 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
14184 
14185 	return 0;
14186 }
14187 
14188 static int
14189 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
14190 		const struct aead_test_data *tdata,
14191 		void *digest_mem, uint64_t digest_phys)
14192 {
14193 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14194 	struct crypto_unittest_params *ut_params = &unittest_params;
14195 
14196 	const unsigned int auth_tag_len = tdata->auth_tag.len;
14197 	const unsigned int iv_len = tdata->iv.len;
14198 	unsigned int aad_len = tdata->aad.len;
14199 	unsigned int aad_len_pad = 0;
14200 
14201 	/* Generate Crypto op data structure */
14202 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
14203 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
14204 	TEST_ASSERT_NOT_NULL(ut_params->op,
14205 		"Failed to allocate symmetric crypto operation struct");
14206 
14207 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
14208 
14209 	sym_op->aead.digest.data = digest_mem;
14210 
14211 	TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
14212 			"no room to append digest");
14213 
14214 	sym_op->aead.digest.phys_addr = digest_phys;
14215 
14216 	if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
14217 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
14218 				auth_tag_len);
14219 		debug_hexdump(stdout, "digest:",
14220 				sym_op->aead.digest.data,
14221 				auth_tag_len);
14222 	}
14223 
14224 	/* Append aad data */
14225 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
14226 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
14227 				uint8_t *, IV_OFFSET);
14228 
14229 		/* Copy IV 1 byte after the IV pointer, according to the API */
14230 		rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
14231 
14232 		aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
14233 
14234 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
14235 				ut_params->ibuf, aad_len);
14236 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
14237 				"no room to prepend aad");
14238 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
14239 				ut_params->ibuf);
14240 
14241 		memset(sym_op->aead.aad.data, 0, aad_len);
14242 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
14243 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
14244 
14245 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
14246 		debug_hexdump(stdout, "aad:",
14247 				sym_op->aead.aad.data, aad_len);
14248 	} else {
14249 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
14250 				uint8_t *, IV_OFFSET);
14251 
14252 		rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
14253 
14254 		aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
14255 
14256 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
14257 				ut_params->ibuf, aad_len_pad);
14258 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
14259 				"no room to prepend aad");
14260 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
14261 				ut_params->ibuf);
14262 
14263 		memset(sym_op->aead.aad.data, 0, aad_len);
14264 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
14265 
14266 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
14267 		debug_hexdump(stdout, "aad:",
14268 				sym_op->aead.aad.data, aad_len);
14269 	}
14270 
14271 	sym_op->aead.data.length = tdata->plaintext.len;
14272 	sym_op->aead.data.offset = aad_len_pad;
14273 
14274 	return 0;
14275 }
14276 
14277 #define SGL_MAX_NO	16
14278 
14279 static int
14280 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
14281 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
14282 {
14283 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14284 	struct crypto_unittest_params *ut_params = &unittest_params;
14285 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
14286 	int retval;
14287 	int to_trn = 0;
14288 	int to_trn_tbl[SGL_MAX_NO];
14289 	int segs = 1;
14290 	unsigned int trn_data = 0;
14291 	uint8_t *plaintext, *ciphertext, *auth_tag;
14292 	struct rte_cryptodev_info dev_info;
14293 
14294 	/* Verify the capabilities */
14295 	struct rte_cryptodev_sym_capability_idx cap_idx;
14296 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
14297 	cap_idx.algo.aead = tdata->algo;
14298 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
14299 			&cap_idx) == NULL)
14300 		return TEST_SKIPPED;
14301 
14302 	/* OOP not supported with CPU crypto */
14303 	if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14304 		return TEST_SKIPPED;
14305 
14306 	/* Detailed check for the particular SGL support flag */
14307 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
14308 	if (!oop) {
14309 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
14310 		if (sgl_in && (!(dev_info.feature_flags &
14311 				RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
14312 			return TEST_SKIPPED;
14313 
14314 		uint64_t feat_flags = dev_info.feature_flags;
14315 
14316 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
14317 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
14318 			printf("Device doesn't support RAW data-path APIs.\n");
14319 			return TEST_SKIPPED;
14320 		}
14321 	} else {
14322 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
14323 		unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
14324 				tdata->plaintext.len;
14325 		/* Raw data path API does not support OOP */
14326 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14327 			return TEST_SKIPPED;
14328 		if (sgl_in && !sgl_out) {
14329 			if (!(dev_info.feature_flags &
14330 					RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
14331 				return TEST_SKIPPED;
14332 		} else if (!sgl_in && sgl_out) {
14333 			if (!(dev_info.feature_flags &
14334 					RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
14335 				return TEST_SKIPPED;
14336 		} else if (sgl_in && sgl_out) {
14337 			if (!(dev_info.feature_flags &
14338 					RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
14339 				return TEST_SKIPPED;
14340 		}
14341 	}
14342 
14343 	if (fragsz > tdata->plaintext.len)
14344 		fragsz = tdata->plaintext.len;
14345 
14346 	uint16_t plaintext_len = fragsz;
14347 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
14348 
14349 	if (fragsz_oop > tdata->plaintext.len)
14350 		frag_size_oop = tdata->plaintext.len;
14351 
14352 	int ecx = 0;
14353 	void *digest_mem = NULL;
14354 
14355 	uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
14356 
14357 	if (tdata->plaintext.len % fragsz != 0) {
14358 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
14359 			return 1;
14360 	}	else {
14361 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
14362 			return 1;
14363 	}
14364 
14365 	/*
14366 	 * For out-op-place we need to alloc another mbuf
14367 	 */
14368 	if (oop) {
14369 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14370 		rte_pktmbuf_append(ut_params->obuf,
14371 				frag_size_oop + prepend_len);
14372 		buf_oop = ut_params->obuf;
14373 	}
14374 
14375 	/* Create AEAD session */
14376 	retval = create_aead_session(ts_params->valid_devs[0],
14377 			tdata->algo,
14378 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
14379 			tdata->key.data, tdata->key.len,
14380 			tdata->aad.len, tdata->auth_tag.len,
14381 			tdata->iv.len);
14382 	if (retval < 0)
14383 		return retval;
14384 
14385 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14386 
14387 	/* clear mbuf payload */
14388 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14389 			rte_pktmbuf_tailroom(ut_params->ibuf));
14390 
14391 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14392 			plaintext_len);
14393 
14394 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
14395 
14396 	trn_data += plaintext_len;
14397 
14398 	buf = ut_params->ibuf;
14399 
14400 	/*
14401 	 * Loop until no more fragments
14402 	 */
14403 
14404 	while (trn_data < tdata->plaintext.len) {
14405 		++segs;
14406 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
14407 				(tdata->plaintext.len - trn_data) : fragsz;
14408 
14409 		to_trn_tbl[ecx++] = to_trn;
14410 
14411 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14412 		buf = buf->next;
14413 
14414 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
14415 				rte_pktmbuf_tailroom(buf));
14416 
14417 		/* OOP */
14418 		if (oop && !fragsz_oop) {
14419 			buf_last_oop = buf_oop->next =
14420 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
14421 			buf_oop = buf_oop->next;
14422 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
14423 					0, rte_pktmbuf_tailroom(buf_oop));
14424 			rte_pktmbuf_append(buf_oop, to_trn);
14425 		}
14426 
14427 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
14428 				to_trn);
14429 
14430 		memcpy(plaintext, tdata->plaintext.data + trn_data,
14431 				to_trn);
14432 		trn_data += to_trn;
14433 		if (trn_data  == tdata->plaintext.len) {
14434 			if (oop) {
14435 				if (!fragsz_oop)
14436 					digest_mem = rte_pktmbuf_append(buf_oop,
14437 						tdata->auth_tag.len);
14438 			} else
14439 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
14440 					tdata->auth_tag.len);
14441 		}
14442 	}
14443 
14444 	uint64_t digest_phys = 0;
14445 
14446 	ut_params->ibuf->nb_segs = segs;
14447 
14448 	segs = 1;
14449 	if (fragsz_oop && oop) {
14450 		to_trn = 0;
14451 		ecx = 0;
14452 
14453 		if (frag_size_oop == tdata->plaintext.len) {
14454 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
14455 				tdata->auth_tag.len);
14456 
14457 			digest_phys = rte_pktmbuf_iova_offset(
14458 					ut_params->obuf,
14459 					tdata->plaintext.len + prepend_len);
14460 		}
14461 
14462 		trn_data = frag_size_oop;
14463 		while (trn_data < tdata->plaintext.len) {
14464 			++segs;
14465 			to_trn =
14466 				(tdata->plaintext.len - trn_data <
14467 						frag_size_oop) ?
14468 				(tdata->plaintext.len - trn_data) :
14469 						frag_size_oop;
14470 
14471 			to_trn_tbl[ecx++] = to_trn;
14472 
14473 			buf_last_oop = buf_oop->next =
14474 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
14475 			buf_oop = buf_oop->next;
14476 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
14477 					0, rte_pktmbuf_tailroom(buf_oop));
14478 			rte_pktmbuf_append(buf_oop, to_trn);
14479 
14480 			trn_data += to_trn;
14481 
14482 			if (trn_data  == tdata->plaintext.len) {
14483 				digest_mem = rte_pktmbuf_append(buf_oop,
14484 					tdata->auth_tag.len);
14485 			}
14486 		}
14487 
14488 		ut_params->obuf->nb_segs = segs;
14489 	}
14490 
14491 	/*
14492 	 * Place digest at the end of the last buffer
14493 	 */
14494 	if (!digest_phys)
14495 		digest_phys = rte_pktmbuf_iova(buf) + to_trn;
14496 	if (oop && buf_last_oop)
14497 		digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
14498 
14499 	if (!digest_mem && !oop) {
14500 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14501 				+ tdata->auth_tag.len);
14502 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
14503 				tdata->plaintext.len);
14504 	}
14505 
14506 	/* Create AEAD operation */
14507 	retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
14508 			tdata, digest_mem, digest_phys);
14509 
14510 	if (retval < 0)
14511 		return retval;
14512 
14513 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
14514 
14515 	ut_params->op->sym->m_src = ut_params->ibuf;
14516 	if (oop)
14517 		ut_params->op->sym->m_dst = ut_params->obuf;
14518 
14519 	/* Process crypto operation */
14520 	if (oop == IN_PLACE &&
14521 			gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14522 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
14523 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14524 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
14525 				ut_params->op, 0, 0, 0, 0);
14526 	else
14527 		TEST_ASSERT_NOT_NULL(
14528 			process_crypto_request(ts_params->valid_devs[0],
14529 			ut_params->op), "failed to process sym crypto op");
14530 
14531 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
14532 			"crypto op processing failed");
14533 
14534 
14535 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
14536 			uint8_t *, prepend_len);
14537 	if (oop) {
14538 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
14539 				uint8_t *, prepend_len);
14540 	}
14541 
14542 	if (fragsz_oop)
14543 		fragsz = fragsz_oop;
14544 
14545 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
14546 			ciphertext,
14547 			tdata->ciphertext.data,
14548 			fragsz,
14549 			"Ciphertext data not as expected");
14550 
14551 	buf = ut_params->op->sym->m_src->next;
14552 	if (oop)
14553 		buf = ut_params->op->sym->m_dst->next;
14554 
14555 	unsigned int off = fragsz;
14556 
14557 	ecx = 0;
14558 	while (buf) {
14559 		ciphertext = rte_pktmbuf_mtod(buf,
14560 				uint8_t *);
14561 
14562 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
14563 				ciphertext,
14564 				tdata->ciphertext.data + off,
14565 				to_trn_tbl[ecx],
14566 				"Ciphertext data not as expected");
14567 
14568 		off += to_trn_tbl[ecx++];
14569 		buf = buf->next;
14570 	}
14571 
14572 	auth_tag = digest_mem;
14573 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
14574 			auth_tag,
14575 			tdata->auth_tag.data,
14576 			tdata->auth_tag.len,
14577 			"Generated auth tag not as expected");
14578 
14579 	return 0;
14580 }
14581 
14582 static int
14583 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
14584 {
14585 	return test_authenticated_encryption_SGL(
14586 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
14587 }
14588 
14589 static int
14590 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
14591 {
14592 	return test_authenticated_encryption_SGL(
14593 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
14594 }
14595 
14596 static int
14597 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
14598 {
14599 	return test_authenticated_encryption_SGL(
14600 			&gcm_test_case_8, OUT_OF_PLACE, 400,
14601 			gcm_test_case_8.plaintext.len);
14602 }
14603 
14604 static int
14605 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
14606 {
14607 	/* This test is not for OPENSSL PMD */
14608 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
14609 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
14610 		return TEST_SKIPPED;
14611 
14612 	return test_authenticated_encryption_SGL(
14613 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
14614 }
14615 
14616 static int
14617 test_authentication_verify_fail_when_data_corrupted(
14618 		struct crypto_testsuite_params *ts_params,
14619 		struct crypto_unittest_params *ut_params,
14620 		const struct test_crypto_vector *reference)
14621 {
14622 	return test_authentication_verify_fail_when_data_corruption(
14623 			ts_params, ut_params, reference, 1);
14624 }
14625 
14626 static int
14627 test_authentication_verify_fail_when_tag_corrupted(
14628 		struct crypto_testsuite_params *ts_params,
14629 		struct crypto_unittest_params *ut_params,
14630 		const struct test_crypto_vector *reference)
14631 {
14632 	return test_authentication_verify_fail_when_data_corruption(
14633 			ts_params, ut_params, reference, 0);
14634 }
14635 
14636 static int
14637 test_authentication_verify_GMAC_fail_when_data_corrupted(
14638 		struct crypto_testsuite_params *ts_params,
14639 		struct crypto_unittest_params *ut_params,
14640 		const struct test_crypto_vector *reference)
14641 {
14642 	return test_authentication_verify_GMAC_fail_when_corruption(
14643 			ts_params, ut_params, reference, 1);
14644 }
14645 
14646 static int
14647 test_authentication_verify_GMAC_fail_when_tag_corrupted(
14648 		struct crypto_testsuite_params *ts_params,
14649 		struct crypto_unittest_params *ut_params,
14650 		const struct test_crypto_vector *reference)
14651 {
14652 	return test_authentication_verify_GMAC_fail_when_corruption(
14653 			ts_params, ut_params, reference, 0);
14654 }
14655 
14656 static int
14657 test_authenticated_decryption_fail_when_data_corrupted(
14658 		struct crypto_testsuite_params *ts_params,
14659 		struct crypto_unittest_params *ut_params,
14660 		const struct test_crypto_vector *reference)
14661 {
14662 	return test_authenticated_decryption_fail_when_corruption(
14663 			ts_params, ut_params, reference, 1);
14664 }
14665 
14666 static int
14667 test_authenticated_decryption_fail_when_tag_corrupted(
14668 		struct crypto_testsuite_params *ts_params,
14669 		struct crypto_unittest_params *ut_params,
14670 		const struct test_crypto_vector *reference)
14671 {
14672 	return test_authenticated_decryption_fail_when_corruption(
14673 			ts_params, ut_params, reference, 0);
14674 }
14675 
14676 static int
14677 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
14678 {
14679 	return test_authentication_verify_fail_when_data_corrupted(
14680 			&testsuite_params, &unittest_params,
14681 			&hmac_sha1_test_crypto_vector);
14682 }
14683 
14684 static int
14685 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
14686 {
14687 	return test_authentication_verify_fail_when_tag_corrupted(
14688 			&testsuite_params, &unittest_params,
14689 			&hmac_sha1_test_crypto_vector);
14690 }
14691 
14692 static int
14693 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
14694 {
14695 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
14696 			&testsuite_params, &unittest_params,
14697 			&aes128_gmac_test_vector);
14698 }
14699 
14700 static int
14701 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
14702 {
14703 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
14704 			&testsuite_params, &unittest_params,
14705 			&aes128_gmac_test_vector);
14706 }
14707 
14708 static int
14709 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
14710 {
14711 	return test_authenticated_decryption_fail_when_data_corrupted(
14712 			&testsuite_params,
14713 			&unittest_params,
14714 			&aes128cbc_hmac_sha1_test_vector);
14715 }
14716 
14717 static int
14718 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
14719 {
14720 	return test_authenticated_decryption_fail_when_tag_corrupted(
14721 			&testsuite_params,
14722 			&unittest_params,
14723 			&aes128cbc_hmac_sha1_test_vector);
14724 }
14725 
14726 static int
14727 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14728 {
14729 	return test_authenticated_encrypt_with_esn(
14730 			&testsuite_params,
14731 			&unittest_params,
14732 			&aes128cbc_hmac_sha1_aad_test_vector);
14733 }
14734 
14735 static int
14736 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14737 {
14738 	return test_authenticated_decrypt_with_esn(
14739 			&testsuite_params,
14740 			&unittest_params,
14741 			&aes128cbc_hmac_sha1_aad_test_vector);
14742 }
14743 
14744 static int
14745 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
14746 {
14747 	return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
14748 }
14749 
14750 static int
14751 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
14752 {
14753 	return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
14754 }
14755 
14756 static int
14757 test_chacha20_poly1305_encrypt_SGL_out_of_place(void)
14758 {
14759 	return test_authenticated_encryption_SGL(
14760 		&chacha20_poly1305_case_2, OUT_OF_PLACE, 32,
14761 		chacha20_poly1305_case_2.plaintext.len);
14762 }
14763 
14764 #ifdef RTE_CRYPTO_SCHEDULER
14765 
14766 /* global AESNI worker IDs for the scheduler test */
14767 uint8_t aesni_ids[2];
14768 
14769 static int
14770 scheduler_testsuite_setup(void)
14771 {
14772 	uint32_t i = 0;
14773 	int32_t nb_devs, ret;
14774 	char vdev_args[VDEV_ARGS_SIZE] = {""};
14775 	char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
14776 		"ordering=enable,name=cryptodev_test_scheduler,corelist="};
14777 	uint16_t worker_core_count = 0;
14778 	uint16_t socket_id = 0;
14779 
14780 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
14781 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
14782 
14783 		/* Identify the Worker Cores
14784 		 * Use 2 worker cores for the device args
14785 		 */
14786 		RTE_LCORE_FOREACH_WORKER(i) {
14787 			if (worker_core_count > 1)
14788 				break;
14789 			snprintf(vdev_args, sizeof(vdev_args),
14790 					"%s%d", temp_str, i);
14791 			strcpy(temp_str, vdev_args);
14792 			strlcat(temp_str, ";", sizeof(temp_str));
14793 			worker_core_count++;
14794 			socket_id = rte_lcore_to_socket_id(i);
14795 		}
14796 		if (worker_core_count != 2) {
14797 			RTE_LOG(ERR, USER1,
14798 				"Cryptodev scheduler test require at least "
14799 				"two worker cores to run. "
14800 				"Please use the correct coremask.\n");
14801 			return TEST_FAILED;
14802 		}
14803 		strcpy(temp_str, vdev_args);
14804 		snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
14805 				temp_str, socket_id);
14806 		RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
14807 		nb_devs = rte_cryptodev_device_count_by_driver(
14808 				rte_cryptodev_driver_id_get(
14809 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
14810 		if (nb_devs < 1) {
14811 			ret = rte_vdev_init(
14812 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
14813 					vdev_args);
14814 			TEST_ASSERT(ret == 0,
14815 				"Failed to create instance %u of pmd : %s",
14816 				i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14817 		}
14818 	}
14819 	return testsuite_setup();
14820 }
14821 
14822 static int
14823 test_scheduler_attach_worker_op(void)
14824 {
14825 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14826 	uint8_t sched_id = ts_params->valid_devs[0];
14827 	uint32_t i, nb_devs_attached = 0;
14828 	int ret;
14829 	char vdev_name[32];
14830 	unsigned int count = rte_cryptodev_count();
14831 
14832 	/* create 2 AESNI_MB vdevs on top of existing devices */
14833 	for (i = count; i < count + 2; i++) {
14834 		snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
14835 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
14836 				i);
14837 		ret = rte_vdev_init(vdev_name, NULL);
14838 
14839 		TEST_ASSERT(ret == 0,
14840 			"Failed to create instance %u of"
14841 			" pmd : %s",
14842 			i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14843 
14844 		if (ret < 0) {
14845 			RTE_LOG(ERR, USER1,
14846 				"Failed to create 2 AESNI MB PMDs.\n");
14847 			return TEST_SKIPPED;
14848 		}
14849 	}
14850 
14851 	/* attach 2 AESNI_MB cdevs */
14852 	for (i = count; i < count + 2; i++) {
14853 		struct rte_cryptodev_info info;
14854 		unsigned int session_size;
14855 
14856 		rte_cryptodev_info_get(i, &info);
14857 		if (info.driver_id != rte_cryptodev_driver_id_get(
14858 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
14859 			continue;
14860 
14861 		session_size = rte_cryptodev_sym_get_private_session_size(i);
14862 		/*
14863 		 * Create the session mempool again, since now there are new devices
14864 		 * to use the mempool.
14865 		 */
14866 		if (ts_params->session_mpool) {
14867 			rte_mempool_free(ts_params->session_mpool);
14868 			ts_params->session_mpool = NULL;
14869 		}
14870 		if (ts_params->session_priv_mpool) {
14871 			rte_mempool_free(ts_params->session_priv_mpool);
14872 			ts_params->session_priv_mpool = NULL;
14873 		}
14874 
14875 		if (info.sym.max_nb_sessions != 0 &&
14876 				info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
14877 			RTE_LOG(ERR, USER1,
14878 					"Device does not support "
14879 					"at least %u sessions\n",
14880 					MAX_NB_SESSIONS);
14881 			return TEST_FAILED;
14882 		}
14883 		/*
14884 		 * Create mempool with maximum number of sessions,
14885 		 * to include the session headers
14886 		 */
14887 		if (ts_params->session_mpool == NULL) {
14888 			ts_params->session_mpool =
14889 				rte_cryptodev_sym_session_pool_create(
14890 						"test_sess_mp",
14891 						MAX_NB_SESSIONS, 0, 0, 0,
14892 						SOCKET_ID_ANY);
14893 			TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
14894 					"session mempool allocation failed");
14895 		}
14896 
14897 		/*
14898 		 * Create mempool with maximum number of sessions,
14899 		 * to include device specific session private data
14900 		 */
14901 		if (ts_params->session_priv_mpool == NULL) {
14902 			ts_params->session_priv_mpool = rte_mempool_create(
14903 					"test_sess_mp_priv",
14904 					MAX_NB_SESSIONS,
14905 					session_size,
14906 					0, 0, NULL, NULL, NULL,
14907 					NULL, SOCKET_ID_ANY,
14908 					0);
14909 
14910 			TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
14911 					"session mempool allocation failed");
14912 		}
14913 
14914 		ts_params->qp_conf.mp_session = ts_params->session_mpool;
14915 		ts_params->qp_conf.mp_session_private =
14916 				ts_params->session_priv_mpool;
14917 
14918 		ret = rte_cryptodev_scheduler_worker_attach(sched_id,
14919 				(uint8_t)i);
14920 
14921 		TEST_ASSERT(ret == 0,
14922 			"Failed to attach device %u of pmd : %s", i,
14923 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14924 
14925 		aesni_ids[nb_devs_attached] = (uint8_t)i;
14926 
14927 		nb_devs_attached++;
14928 	}
14929 
14930 	return 0;
14931 }
14932 
14933 static int
14934 test_scheduler_detach_worker_op(void)
14935 {
14936 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14937 	uint8_t sched_id = ts_params->valid_devs[0];
14938 	uint32_t i;
14939 	int ret;
14940 
14941 	for (i = 0; i < 2; i++) {
14942 		ret = rte_cryptodev_scheduler_worker_detach(sched_id,
14943 				aesni_ids[i]);
14944 		TEST_ASSERT(ret == 0,
14945 			"Failed to detach device %u", aesni_ids[i]);
14946 	}
14947 
14948 	return 0;
14949 }
14950 
14951 static int
14952 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
14953 {
14954 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14955 	uint8_t sched_id = ts_params->valid_devs[0];
14956 	/* set mode */
14957 	return rte_cryptodev_scheduler_mode_set(sched_id,
14958 		scheduler_mode);
14959 }
14960 
14961 static int
14962 test_scheduler_mode_roundrobin_op(void)
14963 {
14964 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
14965 			0, "Failed to set roundrobin mode");
14966 	return 0;
14967 
14968 }
14969 
14970 static int
14971 test_scheduler_mode_multicore_op(void)
14972 {
14973 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
14974 			0, "Failed to set multicore mode");
14975 
14976 	return 0;
14977 }
14978 
14979 static int
14980 test_scheduler_mode_failover_op(void)
14981 {
14982 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
14983 			0, "Failed to set failover mode");
14984 
14985 	return 0;
14986 }
14987 
14988 static int
14989 test_scheduler_mode_pkt_size_distr_op(void)
14990 {
14991 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
14992 			0, "Failed to set pktsize mode");
14993 
14994 	return 0;
14995 }
14996 
14997 static int
14998 scheduler_multicore_testsuite_setup(void)
14999 {
15000 	if (test_scheduler_attach_worker_op() < 0)
15001 		return TEST_SKIPPED;
15002 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
15003 		return TEST_SKIPPED;
15004 	return 0;
15005 }
15006 
15007 static int
15008 scheduler_roundrobin_testsuite_setup(void)
15009 {
15010 	if (test_scheduler_attach_worker_op() < 0)
15011 		return TEST_SKIPPED;
15012 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
15013 		return TEST_SKIPPED;
15014 	return 0;
15015 }
15016 
15017 static int
15018 scheduler_failover_testsuite_setup(void)
15019 {
15020 	if (test_scheduler_attach_worker_op() < 0)
15021 		return TEST_SKIPPED;
15022 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
15023 		return TEST_SKIPPED;
15024 	return 0;
15025 }
15026 
15027 static int
15028 scheduler_pkt_size_distr_testsuite_setup(void)
15029 {
15030 	if (test_scheduler_attach_worker_op() < 0)
15031 		return TEST_SKIPPED;
15032 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
15033 		return TEST_SKIPPED;
15034 	return 0;
15035 }
15036 
15037 static void
15038 scheduler_mode_testsuite_teardown(void)
15039 {
15040 	test_scheduler_detach_worker_op();
15041 }
15042 
15043 #endif /* RTE_CRYPTO_SCHEDULER */
15044 
15045 static struct unit_test_suite end_testsuite = {
15046 	.suite_name = NULL,
15047 	.setup = NULL,
15048 	.teardown = NULL,
15049 	.unit_test_suites = NULL
15050 };
15051 
15052 #ifdef RTE_LIB_SECURITY
15053 static struct unit_test_suite ipsec_proto_testsuite  = {
15054 	.suite_name = "IPsec Proto Unit Test Suite",
15055 	.setup = ipsec_proto_testsuite_setup,
15056 	.unit_test_cases = {
15057 		TEST_CASE_NAMED_WITH_DATA(
15058 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
15059 			ut_setup_security, ut_teardown,
15060 			test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
15061 		TEST_CASE_NAMED_WITH_DATA(
15062 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
15063 			ut_setup_security, ut_teardown,
15064 			test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
15065 		TEST_CASE_NAMED_WITH_DATA(
15066 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
15067 			ut_setup_security, ut_teardown,
15068 			test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
15069 		TEST_CASE_NAMED_WITH_DATA(
15070 			"Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
15071 			ut_setup_security, ut_teardown,
15072 			test_ipsec_proto_known_vec,
15073 			&pkt_aes_128_cbc_hmac_sha256),
15074 		TEST_CASE_NAMED_WITH_DATA(
15075 			"Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
15076 			ut_setup_security, ut_teardown,
15077 			test_ipsec_proto_known_vec,
15078 			&pkt_aes_128_cbc_hmac_sha384),
15079 		TEST_CASE_NAMED_WITH_DATA(
15080 			"Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
15081 			ut_setup_security, ut_teardown,
15082 			test_ipsec_proto_known_vec,
15083 			&pkt_aes_128_cbc_hmac_sha512),
15084 		TEST_CASE_NAMED_WITH_DATA(
15085 			"Outbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
15086 			ut_setup_security, ut_teardown,
15087 			test_ipsec_proto_known_vec, &pkt_aes_256_gcm_v6),
15088 		TEST_CASE_NAMED_WITH_DATA(
15089 			"Outbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
15090 			ut_setup_security, ut_teardown,
15091 			test_ipsec_proto_known_vec,
15092 			&pkt_aes_128_cbc_hmac_sha256_v6),
15093 		TEST_CASE_NAMED_WITH_DATA(
15094 			"Outbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
15095 			ut_setup_security, ut_teardown,
15096 			test_ipsec_proto_known_vec,
15097 			&pkt_null_aes_xcbc),
15098 		TEST_CASE_NAMED_WITH_DATA(
15099 			"Outbound known vector (AH tunnel mode IPv4 HMAC-SHA256)",
15100 			ut_setup_security, ut_teardown,
15101 			test_ipsec_proto_known_vec,
15102 			&pkt_ah_tunnel_sha256),
15103 		TEST_CASE_NAMED_WITH_DATA(
15104 			"Outbound known vector (AH transport mode IPv4 HMAC-SHA256)",
15105 			ut_setup_security, ut_teardown,
15106 			test_ipsec_proto_known_vec,
15107 			&pkt_ah_transport_sha256),
15108 		TEST_CASE_NAMED_WITH_DATA(
15109 			"Outbound known vector (AH transport mode IPv4 AES-GMAC 128)",
15110 			ut_setup_security, ut_teardown,
15111 			test_ipsec_proto_known_vec,
15112 			&pkt_ah_ipv4_aes_gmac_128),
15113 		TEST_CASE_NAMED_WITH_DATA(
15114 			"Outbound fragmented packet",
15115 			ut_setup_security, ut_teardown,
15116 			test_ipsec_proto_known_vec_fragmented,
15117 			&pkt_aes_128_gcm_frag),
15118 		TEST_CASE_NAMED_WITH_DATA(
15119 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
15120 			ut_setup_security, ut_teardown,
15121 			test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
15122 		TEST_CASE_NAMED_WITH_DATA(
15123 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
15124 			ut_setup_security, ut_teardown,
15125 			test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
15126 		TEST_CASE_NAMED_WITH_DATA(
15127 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
15128 			ut_setup_security, ut_teardown,
15129 			test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
15130 		TEST_CASE_NAMED_WITH_DATA(
15131 			"Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128)",
15132 			ut_setup_security, ut_teardown,
15133 			test_ipsec_proto_known_vec_inb, &pkt_aes_128_cbc_null),
15134 		TEST_CASE_NAMED_WITH_DATA(
15135 			"Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
15136 			ut_setup_security, ut_teardown,
15137 			test_ipsec_proto_known_vec_inb,
15138 			&pkt_aes_128_cbc_hmac_sha256),
15139 		TEST_CASE_NAMED_WITH_DATA(
15140 			"Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
15141 			ut_setup_security, ut_teardown,
15142 			test_ipsec_proto_known_vec_inb,
15143 			&pkt_aes_128_cbc_hmac_sha384),
15144 		TEST_CASE_NAMED_WITH_DATA(
15145 			"Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
15146 			ut_setup_security, ut_teardown,
15147 			test_ipsec_proto_known_vec_inb,
15148 			&pkt_aes_128_cbc_hmac_sha512),
15149 		TEST_CASE_NAMED_WITH_DATA(
15150 			"Inbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
15151 			ut_setup_security, ut_teardown,
15152 			test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm_v6),
15153 		TEST_CASE_NAMED_WITH_DATA(
15154 			"Inbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
15155 			ut_setup_security, ut_teardown,
15156 			test_ipsec_proto_known_vec_inb,
15157 			&pkt_aes_128_cbc_hmac_sha256_v6),
15158 		TEST_CASE_NAMED_WITH_DATA(
15159 			"Inbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
15160 			ut_setup_security, ut_teardown,
15161 			test_ipsec_proto_known_vec_inb,
15162 			&pkt_null_aes_xcbc),
15163 		TEST_CASE_NAMED_WITH_DATA(
15164 			"Inbound known vector (AH tunnel mode IPv4 HMAC-SHA256)",
15165 			ut_setup_security, ut_teardown,
15166 			test_ipsec_proto_known_vec_inb,
15167 			&pkt_ah_tunnel_sha256),
15168 		TEST_CASE_NAMED_WITH_DATA(
15169 			"Inbound known vector (AH transport mode IPv4 HMAC-SHA256)",
15170 			ut_setup_security, ut_teardown,
15171 			test_ipsec_proto_known_vec_inb,
15172 			&pkt_ah_transport_sha256),
15173 		TEST_CASE_NAMED_WITH_DATA(
15174 			"Inbound known vector (AH transport mode IPv4 AES-GMAC 128)",
15175 			ut_setup_security, ut_teardown,
15176 			test_ipsec_proto_known_vec_inb,
15177 			&pkt_ah_ipv4_aes_gmac_128),
15178 		TEST_CASE_NAMED_ST(
15179 			"Combined test alg list",
15180 			ut_setup_security, ut_teardown,
15181 			test_ipsec_proto_display_list),
15182 		TEST_CASE_NAMED_ST(
15183 			"Combined test alg list (AH)",
15184 			ut_setup_security, ut_teardown,
15185 			test_ipsec_proto_ah_tunnel_ipv4),
15186 		TEST_CASE_NAMED_ST(
15187 			"IV generation",
15188 			ut_setup_security, ut_teardown,
15189 			test_ipsec_proto_iv_gen),
15190 		TEST_CASE_NAMED_ST(
15191 			"UDP encapsulation",
15192 			ut_setup_security, ut_teardown,
15193 			test_ipsec_proto_udp_encap),
15194 		TEST_CASE_NAMED_ST(
15195 			"UDP encapsulation ports verification test",
15196 			ut_setup_security, ut_teardown,
15197 			test_ipsec_proto_udp_ports_verify),
15198 		TEST_CASE_NAMED_ST(
15199 			"SA expiry packets soft",
15200 			ut_setup_security, ut_teardown,
15201 			test_ipsec_proto_sa_exp_pkts_soft),
15202 		TEST_CASE_NAMED_ST(
15203 			"SA expiry packets hard",
15204 			ut_setup_security, ut_teardown,
15205 			test_ipsec_proto_sa_exp_pkts_hard),
15206 		TEST_CASE_NAMED_ST(
15207 			"Negative test: ICV corruption",
15208 			ut_setup_security, ut_teardown,
15209 			test_ipsec_proto_err_icv_corrupt),
15210 		TEST_CASE_NAMED_ST(
15211 			"Tunnel dst addr verification",
15212 			ut_setup_security, ut_teardown,
15213 			test_ipsec_proto_tunnel_dst_addr_verify),
15214 		TEST_CASE_NAMED_ST(
15215 			"Tunnel src and dst addr verification",
15216 			ut_setup_security, ut_teardown,
15217 			test_ipsec_proto_tunnel_src_dst_addr_verify),
15218 		TEST_CASE_NAMED_ST(
15219 			"Inner IP checksum",
15220 			ut_setup_security, ut_teardown,
15221 			test_ipsec_proto_inner_ip_csum),
15222 		TEST_CASE_NAMED_ST(
15223 			"Inner L4 checksum",
15224 			ut_setup_security, ut_teardown,
15225 			test_ipsec_proto_inner_l4_csum),
15226 		TEST_CASE_NAMED_ST(
15227 			"Tunnel IPv4 in IPv4",
15228 			ut_setup_security, ut_teardown,
15229 			test_ipsec_proto_tunnel_v4_in_v4),
15230 		TEST_CASE_NAMED_ST(
15231 			"Tunnel IPv6 in IPv6",
15232 			ut_setup_security, ut_teardown,
15233 			test_ipsec_proto_tunnel_v6_in_v6),
15234 		TEST_CASE_NAMED_ST(
15235 			"Tunnel IPv4 in IPv6",
15236 			ut_setup_security, ut_teardown,
15237 			test_ipsec_proto_tunnel_v4_in_v6),
15238 		TEST_CASE_NAMED_ST(
15239 			"Tunnel IPv6 in IPv4",
15240 			ut_setup_security, ut_teardown,
15241 			test_ipsec_proto_tunnel_v6_in_v4),
15242 		TEST_CASE_NAMED_ST(
15243 			"Transport IPv4",
15244 			ut_setup_security, ut_teardown,
15245 			test_ipsec_proto_transport_v4),
15246 		TEST_CASE_NAMED_ST(
15247 			"AH transport IPv4",
15248 			ut_setup_security, ut_teardown,
15249 			test_ipsec_proto_ah_transport_ipv4),
15250 		TEST_CASE_NAMED_ST(
15251 			"Transport l4 checksum",
15252 			ut_setup_security, ut_teardown,
15253 			test_ipsec_proto_transport_l4_csum),
15254 		TEST_CASE_NAMED_ST(
15255 			"Statistics: success",
15256 			ut_setup_security, ut_teardown,
15257 			test_ipsec_proto_stats),
15258 		TEST_CASE_NAMED_ST(
15259 			"Fragmented packet",
15260 			ut_setup_security, ut_teardown,
15261 			test_ipsec_proto_pkt_fragment),
15262 		TEST_CASE_NAMED_ST(
15263 			"Tunnel header copy DF (inner 0)",
15264 			ut_setup_security, ut_teardown,
15265 			test_ipsec_proto_copy_df_inner_0),
15266 		TEST_CASE_NAMED_ST(
15267 			"Tunnel header copy DF (inner 1)",
15268 			ut_setup_security, ut_teardown,
15269 			test_ipsec_proto_copy_df_inner_1),
15270 		TEST_CASE_NAMED_ST(
15271 			"Tunnel header set DF 0 (inner 1)",
15272 			ut_setup_security, ut_teardown,
15273 			test_ipsec_proto_set_df_0_inner_1),
15274 		TEST_CASE_NAMED_ST(
15275 			"Tunnel header set DF 1 (inner 0)",
15276 			ut_setup_security, ut_teardown,
15277 			test_ipsec_proto_set_df_1_inner_0),
15278 		TEST_CASE_NAMED_ST(
15279 			"Tunnel header IPv4 copy DSCP (inner 0)",
15280 			ut_setup_security, ut_teardown,
15281 			test_ipsec_proto_ipv4_copy_dscp_inner_0),
15282 		TEST_CASE_NAMED_ST(
15283 			"Tunnel header IPv4 copy DSCP (inner 1)",
15284 			ut_setup_security, ut_teardown,
15285 			test_ipsec_proto_ipv4_copy_dscp_inner_1),
15286 		TEST_CASE_NAMED_ST(
15287 			"Tunnel header IPv4 set DSCP 0 (inner 1)",
15288 			ut_setup_security, ut_teardown,
15289 			test_ipsec_proto_ipv4_set_dscp_0_inner_1),
15290 		TEST_CASE_NAMED_ST(
15291 			"Tunnel header IPv4 set DSCP 1 (inner 0)",
15292 			ut_setup_security, ut_teardown,
15293 			test_ipsec_proto_ipv4_set_dscp_1_inner_0),
15294 		TEST_CASE_NAMED_ST(
15295 			"Tunnel header IPv6 copy DSCP (inner 0)",
15296 			ut_setup_security, ut_teardown,
15297 			test_ipsec_proto_ipv6_copy_dscp_inner_0),
15298 		TEST_CASE_NAMED_ST(
15299 			"Tunnel header IPv6 copy DSCP (inner 1)",
15300 			ut_setup_security, ut_teardown,
15301 			test_ipsec_proto_ipv6_copy_dscp_inner_1),
15302 		TEST_CASE_NAMED_ST(
15303 			"Tunnel header IPv6 set DSCP 0 (inner 1)",
15304 			ut_setup_security, ut_teardown,
15305 			test_ipsec_proto_ipv6_set_dscp_0_inner_1),
15306 		TEST_CASE_NAMED_ST(
15307 			"Tunnel header IPv6 set DSCP 1 (inner 0)",
15308 			ut_setup_security, ut_teardown,
15309 			test_ipsec_proto_ipv6_set_dscp_1_inner_0),
15310 		TEST_CASE_NAMED_WITH_DATA(
15311 			"Antireplay with window size 1024",
15312 			ut_setup_security, ut_teardown,
15313 			test_ipsec_proto_pkt_antireplay1024, &pkt_aes_128_gcm),
15314 		TEST_CASE_NAMED_WITH_DATA(
15315 			"Antireplay with window size 2048",
15316 			ut_setup_security, ut_teardown,
15317 			test_ipsec_proto_pkt_antireplay2048, &pkt_aes_128_gcm),
15318 		TEST_CASE_NAMED_WITH_DATA(
15319 			"Antireplay with window size 4096",
15320 			ut_setup_security, ut_teardown,
15321 			test_ipsec_proto_pkt_antireplay4096, &pkt_aes_128_gcm),
15322 		TEST_CASE_NAMED_WITH_DATA(
15323 			"ESN and Antireplay with window size 1024",
15324 			ut_setup_security, ut_teardown,
15325 			test_ipsec_proto_pkt_esn_antireplay1024,
15326 			&pkt_aes_128_gcm),
15327 		TEST_CASE_NAMED_WITH_DATA(
15328 			"ESN and Antireplay with window size 2048",
15329 			ut_setup_security, ut_teardown,
15330 			test_ipsec_proto_pkt_esn_antireplay2048,
15331 			&pkt_aes_128_gcm),
15332 		TEST_CASE_NAMED_WITH_DATA(
15333 			"ESN and Antireplay with window size 4096",
15334 			ut_setup_security, ut_teardown,
15335 			test_ipsec_proto_pkt_esn_antireplay4096,
15336 			&pkt_aes_128_gcm),
15337 		TEST_CASE_NAMED_ST(
15338 			"Tunnel header IPv4 decrement inner TTL",
15339 			ut_setup_security, ut_teardown,
15340 			test_ipsec_proto_ipv4_ttl_decrement),
15341 		TEST_CASE_NAMED_ST(
15342 			"Tunnel header IPv6 decrement inner hop limit",
15343 			ut_setup_security, ut_teardown,
15344 			test_ipsec_proto_ipv6_hop_limit_decrement),
15345 		TEST_CASES_END() /**< NULL terminate unit test array */
15346 	}
15347 };
15348 
15349 static struct unit_test_suite pdcp_proto_testsuite  = {
15350 	.suite_name = "PDCP Proto Unit Test Suite",
15351 	.setup = pdcp_proto_testsuite_setup,
15352 	.unit_test_cases = {
15353 		TEST_CASE_ST(ut_setup_security, ut_teardown,
15354 			test_PDCP_PROTO_all),
15355 		TEST_CASES_END() /**< NULL terminate unit test array */
15356 	}
15357 };
15358 
15359 #define ADD_UPLINK_TESTCASE(data)						\
15360 	TEST_CASE_NAMED_WITH_DATA(data.test_descr_uplink, ut_setup_security,	\
15361 	ut_teardown, test_docsis_proto_uplink, (const void *) &data),		\
15362 
15363 #define ADD_DOWNLINK_TESTCASE(data)						\
15364 	TEST_CASE_NAMED_WITH_DATA(data.test_descr_downlink, ut_setup_security,	\
15365 	ut_teardown, test_docsis_proto_downlink, (const void *) &data),		\
15366 
15367 static struct unit_test_suite docsis_proto_testsuite  = {
15368 	.suite_name = "DOCSIS Proto Unit Test Suite",
15369 	.setup = docsis_proto_testsuite_setup,
15370 	.unit_test_cases = {
15371 		/* Uplink */
15372 		ADD_UPLINK_TESTCASE(docsis_test_case_1)
15373 		ADD_UPLINK_TESTCASE(docsis_test_case_2)
15374 		ADD_UPLINK_TESTCASE(docsis_test_case_3)
15375 		ADD_UPLINK_TESTCASE(docsis_test_case_4)
15376 		ADD_UPLINK_TESTCASE(docsis_test_case_5)
15377 		ADD_UPLINK_TESTCASE(docsis_test_case_6)
15378 		ADD_UPLINK_TESTCASE(docsis_test_case_7)
15379 		ADD_UPLINK_TESTCASE(docsis_test_case_8)
15380 		ADD_UPLINK_TESTCASE(docsis_test_case_9)
15381 		ADD_UPLINK_TESTCASE(docsis_test_case_10)
15382 		ADD_UPLINK_TESTCASE(docsis_test_case_11)
15383 		ADD_UPLINK_TESTCASE(docsis_test_case_12)
15384 		ADD_UPLINK_TESTCASE(docsis_test_case_13)
15385 		ADD_UPLINK_TESTCASE(docsis_test_case_14)
15386 		ADD_UPLINK_TESTCASE(docsis_test_case_15)
15387 		ADD_UPLINK_TESTCASE(docsis_test_case_16)
15388 		ADD_UPLINK_TESTCASE(docsis_test_case_17)
15389 		ADD_UPLINK_TESTCASE(docsis_test_case_18)
15390 		ADD_UPLINK_TESTCASE(docsis_test_case_19)
15391 		ADD_UPLINK_TESTCASE(docsis_test_case_20)
15392 		ADD_UPLINK_TESTCASE(docsis_test_case_21)
15393 		ADD_UPLINK_TESTCASE(docsis_test_case_22)
15394 		ADD_UPLINK_TESTCASE(docsis_test_case_23)
15395 		ADD_UPLINK_TESTCASE(docsis_test_case_24)
15396 		ADD_UPLINK_TESTCASE(docsis_test_case_25)
15397 		ADD_UPLINK_TESTCASE(docsis_test_case_26)
15398 		/* Downlink */
15399 		ADD_DOWNLINK_TESTCASE(docsis_test_case_1)
15400 		ADD_DOWNLINK_TESTCASE(docsis_test_case_2)
15401 		ADD_DOWNLINK_TESTCASE(docsis_test_case_3)
15402 		ADD_DOWNLINK_TESTCASE(docsis_test_case_4)
15403 		ADD_DOWNLINK_TESTCASE(docsis_test_case_5)
15404 		ADD_DOWNLINK_TESTCASE(docsis_test_case_6)
15405 		ADD_DOWNLINK_TESTCASE(docsis_test_case_7)
15406 		ADD_DOWNLINK_TESTCASE(docsis_test_case_8)
15407 		ADD_DOWNLINK_TESTCASE(docsis_test_case_9)
15408 		ADD_DOWNLINK_TESTCASE(docsis_test_case_10)
15409 		ADD_DOWNLINK_TESTCASE(docsis_test_case_11)
15410 		ADD_DOWNLINK_TESTCASE(docsis_test_case_12)
15411 		ADD_DOWNLINK_TESTCASE(docsis_test_case_13)
15412 		ADD_DOWNLINK_TESTCASE(docsis_test_case_14)
15413 		ADD_DOWNLINK_TESTCASE(docsis_test_case_15)
15414 		ADD_DOWNLINK_TESTCASE(docsis_test_case_16)
15415 		ADD_DOWNLINK_TESTCASE(docsis_test_case_17)
15416 		ADD_DOWNLINK_TESTCASE(docsis_test_case_18)
15417 		ADD_DOWNLINK_TESTCASE(docsis_test_case_19)
15418 		ADD_DOWNLINK_TESTCASE(docsis_test_case_20)
15419 		ADD_DOWNLINK_TESTCASE(docsis_test_case_21)
15420 		ADD_DOWNLINK_TESTCASE(docsis_test_case_22)
15421 		ADD_DOWNLINK_TESTCASE(docsis_test_case_23)
15422 		ADD_DOWNLINK_TESTCASE(docsis_test_case_24)
15423 		ADD_DOWNLINK_TESTCASE(docsis_test_case_25)
15424 		ADD_DOWNLINK_TESTCASE(docsis_test_case_26)
15425 		TEST_CASES_END() /**< NULL terminate unit test array */
15426 	}
15427 };
15428 #endif
15429 
15430 static struct unit_test_suite cryptodev_gen_testsuite  = {
15431 	.suite_name = "Crypto General Unit Test Suite",
15432 	.setup = crypto_gen_testsuite_setup,
15433 	.unit_test_cases = {
15434 		TEST_CASE_ST(ut_setup, ut_teardown,
15435 				test_device_configure_invalid_dev_id),
15436 		TEST_CASE_ST(ut_setup, ut_teardown,
15437 				test_queue_pair_descriptor_setup),
15438 		TEST_CASE_ST(ut_setup, ut_teardown,
15439 				test_device_configure_invalid_queue_pair_ids),
15440 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
15441 		TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
15442 		TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
15443 		TEST_CASES_END() /**< NULL terminate unit test array */
15444 	}
15445 };
15446 
15447 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
15448 	.suite_name = "Negative HMAC SHA1 Unit Test Suite",
15449 	.setup = negative_hmac_sha1_testsuite_setup,
15450 	.unit_test_cases = {
15451 		/** Negative tests */
15452 		TEST_CASE_ST(ut_setup, ut_teardown,
15453 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
15454 		TEST_CASE_ST(ut_setup, ut_teardown,
15455 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
15456 		TEST_CASE_ST(ut_setup, ut_teardown,
15457 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
15458 		TEST_CASE_ST(ut_setup, ut_teardown,
15459 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
15460 
15461 		TEST_CASES_END() /**< NULL terminate unit test array */
15462 	}
15463 };
15464 
15465 static struct unit_test_suite cryptodev_multi_session_testsuite = {
15466 	.suite_name = "Multi Session Unit Test Suite",
15467 	.setup = multi_session_testsuite_setup,
15468 	.unit_test_cases = {
15469 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
15470 		TEST_CASE_ST(ut_setup, ut_teardown,
15471 				test_multi_session_random_usage),
15472 
15473 		TEST_CASES_END() /**< NULL terminate unit test array */
15474 	}
15475 };
15476 
15477 static struct unit_test_suite cryptodev_null_testsuite  = {
15478 	.suite_name = "NULL Test Suite",
15479 	.setup = null_testsuite_setup,
15480 	.unit_test_cases = {
15481 		TEST_CASE_ST(ut_setup, ut_teardown,
15482 			test_null_invalid_operation),
15483 		TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
15484 		TEST_CASES_END()
15485 	}
15486 };
15487 
15488 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
15489 	.suite_name = "AES CCM Authenticated Test Suite",
15490 	.setup = aes_ccm_auth_testsuite_setup,
15491 	.unit_test_cases = {
15492 		/** AES CCM Authenticated Encryption 128 bits key*/
15493 		TEST_CASE_ST(ut_setup, ut_teardown,
15494 			test_AES_CCM_authenticated_encryption_test_case_128_1),
15495 		TEST_CASE_ST(ut_setup, ut_teardown,
15496 			test_AES_CCM_authenticated_encryption_test_case_128_2),
15497 		TEST_CASE_ST(ut_setup, ut_teardown,
15498 			test_AES_CCM_authenticated_encryption_test_case_128_3),
15499 
15500 		/** AES CCM Authenticated Decryption 128 bits key*/
15501 		TEST_CASE_ST(ut_setup, ut_teardown,
15502 			test_AES_CCM_authenticated_decryption_test_case_128_1),
15503 		TEST_CASE_ST(ut_setup, ut_teardown,
15504 			test_AES_CCM_authenticated_decryption_test_case_128_2),
15505 		TEST_CASE_ST(ut_setup, ut_teardown,
15506 			test_AES_CCM_authenticated_decryption_test_case_128_3),
15507 
15508 		/** AES CCM Authenticated Encryption 192 bits key */
15509 		TEST_CASE_ST(ut_setup, ut_teardown,
15510 			test_AES_CCM_authenticated_encryption_test_case_192_1),
15511 		TEST_CASE_ST(ut_setup, ut_teardown,
15512 			test_AES_CCM_authenticated_encryption_test_case_192_2),
15513 		TEST_CASE_ST(ut_setup, ut_teardown,
15514 			test_AES_CCM_authenticated_encryption_test_case_192_3),
15515 
15516 		/** AES CCM Authenticated Decryption 192 bits key*/
15517 		TEST_CASE_ST(ut_setup, ut_teardown,
15518 			test_AES_CCM_authenticated_decryption_test_case_192_1),
15519 		TEST_CASE_ST(ut_setup, ut_teardown,
15520 			test_AES_CCM_authenticated_decryption_test_case_192_2),
15521 		TEST_CASE_ST(ut_setup, ut_teardown,
15522 			test_AES_CCM_authenticated_decryption_test_case_192_3),
15523 
15524 		/** AES CCM Authenticated Encryption 256 bits key */
15525 		TEST_CASE_ST(ut_setup, ut_teardown,
15526 			test_AES_CCM_authenticated_encryption_test_case_256_1),
15527 		TEST_CASE_ST(ut_setup, ut_teardown,
15528 			test_AES_CCM_authenticated_encryption_test_case_256_2),
15529 		TEST_CASE_ST(ut_setup, ut_teardown,
15530 			test_AES_CCM_authenticated_encryption_test_case_256_3),
15531 
15532 		/** AES CCM Authenticated Decryption 256 bits key*/
15533 		TEST_CASE_ST(ut_setup, ut_teardown,
15534 			test_AES_CCM_authenticated_decryption_test_case_256_1),
15535 		TEST_CASE_ST(ut_setup, ut_teardown,
15536 			test_AES_CCM_authenticated_decryption_test_case_256_2),
15537 		TEST_CASE_ST(ut_setup, ut_teardown,
15538 			test_AES_CCM_authenticated_decryption_test_case_256_3),
15539 		TEST_CASES_END()
15540 	}
15541 };
15542 
15543 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
15544 	.suite_name = "AES GCM Authenticated Test Suite",
15545 	.setup = aes_gcm_auth_testsuite_setup,
15546 	.unit_test_cases = {
15547 		/** AES GCM Authenticated Encryption */
15548 		TEST_CASE_ST(ut_setup, ut_teardown,
15549 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
15550 		TEST_CASE_ST(ut_setup, ut_teardown,
15551 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
15552 		TEST_CASE_ST(ut_setup, ut_teardown,
15553 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
15554 		TEST_CASE_ST(ut_setup, ut_teardown,
15555 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
15556 		TEST_CASE_ST(ut_setup, ut_teardown,
15557 			test_AES_GCM_authenticated_encryption_test_case_1),
15558 		TEST_CASE_ST(ut_setup, ut_teardown,
15559 			test_AES_GCM_authenticated_encryption_test_case_2),
15560 		TEST_CASE_ST(ut_setup, ut_teardown,
15561 			test_AES_GCM_authenticated_encryption_test_case_3),
15562 		TEST_CASE_ST(ut_setup, ut_teardown,
15563 			test_AES_GCM_authenticated_encryption_test_case_4),
15564 		TEST_CASE_ST(ut_setup, ut_teardown,
15565 			test_AES_GCM_authenticated_encryption_test_case_5),
15566 		TEST_CASE_ST(ut_setup, ut_teardown,
15567 			test_AES_GCM_authenticated_encryption_test_case_6),
15568 		TEST_CASE_ST(ut_setup, ut_teardown,
15569 			test_AES_GCM_authenticated_encryption_test_case_7),
15570 		TEST_CASE_ST(ut_setup, ut_teardown,
15571 			test_AES_GCM_authenticated_encryption_test_case_8),
15572 		TEST_CASE_ST(ut_setup, ut_teardown,
15573 			test_AES_GCM_J0_authenticated_encryption_test_case_1),
15574 
15575 		/** AES GCM Authenticated Decryption */
15576 		TEST_CASE_ST(ut_setup, ut_teardown,
15577 			test_AES_GCM_authenticated_decryption_test_case_1),
15578 		TEST_CASE_ST(ut_setup, ut_teardown,
15579 			test_AES_GCM_authenticated_decryption_test_case_2),
15580 		TEST_CASE_ST(ut_setup, ut_teardown,
15581 			test_AES_GCM_authenticated_decryption_test_case_3),
15582 		TEST_CASE_ST(ut_setup, ut_teardown,
15583 			test_AES_GCM_authenticated_decryption_test_case_4),
15584 		TEST_CASE_ST(ut_setup, ut_teardown,
15585 			test_AES_GCM_authenticated_decryption_test_case_5),
15586 		TEST_CASE_ST(ut_setup, ut_teardown,
15587 			test_AES_GCM_authenticated_decryption_test_case_6),
15588 		TEST_CASE_ST(ut_setup, ut_teardown,
15589 			test_AES_GCM_authenticated_decryption_test_case_7),
15590 		TEST_CASE_ST(ut_setup, ut_teardown,
15591 			test_AES_GCM_authenticated_decryption_test_case_8),
15592 		TEST_CASE_ST(ut_setup, ut_teardown,
15593 			test_AES_GCM_J0_authenticated_decryption_test_case_1),
15594 
15595 		/** AES GCM Authenticated Encryption 192 bits key */
15596 		TEST_CASE_ST(ut_setup, ut_teardown,
15597 			test_AES_GCM_auth_encryption_test_case_192_1),
15598 		TEST_CASE_ST(ut_setup, ut_teardown,
15599 			test_AES_GCM_auth_encryption_test_case_192_2),
15600 		TEST_CASE_ST(ut_setup, ut_teardown,
15601 			test_AES_GCM_auth_encryption_test_case_192_3),
15602 		TEST_CASE_ST(ut_setup, ut_teardown,
15603 			test_AES_GCM_auth_encryption_test_case_192_4),
15604 		TEST_CASE_ST(ut_setup, ut_teardown,
15605 			test_AES_GCM_auth_encryption_test_case_192_5),
15606 		TEST_CASE_ST(ut_setup, ut_teardown,
15607 			test_AES_GCM_auth_encryption_test_case_192_6),
15608 		TEST_CASE_ST(ut_setup, ut_teardown,
15609 			test_AES_GCM_auth_encryption_test_case_192_7),
15610 
15611 		/** AES GCM Authenticated Decryption 192 bits key */
15612 		TEST_CASE_ST(ut_setup, ut_teardown,
15613 			test_AES_GCM_auth_decryption_test_case_192_1),
15614 		TEST_CASE_ST(ut_setup, ut_teardown,
15615 			test_AES_GCM_auth_decryption_test_case_192_2),
15616 		TEST_CASE_ST(ut_setup, ut_teardown,
15617 			test_AES_GCM_auth_decryption_test_case_192_3),
15618 		TEST_CASE_ST(ut_setup, ut_teardown,
15619 			test_AES_GCM_auth_decryption_test_case_192_4),
15620 		TEST_CASE_ST(ut_setup, ut_teardown,
15621 			test_AES_GCM_auth_decryption_test_case_192_5),
15622 		TEST_CASE_ST(ut_setup, ut_teardown,
15623 			test_AES_GCM_auth_decryption_test_case_192_6),
15624 		TEST_CASE_ST(ut_setup, ut_teardown,
15625 			test_AES_GCM_auth_decryption_test_case_192_7),
15626 
15627 		/** AES GCM Authenticated Encryption 256 bits key */
15628 		TEST_CASE_ST(ut_setup, ut_teardown,
15629 			test_AES_GCM_auth_encryption_test_case_256_1),
15630 		TEST_CASE_ST(ut_setup, ut_teardown,
15631 			test_AES_GCM_auth_encryption_test_case_256_2),
15632 		TEST_CASE_ST(ut_setup, ut_teardown,
15633 			test_AES_GCM_auth_encryption_test_case_256_3),
15634 		TEST_CASE_ST(ut_setup, ut_teardown,
15635 			test_AES_GCM_auth_encryption_test_case_256_4),
15636 		TEST_CASE_ST(ut_setup, ut_teardown,
15637 			test_AES_GCM_auth_encryption_test_case_256_5),
15638 		TEST_CASE_ST(ut_setup, ut_teardown,
15639 			test_AES_GCM_auth_encryption_test_case_256_6),
15640 		TEST_CASE_ST(ut_setup, ut_teardown,
15641 			test_AES_GCM_auth_encryption_test_case_256_7),
15642 
15643 		/** AES GCM Authenticated Decryption 256 bits key */
15644 		TEST_CASE_ST(ut_setup, ut_teardown,
15645 			test_AES_GCM_auth_decryption_test_case_256_1),
15646 		TEST_CASE_ST(ut_setup, ut_teardown,
15647 			test_AES_GCM_auth_decryption_test_case_256_2),
15648 		TEST_CASE_ST(ut_setup, ut_teardown,
15649 			test_AES_GCM_auth_decryption_test_case_256_3),
15650 		TEST_CASE_ST(ut_setup, ut_teardown,
15651 			test_AES_GCM_auth_decryption_test_case_256_4),
15652 		TEST_CASE_ST(ut_setup, ut_teardown,
15653 			test_AES_GCM_auth_decryption_test_case_256_5),
15654 		TEST_CASE_ST(ut_setup, ut_teardown,
15655 			test_AES_GCM_auth_decryption_test_case_256_6),
15656 		TEST_CASE_ST(ut_setup, ut_teardown,
15657 			test_AES_GCM_auth_decryption_test_case_256_7),
15658 
15659 		/** AES GCM Authenticated Encryption big aad size */
15660 		TEST_CASE_ST(ut_setup, ut_teardown,
15661 			test_AES_GCM_auth_encryption_test_case_aad_1),
15662 		TEST_CASE_ST(ut_setup, ut_teardown,
15663 			test_AES_GCM_auth_encryption_test_case_aad_2),
15664 
15665 		/** AES GCM Authenticated Decryption big aad size */
15666 		TEST_CASE_ST(ut_setup, ut_teardown,
15667 			test_AES_GCM_auth_decryption_test_case_aad_1),
15668 		TEST_CASE_ST(ut_setup, ut_teardown,
15669 			test_AES_GCM_auth_decryption_test_case_aad_2),
15670 
15671 		/** Out of place tests */
15672 		TEST_CASE_ST(ut_setup, ut_teardown,
15673 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
15674 		TEST_CASE_ST(ut_setup, ut_teardown,
15675 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
15676 
15677 		/** Session-less tests */
15678 		TEST_CASE_ST(ut_setup, ut_teardown,
15679 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
15680 		TEST_CASE_ST(ut_setup, ut_teardown,
15681 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
15682 
15683 		TEST_CASES_END()
15684 	}
15685 };
15686 
15687 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
15688 	.suite_name = "AES GMAC Authentication Test Suite",
15689 	.setup = aes_gmac_auth_testsuite_setup,
15690 	.unit_test_cases = {
15691 		TEST_CASE_ST(ut_setup, ut_teardown,
15692 			test_AES_GMAC_authentication_test_case_1),
15693 		TEST_CASE_ST(ut_setup, ut_teardown,
15694 			test_AES_GMAC_authentication_verify_test_case_1),
15695 		TEST_CASE_ST(ut_setup, ut_teardown,
15696 			test_AES_GMAC_authentication_test_case_2),
15697 		TEST_CASE_ST(ut_setup, ut_teardown,
15698 			test_AES_GMAC_authentication_verify_test_case_2),
15699 		TEST_CASE_ST(ut_setup, ut_teardown,
15700 			test_AES_GMAC_authentication_test_case_3),
15701 		TEST_CASE_ST(ut_setup, ut_teardown,
15702 			test_AES_GMAC_authentication_verify_test_case_3),
15703 		TEST_CASE_ST(ut_setup, ut_teardown,
15704 			test_AES_GMAC_authentication_test_case_4),
15705 		TEST_CASE_ST(ut_setup, ut_teardown,
15706 			test_AES_GMAC_authentication_verify_test_case_4),
15707 		TEST_CASE_ST(ut_setup, ut_teardown,
15708 			test_AES_GMAC_authentication_SGL_40B),
15709 		TEST_CASE_ST(ut_setup, ut_teardown,
15710 			test_AES_GMAC_authentication_SGL_80B),
15711 		TEST_CASE_ST(ut_setup, ut_teardown,
15712 			test_AES_GMAC_authentication_SGL_2048B),
15713 		TEST_CASE_ST(ut_setup, ut_teardown,
15714 			test_AES_GMAC_authentication_SGL_2047B),
15715 
15716 		TEST_CASES_END()
15717 	}
15718 };
15719 
15720 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
15721 	.suite_name = "Chacha20-Poly1305 Test Suite",
15722 	.setup = chacha20_poly1305_testsuite_setup,
15723 	.unit_test_cases = {
15724 		TEST_CASE_ST(ut_setup, ut_teardown,
15725 			test_chacha20_poly1305_encrypt_test_case_rfc8439),
15726 		TEST_CASE_ST(ut_setup, ut_teardown,
15727 			test_chacha20_poly1305_decrypt_test_case_rfc8439),
15728 		TEST_CASE_ST(ut_setup, ut_teardown,
15729 			test_chacha20_poly1305_encrypt_SGL_out_of_place),
15730 		TEST_CASES_END()
15731 	}
15732 };
15733 
15734 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
15735 	.suite_name = "SNOW 3G Test Suite",
15736 	.setup = snow3g_testsuite_setup,
15737 	.unit_test_cases = {
15738 		/** SNOW 3G encrypt only (UEA2) */
15739 		TEST_CASE_ST(ut_setup, ut_teardown,
15740 			test_snow3g_encryption_test_case_1),
15741 		TEST_CASE_ST(ut_setup, ut_teardown,
15742 			test_snow3g_encryption_test_case_2),
15743 		TEST_CASE_ST(ut_setup, ut_teardown,
15744 			test_snow3g_encryption_test_case_3),
15745 		TEST_CASE_ST(ut_setup, ut_teardown,
15746 			test_snow3g_encryption_test_case_4),
15747 		TEST_CASE_ST(ut_setup, ut_teardown,
15748 			test_snow3g_encryption_test_case_5),
15749 
15750 		TEST_CASE_ST(ut_setup, ut_teardown,
15751 			test_snow3g_encryption_test_case_1_oop),
15752 		TEST_CASE_ST(ut_setup, ut_teardown,
15753 			test_snow3g_encryption_test_case_1_oop_sgl),
15754 		TEST_CASE_ST(ut_setup, ut_teardown,
15755 			test_snow3g_encryption_test_case_1_offset_oop),
15756 		TEST_CASE_ST(ut_setup, ut_teardown,
15757 			test_snow3g_decryption_test_case_1_oop),
15758 
15759 		/** SNOW 3G generate auth, then encrypt (UEA2) */
15760 		TEST_CASE_ST(ut_setup, ut_teardown,
15761 			test_snow3g_auth_cipher_test_case_1),
15762 		TEST_CASE_ST(ut_setup, ut_teardown,
15763 			test_snow3g_auth_cipher_test_case_2),
15764 		TEST_CASE_ST(ut_setup, ut_teardown,
15765 			test_snow3g_auth_cipher_test_case_2_oop),
15766 		TEST_CASE_ST(ut_setup, ut_teardown,
15767 			test_snow3g_auth_cipher_part_digest_enc),
15768 		TEST_CASE_ST(ut_setup, ut_teardown,
15769 			test_snow3g_auth_cipher_part_digest_enc_oop),
15770 		TEST_CASE_ST(ut_setup, ut_teardown,
15771 			test_snow3g_auth_cipher_test_case_3_sgl),
15772 		TEST_CASE_ST(ut_setup, ut_teardown,
15773 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
15774 		TEST_CASE_ST(ut_setup, ut_teardown,
15775 			test_snow3g_auth_cipher_part_digest_enc_sgl),
15776 		TEST_CASE_ST(ut_setup, ut_teardown,
15777 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
15778 
15779 		/** SNOW 3G decrypt (UEA2), then verify auth */
15780 		TEST_CASE_ST(ut_setup, ut_teardown,
15781 			test_snow3g_auth_cipher_verify_test_case_1),
15782 		TEST_CASE_ST(ut_setup, ut_teardown,
15783 			test_snow3g_auth_cipher_verify_test_case_2),
15784 		TEST_CASE_ST(ut_setup, ut_teardown,
15785 			test_snow3g_auth_cipher_verify_test_case_2_oop),
15786 		TEST_CASE_ST(ut_setup, ut_teardown,
15787 			test_snow3g_auth_cipher_verify_part_digest_enc),
15788 		TEST_CASE_ST(ut_setup, ut_teardown,
15789 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
15790 		TEST_CASE_ST(ut_setup, ut_teardown,
15791 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
15792 		TEST_CASE_ST(ut_setup, ut_teardown,
15793 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
15794 		TEST_CASE_ST(ut_setup, ut_teardown,
15795 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
15796 		TEST_CASE_ST(ut_setup, ut_teardown,
15797 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
15798 
15799 		/** SNOW 3G decrypt only (UEA2) */
15800 		TEST_CASE_ST(ut_setup, ut_teardown,
15801 			test_snow3g_decryption_test_case_1),
15802 		TEST_CASE_ST(ut_setup, ut_teardown,
15803 			test_snow3g_decryption_test_case_2),
15804 		TEST_CASE_ST(ut_setup, ut_teardown,
15805 			test_snow3g_decryption_test_case_3),
15806 		TEST_CASE_ST(ut_setup, ut_teardown,
15807 			test_snow3g_decryption_test_case_4),
15808 		TEST_CASE_ST(ut_setup, ut_teardown,
15809 			test_snow3g_decryption_test_case_5),
15810 		TEST_CASE_ST(ut_setup, ut_teardown,
15811 			test_snow3g_decryption_with_digest_test_case_1),
15812 		TEST_CASE_ST(ut_setup, ut_teardown,
15813 			test_snow3g_hash_generate_test_case_1),
15814 		TEST_CASE_ST(ut_setup, ut_teardown,
15815 			test_snow3g_hash_generate_test_case_2),
15816 		TEST_CASE_ST(ut_setup, ut_teardown,
15817 			test_snow3g_hash_generate_test_case_3),
15818 
15819 		/* Tests with buffers which length is not byte-aligned */
15820 		TEST_CASE_ST(ut_setup, ut_teardown,
15821 			test_snow3g_hash_generate_test_case_4),
15822 		TEST_CASE_ST(ut_setup, ut_teardown,
15823 			test_snow3g_hash_generate_test_case_5),
15824 		TEST_CASE_ST(ut_setup, ut_teardown,
15825 			test_snow3g_hash_generate_test_case_6),
15826 		TEST_CASE_ST(ut_setup, ut_teardown,
15827 			test_snow3g_hash_verify_test_case_1),
15828 		TEST_CASE_ST(ut_setup, ut_teardown,
15829 			test_snow3g_hash_verify_test_case_2),
15830 		TEST_CASE_ST(ut_setup, ut_teardown,
15831 			test_snow3g_hash_verify_test_case_3),
15832 
15833 		/* Tests with buffers which length is not byte-aligned */
15834 		TEST_CASE_ST(ut_setup, ut_teardown,
15835 			test_snow3g_hash_verify_test_case_4),
15836 		TEST_CASE_ST(ut_setup, ut_teardown,
15837 			test_snow3g_hash_verify_test_case_5),
15838 		TEST_CASE_ST(ut_setup, ut_teardown,
15839 			test_snow3g_hash_verify_test_case_6),
15840 		TEST_CASE_ST(ut_setup, ut_teardown,
15841 			test_snow3g_cipher_auth_test_case_1),
15842 		TEST_CASE_ST(ut_setup, ut_teardown,
15843 			test_snow3g_auth_cipher_with_digest_test_case_1),
15844 		TEST_CASES_END()
15845 	}
15846 };
15847 
15848 static struct unit_test_suite cryptodev_zuc_testsuite  = {
15849 	.suite_name = "ZUC Test Suite",
15850 	.setup = zuc_testsuite_setup,
15851 	.unit_test_cases = {
15852 		/** ZUC encrypt only (EEA3) */
15853 		TEST_CASE_ST(ut_setup, ut_teardown,
15854 			test_zuc_encryption_test_case_1),
15855 		TEST_CASE_ST(ut_setup, ut_teardown,
15856 			test_zuc_encryption_test_case_2),
15857 		TEST_CASE_ST(ut_setup, ut_teardown,
15858 			test_zuc_encryption_test_case_3),
15859 		TEST_CASE_ST(ut_setup, ut_teardown,
15860 			test_zuc_encryption_test_case_4),
15861 		TEST_CASE_ST(ut_setup, ut_teardown,
15862 			test_zuc_encryption_test_case_5),
15863 		TEST_CASE_ST(ut_setup, ut_teardown,
15864 			test_zuc_encryption_test_case_6_sgl),
15865 
15866 		/** ZUC authenticate (EIA3) */
15867 		TEST_CASE_ST(ut_setup, ut_teardown,
15868 			test_zuc_hash_generate_test_case_1),
15869 		TEST_CASE_ST(ut_setup, ut_teardown,
15870 			test_zuc_hash_generate_test_case_2),
15871 		TEST_CASE_ST(ut_setup, ut_teardown,
15872 			test_zuc_hash_generate_test_case_3),
15873 		TEST_CASE_ST(ut_setup, ut_teardown,
15874 			test_zuc_hash_generate_test_case_4),
15875 		TEST_CASE_ST(ut_setup, ut_teardown,
15876 			test_zuc_hash_generate_test_case_5),
15877 		TEST_CASE_ST(ut_setup, ut_teardown,
15878 			test_zuc_hash_generate_test_case_6),
15879 		TEST_CASE_ST(ut_setup, ut_teardown,
15880 			test_zuc_hash_generate_test_case_7),
15881 		TEST_CASE_ST(ut_setup, ut_teardown,
15882 			test_zuc_hash_generate_test_case_8),
15883 		TEST_CASE_ST(ut_setup, ut_teardown,
15884 			test_zuc_hash_generate_test_case_9),
15885 		TEST_CASE_ST(ut_setup, ut_teardown,
15886 			test_zuc_hash_generate_test_case_10),
15887 		TEST_CASE_ST(ut_setup, ut_teardown,
15888 			test_zuc_hash_generate_test_case_11),
15889 
15890 
15891 		/** ZUC alg-chain (EEA3/EIA3) */
15892 		TEST_CASE_ST(ut_setup, ut_teardown,
15893 			test_zuc_cipher_auth_test_case_1),
15894 		TEST_CASE_ST(ut_setup, ut_teardown,
15895 			test_zuc_cipher_auth_test_case_2),
15896 
15897 		/** ZUC generate auth, then encrypt (EEA3) */
15898 		TEST_CASE_ST(ut_setup, ut_teardown,
15899 			test_zuc_auth_cipher_test_case_1),
15900 		TEST_CASE_ST(ut_setup, ut_teardown,
15901 			test_zuc_auth_cipher_test_case_1_oop),
15902 		TEST_CASE_ST(ut_setup, ut_teardown,
15903 			test_zuc_auth_cipher_test_case_1_sgl),
15904 		TEST_CASE_ST(ut_setup, ut_teardown,
15905 			test_zuc_auth_cipher_test_case_1_oop_sgl),
15906 
15907 		/** ZUC decrypt (EEA3), then verify auth */
15908 		TEST_CASE_ST(ut_setup, ut_teardown,
15909 			test_zuc_auth_cipher_verify_test_case_1),
15910 		TEST_CASE_ST(ut_setup, ut_teardown,
15911 			test_zuc_auth_cipher_verify_test_case_1_oop),
15912 		TEST_CASE_ST(ut_setup, ut_teardown,
15913 			test_zuc_auth_cipher_verify_test_case_1_sgl),
15914 		TEST_CASE_ST(ut_setup, ut_teardown,
15915 			test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
15916 
15917 		/** ZUC-256 encrypt only **/
15918 		TEST_CASE_ST(ut_setup, ut_teardown,
15919 			test_zuc256_encryption_test_case_1),
15920 		TEST_CASE_ST(ut_setup, ut_teardown,
15921 			test_zuc256_encryption_test_case_2),
15922 
15923 		/** ZUC-256 authentication only **/
15924 		TEST_CASE_ST(ut_setup, ut_teardown,
15925 			test_zuc256_authentication_test_case_1),
15926 		TEST_CASE_ST(ut_setup, ut_teardown,
15927 			test_zuc256_authentication_test_case_2),
15928 
15929 		TEST_CASES_END()
15930 	}
15931 };
15932 
15933 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
15934 	.suite_name = "HMAC_MD5 Authentication Test Suite",
15935 	.setup = hmac_md5_auth_testsuite_setup,
15936 	.unit_test_cases = {
15937 		TEST_CASE_ST(ut_setup, ut_teardown,
15938 			test_MD5_HMAC_generate_case_1),
15939 		TEST_CASE_ST(ut_setup, ut_teardown,
15940 			test_MD5_HMAC_verify_case_1),
15941 		TEST_CASE_ST(ut_setup, ut_teardown,
15942 			test_MD5_HMAC_generate_case_2),
15943 		TEST_CASE_ST(ut_setup, ut_teardown,
15944 			test_MD5_HMAC_verify_case_2),
15945 		TEST_CASES_END()
15946 	}
15947 };
15948 
15949 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
15950 	.suite_name = "Kasumi Test Suite",
15951 	.setup = kasumi_testsuite_setup,
15952 	.unit_test_cases = {
15953 		/** KASUMI hash only (UIA1) */
15954 		TEST_CASE_ST(ut_setup, ut_teardown,
15955 			test_kasumi_hash_generate_test_case_1),
15956 		TEST_CASE_ST(ut_setup, ut_teardown,
15957 			test_kasumi_hash_generate_test_case_2),
15958 		TEST_CASE_ST(ut_setup, ut_teardown,
15959 			test_kasumi_hash_generate_test_case_3),
15960 		TEST_CASE_ST(ut_setup, ut_teardown,
15961 			test_kasumi_hash_generate_test_case_4),
15962 		TEST_CASE_ST(ut_setup, ut_teardown,
15963 			test_kasumi_hash_generate_test_case_5),
15964 		TEST_CASE_ST(ut_setup, ut_teardown,
15965 			test_kasumi_hash_generate_test_case_6),
15966 
15967 		TEST_CASE_ST(ut_setup, ut_teardown,
15968 			test_kasumi_hash_verify_test_case_1),
15969 		TEST_CASE_ST(ut_setup, ut_teardown,
15970 			test_kasumi_hash_verify_test_case_2),
15971 		TEST_CASE_ST(ut_setup, ut_teardown,
15972 			test_kasumi_hash_verify_test_case_3),
15973 		TEST_CASE_ST(ut_setup, ut_teardown,
15974 			test_kasumi_hash_verify_test_case_4),
15975 		TEST_CASE_ST(ut_setup, ut_teardown,
15976 			test_kasumi_hash_verify_test_case_5),
15977 
15978 		/** KASUMI encrypt only (UEA1) */
15979 		TEST_CASE_ST(ut_setup, ut_teardown,
15980 			test_kasumi_encryption_test_case_1),
15981 		TEST_CASE_ST(ut_setup, ut_teardown,
15982 			test_kasumi_encryption_test_case_1_sgl),
15983 		TEST_CASE_ST(ut_setup, ut_teardown,
15984 			test_kasumi_encryption_test_case_1_oop),
15985 		TEST_CASE_ST(ut_setup, ut_teardown,
15986 			test_kasumi_encryption_test_case_1_oop_sgl),
15987 		TEST_CASE_ST(ut_setup, ut_teardown,
15988 			test_kasumi_encryption_test_case_2),
15989 		TEST_CASE_ST(ut_setup, ut_teardown,
15990 			test_kasumi_encryption_test_case_3),
15991 		TEST_CASE_ST(ut_setup, ut_teardown,
15992 			test_kasumi_encryption_test_case_4),
15993 		TEST_CASE_ST(ut_setup, ut_teardown,
15994 			test_kasumi_encryption_test_case_5),
15995 
15996 		/** KASUMI decrypt only (UEA1) */
15997 		TEST_CASE_ST(ut_setup, ut_teardown,
15998 			test_kasumi_decryption_test_case_1),
15999 		TEST_CASE_ST(ut_setup, ut_teardown,
16000 			test_kasumi_decryption_test_case_2),
16001 		TEST_CASE_ST(ut_setup, ut_teardown,
16002 			test_kasumi_decryption_test_case_3),
16003 		TEST_CASE_ST(ut_setup, ut_teardown,
16004 			test_kasumi_decryption_test_case_4),
16005 		TEST_CASE_ST(ut_setup, ut_teardown,
16006 			test_kasumi_decryption_test_case_5),
16007 		TEST_CASE_ST(ut_setup, ut_teardown,
16008 			test_kasumi_decryption_test_case_1_oop),
16009 		TEST_CASE_ST(ut_setup, ut_teardown,
16010 			test_kasumi_cipher_auth_test_case_1),
16011 
16012 		/** KASUMI generate auth, then encrypt (F8) */
16013 		TEST_CASE_ST(ut_setup, ut_teardown,
16014 			test_kasumi_auth_cipher_test_case_1),
16015 		TEST_CASE_ST(ut_setup, ut_teardown,
16016 			test_kasumi_auth_cipher_test_case_2),
16017 		TEST_CASE_ST(ut_setup, ut_teardown,
16018 			test_kasumi_auth_cipher_test_case_2_oop),
16019 		TEST_CASE_ST(ut_setup, ut_teardown,
16020 			test_kasumi_auth_cipher_test_case_2_sgl),
16021 		TEST_CASE_ST(ut_setup, ut_teardown,
16022 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
16023 
16024 		/** KASUMI decrypt (F8), then verify auth */
16025 		TEST_CASE_ST(ut_setup, ut_teardown,
16026 			test_kasumi_auth_cipher_verify_test_case_1),
16027 		TEST_CASE_ST(ut_setup, ut_teardown,
16028 			test_kasumi_auth_cipher_verify_test_case_2),
16029 		TEST_CASE_ST(ut_setup, ut_teardown,
16030 			test_kasumi_auth_cipher_verify_test_case_2_oop),
16031 		TEST_CASE_ST(ut_setup, ut_teardown,
16032 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
16033 		TEST_CASE_ST(ut_setup, ut_teardown,
16034 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
16035 
16036 		TEST_CASES_END()
16037 	}
16038 };
16039 
16040 static struct unit_test_suite cryptodev_esn_testsuite  = {
16041 	.suite_name = "ESN Test Suite",
16042 	.setup = esn_testsuite_setup,
16043 	.unit_test_cases = {
16044 		TEST_CASE_ST(ut_setup, ut_teardown,
16045 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
16046 		TEST_CASE_ST(ut_setup, ut_teardown,
16047 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
16048 		TEST_CASES_END()
16049 	}
16050 };
16051 
16052 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
16053 	.suite_name = "Negative AES GCM Test Suite",
16054 	.setup = negative_aes_gcm_testsuite_setup,
16055 	.unit_test_cases = {
16056 		TEST_CASE_ST(ut_setup, ut_teardown,
16057 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
16058 		TEST_CASE_ST(ut_setup, ut_teardown,
16059 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
16060 		TEST_CASE_ST(ut_setup, ut_teardown,
16061 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
16062 		TEST_CASE_ST(ut_setup, ut_teardown,
16063 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
16064 		TEST_CASE_ST(ut_setup, ut_teardown,
16065 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
16066 		TEST_CASE_ST(ut_setup, ut_teardown,
16067 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
16068 		TEST_CASE_ST(ut_setup, ut_teardown,
16069 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
16070 		TEST_CASE_ST(ut_setup, ut_teardown,
16071 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
16072 		TEST_CASE_ST(ut_setup, ut_teardown,
16073 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
16074 		TEST_CASE_ST(ut_setup, ut_teardown,
16075 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
16076 		TEST_CASE_ST(ut_setup, ut_teardown,
16077 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
16078 		TEST_CASE_ST(ut_setup, ut_teardown,
16079 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
16080 
16081 		TEST_CASES_END()
16082 	}
16083 };
16084 
16085 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
16086 	.suite_name = "Negative AES GMAC Test Suite",
16087 	.setup = negative_aes_gmac_testsuite_setup,
16088 	.unit_test_cases = {
16089 		TEST_CASE_ST(ut_setup, ut_teardown,
16090 			authentication_verify_AES128_GMAC_fail_data_corrupt),
16091 		TEST_CASE_ST(ut_setup, ut_teardown,
16092 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
16093 
16094 		TEST_CASES_END()
16095 	}
16096 };
16097 
16098 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
16099 	.suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
16100 	.setup = mixed_cipher_hash_testsuite_setup,
16101 	.unit_test_cases = {
16102 		/** AUTH AES CMAC + CIPHER AES CTR */
16103 		TEST_CASE_ST(ut_setup, ut_teardown,
16104 			test_aes_cmac_aes_ctr_digest_enc_test_case_1),
16105 		TEST_CASE_ST(ut_setup, ut_teardown,
16106 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
16107 		TEST_CASE_ST(ut_setup, ut_teardown,
16108 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
16109 		TEST_CASE_ST(ut_setup, ut_teardown,
16110 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
16111 		TEST_CASE_ST(ut_setup, ut_teardown,
16112 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
16113 		TEST_CASE_ST(ut_setup, ut_teardown,
16114 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
16115 		TEST_CASE_ST(ut_setup, ut_teardown,
16116 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
16117 		TEST_CASE_ST(ut_setup, ut_teardown,
16118 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
16119 
16120 		/** AUTH ZUC + CIPHER SNOW3G */
16121 		TEST_CASE_ST(ut_setup, ut_teardown,
16122 			test_auth_zuc_cipher_snow_test_case_1),
16123 		TEST_CASE_ST(ut_setup, ut_teardown,
16124 			test_verify_auth_zuc_cipher_snow_test_case_1),
16125 		/** AUTH AES CMAC + CIPHER SNOW3G */
16126 		TEST_CASE_ST(ut_setup, ut_teardown,
16127 			test_auth_aes_cmac_cipher_snow_test_case_1),
16128 		TEST_CASE_ST(ut_setup, ut_teardown,
16129 			test_verify_auth_aes_cmac_cipher_snow_test_case_1),
16130 		/** AUTH ZUC + CIPHER AES CTR */
16131 		TEST_CASE_ST(ut_setup, ut_teardown,
16132 			test_auth_zuc_cipher_aes_ctr_test_case_1),
16133 		TEST_CASE_ST(ut_setup, ut_teardown,
16134 			test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
16135 		/** AUTH SNOW3G + CIPHER AES CTR */
16136 		TEST_CASE_ST(ut_setup, ut_teardown,
16137 			test_auth_snow_cipher_aes_ctr_test_case_1),
16138 		TEST_CASE_ST(ut_setup, ut_teardown,
16139 			test_verify_auth_snow_cipher_aes_ctr_test_case_1),
16140 		/** AUTH SNOW3G + CIPHER ZUC */
16141 		TEST_CASE_ST(ut_setup, ut_teardown,
16142 			test_auth_snow_cipher_zuc_test_case_1),
16143 		TEST_CASE_ST(ut_setup, ut_teardown,
16144 			test_verify_auth_snow_cipher_zuc_test_case_1),
16145 		/** AUTH AES CMAC + CIPHER ZUC */
16146 		TEST_CASE_ST(ut_setup, ut_teardown,
16147 			test_auth_aes_cmac_cipher_zuc_test_case_1),
16148 		TEST_CASE_ST(ut_setup, ut_teardown,
16149 			test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
16150 
16151 		/** AUTH NULL + CIPHER SNOW3G */
16152 		TEST_CASE_ST(ut_setup, ut_teardown,
16153 			test_auth_null_cipher_snow_test_case_1),
16154 		TEST_CASE_ST(ut_setup, ut_teardown,
16155 			test_verify_auth_null_cipher_snow_test_case_1),
16156 		/** AUTH NULL + CIPHER ZUC */
16157 		TEST_CASE_ST(ut_setup, ut_teardown,
16158 			test_auth_null_cipher_zuc_test_case_1),
16159 		TEST_CASE_ST(ut_setup, ut_teardown,
16160 			test_verify_auth_null_cipher_zuc_test_case_1),
16161 		/** AUTH SNOW3G + CIPHER NULL */
16162 		TEST_CASE_ST(ut_setup, ut_teardown,
16163 			test_auth_snow_cipher_null_test_case_1),
16164 		TEST_CASE_ST(ut_setup, ut_teardown,
16165 			test_verify_auth_snow_cipher_null_test_case_1),
16166 		/** AUTH ZUC + CIPHER NULL */
16167 		TEST_CASE_ST(ut_setup, ut_teardown,
16168 			test_auth_zuc_cipher_null_test_case_1),
16169 		TEST_CASE_ST(ut_setup, ut_teardown,
16170 			test_verify_auth_zuc_cipher_null_test_case_1),
16171 		/** AUTH NULL + CIPHER AES CTR */
16172 		TEST_CASE_ST(ut_setup, ut_teardown,
16173 			test_auth_null_cipher_aes_ctr_test_case_1),
16174 		TEST_CASE_ST(ut_setup, ut_teardown,
16175 			test_verify_auth_null_cipher_aes_ctr_test_case_1),
16176 		/** AUTH AES CMAC + CIPHER NULL */
16177 		TEST_CASE_ST(ut_setup, ut_teardown,
16178 			test_auth_aes_cmac_cipher_null_test_case_1),
16179 		TEST_CASE_ST(ut_setup, ut_teardown,
16180 			test_verify_auth_aes_cmac_cipher_null_test_case_1),
16181 		TEST_CASES_END()
16182 	}
16183 };
16184 
16185 static int
16186 run_cryptodev_testsuite(const char *pmd_name)
16187 {
16188 	uint8_t ret, j, i = 0, blk_start_idx = 0;
16189 	const enum blockcipher_test_type blk_suites[] = {
16190 		BLKCIPHER_AES_CHAIN_TYPE,
16191 		BLKCIPHER_AES_CIPHERONLY_TYPE,
16192 		BLKCIPHER_AES_DOCSIS_TYPE,
16193 		BLKCIPHER_3DES_CHAIN_TYPE,
16194 		BLKCIPHER_3DES_CIPHERONLY_TYPE,
16195 		BLKCIPHER_DES_CIPHERONLY_TYPE,
16196 		BLKCIPHER_DES_DOCSIS_TYPE,
16197 		BLKCIPHER_AUTHONLY_TYPE};
16198 	struct unit_test_suite *static_suites[] = {
16199 		&cryptodev_multi_session_testsuite,
16200 		&cryptodev_null_testsuite,
16201 		&cryptodev_aes_ccm_auth_testsuite,
16202 		&cryptodev_aes_gcm_auth_testsuite,
16203 		&cryptodev_aes_gmac_auth_testsuite,
16204 		&cryptodev_snow3g_testsuite,
16205 		&cryptodev_chacha20_poly1305_testsuite,
16206 		&cryptodev_zuc_testsuite,
16207 		&cryptodev_hmac_md5_auth_testsuite,
16208 		&cryptodev_kasumi_testsuite,
16209 		&cryptodev_esn_testsuite,
16210 		&cryptodev_negative_aes_gcm_testsuite,
16211 		&cryptodev_negative_aes_gmac_testsuite,
16212 		&cryptodev_mixed_cipher_hash_testsuite,
16213 		&cryptodev_negative_hmac_sha1_testsuite,
16214 		&cryptodev_gen_testsuite,
16215 #ifdef RTE_LIB_SECURITY
16216 		&ipsec_proto_testsuite,
16217 		&pdcp_proto_testsuite,
16218 		&docsis_proto_testsuite,
16219 #endif
16220 		&end_testsuite
16221 	};
16222 	static struct unit_test_suite ts = {
16223 		.suite_name = "Cryptodev Unit Test Suite",
16224 		.setup = testsuite_setup,
16225 		.teardown = testsuite_teardown,
16226 		.unit_test_cases = {TEST_CASES_END()}
16227 	};
16228 
16229 	gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
16230 
16231 	if (gbl_driver_id == -1) {
16232 		RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
16233 		return TEST_SKIPPED;
16234 	}
16235 
16236 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
16237 			(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
16238 
16239 	ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
16240 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
16241 	ret = unit_test_suite_runner(&ts);
16242 
16243 	FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
16244 	free(ts.unit_test_suites);
16245 	return ret;
16246 }
16247 
16248 static int
16249 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
16250 {
16251 	struct rte_cryptodev_info dev_info;
16252 	uint8_t i, nb_devs;
16253 	int driver_id;
16254 
16255 	driver_id = rte_cryptodev_driver_id_get(pmd_name);
16256 	if (driver_id == -1) {
16257 		RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
16258 		return TEST_SKIPPED;
16259 	}
16260 
16261 	nb_devs = rte_cryptodev_count();
16262 	if (nb_devs < 1) {
16263 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
16264 		return TEST_SKIPPED;
16265 	}
16266 
16267 	for (i = 0; i < nb_devs; i++) {
16268 		rte_cryptodev_info_get(i, &dev_info);
16269 		if (dev_info.driver_id == driver_id) {
16270 			if (!(dev_info.feature_flags & flag)) {
16271 				RTE_LOG(INFO, USER1, "%s not supported\n",
16272 						flag_name);
16273 				return TEST_SKIPPED;
16274 			}
16275 			return 0; /* found */
16276 		}
16277 	}
16278 
16279 	RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
16280 	return TEST_SKIPPED;
16281 }
16282 
16283 static int
16284 test_cryptodev_qat(void)
16285 {
16286 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
16287 }
16288 
16289 static int
16290 test_cryptodev_virtio(void)
16291 {
16292 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
16293 }
16294 
16295 static int
16296 test_cryptodev_aesni_mb(void)
16297 {
16298 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
16299 }
16300 
16301 static int
16302 test_cryptodev_cpu_aesni_mb(void)
16303 {
16304 	int32_t rc;
16305 	enum rte_security_session_action_type at = gbl_action_type;
16306 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
16307 	rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
16308 	gbl_action_type = at;
16309 	return rc;
16310 }
16311 
16312 static int
16313 test_cryptodev_chacha_poly_mb(void)
16314 {
16315 	int32_t rc;
16316 	enum rte_security_session_action_type at = gbl_action_type;
16317 	rc = run_cryptodev_testsuite(
16318 			RTE_STR(CRYPTODEV_NAME_CHACHA20_POLY1305_PMD));
16319 	gbl_action_type = at;
16320 	return rc;
16321 }
16322 
16323 static int
16324 test_cryptodev_openssl(void)
16325 {
16326 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
16327 }
16328 
16329 static int
16330 test_cryptodev_aesni_gcm(void)
16331 {
16332 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
16333 }
16334 
16335 static int
16336 test_cryptodev_cpu_aesni_gcm(void)
16337 {
16338 	int32_t rc;
16339 	enum rte_security_session_action_type at = gbl_action_type;
16340 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
16341 	rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
16342 	gbl_action_type = at;
16343 	return rc;
16344 }
16345 
16346 static int
16347 test_cryptodev_mlx5(void)
16348 {
16349 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
16350 }
16351 
16352 static int
16353 test_cryptodev_null(void)
16354 {
16355 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
16356 }
16357 
16358 static int
16359 test_cryptodev_sw_snow3g(void)
16360 {
16361 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
16362 }
16363 
16364 static int
16365 test_cryptodev_sw_kasumi(void)
16366 {
16367 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
16368 }
16369 
16370 static int
16371 test_cryptodev_sw_zuc(void)
16372 {
16373 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
16374 }
16375 
16376 static int
16377 test_cryptodev_armv8(void)
16378 {
16379 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
16380 }
16381 
16382 static int
16383 test_cryptodev_mrvl(void)
16384 {
16385 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
16386 }
16387 
16388 #ifdef RTE_CRYPTO_SCHEDULER
16389 
16390 static int
16391 test_cryptodev_scheduler(void)
16392 {
16393 	uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
16394 	const enum blockcipher_test_type blk_suites[] = {
16395 		BLKCIPHER_AES_CHAIN_TYPE,
16396 		BLKCIPHER_AES_CIPHERONLY_TYPE,
16397 		BLKCIPHER_AUTHONLY_TYPE
16398 	};
16399 	static struct unit_test_suite scheduler_multicore = {
16400 		.suite_name = "Scheduler Multicore Unit Test Suite",
16401 		.setup = scheduler_multicore_testsuite_setup,
16402 		.teardown = scheduler_mode_testsuite_teardown,
16403 		.unit_test_cases = {TEST_CASES_END()}
16404 	};
16405 	static struct unit_test_suite scheduler_round_robin = {
16406 		.suite_name = "Scheduler Round Robin Unit Test Suite",
16407 		.setup = scheduler_roundrobin_testsuite_setup,
16408 		.teardown = scheduler_mode_testsuite_teardown,
16409 		.unit_test_cases = {TEST_CASES_END()}
16410 	};
16411 	static struct unit_test_suite scheduler_failover = {
16412 		.suite_name = "Scheduler Failover Unit Test Suite",
16413 		.setup = scheduler_failover_testsuite_setup,
16414 		.teardown = scheduler_mode_testsuite_teardown,
16415 		.unit_test_cases = {TEST_CASES_END()}
16416 	};
16417 	static struct unit_test_suite scheduler_pkt_size_distr = {
16418 		.suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
16419 		.setup = scheduler_pkt_size_distr_testsuite_setup,
16420 		.teardown = scheduler_mode_testsuite_teardown,
16421 		.unit_test_cases = {TEST_CASES_END()}
16422 	};
16423 	struct unit_test_suite *sched_mode_suites[] = {
16424 		&scheduler_multicore,
16425 		&scheduler_round_robin,
16426 		&scheduler_failover,
16427 		&scheduler_pkt_size_distr
16428 	};
16429 	static struct unit_test_suite scheduler_config = {
16430 		.suite_name = "Crypto Device Scheduler Config Unit Test Suite",
16431 		.unit_test_cases = {
16432 			TEST_CASE(test_scheduler_attach_worker_op),
16433 			TEST_CASE(test_scheduler_mode_multicore_op),
16434 			TEST_CASE(test_scheduler_mode_roundrobin_op),
16435 			TEST_CASE(test_scheduler_mode_failover_op),
16436 			TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
16437 			TEST_CASE(test_scheduler_detach_worker_op),
16438 
16439 			TEST_CASES_END() /**< NULL terminate array */
16440 		}
16441 	};
16442 	struct unit_test_suite *static_suites[] = {
16443 		&scheduler_config,
16444 		&end_testsuite
16445 	};
16446 	static struct unit_test_suite ts = {
16447 		.suite_name = "Scheduler Unit Test Suite",
16448 		.setup = scheduler_testsuite_setup,
16449 		.teardown = testsuite_teardown,
16450 		.unit_test_cases = {TEST_CASES_END()}
16451 	};
16452 
16453 	gbl_driver_id =	rte_cryptodev_driver_id_get(
16454 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
16455 
16456 	if (gbl_driver_id == -1) {
16457 		RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
16458 		return TEST_SKIPPED;
16459 	}
16460 
16461 	if (rte_cryptodev_driver_id_get(
16462 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
16463 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
16464 		return TEST_SKIPPED;
16465 	}
16466 
16467 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
16468 		uint8_t blk_i = 0;
16469 		sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
16470 				(struct unit_test_suite *) *
16471 				(RTE_DIM(blk_suites) + 1));
16472 		ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
16473 				blk_suites, RTE_DIM(blk_suites));
16474 		sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
16475 	}
16476 
16477 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
16478 			(RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
16479 	ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
16480 			RTE_DIM(sched_mode_suites));
16481 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
16482 	ret = unit_test_suite_runner(&ts);
16483 
16484 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
16485 		FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
16486 				(*sched_mode_suites[sched_i]),
16487 				RTE_DIM(blk_suites));
16488 		free(sched_mode_suites[sched_i]->unit_test_suites);
16489 	}
16490 	free(ts.unit_test_suites);
16491 	return ret;
16492 }
16493 
16494 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
16495 
16496 #endif
16497 
16498 static int
16499 test_cryptodev_dpaa2_sec(void)
16500 {
16501 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
16502 }
16503 
16504 static int
16505 test_cryptodev_dpaa_sec(void)
16506 {
16507 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
16508 }
16509 
16510 static int
16511 test_cryptodev_ccp(void)
16512 {
16513 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
16514 }
16515 
16516 static int
16517 test_cryptodev_octeontx(void)
16518 {
16519 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
16520 }
16521 
16522 static int
16523 test_cryptodev_caam_jr(void)
16524 {
16525 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
16526 }
16527 
16528 static int
16529 test_cryptodev_nitrox(void)
16530 {
16531 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
16532 }
16533 
16534 static int
16535 test_cryptodev_bcmfs(void)
16536 {
16537 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
16538 }
16539 
16540 static int
16541 test_cryptodev_qat_raw_api(void)
16542 {
16543 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
16544 	int ret;
16545 
16546 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16547 			"RAW API");
16548 	if (ret)
16549 		return ret;
16550 
16551 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
16552 	ret = run_cryptodev_testsuite(pmd_name);
16553 	global_api_test_type = CRYPTODEV_API_TEST;
16554 
16555 	return ret;
16556 }
16557 
16558 static int
16559 test_cryptodev_cn9k(void)
16560 {
16561 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
16562 }
16563 
16564 static int
16565 test_cryptodev_cn10k(void)
16566 {
16567 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
16568 }
16569 
16570 static int
16571 test_cryptodev_dpaa2_sec_raw_api(void)
16572 {
16573 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
16574 	int ret;
16575 
16576 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16577 			"RAW API");
16578 	if (ret)
16579 		return ret;
16580 
16581 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
16582 	ret = run_cryptodev_testsuite(pmd_name);
16583 	global_api_test_type = CRYPTODEV_API_TEST;
16584 
16585 	return ret;
16586 }
16587 
16588 static int
16589 test_cryptodev_dpaa_sec_raw_api(void)
16590 {
16591 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
16592 	int ret;
16593 
16594 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16595 			"RAW API");
16596 	if (ret)
16597 		return ret;
16598 
16599 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
16600 	ret = run_cryptodev_testsuite(pmd_name);
16601 	global_api_test_type = CRYPTODEV_API_TEST;
16602 
16603 	return ret;
16604 }
16605 
16606 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest,
16607 		test_cryptodev_dpaa2_sec_raw_api);
16608 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest,
16609 		test_cryptodev_dpaa_sec_raw_api);
16610 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
16611 		test_cryptodev_qat_raw_api);
16612 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
16613 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
16614 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
16615 	test_cryptodev_cpu_aesni_mb);
16616 REGISTER_TEST_COMMAND(cryptodev_chacha_poly_mb_autotest,
16617 	test_cryptodev_chacha_poly_mb);
16618 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
16619 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
16620 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
16621 	test_cryptodev_cpu_aesni_gcm);
16622 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
16623 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
16624 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
16625 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
16626 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
16627 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
16628 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
16629 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
16630 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
16631 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
16632 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
16633 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
16634 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
16635 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
16636 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
16637 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
16638 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);
16639 
16640 #endif /* !RTE_EXEC_ENV_WINDOWS */
16641