xref: /dpdk/app/test/test_cryptodev.c (revision 3da59f30a23f2e795d2315f3d949e1b3e0ce0c3d)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2015-2020 Intel Corporation
3  * Copyright 2020 NXP
4  */
5 
6 #include <time.h>
7 
8 #include <rte_common.h>
9 #include <rte_hexdump.h>
10 #include <rte_mbuf.h>
11 #include <rte_malloc.h>
12 #include <rte_memcpy.h>
13 #include <rte_pause.h>
14 #include <rte_bus_vdev.h>
15 #include <rte_ether.h>
16 #include <rte_errno.h>
17 
18 #include <rte_crypto.h>
19 #include <rte_cryptodev.h>
20 #include <rte_ethdev.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 #include "test_cryptodev_sm4_test_vectors.h"
49 #ifdef RTE_LIB_SECURITY
50 #include "test_cryptodev_security_ipsec.h"
51 #include "test_cryptodev_security_ipsec_test_vectors.h"
52 #include "test_cryptodev_security_pdcp_test_vectors.h"
53 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
54 #include "test_cryptodev_security_pdcp_test_func.h"
55 #include "test_cryptodev_security_docsis_test_vectors.h"
56 #include "test_cryptodev_security_tls_record.h"
57 #include "test_security_proto.h"
58 
59 #define SDAP_DISABLED	0
60 #define SDAP_ENABLED	1
61 #endif
62 
63 #define VDEV_ARGS_SIZE 100
64 #define MAX_NB_SESSIONS 4
65 
66 #define MAX_DRV_SERVICE_CTX_SIZE 256
67 
68 #define MAX_RAW_DEQUEUE_COUNT	65535
69 
70 #define IN_PLACE 0
71 #define OUT_OF_PLACE 1
72 
73 static int gbl_driver_id;
74 
75 static enum rte_security_session_action_type gbl_action_type =
76 	RTE_SECURITY_ACTION_TYPE_NONE;
77 
78 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
79 
80 struct crypto_unittest_params {
81 	struct rte_crypto_sym_xform cipher_xform;
82 	struct rte_crypto_sym_xform auth_xform;
83 	struct rte_crypto_sym_xform aead_xform;
84 #ifdef RTE_LIB_SECURITY
85 	struct rte_security_docsis_xform docsis_xform;
86 #endif
87 
88 	union {
89 		void *sess;
90 #ifdef RTE_LIB_SECURITY
91 		void *sec_session;
92 #endif
93 	};
94 #ifdef RTE_LIB_SECURITY
95 	enum rte_security_session_action_type type;
96 #endif
97 	struct rte_crypto_op *op;
98 
99 	struct rte_mbuf *obuf, *ibuf;
100 
101 	uint8_t *digest;
102 };
103 
104 #define ALIGN_POW2_ROUNDUP(num, align) \
105 	(((num) + (align) - 1) & ~((align) - 1))
106 
107 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts)	\
108 	for (j = 0; j < num_child_ts; index++, j++)			\
109 		parent_ts.unit_test_suites[index] = child_ts[j]
110 
111 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types)	\
112 	for (j = 0; j < num_blk_types; index++, j++)				\
113 		parent_ts.unit_test_suites[index] =				\
114 				build_blockcipher_test_suite(blk_types[j])
115 
116 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types)		\
117 	for (j = index; j < index + num_blk_types; j++)				\
118 		free_blockcipher_test_suite(parent_ts.unit_test_suites[j])
119 
120 /*
121  * Forward declarations.
122  */
123 static int
124 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
125 		struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
126 		uint8_t *hmac_key);
127 
128 static int
129 test_AES_CBC_HMAC_SHA512_decrypt_perform(void *sess,
130 		struct crypto_unittest_params *ut_params,
131 		struct crypto_testsuite_params *ts_param,
132 		const uint8_t *cipher,
133 		const uint8_t *digest,
134 		const uint8_t *iv);
135 
136 static int
137 security_proto_supported(enum rte_security_session_action_type action,
138 	enum rte_security_session_protocol proto);
139 
140 static int
141 dev_configure_and_start(uint64_t ff_disable);
142 
143 static int
144 check_cipher_capability(const struct crypto_testsuite_params *ts_params,
145 			const enum rte_crypto_cipher_algorithm cipher_algo,
146 			const uint16_t key_size, const uint16_t iv_size);
147 
148 static int
149 check_auth_capability(const struct crypto_testsuite_params *ts_params,
150 			const enum rte_crypto_auth_algorithm auth_algo,
151 			const uint16_t key_size, const uint16_t iv_size,
152 			const uint16_t tag_size);
153 
154 static struct rte_mbuf *
155 setup_test_string(struct rte_mempool *mpool,
156 		const char *string, size_t len, uint8_t blocksize)
157 {
158 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
159 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
160 
161 	if (m) {
162 		char *dst;
163 
164 		memset(m->buf_addr, 0, m->buf_len);
165 		dst = rte_pktmbuf_append(m, t_len);
166 		if (!dst) {
167 			rte_pktmbuf_free(m);
168 			return NULL;
169 		}
170 		if (string != NULL)
171 			rte_memcpy(dst, string, t_len);
172 		else
173 			memset(dst, 0, t_len);
174 	}
175 
176 	return m;
177 }
178 
179 /* Get number of bytes in X bits (rounding up) */
180 static uint32_t
181 ceil_byte_length(uint32_t num_bits)
182 {
183 	if (num_bits % 8)
184 		return ((num_bits >> 3) + 1);
185 	else
186 		return (num_bits >> 3);
187 }
188 
189 static void
190 post_process_raw_dp_op(void *user_data,	uint32_t index __rte_unused,
191 		uint8_t is_op_success)
192 {
193 	struct rte_crypto_op *op = user_data;
194 	op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
195 			RTE_CRYPTO_OP_STATUS_ERROR;
196 }
197 
198 static struct crypto_testsuite_params testsuite_params = { NULL };
199 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
200 static struct crypto_unittest_params unittest_params;
201 
202 int
203 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
204 		struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
205 		uint8_t len_in_bits, uint8_t cipher_iv_len)
206 {
207 	struct rte_crypto_sym_op *sop = op->sym;
208 	struct rte_crypto_op *ret_op = NULL;
209 	struct rte_crypto_vec data_vec[UINT8_MAX], dest_data_vec[UINT8_MAX];
210 	struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
211 	union rte_crypto_sym_ofs ofs;
212 	struct rte_crypto_sym_vec vec;
213 	struct rte_crypto_sgl sgl, dest_sgl;
214 	uint32_t max_len;
215 	union rte_cryptodev_session_ctx sess;
216 	uint64_t auth_end_iova;
217 	uint32_t count = 0;
218 	struct rte_crypto_raw_dp_ctx *ctx;
219 	uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
220 			auth_len = 0;
221 	int32_t n;
222 	uint32_t n_success;
223 	int ctx_service_size;
224 	int32_t status = 0;
225 	int enqueue_status, dequeue_status;
226 	struct crypto_unittest_params *ut_params = &unittest_params;
227 	int is_sgl = sop->m_src->nb_segs > 1;
228 	int ret = TEST_SUCCESS, is_oop = 0;
229 
230 	ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
231 	if (ctx_service_size < 0)
232 		return TEST_SKIPPED;
233 
234 	ctx = malloc(ctx_service_size);
235 	if (ctx == NULL)
236 		return TEST_FAILED;
237 
238 	/* Both are enums, setting crypto_sess will suit any session type */
239 	sess.crypto_sess = op->sym->session;
240 
241 	ret = rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx, op->sess_type, sess, 0);
242 	if (ret == -ENOTSUP) {
243 		ret = TEST_SKIPPED;
244 		goto exit;
245 	} else if (ret) {
246 		ret = TEST_FAILED;
247 		goto exit;
248 	}
249 
250 	cipher_iv.iova = 0;
251 	cipher_iv.va = NULL;
252 	aad_auth_iv.iova = 0;
253 	aad_auth_iv.va = NULL;
254 	digest.iova = 0;
255 	digest.va = NULL;
256 	sgl.vec = data_vec;
257 	vec.num = 1;
258 	vec.src_sgl = &sgl;
259 	vec.iv = &cipher_iv;
260 	vec.digest = &digest;
261 	vec.aad = &aad_auth_iv;
262 	vec.status = &status;
263 
264 	ofs.raw = 0;
265 
266 	if ((sop->m_dst != NULL) && (sop->m_dst != sop->m_src))
267 		is_oop = 1;
268 
269 	if (is_cipher && is_auth) {
270 		cipher_offset = sop->cipher.data.offset;
271 		cipher_len = sop->cipher.data.length;
272 		auth_offset = sop->auth.data.offset;
273 		auth_len = sop->auth.data.length;
274 		max_len = RTE_MAX(cipher_offset + cipher_len,
275 				auth_offset + auth_len);
276 		if (len_in_bits) {
277 			max_len = max_len >> 3;
278 			cipher_offset = cipher_offset >> 3;
279 			auth_offset = auth_offset >> 3;
280 			cipher_len = cipher_len >> 3;
281 			auth_len = auth_len >> 3;
282 		}
283 		ofs.ofs.cipher.head = cipher_offset;
284 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
285 		ofs.ofs.auth.head = auth_offset;
286 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
287 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
288 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
289 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
290 				op, void *, IV_OFFSET + cipher_iv_len);
291 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
292 				cipher_iv_len);
293 		digest.va = (void *)sop->auth.digest.data;
294 		digest.iova = sop->auth.digest.phys_addr;
295 
296 		if (is_sgl) {
297 			uint32_t remaining_off = auth_offset + auth_len;
298 			struct rte_mbuf *sgl_buf = sop->m_src;
299 			if (is_oop)
300 				sgl_buf = sop->m_dst;
301 
302 			while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)
303 					&& sgl_buf->next != NULL) {
304 				remaining_off -= rte_pktmbuf_data_len(sgl_buf);
305 				sgl_buf = sgl_buf->next;
306 			}
307 
308 			auth_end_iova = (uint64_t)rte_pktmbuf_iova_offset(
309 				sgl_buf, remaining_off);
310 		} else {
311 			auth_end_iova = rte_pktmbuf_iova(op->sym->m_src) +
312 							 auth_offset + auth_len;
313 		}
314 		/* Then check if digest-encrypted conditions are met */
315 		if ((auth_offset + auth_len < cipher_offset + cipher_len) &&
316 				(digest.iova == auth_end_iova) && is_sgl)
317 			max_len = RTE_MAX(max_len,
318 				auth_offset + auth_len +
319 				ut_params->auth_xform.auth.digest_length);
320 
321 	} else if (is_cipher) {
322 		cipher_offset = sop->cipher.data.offset;
323 		cipher_len = sop->cipher.data.length;
324 		max_len = cipher_len + cipher_offset;
325 		if (len_in_bits) {
326 			max_len = max_len >> 3;
327 			cipher_offset = cipher_offset >> 3;
328 			cipher_len = cipher_len >> 3;
329 		}
330 		ofs.ofs.cipher.head = cipher_offset;
331 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
332 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
333 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
334 
335 	} else if (is_auth) {
336 		auth_offset = sop->auth.data.offset;
337 		auth_len = sop->auth.data.length;
338 		max_len = auth_len + auth_offset;
339 		if (len_in_bits) {
340 			max_len = max_len >> 3;
341 			auth_offset = auth_offset >> 3;
342 			auth_len = auth_len >> 3;
343 		}
344 		ofs.ofs.auth.head = auth_offset;
345 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
346 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
347 				op, void *, IV_OFFSET + cipher_iv_len);
348 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
349 				cipher_iv_len);
350 		digest.va = (void *)sop->auth.digest.data;
351 		digest.iova = sop->auth.digest.phys_addr;
352 
353 	} else { /* aead */
354 		cipher_offset = sop->aead.data.offset;
355 		cipher_len = sop->aead.data.length;
356 		max_len = cipher_len + cipher_offset;
357 		if (len_in_bits) {
358 			max_len = max_len >> 3;
359 			cipher_offset = cipher_offset >> 3;
360 			cipher_len = cipher_len >> 3;
361 		}
362 		ofs.ofs.cipher.head = cipher_offset;
363 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
364 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
365 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
366 		aad_auth_iv.va = (void *)sop->aead.aad.data;
367 		aad_auth_iv.iova = sop->aead.aad.phys_addr;
368 		digest.va = (void *)sop->aead.digest.data;
369 		digest.iova = sop->aead.digest.phys_addr;
370 	}
371 
372 	n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
373 			data_vec, RTE_DIM(data_vec));
374 	if (n < 0 || n > sop->m_src->nb_segs) {
375 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
376 		goto exit;
377 	}
378 
379 	sgl.num = n;
380 	/* Out of place */
381 	if (is_oop) {
382 		dest_sgl.vec = dest_data_vec;
383 		vec.dest_sgl = &dest_sgl;
384 		n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
385 				dest_data_vec, RTE_DIM(dest_data_vec));
386 		if (n < 0 || n > sop->m_dst->nb_segs) {
387 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
388 			goto exit;
389 		}
390 		dest_sgl.num = n;
391 	} else
392 		vec.dest_sgl = NULL;
393 
394 	if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
395 			&enqueue_status) < 1) {
396 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
397 		goto exit;
398 	}
399 
400 	if (enqueue_status == 0) {
401 		status = rte_cryptodev_raw_enqueue_done(ctx, 1);
402 		if (status < 0) {
403 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
404 			goto exit;
405 		}
406 	} else if (enqueue_status < 0) {
407 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
408 		goto exit;
409 	}
410 
411 	n = n_success = 0;
412 	while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
413 		n = rte_cryptodev_raw_dequeue_burst(ctx,
414 			NULL, 1, post_process_raw_dp_op,
415 				(void **)&ret_op, 0, &n_success,
416 				&dequeue_status);
417 		if (dequeue_status < 0) {
418 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
419 			goto exit;
420 		}
421 		if (n == 0)
422 			rte_pause();
423 	}
424 
425 	if (n == 1 && dequeue_status == 0) {
426 		if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
427 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
428 			goto exit;
429 		}
430 	}
431 
432 	op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
433 			ret_op->status == RTE_CRYPTO_OP_STATUS_ERROR ||
434 			n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
435 					RTE_CRYPTO_OP_STATUS_SUCCESS;
436 
437 exit:
438 	free(ctx);
439 	return ret;
440 }
441 
442 static void
443 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
444 {
445 	int32_t n, st;
446 	struct rte_crypto_sym_op *sop;
447 	union rte_crypto_sym_ofs ofs;
448 	struct rte_crypto_sgl sgl;
449 	struct rte_crypto_sym_vec symvec;
450 	struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
451 	struct rte_crypto_vec vec[UINT8_MAX];
452 
453 	sop = op->sym;
454 
455 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
456 		sop->aead.data.length, vec, RTE_DIM(vec));
457 
458 	if (n < 0 || n != sop->m_src->nb_segs) {
459 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
460 		return;
461 	}
462 
463 	sgl.vec = vec;
464 	sgl.num = n;
465 	symvec.src_sgl = &sgl;
466 	symvec.iv = &iv_ptr;
467 	symvec.digest = &digest_ptr;
468 	symvec.aad = &aad_ptr;
469 	symvec.status = &st;
470 	symvec.num = 1;
471 
472 	/* for CPU crypto the IOVA address is not required */
473 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
474 	digest_ptr.va = (void *)sop->aead.digest.data;
475 	aad_ptr.va = (void *)sop->aead.aad.data;
476 
477 	ofs.raw = 0;
478 
479 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
480 		&symvec);
481 
482 	if (n != 1)
483 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
484 	else
485 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
486 }
487 
488 static void
489 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
490 {
491 	int32_t n, st;
492 	struct rte_crypto_sym_op *sop;
493 	union rte_crypto_sym_ofs ofs;
494 	struct rte_crypto_sgl sgl;
495 	struct rte_crypto_sym_vec symvec;
496 	struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
497 	struct rte_crypto_vec vec[UINT8_MAX];
498 
499 	sop = op->sym;
500 
501 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
502 		sop->auth.data.length, vec, RTE_DIM(vec));
503 
504 	if (n < 0 || n != sop->m_src->nb_segs) {
505 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
506 		return;
507 	}
508 
509 	sgl.vec = vec;
510 	sgl.num = n;
511 	symvec.src_sgl = &sgl;
512 	symvec.iv = &iv_ptr;
513 	symvec.digest = &digest_ptr;
514 	symvec.status = &st;
515 	symvec.num = 1;
516 
517 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
518 	digest_ptr.va = (void *)sop->auth.digest.data;
519 
520 	ofs.raw = 0;
521 	ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
522 	ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
523 		(sop->cipher.data.offset + sop->cipher.data.length);
524 
525 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
526 		&symvec);
527 
528 	if (n != 1)
529 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
530 	else
531 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
532 }
533 
534 static struct rte_crypto_op *
535 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
536 {
537 
538 	RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
539 
540 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
541 		RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
542 		return NULL;
543 	}
544 
545 	op = NULL;
546 
547 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
548 		rte_pause();
549 
550 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
551 		RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
552 		return NULL;
553 	}
554 
555 	return op;
556 }
557 
558 static int
559 testsuite_setup(void)
560 {
561 	struct crypto_testsuite_params *ts_params = &testsuite_params;
562 	struct rte_cryptodev_info info;
563 	uint32_t i = 0, nb_devs, dev_id;
564 	uint16_t qp_id;
565 
566 	memset(ts_params, 0, sizeof(*ts_params));
567 
568 	ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
569 	if (ts_params->mbuf_pool == NULL) {
570 		/* Not already created so create */
571 		ts_params->mbuf_pool = rte_pktmbuf_pool_create(
572 				"CRYPTO_MBUFPOOL",
573 				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
574 				rte_socket_id());
575 		if (ts_params->mbuf_pool == NULL) {
576 			RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
577 			return TEST_FAILED;
578 		}
579 	}
580 
581 	ts_params->large_mbuf_pool = rte_mempool_lookup(
582 			"CRYPTO_LARGE_MBUFPOOL");
583 	if (ts_params->large_mbuf_pool == NULL) {
584 		/* Not already created so create */
585 		ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
586 				"CRYPTO_LARGE_MBUFPOOL",
587 				1, 0, 0, UINT16_MAX,
588 				rte_socket_id());
589 		if (ts_params->large_mbuf_pool == NULL) {
590 			RTE_LOG(ERR, USER1,
591 				"Can't create CRYPTO_LARGE_MBUFPOOL\n");
592 			return TEST_FAILED;
593 		}
594 	}
595 
596 	ts_params->op_mpool = rte_crypto_op_pool_create(
597 			"MBUF_CRYPTO_SYM_OP_POOL",
598 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
599 			NUM_MBUFS, MBUF_CACHE_SIZE,
600 			DEFAULT_NUM_XFORMS *
601 			sizeof(struct rte_crypto_sym_xform) +
602 			MAXIMUM_IV_LENGTH,
603 			rte_socket_id());
604 	if (ts_params->op_mpool == NULL) {
605 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
606 		return TEST_FAILED;
607 	}
608 
609 	nb_devs = rte_cryptodev_count();
610 	if (nb_devs < 1) {
611 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
612 		return TEST_SKIPPED;
613 	}
614 
615 	if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
616 		RTE_LOG(WARNING, USER1, "No %s devices found?\n",
617 				rte_cryptodev_driver_name_get(gbl_driver_id));
618 		return TEST_SKIPPED;
619 	}
620 
621 	/* Create list of valid crypto devs */
622 	for (i = 0; i < nb_devs; i++) {
623 		rte_cryptodev_info_get(i, &info);
624 		if (info.driver_id == gbl_driver_id)
625 			ts_params->valid_devs[ts_params->valid_dev_count++] = i;
626 	}
627 
628 	if (ts_params->valid_dev_count < 1)
629 		return TEST_FAILED;
630 
631 	/* Set up all the qps on the first of the valid devices found */
632 
633 	dev_id = ts_params->valid_devs[0];
634 
635 	rte_cryptodev_info_get(dev_id, &info);
636 
637 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
638 	ts_params->conf.socket_id = SOCKET_ID_ANY;
639 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
640 
641 	unsigned int session_size =
642 		rte_cryptodev_sym_get_private_session_size(dev_id);
643 
644 #ifdef RTE_LIB_SECURITY
645 	unsigned int security_session_size = rte_security_session_get_size(
646 			rte_cryptodev_get_sec_ctx(dev_id));
647 
648 	if (session_size < security_session_size)
649 		session_size = security_session_size;
650 #endif
651 	/*
652 	 * Create mempool with maximum number of sessions.
653 	 */
654 	if (info.sym.max_nb_sessions != 0 &&
655 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
656 		RTE_LOG(ERR, USER1, "Device does not support "
657 				"at least %u sessions\n",
658 				MAX_NB_SESSIONS);
659 		return TEST_FAILED;
660 	}
661 
662 	ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
663 			"test_sess_mp", MAX_NB_SESSIONS, session_size, 0, 0,
664 			SOCKET_ID_ANY);
665 	TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
666 			"session mempool allocation failed");
667 
668 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
669 			&ts_params->conf),
670 			"Failed to configure cryptodev %u with %u qps",
671 			dev_id, ts_params->conf.nb_queue_pairs);
672 
673 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
674 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
675 
676 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
677 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
678 			dev_id, qp_id, &ts_params->qp_conf,
679 			rte_cryptodev_socket_id(dev_id)),
680 			"Failed to setup queue pair %u on cryptodev %u",
681 			qp_id, dev_id);
682 	}
683 
684 	return TEST_SUCCESS;
685 }
686 
687 static void
688 testsuite_teardown(void)
689 {
690 	struct crypto_testsuite_params *ts_params = &testsuite_params;
691 	int res;
692 
693 	if (ts_params->mbuf_pool != NULL) {
694 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
695 		rte_mempool_avail_count(ts_params->mbuf_pool));
696 	}
697 
698 	if (ts_params->op_mpool != NULL) {
699 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
700 		rte_mempool_avail_count(ts_params->op_mpool));
701 	}
702 
703 	if (ts_params->session_mpool != NULL) {
704 		rte_mempool_free(ts_params->session_mpool);
705 		ts_params->session_mpool = NULL;
706 	}
707 
708 	res = rte_cryptodev_close(ts_params->valid_devs[0]);
709 	if (res)
710 		RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
711 }
712 
713 static int
714 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
715 		const int *algs, uint16_t num_algs)
716 {
717 	uint8_t dev_id = testsuite_params.valid_devs[0];
718 	bool some_alg_supported = FALSE;
719 	uint16_t i;
720 
721 	for (i = 0; i < num_algs && !some_alg_supported; i++) {
722 		struct rte_cryptodev_sym_capability_idx alg = {
723 			type, {algs[i]}
724 		};
725 		if (rte_cryptodev_sym_capability_get(dev_id,
726 				&alg) != NULL)
727 			some_alg_supported = TRUE;
728 	}
729 	if (!some_alg_supported)
730 		return TEST_SKIPPED;
731 
732 	return 0;
733 }
734 
735 int
736 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
737 		uint16_t num_ciphers)
738 {
739 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
740 			(const int *) ciphers, num_ciphers);
741 }
742 
743 int
744 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
745 		uint16_t num_auths)
746 {
747 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
748 			(const int *) auths, num_auths);
749 }
750 
751 int
752 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
753 		uint16_t num_aeads)
754 {
755 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
756 			(const int *) aeads, num_aeads);
757 }
758 
759 static int
760 null_testsuite_setup(void)
761 {
762 	struct crypto_testsuite_params *ts_params = &testsuite_params;
763 	uint8_t dev_id = ts_params->valid_devs[0];
764 	struct rte_cryptodev_info dev_info;
765 	const enum rte_crypto_cipher_algorithm ciphers[] = {
766 		RTE_CRYPTO_CIPHER_NULL
767 	};
768 	const enum rte_crypto_auth_algorithm auths[] = {
769 		RTE_CRYPTO_AUTH_NULL
770 	};
771 
772 	rte_cryptodev_info_get(dev_id, &dev_info);
773 
774 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
775 		RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
776 				"testsuite not met\n");
777 		return TEST_SKIPPED;
778 	}
779 
780 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
781 			&& check_auth_capabilities_supported(auths,
782 			RTE_DIM(auths)) != 0) {
783 		RTE_LOG(INFO, USER1, "Capability requirements for NULL "
784 				"testsuite not met\n");
785 		return TEST_SKIPPED;
786 	}
787 
788 	return 0;
789 }
790 
791 static int
792 crypto_gen_testsuite_setup(void)
793 {
794 	struct crypto_testsuite_params *ts_params = &testsuite_params;
795 	uint8_t dev_id = ts_params->valid_devs[0];
796 	struct rte_cryptodev_info dev_info;
797 
798 	rte_cryptodev_info_get(dev_id, &dev_info);
799 
800 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
801 		RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
802 				"testsuite not met\n");
803 		return TEST_SKIPPED;
804 	}
805 
806 	return 0;
807 }
808 
809 #ifdef RTE_LIB_SECURITY
810 static int
811 sec_proto_testsuite_setup(enum rte_security_session_protocol protocol)
812 {
813 	struct crypto_testsuite_params *ts_params = &testsuite_params;
814 	struct crypto_unittest_params *ut_params = &unittest_params;
815 	struct rte_cryptodev_info dev_info;
816 	int ret = 0;
817 
818 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
819 
820 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
821 		RTE_LOG(INFO, USER1,
822 			"Feature flag requirements for security protocol testsuite not met\n");
823 		return TEST_SKIPPED;
824 	}
825 
826 	/* Reconfigure to enable security */
827 	ret = dev_configure_and_start(0);
828 	if (ret != TEST_SUCCESS)
829 		return ret;
830 
831 	/* Set action type */
832 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
833 
834 	if (security_proto_supported(RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, protocol) < 0) {
835 		RTE_LOG(INFO, USER1,
836 			"Capability requirements for security protocol test not met\n");
837 		ret = TEST_SKIPPED;
838 	}
839 
840 	test_sec_alg_list_populate();
841 	test_sec_auth_only_alg_list_populate();
842 
843 	/*
844 	 * Stop the device. Device would be started again by individual test
845 	 * case setup routine.
846 	 */
847 	rte_cryptodev_stop(ts_params->valid_devs[0]);
848 
849 	return ret;
850 }
851 
852 static int
853 ipsec_proto_testsuite_setup(void)
854 {
855 	return sec_proto_testsuite_setup(RTE_SECURITY_PROTOCOL_IPSEC);
856 }
857 
858 static int
859 tls_record_proto_testsuite_setup(void)
860 {
861 	return sec_proto_testsuite_setup(RTE_SECURITY_PROTOCOL_TLS_RECORD);
862 }
863 
864 static int
865 pdcp_proto_testsuite_setup(void)
866 {
867 	struct crypto_testsuite_params *ts_params = &testsuite_params;
868 	uint8_t dev_id = ts_params->valid_devs[0];
869 	struct rte_cryptodev_info dev_info;
870 	const enum rte_crypto_cipher_algorithm ciphers[] = {
871 		RTE_CRYPTO_CIPHER_NULL,
872 		RTE_CRYPTO_CIPHER_AES_CTR,
873 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
874 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
875 	};
876 	const enum rte_crypto_auth_algorithm auths[] = {
877 		RTE_CRYPTO_AUTH_NULL,
878 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
879 		RTE_CRYPTO_AUTH_AES_CMAC,
880 		RTE_CRYPTO_AUTH_ZUC_EIA3
881 	};
882 
883 	RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_auth_key));
884 	RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_bearer));
885 	RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_crypto_key));
886 	RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_data_in));
887 	RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_data_in_len));
888 	RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_data_out));
889 	RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_data_sn_size));
890 	RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_hfn));
891 	RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_hfn_threshold));
892 	RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_packet_direction));
893 
894 	rte_cryptodev_info_get(dev_id, &dev_info);
895 
896 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
897 			!(dev_info.feature_flags &
898 			RTE_CRYPTODEV_FF_SECURITY)) {
899 		RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
900 				"testsuite not met\n");
901 		return TEST_SKIPPED;
902 	}
903 
904 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
905 			&& check_auth_capabilities_supported(auths,
906 			RTE_DIM(auths)) != 0) {
907 		RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
908 				"testsuite not met\n");
909 		return TEST_SKIPPED;
910 	}
911 
912 	return 0;
913 }
914 
915 static int
916 docsis_proto_testsuite_setup(void)
917 {
918 	struct crypto_testsuite_params *ts_params = &testsuite_params;
919 	uint8_t dev_id = ts_params->valid_devs[0];
920 	struct rte_cryptodev_info dev_info;
921 	const enum rte_crypto_cipher_algorithm ciphers[] = {
922 		RTE_CRYPTO_CIPHER_AES_DOCSISBPI
923 	};
924 
925 	rte_cryptodev_info_get(dev_id, &dev_info);
926 
927 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
928 			!(dev_info.feature_flags &
929 			RTE_CRYPTODEV_FF_SECURITY)) {
930 		RTE_LOG(INFO, USER1, "Feature flag requirements for DOCSIS "
931 				"Proto testsuite not met\n");
932 		return TEST_SKIPPED;
933 	}
934 
935 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
936 		RTE_LOG(INFO, USER1, "Capability requirements for DOCSIS Proto "
937 				"testsuite not met\n");
938 		return TEST_SKIPPED;
939 	}
940 
941 	return 0;
942 }
943 #endif
944 
945 static int
946 aes_ccm_auth_testsuite_setup(void)
947 {
948 	struct crypto_testsuite_params *ts_params = &testsuite_params;
949 	uint8_t dev_id = ts_params->valid_devs[0];
950 	struct rte_cryptodev_info dev_info;
951 	const enum rte_crypto_aead_algorithm aeads[] = {
952 		RTE_CRYPTO_AEAD_AES_CCM
953 	};
954 
955 	rte_cryptodev_info_get(dev_id, &dev_info);
956 
957 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
958 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
959 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
960 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
961 				"testsuite not met\n");
962 		return TEST_SKIPPED;
963 	}
964 
965 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
966 		RTE_LOG(INFO, USER1, "Capability requirements for AES CCM "
967 				"testsuite not met\n");
968 		return TEST_SKIPPED;
969 	}
970 
971 	return 0;
972 }
973 
974 static int
975 aes_gcm_auth_testsuite_setup(void)
976 {
977 	struct crypto_testsuite_params *ts_params = &testsuite_params;
978 	uint8_t dev_id = ts_params->valid_devs[0];
979 	struct rte_cryptodev_info dev_info;
980 	const enum rte_crypto_aead_algorithm aeads[] = {
981 		RTE_CRYPTO_AEAD_AES_GCM
982 	};
983 
984 	rte_cryptodev_info_get(dev_id, &dev_info);
985 
986 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
987 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
988 				"testsuite not met\n");
989 		return TEST_SKIPPED;
990 	}
991 
992 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
993 		RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
994 				"testsuite not met\n");
995 		return TEST_SKIPPED;
996 	}
997 
998 	return 0;
999 }
1000 
1001 static int
1002 aes_gmac_auth_testsuite_setup(void)
1003 {
1004 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1005 	uint8_t dev_id = ts_params->valid_devs[0];
1006 	struct rte_cryptodev_info dev_info;
1007 	const enum rte_crypto_auth_algorithm auths[] = {
1008 		RTE_CRYPTO_AUTH_AES_GMAC
1009 	};
1010 
1011 	rte_cryptodev_info_get(dev_id, &dev_info);
1012 
1013 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1014 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1015 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1016 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
1017 				"testsuite not met\n");
1018 		return TEST_SKIPPED;
1019 	}
1020 
1021 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1022 		RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
1023 				"testsuite not met\n");
1024 		return TEST_SKIPPED;
1025 	}
1026 
1027 	return 0;
1028 }
1029 
1030 static int
1031 chacha20_poly1305_testsuite_setup(void)
1032 {
1033 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1034 	uint8_t dev_id = ts_params->valid_devs[0];
1035 	struct rte_cryptodev_info dev_info;
1036 	const enum rte_crypto_aead_algorithm aeads[] = {
1037 		RTE_CRYPTO_AEAD_CHACHA20_POLY1305
1038 	};
1039 
1040 	rte_cryptodev_info_get(dev_id, &dev_info);
1041 
1042 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1043 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1044 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1045 		RTE_LOG(INFO, USER1, "Feature flag requirements for "
1046 				"Chacha20-Poly1305 testsuite not met\n");
1047 		return TEST_SKIPPED;
1048 	}
1049 
1050 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1051 		RTE_LOG(INFO, USER1, "Capability requirements for "
1052 				"Chacha20-Poly1305 testsuite not met\n");
1053 		return TEST_SKIPPED;
1054 	}
1055 
1056 	return 0;
1057 }
1058 
1059 static int
1060 snow3g_testsuite_setup(void)
1061 {
1062 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1063 	uint8_t dev_id = ts_params->valid_devs[0];
1064 	struct rte_cryptodev_info dev_info;
1065 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1066 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1067 
1068 	};
1069 	const enum rte_crypto_auth_algorithm auths[] = {
1070 		RTE_CRYPTO_AUTH_SNOW3G_UIA2
1071 	};
1072 
1073 	rte_cryptodev_info_get(dev_id, &dev_info);
1074 
1075 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1076 		RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
1077 				"testsuite not met\n");
1078 		return TEST_SKIPPED;
1079 	}
1080 
1081 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1082 			&& check_auth_capabilities_supported(auths,
1083 			RTE_DIM(auths)) != 0) {
1084 		RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
1085 				"testsuite not met\n");
1086 		return TEST_SKIPPED;
1087 	}
1088 
1089 	return 0;
1090 }
1091 
1092 static int
1093 zuc_testsuite_setup(void)
1094 {
1095 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1096 	uint8_t dev_id = ts_params->valid_devs[0];
1097 	struct rte_cryptodev_info dev_info;
1098 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1099 		RTE_CRYPTO_CIPHER_ZUC_EEA3
1100 	};
1101 	const enum rte_crypto_auth_algorithm auths[] = {
1102 		RTE_CRYPTO_AUTH_ZUC_EIA3
1103 	};
1104 
1105 	rte_cryptodev_info_get(dev_id, &dev_info);
1106 
1107 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1108 		RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
1109 				"testsuite not met\n");
1110 		return TEST_SKIPPED;
1111 	}
1112 
1113 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1114 			&& check_auth_capabilities_supported(auths,
1115 			RTE_DIM(auths)) != 0) {
1116 		RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
1117 				"testsuite not met\n");
1118 		return TEST_SKIPPED;
1119 	}
1120 
1121 	return 0;
1122 }
1123 
1124 static int
1125 hmac_md5_auth_testsuite_setup(void)
1126 {
1127 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1128 	uint8_t dev_id = ts_params->valid_devs[0];
1129 	struct rte_cryptodev_info dev_info;
1130 	const enum rte_crypto_auth_algorithm auths[] = {
1131 		RTE_CRYPTO_AUTH_MD5_HMAC
1132 	};
1133 
1134 	rte_cryptodev_info_get(dev_id, &dev_info);
1135 
1136 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1137 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1138 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1139 		RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1140 				"Auth testsuite not met\n");
1141 		return TEST_SKIPPED;
1142 	}
1143 
1144 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1145 		RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1146 				"testsuite not met\n");
1147 		return TEST_SKIPPED;
1148 	}
1149 
1150 	return 0;
1151 }
1152 
1153 static int
1154 kasumi_testsuite_setup(void)
1155 {
1156 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1157 	uint8_t dev_id = ts_params->valid_devs[0];
1158 	struct rte_cryptodev_info dev_info;
1159 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1160 		RTE_CRYPTO_CIPHER_KASUMI_F8
1161 	};
1162 	const enum rte_crypto_auth_algorithm auths[] = {
1163 		RTE_CRYPTO_AUTH_KASUMI_F9
1164 	};
1165 
1166 	rte_cryptodev_info_get(dev_id, &dev_info);
1167 
1168 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1169 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1170 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1171 		RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1172 				"testsuite not met\n");
1173 		return TEST_SKIPPED;
1174 	}
1175 
1176 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1177 			&& check_auth_capabilities_supported(auths,
1178 			RTE_DIM(auths)) != 0) {
1179 		RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1180 				"testsuite not met\n");
1181 		return TEST_SKIPPED;
1182 	}
1183 
1184 	return 0;
1185 }
1186 
1187 static int
1188 negative_aes_gcm_testsuite_setup(void)
1189 {
1190 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1191 	uint8_t dev_id = ts_params->valid_devs[0];
1192 	struct rte_cryptodev_info dev_info;
1193 	const enum rte_crypto_aead_algorithm aeads[] = {
1194 		RTE_CRYPTO_AEAD_AES_GCM
1195 	};
1196 
1197 	rte_cryptodev_info_get(dev_id, &dev_info);
1198 
1199 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1200 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1201 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1202 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1203 				"AES GCM testsuite not met\n");
1204 		return TEST_SKIPPED;
1205 	}
1206 
1207 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1208 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1209 				"AES GCM testsuite not met\n");
1210 		return TEST_SKIPPED;
1211 	}
1212 
1213 	return 0;
1214 }
1215 
1216 static int
1217 negative_aes_gmac_testsuite_setup(void)
1218 {
1219 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1220 	uint8_t dev_id = ts_params->valid_devs[0];
1221 	struct rte_cryptodev_info dev_info;
1222 	const enum rte_crypto_auth_algorithm auths[] = {
1223 		RTE_CRYPTO_AUTH_AES_GMAC
1224 	};
1225 
1226 	rte_cryptodev_info_get(dev_id, &dev_info);
1227 
1228 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1229 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1230 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1231 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1232 				"AES GMAC testsuite not met\n");
1233 		return TEST_SKIPPED;
1234 	}
1235 
1236 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1237 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1238 				"AES GMAC testsuite not met\n");
1239 		return TEST_SKIPPED;
1240 	}
1241 
1242 	return 0;
1243 }
1244 
1245 static int
1246 mixed_cipher_hash_testsuite_setup(void)
1247 {
1248 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1249 	uint8_t dev_id = ts_params->valid_devs[0];
1250 	struct rte_cryptodev_info dev_info;
1251 	uint64_t feat_flags;
1252 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1253 		RTE_CRYPTO_CIPHER_NULL,
1254 		RTE_CRYPTO_CIPHER_AES_CTR,
1255 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
1256 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1257 	};
1258 	const enum rte_crypto_auth_algorithm auths[] = {
1259 		RTE_CRYPTO_AUTH_NULL,
1260 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1261 		RTE_CRYPTO_AUTH_AES_CMAC,
1262 		RTE_CRYPTO_AUTH_ZUC_EIA3
1263 	};
1264 
1265 	rte_cryptodev_info_get(dev_id, &dev_info);
1266 	feat_flags = dev_info.feature_flags;
1267 
1268 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1269 			(global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1270 		RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1271 				"Cipher Hash testsuite not met\n");
1272 		return TEST_SKIPPED;
1273 	}
1274 
1275 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1276 			&& check_auth_capabilities_supported(auths,
1277 			RTE_DIM(auths)) != 0) {
1278 		RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1279 				"Cipher Hash testsuite not met\n");
1280 		return TEST_SKIPPED;
1281 	}
1282 
1283 	return 0;
1284 }
1285 
1286 static int
1287 esn_testsuite_setup(void)
1288 {
1289 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1290 	uint8_t dev_id = ts_params->valid_devs[0];
1291 	struct rte_cryptodev_info dev_info;
1292 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1293 		RTE_CRYPTO_CIPHER_AES_CBC
1294 	};
1295 	const enum rte_crypto_auth_algorithm auths[] = {
1296 		RTE_CRYPTO_AUTH_SHA1_HMAC
1297 	};
1298 
1299 	rte_cryptodev_info_get(dev_id, &dev_info);
1300 
1301 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1302 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1303 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1304 		RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1305 				"testsuite not met\n");
1306 		return TEST_SKIPPED;
1307 	}
1308 
1309 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1310 			&& check_auth_capabilities_supported(auths,
1311 			RTE_DIM(auths)) != 0) {
1312 		RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1313 				"testsuite not met\n");
1314 		return TEST_SKIPPED;
1315 	}
1316 
1317 	return 0;
1318 }
1319 
1320 static int
1321 multi_session_testsuite_setup(void)
1322 {
1323 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1324 	uint8_t dev_id = ts_params->valid_devs[0];
1325 	struct rte_cryptodev_info dev_info;
1326 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1327 		RTE_CRYPTO_CIPHER_AES_CBC
1328 	};
1329 	const enum rte_crypto_auth_algorithm auths[] = {
1330 		RTE_CRYPTO_AUTH_SHA512_HMAC
1331 	};
1332 
1333 	rte_cryptodev_info_get(dev_id, &dev_info);
1334 
1335 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1336 		RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1337 				"Session testsuite not met\n");
1338 		return TEST_SKIPPED;
1339 	}
1340 
1341 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1342 			&& check_auth_capabilities_supported(auths,
1343 			RTE_DIM(auths)) != 0) {
1344 		RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1345 				"Session testsuite not met\n");
1346 		return TEST_SKIPPED;
1347 	}
1348 
1349 	return 0;
1350 }
1351 
1352 static int
1353 negative_hmac_sha1_testsuite_setup(void)
1354 {
1355 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1356 	uint8_t dev_id = ts_params->valid_devs[0];
1357 	struct rte_cryptodev_info dev_info;
1358 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1359 		RTE_CRYPTO_CIPHER_AES_CBC
1360 	};
1361 	const enum rte_crypto_auth_algorithm auths[] = {
1362 		RTE_CRYPTO_AUTH_SHA1_HMAC
1363 	};
1364 
1365 	rte_cryptodev_info_get(dev_id, &dev_info);
1366 
1367 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1368 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1369 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1370 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1371 				"HMAC SHA1 testsuite not met\n");
1372 		return TEST_SKIPPED;
1373 	}
1374 
1375 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1376 			&& check_auth_capabilities_supported(auths,
1377 			RTE_DIM(auths)) != 0) {
1378 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1379 				"HMAC SHA1 testsuite not met\n");
1380 		return TEST_SKIPPED;
1381 	}
1382 
1383 	return 0;
1384 }
1385 
1386 static int
1387 dev_configure_and_start(uint64_t ff_disable)
1388 {
1389 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1390 	struct crypto_unittest_params *ut_params = &unittest_params;
1391 
1392 	uint16_t qp_id;
1393 
1394 	/* Clear unit test parameters before running test */
1395 	memset(ut_params, 0, sizeof(*ut_params));
1396 
1397 	/* Reconfigure device to default parameters */
1398 	ts_params->conf.socket_id = SOCKET_ID_ANY;
1399 	ts_params->conf.ff_disable = ff_disable;
1400 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1401 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
1402 
1403 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1404 			&ts_params->conf),
1405 			"Failed to configure cryptodev %u",
1406 			ts_params->valid_devs[0]);
1407 
1408 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1409 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1410 			ts_params->valid_devs[0], qp_id,
1411 			&ts_params->qp_conf,
1412 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1413 			"Failed to setup queue pair %u on cryptodev %u",
1414 			qp_id, ts_params->valid_devs[0]);
1415 	}
1416 
1417 
1418 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1419 
1420 	/* Start the device */
1421 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1422 			"Failed to start cryptodev %u",
1423 			ts_params->valid_devs[0]);
1424 
1425 	return TEST_SUCCESS;
1426 }
1427 
1428 int
1429 ut_setup(void)
1430 {
1431 	/* Configure and start the device with security feature disabled */
1432 	return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1433 }
1434 
1435 static int
1436 ut_setup_security(void)
1437 {
1438 	/* Configure and start the device with no features disabled */
1439 	return dev_configure_and_start(0);
1440 }
1441 
1442 static int
1443 ut_setup_security_rx_inject(void)
1444 {
1445 	struct rte_mempool *mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
1446 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1447 	struct rte_eth_conf port_conf = {
1448 		.rxmode = {
1449 			.offloads = RTE_ETH_RX_OFFLOAD_CHECKSUM |
1450 				    RTE_ETH_RX_OFFLOAD_SECURITY,
1451 		},
1452 		.txmode = {
1453 			.offloads = RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE,
1454 		},
1455 		.lpbk_mode = 1,  /* Enable loopback */
1456 	};
1457 	struct rte_cryptodev_info dev_info;
1458 	struct rte_eth_rxconf rx_conf = {
1459 		.rx_thresh = {
1460 			.pthresh = 8,
1461 			.hthresh = 8,
1462 			.wthresh = 8,
1463 		},
1464 		.rx_free_thresh = 32,
1465 	};
1466 	uint16_t nb_ports;
1467 	void *sec_ctx;
1468 	int ret;
1469 
1470 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
1471 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY_RX_INJECT) ||
1472 	    !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
1473 		RTE_LOG(INFO, USER1,
1474 			"Feature requirements for IPsec Rx inject test case not met\n");
1475 		return TEST_SKIPPED;
1476 	}
1477 
1478 	sec_ctx = rte_cryptodev_get_sec_ctx(ts_params->valid_devs[0]);
1479 	if (sec_ctx == NULL)
1480 		return TEST_SKIPPED;
1481 
1482 	nb_ports = rte_eth_dev_count_avail();
1483 	if (nb_ports == 0)
1484 		return TEST_SKIPPED;
1485 
1486 	ret = rte_eth_dev_configure(0 /* port_id */,
1487 				    1 /* nb_rx_queue */,
1488 				    0 /* nb_tx_queue */,
1489 				    &port_conf);
1490 	if (ret) {
1491 		printf("Could not configure ethdev port 0 [err=%d]\n", ret);
1492 		return TEST_SKIPPED;
1493 	}
1494 
1495 	/* Rx queue setup */
1496 	ret = rte_eth_rx_queue_setup(0 /* port_id */,
1497 				     0 /* rx_queue_id */,
1498 				     1024 /* nb_rx_desc */,
1499 				     SOCKET_ID_ANY,
1500 				     &rx_conf,
1501 				     mbuf_pool);
1502 	if (ret) {
1503 		printf("Could not setup eth port 0 queue 0\n");
1504 		return TEST_SKIPPED;
1505 	}
1506 
1507 	ret = rte_security_rx_inject_configure(sec_ctx, 0, true);
1508 	if (ret) {
1509 		printf("Could not enable Rx inject offload");
1510 		return TEST_SKIPPED;
1511 	}
1512 
1513 	ret = rte_eth_dev_start(0);
1514 	if (ret) {
1515 		printf("Could not start ethdev");
1516 		return TEST_SKIPPED;
1517 	}
1518 
1519 	ret = rte_eth_promiscuous_enable(0);
1520 	if (ret) {
1521 		printf("Could not enable promiscuous mode");
1522 		return TEST_SKIPPED;
1523 	}
1524 
1525 	/* Configure and start cryptodev with no features disabled */
1526 	return dev_configure_and_start(0);
1527 }
1528 
1529 void
1530 ut_teardown(void)
1531 {
1532 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1533 	struct crypto_unittest_params *ut_params = &unittest_params;
1534 
1535 	/* free crypto session structure */
1536 #ifdef RTE_LIB_SECURITY
1537 	if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1538 		if (ut_params->sec_session) {
1539 			rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1540 						(ts_params->valid_devs[0]),
1541 						ut_params->sec_session);
1542 			ut_params->sec_session = NULL;
1543 		}
1544 	} else
1545 #endif
1546 	{
1547 		if (ut_params->sess) {
1548 			rte_cryptodev_sym_session_free(ts_params->valid_devs[0],
1549 					ut_params->sess);
1550 			ut_params->sess = NULL;
1551 		}
1552 	}
1553 
1554 	/* free crypto operation structure */
1555 	rte_crypto_op_free(ut_params->op);
1556 
1557 	/*
1558 	 * free mbuf - both obuf and ibuf are usually the same,
1559 	 * so check if they point at the same address is necessary,
1560 	 * to avoid freeing the mbuf twice.
1561 	 */
1562 	if (ut_params->obuf) {
1563 		rte_pktmbuf_free(ut_params->obuf);
1564 		if (ut_params->ibuf == ut_params->obuf)
1565 			ut_params->ibuf = 0;
1566 		ut_params->obuf = 0;
1567 	}
1568 	if (ut_params->ibuf) {
1569 		rte_pktmbuf_free(ut_params->ibuf);
1570 		ut_params->ibuf = 0;
1571 	}
1572 
1573 	if (ts_params->mbuf_pool != NULL)
1574 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1575 			rte_mempool_avail_count(ts_params->mbuf_pool));
1576 
1577 	/* Stop the device */
1578 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1579 }
1580 
1581 static void
1582 ut_teardown_rx_inject(void)
1583 {
1584 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1585 	void *sec_ctx;
1586 	int ret;
1587 
1588 	if  (rte_eth_dev_count_avail() != 0) {
1589 		ret = rte_eth_dev_reset(0);
1590 		if (ret)
1591 			printf("Could not reset eth port 0");
1592 
1593 	}
1594 
1595 	ut_teardown();
1596 
1597 	sec_ctx = rte_cryptodev_get_sec_ctx(ts_params->valid_devs[0]);
1598 	if (sec_ctx == NULL)
1599 		return;
1600 
1601 	ret = rte_security_rx_inject_configure(sec_ctx, 0, false);
1602 	if (ret) {
1603 		printf("Could not disable Rx inject offload");
1604 		return;
1605 	}
1606 }
1607 
1608 static int
1609 test_device_configure_invalid_dev_id(void)
1610 {
1611 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1612 	uint16_t dev_id, num_devs = 0;
1613 
1614 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1615 			"Need at least %d devices for test", 1);
1616 
1617 	/* valid dev_id values */
1618 	dev_id = ts_params->valid_devs[0];
1619 
1620 	/* Stop the device in case it's started so it can be configured */
1621 	rte_cryptodev_stop(dev_id);
1622 
1623 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1624 			"Failed test for rte_cryptodev_configure: "
1625 			"invalid dev_num %u", dev_id);
1626 
1627 	/* invalid dev_id values */
1628 	dev_id = num_devs;
1629 
1630 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1631 			"Failed test for rte_cryptodev_configure: "
1632 			"invalid dev_num %u", dev_id);
1633 
1634 	dev_id = 0xff;
1635 
1636 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1637 			"Failed test for rte_cryptodev_configure:"
1638 			"invalid dev_num %u", dev_id);
1639 
1640 	return TEST_SUCCESS;
1641 }
1642 
1643 static int
1644 test_device_configure_invalid_queue_pair_ids(void)
1645 {
1646 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1647 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1648 
1649 	/* Stop the device in case it's started so it can be configured */
1650 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1651 
1652 	/* valid - max value queue pairs */
1653 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1654 
1655 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1656 			&ts_params->conf),
1657 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1658 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1659 
1660 	/* valid - one queue pairs */
1661 	ts_params->conf.nb_queue_pairs = 1;
1662 
1663 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1664 			&ts_params->conf),
1665 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1666 			ts_params->valid_devs[0],
1667 			ts_params->conf.nb_queue_pairs);
1668 
1669 
1670 	/* invalid - zero queue pairs */
1671 	ts_params->conf.nb_queue_pairs = 0;
1672 
1673 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1674 			&ts_params->conf),
1675 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1676 			" invalid qps: %u",
1677 			ts_params->valid_devs[0],
1678 			ts_params->conf.nb_queue_pairs);
1679 
1680 
1681 	/* invalid - max value supported by field queue pairs */
1682 	ts_params->conf.nb_queue_pairs = UINT16_MAX;
1683 
1684 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1685 			&ts_params->conf),
1686 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1687 			" invalid qps: %u",
1688 			ts_params->valid_devs[0],
1689 			ts_params->conf.nb_queue_pairs);
1690 
1691 
1692 	/* invalid - max value + 1 queue pairs */
1693 	ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1694 
1695 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1696 			&ts_params->conf),
1697 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1698 			" invalid qps: %u",
1699 			ts_params->valid_devs[0],
1700 			ts_params->conf.nb_queue_pairs);
1701 
1702 	/* revert to original testsuite value */
1703 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1704 
1705 	return TEST_SUCCESS;
1706 }
1707 
1708 static int
1709 test_queue_pair_descriptor_setup(void)
1710 {
1711 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1712 	struct rte_cryptodev_qp_conf qp_conf = {
1713 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
1714 	};
1715 	uint16_t qp_id;
1716 
1717 	/* Stop the device in case it's started so it can be configured */
1718 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1719 
1720 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1721 			&ts_params->conf),
1722 			"Failed to configure cryptodev %u",
1723 			ts_params->valid_devs[0]);
1724 
1725 	/*
1726 	 * Test various ring sizes on this device. memzones can't be
1727 	 * freed so are re-used if ring is released and re-created.
1728 	 */
1729 	qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1730 	qp_conf.mp_session = ts_params->session_mpool;
1731 
1732 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1733 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1734 				ts_params->valid_devs[0], qp_id, &qp_conf,
1735 				rte_cryptodev_socket_id(
1736 						ts_params->valid_devs[0])),
1737 				"Failed test for "
1738 				"rte_cryptodev_queue_pair_setup: num_inflights "
1739 				"%u on qp %u on cryptodev %u",
1740 				qp_conf.nb_descriptors, qp_id,
1741 				ts_params->valid_devs[0]);
1742 	}
1743 
1744 	qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1745 
1746 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1747 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1748 				ts_params->valid_devs[0], qp_id, &qp_conf,
1749 				rte_cryptodev_socket_id(
1750 						ts_params->valid_devs[0])),
1751 				"Failed test for"
1752 				" rte_cryptodev_queue_pair_setup: num_inflights"
1753 				" %u on qp %u on cryptodev %u",
1754 				qp_conf.nb_descriptors, qp_id,
1755 				ts_params->valid_devs[0]);
1756 	}
1757 
1758 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1759 
1760 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1761 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1762 				ts_params->valid_devs[0], qp_id, &qp_conf,
1763 				rte_cryptodev_socket_id(
1764 						ts_params->valid_devs[0])),
1765 				"Failed test for "
1766 				"rte_cryptodev_queue_pair_setup: num_inflights"
1767 				" %u on qp %u on cryptodev %u",
1768 				qp_conf.nb_descriptors, qp_id,
1769 				ts_params->valid_devs[0]);
1770 	}
1771 
1772 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1773 
1774 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1775 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1776 				ts_params->valid_devs[0], qp_id, &qp_conf,
1777 				rte_cryptodev_socket_id(
1778 						ts_params->valid_devs[0])),
1779 				"Failed test for"
1780 				" rte_cryptodev_queue_pair_setup:"
1781 				"num_inflights %u on qp %u on cryptodev %u",
1782 				qp_conf.nb_descriptors, qp_id,
1783 				ts_params->valid_devs[0]);
1784 	}
1785 
1786 	/* test invalid queue pair id */
1787 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;	/*valid */
1788 
1789 	qp_id = ts_params->conf.nb_queue_pairs;		/*invalid */
1790 
1791 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1792 			ts_params->valid_devs[0],
1793 			qp_id, &qp_conf,
1794 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1795 			"Failed test for rte_cryptodev_queue_pair_setup:"
1796 			"invalid qp %u on cryptodev %u",
1797 			qp_id, ts_params->valid_devs[0]);
1798 
1799 	qp_id = 0xffff; /*invalid*/
1800 
1801 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1802 			ts_params->valid_devs[0],
1803 			qp_id, &qp_conf,
1804 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1805 			"Failed test for rte_cryptodev_queue_pair_setup:"
1806 			"invalid qp %u on cryptodev %u",
1807 			qp_id, ts_params->valid_devs[0]);
1808 
1809 	return TEST_SUCCESS;
1810 }
1811 
1812 /* ***** Plaintext data for tests ***** */
1813 
1814 const char catch_22_quote_1[] =
1815 		"There was only one catch and that was Catch-22, which "
1816 		"specified that a concern for one's safety in the face of "
1817 		"dangers that were real and immediate was the process of a "
1818 		"rational mind. Orr was crazy and could be grounded. All he "
1819 		"had to do was ask; and as soon as he did, he would no longer "
1820 		"be crazy and would have to fly more missions. Orr would be "
1821 		"crazy to fly more missions and sane if he didn't, but if he "
1822 		"was sane he had to fly them. If he flew them he was crazy "
1823 		"and didn't have to; but if he didn't want to he was sane and "
1824 		"had to. Yossarian was moved very deeply by the absolute "
1825 		"simplicity of this clause of Catch-22 and let out a "
1826 		"respectful whistle. \"That's some catch, that Catch-22\", he "
1827 		"observed. \"It's the best there is,\" Doc Daneeka agreed.";
1828 
1829 const char catch_22_quote[] =
1830 		"What a lousy earth! He wondered how many people were "
1831 		"destitute that same night even in his own prosperous country, "
1832 		"how many homes were shanties, how many husbands were drunk "
1833 		"and wives socked, and how many children were bullied, abused, "
1834 		"or abandoned. How many families hungered for food they could "
1835 		"not afford to buy? How many hearts were broken? How many "
1836 		"suicides would take place that same night, how many people "
1837 		"would go insane? How many cockroaches and landlords would "
1838 		"triumph? How many winners were losers, successes failures, "
1839 		"and rich men poor men? How many wise guys were stupid? How "
1840 		"many happy endings were unhappy endings? How many honest men "
1841 		"were liars, brave men cowards, loyal men traitors, how many "
1842 		"sainted men were corrupt, how many people in positions of "
1843 		"trust had sold their souls to bodyguards, how many had never "
1844 		"had souls? How many straight-and-narrow paths were crooked "
1845 		"paths? How many best families were worst families and how "
1846 		"many good people were bad people? When you added them all up "
1847 		"and then subtracted, you might be left with only the children, "
1848 		"and perhaps with Albert Einstein and an old violinist or "
1849 		"sculptor somewhere.";
1850 
1851 #define QUOTE_480_BYTES		(480)
1852 #define QUOTE_512_BYTES		(512)
1853 #define QUOTE_768_BYTES		(768)
1854 #define QUOTE_1024_BYTES	(1024)
1855 
1856 
1857 
1858 /* ***** SHA1 Hash Tests ***** */
1859 
1860 #define HMAC_KEY_LENGTH_SHA1	(DIGEST_BYTE_LENGTH_SHA1)
1861 
1862 static uint8_t hmac_sha1_key[] = {
1863 	0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1864 	0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1865 	0xDE, 0xF4, 0xDE, 0xAD };
1866 
1867 /* ***** SHA224 Hash Tests ***** */
1868 
1869 #define HMAC_KEY_LENGTH_SHA224	(DIGEST_BYTE_LENGTH_SHA224)
1870 
1871 
1872 /* ***** AES-CBC Cipher Tests ***** */
1873 
1874 #define CIPHER_KEY_LENGTH_AES_CBC	(16)
1875 #define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
1876 
1877 static uint8_t aes_cbc_key[] = {
1878 	0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1879 	0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1880 
1881 static uint8_t aes_cbc_iv[] = {
1882 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1883 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1884 
1885 
1886 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1887 
1888 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1889 	0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1890 	0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1891 	0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1892 	0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1893 	0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1894 	0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1895 	0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1896 	0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1897 	0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1898 	0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1899 	0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1900 	0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1901 	0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1902 	0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1903 	0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1904 	0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1905 	0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1906 	0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1907 	0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1908 	0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1909 	0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1910 	0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1911 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1912 	0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1913 	0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1914 	0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1915 	0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1916 	0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1917 	0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1918 	0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1919 	0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1920 	0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1921 	0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1922 	0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1923 	0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1924 	0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1925 	0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1926 	0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1927 	0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1928 	0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1929 	0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1930 	0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1931 	0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1932 	0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1933 	0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1934 	0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1935 	0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1936 	0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1937 	0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1938 	0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1939 	0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1940 	0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1941 	0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1942 	0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1943 	0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1944 	0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1945 	0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1946 	0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1947 	0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1948 	0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1949 	0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1950 	0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1951 	0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1952 	0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1953 };
1954 
1955 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1956 	0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1957 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1958 	0x18, 0x8c, 0x1d, 0x32
1959 };
1960 
1961 
1962 /* Multisession Vector context Test */
1963 /*Begin Session 0 */
1964 static uint8_t ms_aes_cbc_key0[] = {
1965 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1966 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1967 };
1968 
1969 static uint8_t ms_aes_cbc_iv0[] = {
1970 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1971 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1972 };
1973 
1974 static const uint8_t ms_aes_cbc_cipher0[] = {
1975 		0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1976 		0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1977 		0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1978 		0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1979 		0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1980 		0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1981 		0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1982 		0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1983 		0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1984 		0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1985 		0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1986 		0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1987 		0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1988 		0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1989 		0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1990 		0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1991 		0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1992 		0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1993 		0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1994 		0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1995 		0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1996 		0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1997 		0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1998 		0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1999 		0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
2000 		0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
2001 		0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
2002 		0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
2003 		0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
2004 		0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
2005 		0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
2006 		0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
2007 		0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
2008 		0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
2009 		0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
2010 		0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
2011 		0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
2012 		0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
2013 		0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
2014 		0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
2015 		0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
2016 		0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
2017 		0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
2018 		0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
2019 		0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
2020 		0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
2021 		0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
2022 		0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
2023 		0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
2024 		0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
2025 		0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
2026 		0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
2027 		0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
2028 		0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
2029 		0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
2030 		0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
2031 		0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
2032 		0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
2033 		0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
2034 		0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
2035 		0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
2036 		0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
2037 		0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
2038 		0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
2039 };
2040 
2041 
2042 static  uint8_t ms_hmac_key0[] = {
2043 		0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2044 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2045 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2046 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2047 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2048 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2049 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2050 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2051 };
2052 
2053 static const uint8_t ms_hmac_digest0[] = {
2054 		0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
2055 		0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
2056 		0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
2057 		0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
2058 		0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
2059 		0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
2060 		0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
2061 		0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
2062 		};
2063 
2064 /* End Session 0 */
2065 /* Begin session 1 */
2066 
2067 static  uint8_t ms_aes_cbc_key1[] = {
2068 		0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2069 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2070 };
2071 
2072 static  uint8_t ms_aes_cbc_iv1[] = {
2073 	0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2074 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2075 };
2076 
2077 static const uint8_t ms_aes_cbc_cipher1[] = {
2078 		0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
2079 		0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
2080 		0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
2081 		0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
2082 		0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
2083 		0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
2084 		0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
2085 		0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
2086 		0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
2087 		0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
2088 		0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
2089 		0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
2090 		0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
2091 		0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
2092 		0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
2093 		0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
2094 		0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
2095 		0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
2096 		0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
2097 		0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
2098 		0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
2099 		0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
2100 		0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
2101 		0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
2102 		0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
2103 		0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
2104 		0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
2105 		0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
2106 		0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
2107 		0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
2108 		0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
2109 		0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
2110 		0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
2111 		0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
2112 		0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
2113 		0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
2114 		0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
2115 		0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
2116 		0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
2117 		0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
2118 		0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
2119 		0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
2120 		0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
2121 		0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
2122 		0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
2123 		0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
2124 		0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
2125 		0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
2126 		0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
2127 		0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
2128 		0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
2129 		0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
2130 		0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
2131 		0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
2132 		0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
2133 		0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
2134 		0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
2135 		0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
2136 		0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
2137 		0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
2138 		0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
2139 		0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
2140 		0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
2141 		0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
2142 
2143 };
2144 
2145 static uint8_t ms_hmac_key1[] = {
2146 		0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2147 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2148 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2149 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2150 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2151 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2152 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2153 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2154 };
2155 
2156 static const uint8_t ms_hmac_digest1[] = {
2157 		0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
2158 		0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
2159 		0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
2160 		0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
2161 		0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
2162 		0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
2163 		0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
2164 		0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
2165 };
2166 /* End Session 1  */
2167 /* Begin Session 2 */
2168 static  uint8_t ms_aes_cbc_key2[] = {
2169 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2170 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2171 };
2172 
2173 static  uint8_t ms_aes_cbc_iv2[] = {
2174 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2175 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2176 };
2177 
2178 static const uint8_t ms_aes_cbc_cipher2[] = {
2179 		0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
2180 		0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
2181 		0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
2182 		0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
2183 		0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
2184 		0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
2185 		0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
2186 		0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
2187 		0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
2188 		0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
2189 		0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
2190 		0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
2191 		0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
2192 		0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
2193 		0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
2194 		0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
2195 		0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
2196 		0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
2197 		0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
2198 		0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
2199 		0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
2200 		0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
2201 		0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
2202 		0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
2203 		0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
2204 		0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
2205 		0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
2206 		0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
2207 		0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
2208 		0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
2209 		0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
2210 		0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
2211 		0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
2212 		0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
2213 		0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
2214 		0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
2215 		0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
2216 		0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
2217 		0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
2218 		0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
2219 		0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
2220 		0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
2221 		0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
2222 		0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
2223 		0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
2224 		0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
2225 		0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2226 		0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2227 		0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2228 		0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2229 		0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2230 		0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2231 		0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2232 		0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2233 		0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2234 		0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2235 		0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2236 		0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2237 		0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2238 		0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2239 		0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2240 		0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2241 		0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2242 		0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2243 };
2244 
2245 static  uint8_t ms_hmac_key2[] = {
2246 		0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2247 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2248 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2249 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2250 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2251 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2252 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2253 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2254 };
2255 
2256 static const uint8_t ms_hmac_digest2[] = {
2257 		0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2258 		0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2259 		0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2260 		0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2261 		0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2262 		0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2263 		0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2264 		0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2265 };
2266 
2267 /* End Session 2 */
2268 
2269 
2270 static int
2271 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2272 {
2273 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2274 	struct crypto_unittest_params *ut_params = &unittest_params;
2275 	/* Verify the capabilities */
2276 	struct rte_cryptodev_sym_capability_idx cap_idx;
2277 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2278 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2279 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2280 			&cap_idx) == NULL)
2281 		return TEST_SKIPPED;
2282 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2283 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2284 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2285 			&cap_idx) == NULL)
2286 		return TEST_SKIPPED;
2287 
2288 	/* Generate test mbuf data and space for digest */
2289 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2290 			catch_22_quote,	QUOTE_512_BYTES, 0);
2291 
2292 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2293 			DIGEST_BYTE_LENGTH_SHA1);
2294 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2295 
2296 	/* Setup Cipher Parameters */
2297 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2298 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2299 
2300 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2301 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2302 	ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2303 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2304 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2305 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2306 
2307 	/* Setup HMAC Parameters */
2308 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2309 
2310 	ut_params->auth_xform.next = NULL;
2311 
2312 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2313 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2314 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2315 	ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2316 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2317 
2318 	rte_errno = 0;
2319 	ut_params->sess = rte_cryptodev_sym_session_create(
2320 			ts_params->valid_devs[0], &ut_params->cipher_xform,
2321 			ts_params->session_mpool);
2322 	if (rte_errno == ENOTSUP)
2323 		return TEST_SKIPPED;
2324 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2325 
2326 	/* Generate crypto op data structure */
2327 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2328 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2329 	TEST_ASSERT_NOT_NULL(ut_params->op,
2330 			"Failed to allocate symmetric crypto operation struct");
2331 
2332 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2333 
2334 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2335 
2336 	/* set crypto operation source mbuf */
2337 	sym_op->m_src = ut_params->ibuf;
2338 
2339 	/* Set crypto operation authentication parameters */
2340 	sym_op->auth.digest.data = ut_params->digest;
2341 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2342 			ut_params->ibuf, QUOTE_512_BYTES);
2343 
2344 	sym_op->auth.data.offset = 0;
2345 	sym_op->auth.data.length = QUOTE_512_BYTES;
2346 
2347 	/* Copy IV at the end of the crypto operation */
2348 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2349 			aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2350 
2351 	/* Set crypto operation cipher parameters */
2352 	sym_op->cipher.data.offset = 0;
2353 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2354 
2355 	/* Process crypto operation */
2356 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2357 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2358 			ut_params->op);
2359 	else
2360 		TEST_ASSERT_NOT_NULL(
2361 			process_crypto_request(ts_params->valid_devs[0],
2362 				ut_params->op),
2363 				"failed to process sym crypto op");
2364 
2365 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2366 			"crypto op processing failed");
2367 
2368 	/* Validate obuf */
2369 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2370 			uint8_t *);
2371 
2372 	TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2373 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2374 			QUOTE_512_BYTES,
2375 			"ciphertext data not as expected");
2376 
2377 	uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2378 
2379 	TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2380 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2381 			gbl_driver_id == rte_cryptodev_driver_id_get(
2382 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2383 					TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2384 					DIGEST_BYTE_LENGTH_SHA1,
2385 			"Generated digest data not as expected");
2386 
2387 	return TEST_SUCCESS;
2388 }
2389 
2390 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2391 
2392 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
2393 
2394 static uint8_t hmac_sha512_key[] = {
2395 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2396 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2397 	0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2398 	0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2399 	0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2400 	0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2401 	0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2402 	0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2403 
2404 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2405 	0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2406 	0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2407 	0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2408 	0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2409 	0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2410 	0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2411 	0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2412 	0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2413 
2414 
2415 
2416 static int
2417 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2418 		struct crypto_unittest_params *ut_params,
2419 		uint8_t *cipher_key,
2420 		uint8_t *hmac_key);
2421 
2422 static int
2423 test_AES_CBC_HMAC_SHA512_decrypt_perform(void *sess,
2424 		struct crypto_unittest_params *ut_params,
2425 		struct crypto_testsuite_params *ts_params,
2426 		const uint8_t *cipher,
2427 		const uint8_t *digest,
2428 		const uint8_t *iv);
2429 
2430 
2431 static int
2432 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2433 		struct crypto_unittest_params *ut_params,
2434 		uint8_t *cipher_key,
2435 		uint8_t *hmac_key)
2436 {
2437 
2438 	/* Setup Cipher Parameters */
2439 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2440 	ut_params->cipher_xform.next = NULL;
2441 
2442 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2443 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2444 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2445 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2446 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2447 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2448 
2449 	/* Setup HMAC Parameters */
2450 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2451 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2452 
2453 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2454 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2455 	ut_params->auth_xform.auth.key.data = hmac_key;
2456 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2457 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2458 
2459 	return TEST_SUCCESS;
2460 }
2461 
2462 
2463 static int
2464 test_AES_CBC_HMAC_SHA512_decrypt_perform(void *sess,
2465 		struct crypto_unittest_params *ut_params,
2466 		struct crypto_testsuite_params *ts_params,
2467 		const uint8_t *cipher,
2468 		const uint8_t *digest,
2469 		const uint8_t *iv)
2470 {
2471 	int ret;
2472 
2473 	/* Generate test mbuf data and digest */
2474 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2475 			(const char *)
2476 			cipher,
2477 			QUOTE_512_BYTES, 0);
2478 
2479 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2480 			DIGEST_BYTE_LENGTH_SHA512);
2481 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2482 
2483 	rte_memcpy(ut_params->digest,
2484 			digest,
2485 			DIGEST_BYTE_LENGTH_SHA512);
2486 
2487 	/* Generate Crypto op data structure */
2488 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2489 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2490 	TEST_ASSERT_NOT_NULL(ut_params->op,
2491 			"Failed to allocate symmetric crypto operation struct");
2492 
2493 	rte_crypto_op_attach_sym_session(ut_params->op, sess);
2494 
2495 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2496 
2497 	/* set crypto operation source mbuf */
2498 	sym_op->m_src = ut_params->ibuf;
2499 
2500 	sym_op->auth.digest.data = ut_params->digest;
2501 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2502 			ut_params->ibuf, QUOTE_512_BYTES);
2503 
2504 	sym_op->auth.data.offset = 0;
2505 	sym_op->auth.data.length = QUOTE_512_BYTES;
2506 
2507 	/* Copy IV at the end of the crypto operation */
2508 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2509 			iv, CIPHER_IV_LENGTH_AES_CBC);
2510 
2511 	sym_op->cipher.data.offset = 0;
2512 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2513 
2514 	/* Process crypto operation */
2515 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2516 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2517 			ut_params->op);
2518 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
2519 		ret = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 0, 0);
2520 		if (ret != TEST_SUCCESS)
2521 			return ret;
2522 	} else
2523 		TEST_ASSERT_NOT_NULL(
2524 				process_crypto_request(ts_params->valid_devs[0],
2525 					ut_params->op),
2526 					"failed to process sym crypto op");
2527 
2528 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2529 			"crypto op processing failed");
2530 
2531 	ut_params->obuf = ut_params->op->sym->m_src;
2532 
2533 	/* Validate obuf */
2534 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2535 			rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2536 			catch_22_quote,
2537 			QUOTE_512_BYTES,
2538 			"Plaintext data not as expected");
2539 
2540 	/* Validate obuf */
2541 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2542 			"Digest verification failed");
2543 
2544 	return TEST_SUCCESS;
2545 }
2546 
2547 /* ***** SNOW 3G Tests ***** */
2548 static int
2549 create_wireless_algo_hash_session(uint8_t dev_id,
2550 	const uint8_t *key, const uint8_t key_len,
2551 	const uint8_t iv_len, const uint8_t auth_len,
2552 	enum rte_crypto_auth_operation op,
2553 	enum rte_crypto_auth_algorithm algo)
2554 {
2555 	uint8_t hash_key[key_len];
2556 
2557 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2558 	struct crypto_unittest_params *ut_params = &unittest_params;
2559 
2560 	memcpy(hash_key, key, key_len);
2561 
2562 	debug_hexdump(stdout, "key:", key, key_len);
2563 
2564 	/* Setup Authentication Parameters */
2565 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2566 	ut_params->auth_xform.next = NULL;
2567 
2568 	ut_params->auth_xform.auth.op = op;
2569 	ut_params->auth_xform.auth.algo = algo;
2570 	ut_params->auth_xform.auth.key.length = key_len;
2571 	ut_params->auth_xform.auth.key.data = hash_key;
2572 	ut_params->auth_xform.auth.digest_length = auth_len;
2573 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2574 	ut_params->auth_xform.auth.iv.length = iv_len;
2575 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
2576 			&ut_params->auth_xform, ts_params->session_mpool);
2577 	if (ut_params->sess == NULL && rte_errno == ENOTSUP)
2578 		return TEST_SKIPPED;
2579 
2580 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2581 	return 0;
2582 }
2583 
2584 static int
2585 create_wireless_algo_cipher_session(uint8_t dev_id,
2586 			enum rte_crypto_cipher_operation op,
2587 			enum rte_crypto_cipher_algorithm algo,
2588 			const uint8_t *key, const uint8_t key_len,
2589 			uint8_t iv_len)
2590 {
2591 	uint8_t cipher_key[key_len];
2592 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2593 	struct crypto_unittest_params *ut_params = &unittest_params;
2594 
2595 	memcpy(cipher_key, key, key_len);
2596 
2597 	/* Setup Cipher Parameters */
2598 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2599 	ut_params->cipher_xform.next = NULL;
2600 
2601 	ut_params->cipher_xform.cipher.algo = algo;
2602 	ut_params->cipher_xform.cipher.op = op;
2603 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2604 	ut_params->cipher_xform.cipher.key.length = key_len;
2605 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2606 	ut_params->cipher_xform.cipher.iv.length = iv_len;
2607 
2608 	debug_hexdump(stdout, "key:", key, key_len);
2609 
2610 	/* Create Crypto session */
2611 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
2612 			&ut_params->cipher_xform, ts_params->session_mpool);
2613 
2614 	if (ut_params->sess == NULL && rte_errno == ENOTSUP)
2615 		return TEST_SKIPPED;
2616 
2617 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2618 	return 0;
2619 }
2620 
2621 static int
2622 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2623 			unsigned int cipher_len,
2624 			unsigned int cipher_offset)
2625 {
2626 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2627 	struct crypto_unittest_params *ut_params = &unittest_params;
2628 
2629 	/* Generate Crypto op data structure */
2630 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2631 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2632 	TEST_ASSERT_NOT_NULL(ut_params->op,
2633 				"Failed to allocate pktmbuf offload");
2634 
2635 	/* Set crypto operation data parameters */
2636 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2637 
2638 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2639 
2640 	/* set crypto operation source mbuf */
2641 	sym_op->m_src = ut_params->ibuf;
2642 
2643 	/* iv */
2644 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2645 			iv, iv_len);
2646 	sym_op->cipher.data.length = cipher_len;
2647 	sym_op->cipher.data.offset = cipher_offset;
2648 	return 0;
2649 }
2650 
2651 static int
2652 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2653 			unsigned int cipher_len,
2654 			unsigned int cipher_offset)
2655 {
2656 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2657 	struct crypto_unittest_params *ut_params = &unittest_params;
2658 
2659 	/* Generate Crypto op data structure */
2660 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2661 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2662 	TEST_ASSERT_NOT_NULL(ut_params->op,
2663 				"Failed to allocate pktmbuf offload");
2664 
2665 	/* Set crypto operation data parameters */
2666 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2667 
2668 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2669 
2670 	/* set crypto operation source mbuf */
2671 	sym_op->m_src = ut_params->ibuf;
2672 	sym_op->m_dst = ut_params->obuf;
2673 
2674 	/* iv */
2675 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2676 			iv, iv_len);
2677 	sym_op->cipher.data.length = cipher_len;
2678 	sym_op->cipher.data.offset = cipher_offset;
2679 	return 0;
2680 }
2681 
2682 static int
2683 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2684 		enum rte_crypto_cipher_operation cipher_op,
2685 		enum rte_crypto_auth_operation auth_op,
2686 		enum rte_crypto_auth_algorithm auth_algo,
2687 		enum rte_crypto_cipher_algorithm cipher_algo,
2688 		const uint8_t *a_key, uint8_t a_key_len,
2689 		const uint8_t *c_key, uint8_t c_key_len,
2690 		uint8_t auth_iv_len, uint8_t auth_len,
2691 		uint8_t cipher_iv_len)
2692 
2693 {
2694 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2695 	struct crypto_unittest_params *ut_params = &unittest_params;
2696 
2697 	/* Setup Authentication Parameters */
2698 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2699 	ut_params->auth_xform.next = NULL;
2700 
2701 	ut_params->auth_xform.auth.op = auth_op;
2702 	ut_params->auth_xform.auth.algo = auth_algo;
2703 	ut_params->auth_xform.auth.key.length = a_key_len;
2704 	ut_params->auth_xform.auth.key.data = a_key;
2705 	ut_params->auth_xform.auth.digest_length = auth_len;
2706 	/* Auth IV will be after cipher IV */
2707 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2708 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2709 
2710 	/* Setup Cipher Parameters */
2711 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2712 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2713 
2714 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2715 	ut_params->cipher_xform.cipher.op = cipher_op;
2716 	ut_params->cipher_xform.cipher.key.data = c_key;
2717 	ut_params->cipher_xform.cipher.key.length = c_key_len;
2718 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2719 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2720 
2721 	debug_hexdump(stdout, "Auth key:", a_key, c_key_len);
2722 	debug_hexdump(stdout, "Cipher key:", c_key, c_key_len);
2723 
2724 	/* Create Crypto session*/
2725 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
2726 			&ut_params->cipher_xform, ts_params->session_mpool);
2727 	if (ut_params->sess == NULL && rte_errno == ENOTSUP)
2728 		return TEST_SKIPPED;
2729 
2730 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2731 	return 0;
2732 }
2733 
2734 static int
2735 create_wireless_cipher_auth_session(uint8_t dev_id,
2736 		enum rte_crypto_cipher_operation cipher_op,
2737 		enum rte_crypto_auth_operation auth_op,
2738 		enum rte_crypto_auth_algorithm auth_algo,
2739 		enum rte_crypto_cipher_algorithm cipher_algo,
2740 		const struct wireless_test_data *tdata)
2741 {
2742 	const uint8_t key_len = tdata->key.len;
2743 	uint8_t cipher_auth_key[key_len];
2744 
2745 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2746 	struct crypto_unittest_params *ut_params = &unittest_params;
2747 	const uint8_t *key = tdata->key.data;
2748 	const uint8_t auth_len = tdata->digest.len;
2749 	uint8_t cipher_iv_len = tdata->cipher_iv.len;
2750 	uint8_t auth_iv_len = tdata->auth_iv.len;
2751 
2752 	memcpy(cipher_auth_key, key, key_len);
2753 
2754 	/* Setup Authentication Parameters */
2755 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2756 	ut_params->auth_xform.next = NULL;
2757 
2758 	ut_params->auth_xform.auth.op = auth_op;
2759 	ut_params->auth_xform.auth.algo = auth_algo;
2760 	ut_params->auth_xform.auth.key.length = key_len;
2761 	/* Hash key = cipher key */
2762 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2763 	ut_params->auth_xform.auth.digest_length = auth_len;
2764 	/* Auth IV will be after cipher IV */
2765 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2766 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2767 
2768 	/* Setup Cipher Parameters */
2769 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2770 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2771 
2772 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2773 	ut_params->cipher_xform.cipher.op = cipher_op;
2774 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2775 	ut_params->cipher_xform.cipher.key.length = key_len;
2776 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2777 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2778 
2779 
2780 	debug_hexdump(stdout, "key:", key, key_len);
2781 
2782 	/* Create Crypto session*/
2783 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
2784 			&ut_params->cipher_xform, ts_params->session_mpool);
2785 	if (ut_params->sess == NULL && rte_errno == ENOTSUP)
2786 		return TEST_SKIPPED;
2787 
2788 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2789 	return 0;
2790 }
2791 
2792 static int
2793 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2794 		const struct wireless_test_data *tdata)
2795 {
2796 	return create_wireless_cipher_auth_session(dev_id,
2797 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2798 		RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2799 		RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2800 }
2801 
2802 static int
2803 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2804 		enum rte_crypto_cipher_operation cipher_op,
2805 		enum rte_crypto_auth_operation auth_op,
2806 		enum rte_crypto_auth_algorithm auth_algo,
2807 		enum rte_crypto_cipher_algorithm cipher_algo,
2808 		const uint8_t *a_key, const uint8_t a_key_len,
2809 		const uint8_t *c_key, const uint8_t c_key_len,
2810 		uint8_t auth_iv_len, uint8_t auth_len,
2811 		uint8_t cipher_iv_len)
2812 {
2813 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2814 	struct crypto_unittest_params *ut_params = &unittest_params;
2815 
2816 	/* Setup Authentication Parameters */
2817 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2818 	ut_params->auth_xform.auth.op = auth_op;
2819 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2820 	ut_params->auth_xform.auth.algo = auth_algo;
2821 	ut_params->auth_xform.auth.key.length = a_key_len;
2822 	ut_params->auth_xform.auth.key.data = a_key;
2823 	ut_params->auth_xform.auth.digest_length = auth_len;
2824 	/* Auth IV will be after cipher IV */
2825 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2826 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2827 
2828 	/* Setup Cipher Parameters */
2829 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2830 	ut_params->cipher_xform.next = NULL;
2831 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2832 	ut_params->cipher_xform.cipher.op = cipher_op;
2833 	ut_params->cipher_xform.cipher.key.data = c_key;
2834 	ut_params->cipher_xform.cipher.key.length = c_key_len;
2835 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2836 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2837 
2838 	debug_hexdump(stdout, "Auth key:", a_key, a_key_len);
2839 	debug_hexdump(stdout, "Cipher key:", c_key, c_key_len);
2840 
2841 	/* Create Crypto session*/
2842 	if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2843 		ut_params->auth_xform.next = NULL;
2844 		ut_params->cipher_xform.next = &ut_params->auth_xform;
2845 		ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
2846 			&ut_params->cipher_xform, ts_params->session_mpool);
2847 	} else
2848 		ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
2849 			&ut_params->auth_xform, ts_params->session_mpool);
2850 
2851 	if (ut_params->sess == NULL && rte_errno == ENOTSUP)
2852 		return TEST_SKIPPED;
2853 
2854 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2855 
2856 	return 0;
2857 }
2858 
2859 static int
2860 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2861 		unsigned int auth_tag_len,
2862 		const uint8_t *iv, unsigned int iv_len,
2863 		unsigned int data_pad_len,
2864 		enum rte_crypto_auth_operation op,
2865 		unsigned int auth_len, unsigned int auth_offset)
2866 {
2867 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2868 
2869 	struct crypto_unittest_params *ut_params = &unittest_params;
2870 
2871 	/* Generate Crypto op data structure */
2872 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2873 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2874 	TEST_ASSERT_NOT_NULL(ut_params->op,
2875 		"Failed to allocate pktmbuf offload");
2876 
2877 	/* Set crypto operation data parameters */
2878 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2879 
2880 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2881 
2882 	/* set crypto operation source mbuf */
2883 	sym_op->m_src = ut_params->ibuf;
2884 
2885 	/* iv */
2886 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2887 			iv, iv_len);
2888 	/* digest */
2889 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2890 					ut_params->ibuf, auth_tag_len);
2891 
2892 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2893 				"no room to append auth tag");
2894 	ut_params->digest = sym_op->auth.digest.data;
2895 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2896 			ut_params->ibuf, data_pad_len);
2897 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2898 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2899 	else
2900 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2901 
2902 	debug_hexdump(stdout, "digest:",
2903 		sym_op->auth.digest.data,
2904 		auth_tag_len);
2905 
2906 	sym_op->auth.data.length = auth_len;
2907 	sym_op->auth.data.offset = auth_offset;
2908 
2909 	return 0;
2910 }
2911 
2912 static int
2913 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2914 	enum rte_crypto_auth_operation op)
2915 {
2916 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2917 	struct crypto_unittest_params *ut_params = &unittest_params;
2918 
2919 	const uint8_t *auth_tag = tdata->digest.data;
2920 	const unsigned int auth_tag_len = tdata->digest.len;
2921 	unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2922 	unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2923 
2924 	const uint8_t *cipher_iv = tdata->cipher_iv.data;
2925 	const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2926 	const uint8_t *auth_iv = tdata->auth_iv.data;
2927 	const uint8_t auth_iv_len = tdata->auth_iv.len;
2928 	const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2929 	const unsigned int auth_len = tdata->validAuthLenInBits.len;
2930 
2931 	/* Generate Crypto op data structure */
2932 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2933 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2934 	TEST_ASSERT_NOT_NULL(ut_params->op,
2935 			"Failed to allocate pktmbuf offload");
2936 	/* Set crypto operation data parameters */
2937 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2938 
2939 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2940 
2941 	/* set crypto operation source mbuf */
2942 	sym_op->m_src = ut_params->ibuf;
2943 
2944 	/* digest */
2945 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2946 			ut_params->ibuf, auth_tag_len);
2947 
2948 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2949 			"no room to append auth tag");
2950 	ut_params->digest = sym_op->auth.digest.data;
2951 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2952 			ut_params->ibuf, data_pad_len);
2953 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2954 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2955 	else
2956 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2957 
2958 	debug_hexdump(stdout, "digest:",
2959 		sym_op->auth.digest.data,
2960 		auth_tag_len);
2961 
2962 	/* Copy cipher and auth IVs at the end of the crypto operation */
2963 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2964 						IV_OFFSET);
2965 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2966 	iv_ptr += cipher_iv_len;
2967 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2968 
2969 	sym_op->cipher.data.length = cipher_len;
2970 	sym_op->cipher.data.offset = 0;
2971 	sym_op->auth.data.length = auth_len;
2972 	sym_op->auth.data.offset = 0;
2973 
2974 	return 0;
2975 }
2976 
2977 static int
2978 create_zuc_cipher_hash_generate_operation(
2979 		const struct wireless_test_data *tdata)
2980 {
2981 	return create_wireless_cipher_hash_operation(tdata,
2982 		RTE_CRYPTO_AUTH_OP_GENERATE);
2983 }
2984 
2985 static int
2986 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2987 		const unsigned auth_tag_len,
2988 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2989 		unsigned data_pad_len,
2990 		enum rte_crypto_auth_operation op,
2991 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2992 		const unsigned cipher_len, const unsigned cipher_offset,
2993 		const unsigned auth_len, const unsigned auth_offset)
2994 {
2995 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2996 	struct crypto_unittest_params *ut_params = &unittest_params;
2997 
2998 	enum rte_crypto_cipher_algorithm cipher_algo =
2999 			ut_params->cipher_xform.cipher.algo;
3000 	enum rte_crypto_auth_algorithm auth_algo =
3001 			ut_params->auth_xform.auth.algo;
3002 
3003 	/* Generate Crypto op data structure */
3004 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
3005 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
3006 	TEST_ASSERT_NOT_NULL(ut_params->op,
3007 			"Failed to allocate pktmbuf offload");
3008 	/* Set crypto operation data parameters */
3009 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
3010 
3011 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
3012 
3013 	/* set crypto operation source mbuf */
3014 	sym_op->m_src = ut_params->ibuf;
3015 
3016 	/* digest */
3017 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
3018 			ut_params->ibuf, auth_tag_len);
3019 
3020 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
3021 			"no room to append auth tag");
3022 	ut_params->digest = sym_op->auth.digest.data;
3023 
3024 	if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
3025 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
3026 				ut_params->ibuf, data_pad_len);
3027 	} else {
3028 		struct rte_mbuf *m = ut_params->ibuf;
3029 		unsigned int offset = data_pad_len;
3030 
3031 		while (offset > m->data_len && m->next != NULL) {
3032 			offset -= m->data_len;
3033 			m = m->next;
3034 		}
3035 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
3036 			m, offset);
3037 	}
3038 
3039 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
3040 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
3041 	else
3042 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
3043 
3044 	debug_hexdump(stdout, "digest:",
3045 		sym_op->auth.digest.data,
3046 		auth_tag_len);
3047 
3048 	/* Copy cipher and auth IVs at the end of the crypto operation */
3049 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
3050 						IV_OFFSET);
3051 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3052 	iv_ptr += cipher_iv_len;
3053 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3054 
3055 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3056 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3057 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3058 		sym_op->cipher.data.length = cipher_len;
3059 		sym_op->cipher.data.offset = cipher_offset;
3060 	} else {
3061 		sym_op->cipher.data.length = cipher_len >> 3;
3062 		sym_op->cipher.data.offset = cipher_offset >> 3;
3063 	}
3064 
3065 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3066 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3067 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3068 		sym_op->auth.data.length = auth_len;
3069 		sym_op->auth.data.offset = auth_offset;
3070 	} else {
3071 		sym_op->auth.data.length = auth_len >> 3;
3072 		sym_op->auth.data.offset = auth_offset >> 3;
3073 	}
3074 
3075 	return 0;
3076 }
3077 
3078 static int
3079 create_wireless_algo_auth_cipher_operation(
3080 		const uint8_t *auth_tag, unsigned int auth_tag_len,
3081 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
3082 		const uint8_t *auth_iv, uint8_t auth_iv_len,
3083 		unsigned int data_pad_len,
3084 		unsigned int cipher_len, unsigned int cipher_offset,
3085 		unsigned int auth_len, unsigned int auth_offset,
3086 		uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
3087 {
3088 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3089 	struct crypto_unittest_params *ut_params = &unittest_params;
3090 
3091 	enum rte_crypto_cipher_algorithm cipher_algo =
3092 			ut_params->cipher_xform.cipher.algo;
3093 	enum rte_crypto_auth_algorithm auth_algo =
3094 			ut_params->auth_xform.auth.algo;
3095 
3096 	/* Generate Crypto op data structure */
3097 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
3098 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
3099 	TEST_ASSERT_NOT_NULL(ut_params->op,
3100 			"Failed to allocate pktmbuf offload");
3101 
3102 	/* Set crypto operation data parameters */
3103 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
3104 
3105 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
3106 
3107 	/* set crypto operation mbufs */
3108 	sym_op->m_src = ut_params->ibuf;
3109 	if (op_mode == OUT_OF_PLACE)
3110 		sym_op->m_dst = ut_params->obuf;
3111 
3112 	/* digest */
3113 	if (!do_sgl) {
3114 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
3115 			(op_mode == IN_PLACE ?
3116 				ut_params->ibuf : ut_params->obuf),
3117 			uint8_t *, data_pad_len);
3118 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
3119 			(op_mode == IN_PLACE ?
3120 				ut_params->ibuf : ut_params->obuf),
3121 			data_pad_len);
3122 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
3123 	} else {
3124 		uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
3125 		struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
3126 				sym_op->m_src : sym_op->m_dst);
3127 		while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
3128 			remaining_off -= rte_pktmbuf_data_len(sgl_buf);
3129 			sgl_buf = sgl_buf->next;
3130 		}
3131 
3132 		/* The last segment should be large enough to hold full digest */
3133 		if (sgl_buf->data_len < auth_tag_len) {
3134 			rte_pktmbuf_free(sgl_buf->next);
3135 			sgl_buf->next = NULL;
3136 			TEST_ASSERT_NOT_NULL(rte_pktmbuf_append(sgl_buf,
3137 					auth_tag_len - sgl_buf->data_len),
3138 					"No room to append auth tag");
3139 		}
3140 
3141 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
3142 				uint8_t *, remaining_off);
3143 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
3144 				remaining_off);
3145 		memset(sym_op->auth.digest.data, 0, remaining_off);
3146 		while (sgl_buf->next != NULL) {
3147 			memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
3148 				0, rte_pktmbuf_data_len(sgl_buf));
3149 			sgl_buf = sgl_buf->next;
3150 		}
3151 	}
3152 
3153 	/* Copy digest for the verification */
3154 	if (verify)
3155 		memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
3156 
3157 	/* Copy cipher and auth IVs at the end of the crypto operation */
3158 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
3159 			ut_params->op, uint8_t *, IV_OFFSET);
3160 
3161 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3162 	iv_ptr += cipher_iv_len;
3163 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3164 
3165 	/* Only copy over the offset data needed from src to dst in OOP,
3166 	 * if the auth and cipher offsets are not aligned
3167 	 */
3168 	if (op_mode == OUT_OF_PLACE) {
3169 		if (cipher_offset > auth_offset)
3170 			rte_memcpy(
3171 				rte_pktmbuf_mtod_offset(
3172 					sym_op->m_dst,
3173 					uint8_t *, auth_offset >> 3),
3174 				rte_pktmbuf_mtod_offset(
3175 					sym_op->m_src,
3176 					uint8_t *, auth_offset >> 3),
3177 				((cipher_offset >> 3) - (auth_offset >> 3)));
3178 	}
3179 
3180 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3181 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3182 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3183 		sym_op->cipher.data.length = cipher_len;
3184 		sym_op->cipher.data.offset = cipher_offset;
3185 	} else {
3186 		sym_op->cipher.data.length = cipher_len >> 3;
3187 		sym_op->cipher.data.offset = cipher_offset >> 3;
3188 	}
3189 
3190 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3191 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3192 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3193 		sym_op->auth.data.length = auth_len;
3194 		sym_op->auth.data.offset = auth_offset;
3195 	} else {
3196 		sym_op->auth.data.length = auth_len >> 3;
3197 		sym_op->auth.data.offset = auth_offset >> 3;
3198 	}
3199 
3200 	return 0;
3201 }
3202 
3203 static int
3204 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
3205 {
3206 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3207 	struct crypto_unittest_params *ut_params = &unittest_params;
3208 
3209 	int retval;
3210 	unsigned plaintext_pad_len;
3211 	unsigned plaintext_len;
3212 	uint8_t *plaintext;
3213 	struct rte_cryptodev_info dev_info;
3214 
3215 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3216 	uint64_t feat_flags = dev_info.feature_flags;
3217 
3218 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3219 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3220 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3221 		return TEST_SKIPPED;
3222 	}
3223 
3224 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3225 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3226 		printf("Device doesn't support RAW data-path APIs.\n");
3227 		return TEST_SKIPPED;
3228 	}
3229 
3230 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3231 		return TEST_SKIPPED;
3232 
3233 	/* Verify the capabilities */
3234 	struct rte_cryptodev_sym_capability_idx cap_idx;
3235 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3236 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3237 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3238 			&cap_idx) == NULL)
3239 		return TEST_SKIPPED;
3240 
3241 	/* Create SNOW 3G session */
3242 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3243 			tdata->key.data, tdata->key.len,
3244 			tdata->auth_iv.len, tdata->digest.len,
3245 			RTE_CRYPTO_AUTH_OP_GENERATE,
3246 			RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3247 	if (retval < 0)
3248 		return retval;
3249 
3250 	/* alloc mbuf and set payload */
3251 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3252 
3253 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3254 	rte_pktmbuf_tailroom(ut_params->ibuf));
3255 
3256 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3257 	/* Append data which is padded to a multiple of */
3258 	/* the algorithms block size */
3259 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3260 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3261 				plaintext_pad_len);
3262 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3263 
3264 	/* Create SNOW 3G operation */
3265 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3266 			tdata->auth_iv.data, tdata->auth_iv.len,
3267 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3268 			tdata->validAuthLenInBits.len,
3269 			0);
3270 	if (retval < 0)
3271 		return retval;
3272 
3273 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
3274 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 1, 1,
3275 					       0);
3276 		if (retval != TEST_SUCCESS)
3277 			return retval;
3278 	} else
3279 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3280 				ut_params->op);
3281 	ut_params->obuf = ut_params->op->sym->m_src;
3282 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3283 	ut_params->digest = rte_pktmbuf_mtod_offset(ut_params->obuf,
3284 						    uint8_t *,
3285 						    plaintext_pad_len);
3286 
3287 	/* Validate obuf */
3288 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3289 	ut_params->digest,
3290 	tdata->digest.data,
3291 	DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3292 	"SNOW 3G Generated auth tag not as expected");
3293 
3294 	return 0;
3295 }
3296 
3297 static int
3298 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3299 {
3300 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3301 	struct crypto_unittest_params *ut_params = &unittest_params;
3302 
3303 	int retval;
3304 	unsigned plaintext_pad_len;
3305 	unsigned plaintext_len;
3306 	uint8_t *plaintext;
3307 	struct rte_cryptodev_info dev_info;
3308 
3309 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3310 	uint64_t feat_flags = dev_info.feature_flags;
3311 
3312 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3313 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3314 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3315 		return TEST_SKIPPED;
3316 	}
3317 
3318 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3319 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3320 		printf("Device doesn't support RAW data-path APIs.\n");
3321 		return TEST_SKIPPED;
3322 	}
3323 
3324 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3325 		return TEST_SKIPPED;
3326 
3327 	/* Verify the capabilities */
3328 	struct rte_cryptodev_sym_capability_idx cap_idx;
3329 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3330 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3331 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3332 			&cap_idx) == NULL)
3333 		return TEST_SKIPPED;
3334 
3335 	/* Create SNOW 3G session */
3336 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3337 				tdata->key.data, tdata->key.len,
3338 				tdata->auth_iv.len, tdata->digest.len,
3339 				RTE_CRYPTO_AUTH_OP_VERIFY,
3340 				RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3341 	if (retval < 0)
3342 		return retval;
3343 	/* alloc mbuf and set payload */
3344 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3345 
3346 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3347 	rte_pktmbuf_tailroom(ut_params->ibuf));
3348 
3349 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3350 	/* Append data which is padded to a multiple of */
3351 	/* the algorithms block size */
3352 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3353 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3354 				plaintext_pad_len);
3355 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3356 
3357 	/* Create SNOW 3G operation */
3358 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3359 			tdata->digest.len,
3360 			tdata->auth_iv.data, tdata->auth_iv.len,
3361 			plaintext_pad_len,
3362 			RTE_CRYPTO_AUTH_OP_VERIFY,
3363 			tdata->validAuthLenInBits.len,
3364 			0);
3365 	if (retval < 0)
3366 		return retval;
3367 
3368 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
3369 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 1, 1,
3370 					       0);
3371 		if (retval != TEST_SUCCESS)
3372 			return retval;
3373 	} else
3374 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3375 				ut_params->op);
3376 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3377 	ut_params->obuf = ut_params->op->sym->m_src;
3378 	ut_params->digest = rte_pktmbuf_mtod_offset(ut_params->obuf,
3379 						    uint8_t *,
3380 						    plaintext_pad_len);
3381 
3382 	/* Validate obuf */
3383 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3384 		return 0;
3385 	else
3386 		return -1;
3387 
3388 	return 0;
3389 }
3390 
3391 static int
3392 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3393 {
3394 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3395 	struct crypto_unittest_params *ut_params = &unittest_params;
3396 
3397 	int retval;
3398 	unsigned plaintext_pad_len;
3399 	unsigned plaintext_len;
3400 	uint8_t *plaintext;
3401 	struct rte_cryptodev_info dev_info;
3402 
3403 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3404 	uint64_t feat_flags = dev_info.feature_flags;
3405 
3406 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3407 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3408 		printf("Device doesn't support RAW data-path APIs.\n");
3409 		return TEST_SKIPPED;
3410 	}
3411 
3412 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3413 		return TEST_SKIPPED;
3414 
3415 	/* Verify the capabilities */
3416 	struct rte_cryptodev_sym_capability_idx cap_idx;
3417 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3418 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3419 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3420 			&cap_idx) == NULL)
3421 		return TEST_SKIPPED;
3422 
3423 	/* Create KASUMI session */
3424 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3425 			tdata->key.data, tdata->key.len,
3426 			0, tdata->digest.len,
3427 			RTE_CRYPTO_AUTH_OP_GENERATE,
3428 			RTE_CRYPTO_AUTH_KASUMI_F9);
3429 	if (retval < 0)
3430 		return retval;
3431 
3432 	/* alloc mbuf and set payload */
3433 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3434 
3435 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3436 	rte_pktmbuf_tailroom(ut_params->ibuf));
3437 
3438 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3439 	/* Append data which is padded to a multiple of */
3440 	/* the algorithms block size */
3441 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3442 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3443 				plaintext_pad_len);
3444 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3445 
3446 	/* Create KASUMI operation */
3447 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3448 			NULL, 0,
3449 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3450 			tdata->plaintext.len,
3451 			0);
3452 	if (retval < 0)
3453 		return retval;
3454 
3455 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3456 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3457 			ut_params->op);
3458 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
3459 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 1, 1,
3460 					       0);
3461 		if (retval != TEST_SUCCESS)
3462 			return retval;
3463 	} else
3464 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3465 			ut_params->op);
3466 
3467 	ut_params->obuf = ut_params->op->sym->m_src;
3468 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3469 	ut_params->digest = rte_pktmbuf_mtod_offset(ut_params->obuf,
3470 						    uint8_t *,
3471 						    plaintext_pad_len);
3472 
3473 	/* Validate obuf */
3474 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3475 	ut_params->digest,
3476 	tdata->digest.data,
3477 	DIGEST_BYTE_LENGTH_KASUMI_F9,
3478 	"KASUMI Generated auth tag not as expected");
3479 
3480 	return 0;
3481 }
3482 
3483 static int
3484 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3485 {
3486 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3487 	struct crypto_unittest_params *ut_params = &unittest_params;
3488 
3489 	int retval;
3490 	unsigned plaintext_pad_len;
3491 	unsigned plaintext_len;
3492 	uint8_t *plaintext;
3493 	struct rte_cryptodev_info dev_info;
3494 
3495 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3496 	uint64_t feat_flags = dev_info.feature_flags;
3497 
3498 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3499 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3500 		printf("Device doesn't support RAW data-path APIs.\n");
3501 		return TEST_SKIPPED;
3502 	}
3503 
3504 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3505 		return TEST_SKIPPED;
3506 
3507 	/* Verify the capabilities */
3508 	struct rte_cryptodev_sym_capability_idx cap_idx;
3509 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3510 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3511 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3512 			&cap_idx) == NULL)
3513 		return TEST_SKIPPED;
3514 
3515 	/* Create KASUMI session */
3516 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3517 				tdata->key.data, tdata->key.len,
3518 				0, tdata->digest.len,
3519 				RTE_CRYPTO_AUTH_OP_VERIFY,
3520 				RTE_CRYPTO_AUTH_KASUMI_F9);
3521 	if (retval < 0)
3522 		return retval;
3523 	/* alloc mbuf and set payload */
3524 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3525 
3526 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3527 	rte_pktmbuf_tailroom(ut_params->ibuf));
3528 
3529 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3530 	/* Append data which is padded to a multiple */
3531 	/* of the algorithms block size */
3532 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3533 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3534 				plaintext_pad_len);
3535 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3536 
3537 	/* Create KASUMI operation */
3538 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3539 			tdata->digest.len,
3540 			NULL, 0,
3541 			plaintext_pad_len,
3542 			RTE_CRYPTO_AUTH_OP_VERIFY,
3543 			tdata->plaintext.len,
3544 			0);
3545 	if (retval < 0)
3546 		return retval;
3547 
3548 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
3549 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 1, 1,
3550 					       0);
3551 		if (retval != TEST_SUCCESS)
3552 			return retval;
3553 	} else
3554 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3555 				ut_params->op);
3556 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3557 	ut_params->obuf = ut_params->op->sym->m_src;
3558 	ut_params->digest = rte_pktmbuf_mtod_offset(ut_params->obuf,
3559 						    uint8_t *,
3560 						    plaintext_pad_len);
3561 
3562 	/* Validate obuf */
3563 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3564 		return 0;
3565 	else
3566 		return -1;
3567 
3568 	return 0;
3569 }
3570 
3571 static int
3572 test_snow3g_hash_generate_test_case_1(void)
3573 {
3574 	return test_snow3g_authentication(&snow3g_hash_test_case_1);
3575 }
3576 
3577 static int
3578 test_snow3g_hash_generate_test_case_2(void)
3579 {
3580 	return test_snow3g_authentication(&snow3g_hash_test_case_2);
3581 }
3582 
3583 static int
3584 test_snow3g_hash_generate_test_case_3(void)
3585 {
3586 	return test_snow3g_authentication(&snow3g_hash_test_case_3);
3587 }
3588 
3589 static int
3590 test_snow3g_hash_generate_test_case_4(void)
3591 {
3592 	return test_snow3g_authentication(&snow3g_hash_test_case_4);
3593 }
3594 
3595 static int
3596 test_snow3g_hash_generate_test_case_5(void)
3597 {
3598 	return test_snow3g_authentication(&snow3g_hash_test_case_5);
3599 }
3600 
3601 static int
3602 test_snow3g_hash_generate_test_case_6(void)
3603 {
3604 	return test_snow3g_authentication(&snow3g_hash_test_case_6);
3605 }
3606 
3607 static int
3608 test_snow3g_hash_verify_test_case_1(void)
3609 {
3610 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3611 
3612 }
3613 
3614 static int
3615 test_snow3g_hash_verify_test_case_2(void)
3616 {
3617 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3618 }
3619 
3620 static int
3621 test_snow3g_hash_verify_test_case_3(void)
3622 {
3623 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3624 }
3625 
3626 static int
3627 test_snow3g_hash_verify_test_case_4(void)
3628 {
3629 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3630 }
3631 
3632 static int
3633 test_snow3g_hash_verify_test_case_5(void)
3634 {
3635 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3636 }
3637 
3638 static int
3639 test_snow3g_hash_verify_test_case_6(void)
3640 {
3641 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3642 }
3643 
3644 static int
3645 test_kasumi_hash_generate_test_case_1(void)
3646 {
3647 	return test_kasumi_authentication(&kasumi_hash_test_case_1);
3648 }
3649 
3650 static int
3651 test_kasumi_hash_generate_test_case_2(void)
3652 {
3653 	return test_kasumi_authentication(&kasumi_hash_test_case_2);
3654 }
3655 
3656 static int
3657 test_kasumi_hash_generate_test_case_3(void)
3658 {
3659 	return test_kasumi_authentication(&kasumi_hash_test_case_3);
3660 }
3661 
3662 static int
3663 test_kasumi_hash_generate_test_case_4(void)
3664 {
3665 	return test_kasumi_authentication(&kasumi_hash_test_case_4);
3666 }
3667 
3668 static int
3669 test_kasumi_hash_generate_test_case_5(void)
3670 {
3671 	return test_kasumi_authentication(&kasumi_hash_test_case_5);
3672 }
3673 
3674 static int
3675 test_kasumi_hash_generate_test_case_6(void)
3676 {
3677 	return test_kasumi_authentication(&kasumi_hash_test_case_6);
3678 }
3679 
3680 static int
3681 test_kasumi_hash_verify_test_case_1(void)
3682 {
3683 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3684 }
3685 
3686 static int
3687 test_kasumi_hash_verify_test_case_2(void)
3688 {
3689 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3690 }
3691 
3692 static int
3693 test_kasumi_hash_verify_test_case_3(void)
3694 {
3695 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3696 }
3697 
3698 static int
3699 test_kasumi_hash_verify_test_case_4(void)
3700 {
3701 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3702 }
3703 
3704 static int
3705 test_kasumi_hash_verify_test_case_5(void)
3706 {
3707 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3708 }
3709 
3710 static int
3711 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3712 {
3713 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3714 	struct crypto_unittest_params *ut_params = &unittest_params;
3715 
3716 	int retval;
3717 	uint8_t *plaintext, *ciphertext;
3718 	unsigned plaintext_pad_len;
3719 	unsigned plaintext_len;
3720 	struct rte_cryptodev_info dev_info;
3721 
3722 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3723 	uint64_t feat_flags = dev_info.feature_flags;
3724 
3725 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3726 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3727 		printf("Device doesn't support RAW data-path APIs.\n");
3728 		return TEST_SKIPPED;
3729 	}
3730 
3731 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3732 		return TEST_SKIPPED;
3733 
3734 	/* Verify the capabilities */
3735 	struct rte_cryptodev_sym_capability_idx cap_idx;
3736 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3737 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3738 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3739 			&cap_idx) == NULL)
3740 		return TEST_SKIPPED;
3741 
3742 	/* Create KASUMI session */
3743 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3744 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3745 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3746 					tdata->key.data, tdata->key.len,
3747 					tdata->cipher_iv.len);
3748 	if (retval < 0)
3749 		return retval;
3750 
3751 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3752 
3753 	/* Clear mbuf payload */
3754 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3755 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3756 
3757 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3758 	/* Append data which is padded to a multiple */
3759 	/* of the algorithms block size */
3760 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3761 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3762 				plaintext_pad_len);
3763 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3764 
3765 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3766 
3767 	/* Create KASUMI operation */
3768 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3769 				tdata->cipher_iv.len,
3770 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3771 				tdata->validCipherOffsetInBits.len);
3772 	if (retval < 0)
3773 		return retval;
3774 
3775 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
3776 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 0, 1,
3777 					       tdata->cipher_iv.len);
3778 		if (retval != TEST_SUCCESS)
3779 			return retval;
3780 	} else
3781 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3782 				ut_params->op);
3783 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3784 
3785 	ut_params->obuf = ut_params->op->sym->m_dst;
3786 	if (ut_params->obuf)
3787 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3788 	else
3789 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3790 
3791 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3792 
3793 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3794 				(tdata->validCipherOffsetInBits.len >> 3);
3795 	/* Validate obuf */
3796 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3797 		ciphertext,
3798 		reference_ciphertext,
3799 		tdata->validCipherLenInBits.len,
3800 		"KASUMI Ciphertext data not as expected");
3801 	return 0;
3802 }
3803 
3804 static int
3805 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3806 {
3807 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3808 	struct crypto_unittest_params *ut_params = &unittest_params;
3809 
3810 	int retval;
3811 
3812 	unsigned int plaintext_pad_len;
3813 	unsigned int plaintext_len;
3814 
3815 	uint8_t buffer[10000];
3816 	const uint8_t *ciphertext;
3817 
3818 	struct rte_cryptodev_info dev_info;
3819 
3820 	/* Verify the capabilities */
3821 	struct rte_cryptodev_sym_capability_idx cap_idx;
3822 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3823 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3824 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3825 			&cap_idx) == NULL)
3826 		return TEST_SKIPPED;
3827 
3828 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3829 
3830 	uint64_t feat_flags = dev_info.feature_flags;
3831 
3832 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3833 		printf("Device doesn't support in-place scatter-gather. "
3834 				"Test Skipped.\n");
3835 		return TEST_SKIPPED;
3836 	}
3837 
3838 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3839 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3840 		printf("Device doesn't support RAW data-path APIs.\n");
3841 		return TEST_SKIPPED;
3842 	}
3843 
3844 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3845 		return TEST_SKIPPED;
3846 
3847 	/* Create KASUMI session */
3848 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3849 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3850 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3851 					tdata->key.data, tdata->key.len,
3852 					tdata->cipher_iv.len);
3853 	if (retval < 0)
3854 		return retval;
3855 
3856 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3857 
3858 
3859 	/* Append data which is padded to a multiple */
3860 	/* of the algorithms block size */
3861 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3862 
3863 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3864 			plaintext_pad_len, 10, 0);
3865 
3866 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3867 
3868 	/* Create KASUMI operation */
3869 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3870 				tdata->cipher_iv.len,
3871 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3872 				tdata->validCipherOffsetInBits.len);
3873 	if (retval < 0)
3874 		return retval;
3875 
3876 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
3877 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 0, 1,
3878 					       tdata->cipher_iv.len);
3879 		if (retval != TEST_SUCCESS)
3880 			return retval;
3881 	} else
3882 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3883 						ut_params->op);
3884 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3885 
3886 	ut_params->obuf = ut_params->op->sym->m_dst;
3887 
3888 	if (ut_params->obuf)
3889 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3890 				plaintext_len, buffer);
3891 	else
3892 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3893 				tdata->validCipherOffsetInBits.len >> 3,
3894 				plaintext_len, buffer);
3895 
3896 	/* Validate obuf */
3897 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3898 
3899 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3900 				(tdata->validCipherOffsetInBits.len >> 3);
3901 	/* Validate obuf */
3902 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3903 		ciphertext,
3904 		reference_ciphertext,
3905 		tdata->validCipherLenInBits.len,
3906 		"KASUMI Ciphertext data not as expected");
3907 	return 0;
3908 }
3909 
3910 static int
3911 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3912 {
3913 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3914 	struct crypto_unittest_params *ut_params = &unittest_params;
3915 
3916 	int retval;
3917 	uint8_t *plaintext, *ciphertext;
3918 	unsigned plaintext_pad_len;
3919 	unsigned plaintext_len;
3920 
3921 	/* Verify the capabilities */
3922 	struct rte_cryptodev_sym_capability_idx cap_idx;
3923 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3924 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3925 	/* Data-path service does not support OOP */
3926 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3927 			&cap_idx) == NULL)
3928 		return TEST_SKIPPED;
3929 
3930 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3931 		return TEST_SKIPPED;
3932 
3933 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3934 		return TEST_SKIPPED;
3935 
3936 	/* Create KASUMI session */
3937 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3938 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3939 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3940 					tdata->key.data, tdata->key.len,
3941 					tdata->cipher_iv.len);
3942 	if (retval < 0)
3943 		return retval;
3944 
3945 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3946 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3947 
3948 	/* Clear mbuf payload */
3949 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3950 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3951 
3952 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3953 	/* Append data which is padded to a multiple */
3954 	/* of the algorithms block size */
3955 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3956 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3957 				plaintext_pad_len);
3958 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3959 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3960 
3961 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3962 
3963 	/* Create KASUMI operation */
3964 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3965 				tdata->cipher_iv.len,
3966 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3967 				tdata->validCipherOffsetInBits.len);
3968 	if (retval < 0)
3969 		return retval;
3970 
3971 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3972 						ut_params->op);
3973 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3974 
3975 	ut_params->obuf = ut_params->op->sym->m_dst;
3976 	if (ut_params->obuf)
3977 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3978 	else
3979 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3980 
3981 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3982 
3983 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3984 				(tdata->validCipherOffsetInBits.len >> 3);
3985 	/* Validate obuf */
3986 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3987 		ciphertext,
3988 		reference_ciphertext,
3989 		tdata->validCipherLenInBits.len,
3990 		"KASUMI Ciphertext data not as expected");
3991 	return 0;
3992 }
3993 
3994 static int
3995 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3996 {
3997 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3998 	struct crypto_unittest_params *ut_params = &unittest_params;
3999 
4000 	int retval;
4001 	unsigned int plaintext_pad_len;
4002 	unsigned int plaintext_len;
4003 
4004 	const uint8_t *ciphertext;
4005 	uint8_t buffer[2048];
4006 
4007 	struct rte_cryptodev_info dev_info;
4008 
4009 	/* Verify the capabilities */
4010 	struct rte_cryptodev_sym_capability_idx cap_idx;
4011 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4012 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4013 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4014 			&cap_idx) == NULL)
4015 		return TEST_SKIPPED;
4016 
4017 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4018 		return TEST_SKIPPED;
4019 
4020 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4021 		return TEST_SKIPPED;
4022 
4023 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4024 
4025 	uint64_t feat_flags = dev_info.feature_flags;
4026 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4027 		printf("Device doesn't support out-of-place scatter-gather "
4028 				"in both input and output mbufs. "
4029 				"Test Skipped.\n");
4030 		return TEST_SKIPPED;
4031 	}
4032 
4033 	/* Create KASUMI session */
4034 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4035 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4036 					RTE_CRYPTO_CIPHER_KASUMI_F8,
4037 					tdata->key.data, tdata->key.len,
4038 					tdata->cipher_iv.len);
4039 	if (retval < 0)
4040 		return retval;
4041 
4042 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4043 	/* Append data which is padded to a multiple */
4044 	/* of the algorithms block size */
4045 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
4046 
4047 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4048 			plaintext_pad_len, 10, 0);
4049 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4050 			plaintext_pad_len, 3, 0);
4051 
4052 	/* Append data which is padded to a multiple */
4053 	/* of the algorithms block size */
4054 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4055 
4056 	/* Create KASUMI operation */
4057 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4058 				tdata->cipher_iv.len,
4059 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4060 				tdata->validCipherOffsetInBits.len);
4061 	if (retval < 0)
4062 		return retval;
4063 
4064 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4065 						ut_params->op);
4066 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4067 
4068 	ut_params->obuf = ut_params->op->sym->m_dst;
4069 	if (ut_params->obuf)
4070 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4071 				plaintext_pad_len, buffer);
4072 	else
4073 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
4074 				tdata->validCipherOffsetInBits.len >> 3,
4075 				plaintext_pad_len, buffer);
4076 
4077 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
4078 				(tdata->validCipherOffsetInBits.len >> 3);
4079 	/* Validate obuf */
4080 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4081 		ciphertext,
4082 		reference_ciphertext,
4083 		tdata->validCipherLenInBits.len,
4084 		"KASUMI Ciphertext data not as expected");
4085 	return 0;
4086 }
4087 
4088 
4089 static int
4090 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
4091 {
4092 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4093 	struct crypto_unittest_params *ut_params = &unittest_params;
4094 
4095 	int retval;
4096 	uint8_t *ciphertext, *plaintext;
4097 	unsigned ciphertext_pad_len;
4098 	unsigned ciphertext_len;
4099 
4100 	/* Verify the capabilities */
4101 	struct rte_cryptodev_sym_capability_idx cap_idx;
4102 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4103 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4104 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4105 			&cap_idx) == NULL)
4106 		return TEST_SKIPPED;
4107 
4108 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4109 		return TEST_SKIPPED;
4110 
4111 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4112 		return TEST_SKIPPED;
4113 
4114 	/* Create KASUMI session */
4115 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4116 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4117 					RTE_CRYPTO_CIPHER_KASUMI_F8,
4118 					tdata->key.data, tdata->key.len,
4119 					tdata->cipher_iv.len);
4120 	if (retval < 0)
4121 		return retval;
4122 
4123 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4124 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4125 
4126 	/* Clear mbuf payload */
4127 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4128 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4129 
4130 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4131 	/* Append data which is padded to a multiple */
4132 	/* of the algorithms block size */
4133 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4134 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4135 				ciphertext_pad_len);
4136 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4137 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4138 
4139 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4140 
4141 	/* Create KASUMI operation */
4142 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4143 				tdata->cipher_iv.len,
4144 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4145 				tdata->validCipherOffsetInBits.len);
4146 	if (retval < 0)
4147 		return retval;
4148 
4149 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4150 						ut_params->op);
4151 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4152 
4153 	ut_params->obuf = ut_params->op->sym->m_dst;
4154 	if (ut_params->obuf)
4155 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4156 	else
4157 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4158 
4159 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4160 
4161 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4162 				(tdata->validCipherOffsetInBits.len >> 3);
4163 	/* Validate obuf */
4164 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4165 		plaintext,
4166 		reference_plaintext,
4167 		tdata->validCipherLenInBits.len,
4168 		"KASUMI Plaintext data not as expected");
4169 	return 0;
4170 }
4171 
4172 static int
4173 test_kasumi_decryption(const struct kasumi_test_data *tdata)
4174 {
4175 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4176 	struct crypto_unittest_params *ut_params = &unittest_params;
4177 
4178 	int retval;
4179 	uint8_t *ciphertext, *plaintext;
4180 	unsigned ciphertext_pad_len;
4181 	unsigned ciphertext_len;
4182 	struct rte_cryptodev_info dev_info;
4183 
4184 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4185 	uint64_t feat_flags = dev_info.feature_flags;
4186 
4187 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4188 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4189 		printf("Device doesn't support RAW data-path APIs.\n");
4190 		return TEST_SKIPPED;
4191 	}
4192 
4193 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4194 		return TEST_SKIPPED;
4195 
4196 	/* Verify the capabilities */
4197 	struct rte_cryptodev_sym_capability_idx cap_idx;
4198 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4199 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4200 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4201 			&cap_idx) == NULL)
4202 		return TEST_SKIPPED;
4203 
4204 	/* Create KASUMI session */
4205 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4206 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4207 					RTE_CRYPTO_CIPHER_KASUMI_F8,
4208 					tdata->key.data, tdata->key.len,
4209 					tdata->cipher_iv.len);
4210 	if (retval < 0)
4211 		return retval;
4212 
4213 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4214 
4215 	/* Clear mbuf payload */
4216 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4217 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4218 
4219 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4220 	/* Append data which is padded to a multiple */
4221 	/* of the algorithms block size */
4222 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4223 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4224 				ciphertext_pad_len);
4225 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4226 
4227 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4228 
4229 	/* Create KASUMI operation */
4230 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4231 			tdata->cipher_iv.len,
4232 			RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4233 			tdata->validCipherOffsetInBits.len);
4234 	if (retval < 0)
4235 		return retval;
4236 
4237 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
4238 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 0, 1,
4239 					       0);
4240 		if (retval != TEST_SUCCESS)
4241 			return retval;
4242 	} else
4243 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4244 						ut_params->op);
4245 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4246 
4247 	ut_params->obuf = ut_params->op->sym->m_dst;
4248 	if (ut_params->obuf)
4249 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4250 	else
4251 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4252 
4253 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4254 
4255 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4256 				(tdata->validCipherOffsetInBits.len >> 3);
4257 	/* Validate obuf */
4258 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4259 		plaintext,
4260 		reference_plaintext,
4261 		tdata->validCipherLenInBits.len,
4262 		"KASUMI Plaintext data not as expected");
4263 	return 0;
4264 }
4265 
4266 static int
4267 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4268 {
4269 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4270 	struct crypto_unittest_params *ut_params = &unittest_params;
4271 
4272 	int retval;
4273 	uint8_t *plaintext, *ciphertext;
4274 	unsigned plaintext_pad_len;
4275 	unsigned plaintext_len;
4276 	struct rte_cryptodev_info dev_info;
4277 
4278 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4279 	uint64_t feat_flags = dev_info.feature_flags;
4280 
4281 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4282 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4283 		printf("Device doesn't support RAW data-path APIs.\n");
4284 		return TEST_SKIPPED;
4285 	}
4286 
4287 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4288 		return TEST_SKIPPED;
4289 
4290 	/* Verify the capabilities */
4291 	struct rte_cryptodev_sym_capability_idx cap_idx;
4292 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4293 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4294 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4295 			&cap_idx) == NULL)
4296 		return TEST_SKIPPED;
4297 
4298 	/* Create SNOW 3G session */
4299 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4300 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4301 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4302 					tdata->key.data, tdata->key.len,
4303 					tdata->cipher_iv.len);
4304 	if (retval < 0)
4305 		return retval;
4306 
4307 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4308 
4309 	/* Clear mbuf payload */
4310 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4311 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4312 
4313 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4314 	/* Append data which is padded to a multiple of */
4315 	/* the algorithms block size */
4316 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4317 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4318 				plaintext_pad_len);
4319 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4320 
4321 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4322 
4323 	/* Create SNOW 3G operation */
4324 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4325 					tdata->cipher_iv.len,
4326 					tdata->validCipherLenInBits.len,
4327 					0);
4328 	if (retval < 0)
4329 		return retval;
4330 
4331 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
4332 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 0, 1,
4333 					       tdata->cipher_iv.len);
4334 		if (retval != TEST_SUCCESS)
4335 			return retval;
4336 	} else
4337 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4338 						ut_params->op);
4339 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4340 
4341 	ut_params->obuf = ut_params->op->sym->m_dst;
4342 	if (ut_params->obuf)
4343 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4344 	else
4345 		ciphertext = plaintext;
4346 
4347 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4348 
4349 	/* Validate obuf */
4350 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4351 		ciphertext,
4352 		tdata->ciphertext.data,
4353 		tdata->validDataLenInBits.len,
4354 		"SNOW 3G Ciphertext data not as expected");
4355 	return 0;
4356 }
4357 
4358 
4359 static int
4360 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4361 {
4362 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4363 	struct crypto_unittest_params *ut_params = &unittest_params;
4364 	uint8_t *plaintext, *ciphertext;
4365 
4366 	int retval;
4367 	unsigned plaintext_pad_len;
4368 	unsigned plaintext_len;
4369 	struct rte_cryptodev_info dev_info;
4370 
4371 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4372 	uint64_t feat_flags = dev_info.feature_flags;
4373 
4374 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4375 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4376 		printf("Device does not support RAW data-path APIs.\n");
4377 		return -ENOTSUP;
4378 	}
4379 
4380 	/* Verify the capabilities */
4381 	struct rte_cryptodev_sym_capability_idx cap_idx;
4382 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4383 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4384 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4385 			&cap_idx) == NULL)
4386 		return TEST_SKIPPED;
4387 
4388 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4389 		return TEST_SKIPPED;
4390 
4391 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4392 		return TEST_SKIPPED;
4393 
4394 	/* Create SNOW 3G session */
4395 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4396 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4397 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4398 					tdata->key.data, tdata->key.len,
4399 					tdata->cipher_iv.len);
4400 	if (retval < 0)
4401 		return retval;
4402 
4403 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4404 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4405 
4406 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4407 			"Failed to allocate input buffer in mempool");
4408 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4409 			"Failed to allocate output buffer in mempool");
4410 
4411 	/* Clear mbuf payload */
4412 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4413 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4414 
4415 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4416 	/* Append data which is padded to a multiple of */
4417 	/* the algorithms block size */
4418 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4419 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4420 				plaintext_pad_len);
4421 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4422 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4423 
4424 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4425 
4426 	/* Create SNOW 3G operation */
4427 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4428 					tdata->cipher_iv.len,
4429 					tdata->validCipherLenInBits.len,
4430 					0);
4431 	if (retval < 0)
4432 		return retval;
4433 
4434 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
4435 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 0, 1,
4436 					       tdata->cipher_iv.len);
4437 		if (retval != TEST_SUCCESS)
4438 			return retval;
4439 	} else
4440 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4441 						ut_params->op);
4442 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4443 
4444 	ut_params->obuf = ut_params->op->sym->m_dst;
4445 	if (ut_params->obuf)
4446 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4447 	else
4448 		ciphertext = plaintext;
4449 
4450 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4451 
4452 	/* Validate obuf */
4453 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4454 		ciphertext,
4455 		tdata->ciphertext.data,
4456 		tdata->validDataLenInBits.len,
4457 		"SNOW 3G Ciphertext data not as expected");
4458 	return 0;
4459 }
4460 
4461 static int
4462 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata,
4463 		uint8_t sgl_in, uint8_t sgl_out)
4464 {
4465 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4466 	struct crypto_unittest_params *ut_params = &unittest_params;
4467 
4468 	int retval;
4469 	unsigned int plaintext_pad_len;
4470 	unsigned int plaintext_len;
4471 	uint8_t buffer[10000];
4472 	const uint8_t *ciphertext;
4473 
4474 	struct rte_cryptodev_info dev_info;
4475 
4476 	/* Verify the capabilities */
4477 	struct rte_cryptodev_sym_capability_idx cap_idx;
4478 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4479 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4480 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4481 			&cap_idx) == NULL)
4482 		return TEST_SKIPPED;
4483 
4484 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4485 		return TEST_SKIPPED;
4486 
4487 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4488 		return TEST_SKIPPED;
4489 
4490 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4491 
4492 	uint64_t feat_flags = dev_info.feature_flags;
4493 
4494 	if (((sgl_in && sgl_out) && !(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
4495 			|| ((!sgl_in && sgl_out) &&
4496 			!(feat_flags & RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
4497 			|| ((sgl_in && !sgl_out) &&
4498 			!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))) {
4499 		printf("Device doesn't support out-of-place scatter gather type. "
4500 				"Test Skipped.\n");
4501 		return TEST_SKIPPED;
4502 	}
4503 
4504 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4505 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4506 		printf("Device does not support RAW data-path APIs.\n");
4507 		return -ENOTSUP;
4508 	}
4509 
4510 	/* Create SNOW 3G session */
4511 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4512 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4513 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4514 					tdata->key.data, tdata->key.len,
4515 					tdata->cipher_iv.len);
4516 	if (retval < 0)
4517 		return retval;
4518 
4519 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4520 	/* Append data which is padded to a multiple of */
4521 	/* the algorithms block size */
4522 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4523 
4524 	if (sgl_in)
4525 		ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4526 				plaintext_pad_len, 10, 0);
4527 	else {
4528 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4529 		rte_pktmbuf_append(ut_params->ibuf, plaintext_pad_len);
4530 	}
4531 
4532 	if (sgl_out)
4533 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4534 				plaintext_pad_len, 3, 0);
4535 	else {
4536 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4537 		rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4538 	}
4539 
4540 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4541 			"Failed to allocate input buffer in mempool");
4542 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4543 			"Failed to allocate output buffer in mempool");
4544 
4545 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4546 
4547 	/* Create SNOW 3G operation */
4548 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4549 					tdata->cipher_iv.len,
4550 					tdata->validCipherLenInBits.len,
4551 					0);
4552 	if (retval < 0)
4553 		return retval;
4554 
4555 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
4556 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 0, 1,
4557 					       tdata->cipher_iv.len);
4558 		if (retval != TEST_SUCCESS)
4559 			return retval;
4560 	} else
4561 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4562 						ut_params->op);
4563 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4564 
4565 	ut_params->obuf = ut_params->op->sym->m_dst;
4566 	if (ut_params->obuf)
4567 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4568 				plaintext_len, buffer);
4569 	else
4570 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4571 				plaintext_len, buffer);
4572 
4573 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4574 
4575 	/* Validate obuf */
4576 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4577 		ciphertext,
4578 		tdata->ciphertext.data,
4579 		tdata->validDataLenInBits.len,
4580 		"SNOW 3G Ciphertext data not as expected");
4581 
4582 	return 0;
4583 }
4584 
4585 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4586 static void
4587 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4588 {
4589 	uint8_t curr_byte, prev_byte;
4590 	uint32_t length_in_bytes = ceil_byte_length(length + offset);
4591 	uint8_t lower_byte_mask = (1 << offset) - 1;
4592 	unsigned i;
4593 
4594 	prev_byte = buffer[0];
4595 	buffer[0] >>= offset;
4596 
4597 	for (i = 1; i < length_in_bytes; i++) {
4598 		curr_byte = buffer[i];
4599 		buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4600 				(curr_byte >> offset);
4601 		prev_byte = curr_byte;
4602 	}
4603 }
4604 
4605 static int
4606 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4607 {
4608 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4609 	struct crypto_unittest_params *ut_params = &unittest_params;
4610 	uint8_t *plaintext, *ciphertext;
4611 	int retval;
4612 	uint32_t plaintext_len;
4613 	uint32_t plaintext_pad_len;
4614 	uint8_t extra_offset = 4;
4615 	uint8_t *expected_ciphertext_shifted;
4616 	struct rte_cryptodev_info dev_info;
4617 
4618 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4619 	uint64_t feat_flags = dev_info.feature_flags;
4620 
4621 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4622 			((tdata->validDataLenInBits.len % 8) != 0)) {
4623 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4624 		return TEST_SKIPPED;
4625 	}
4626 
4627 	/* Verify the capabilities */
4628 	struct rte_cryptodev_sym_capability_idx cap_idx;
4629 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4630 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4631 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4632 			&cap_idx) == NULL)
4633 		return TEST_SKIPPED;
4634 
4635 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4636 		return TEST_SKIPPED;
4637 
4638 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4639 		return TEST_SKIPPED;
4640 
4641 	/* Create SNOW 3G session */
4642 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4643 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4644 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4645 					tdata->key.data, tdata->key.len,
4646 					tdata->cipher_iv.len);
4647 	if (retval < 0)
4648 		return retval;
4649 
4650 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4651 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4652 
4653 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4654 			"Failed to allocate input buffer in mempool");
4655 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4656 			"Failed to allocate output buffer in mempool");
4657 
4658 	/* Clear mbuf payload */
4659 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4660 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4661 
4662 	plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4663 	/*
4664 	 * Append data which is padded to a
4665 	 * multiple of the algorithms block size
4666 	 */
4667 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4668 
4669 	plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4670 						plaintext_pad_len);
4671 
4672 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4673 
4674 	memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4675 	buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4676 
4677 #ifdef RTE_APP_TEST_DEBUG
4678 	rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4679 #endif
4680 	/* Create SNOW 3G operation */
4681 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4682 					tdata->cipher_iv.len,
4683 					tdata->validCipherLenInBits.len,
4684 					extra_offset);
4685 	if (retval < 0)
4686 		return retval;
4687 
4688 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
4689 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 0, 1,
4690 					       tdata->cipher_iv.len);
4691 		if (retval != TEST_SUCCESS)
4692 			return retval;
4693 	} else
4694 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4695 						ut_params->op);
4696 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4697 
4698 	ut_params->obuf = ut_params->op->sym->m_dst;
4699 	if (ut_params->obuf)
4700 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4701 	else
4702 		ciphertext = plaintext;
4703 
4704 #ifdef RTE_APP_TEST_DEBUG
4705 	rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4706 #endif
4707 
4708 	expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4709 
4710 	TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4711 			"failed to reserve memory for ciphertext shifted\n");
4712 
4713 	memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4714 			ceil_byte_length(tdata->ciphertext.len));
4715 	buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4716 			extra_offset);
4717 	/* Validate obuf */
4718 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4719 		ciphertext,
4720 		expected_ciphertext_shifted,
4721 		tdata->validDataLenInBits.len,
4722 		extra_offset,
4723 		"SNOW 3G Ciphertext data not as expected");
4724 	return 0;
4725 }
4726 
4727 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4728 {
4729 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4730 	struct crypto_unittest_params *ut_params = &unittest_params;
4731 
4732 	int retval;
4733 
4734 	uint8_t *plaintext, *ciphertext;
4735 	unsigned ciphertext_pad_len;
4736 	unsigned ciphertext_len;
4737 	struct rte_cryptodev_info dev_info;
4738 
4739 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4740 	uint64_t feat_flags = dev_info.feature_flags;
4741 
4742 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4743 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4744 		printf("Device doesn't support RAW data-path APIs.\n");
4745 		return TEST_SKIPPED;
4746 	}
4747 
4748 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4749 		return TEST_SKIPPED;
4750 
4751 	/* Verify the capabilities */
4752 	struct rte_cryptodev_sym_capability_idx cap_idx;
4753 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4754 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4755 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4756 			&cap_idx) == NULL)
4757 		return TEST_SKIPPED;
4758 
4759 	/* Create SNOW 3G session */
4760 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4761 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4762 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4763 					tdata->key.data, tdata->key.len,
4764 					tdata->cipher_iv.len);
4765 	if (retval < 0)
4766 		return retval;
4767 
4768 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4769 
4770 	/* Clear mbuf payload */
4771 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4772 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4773 
4774 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4775 	/* Append data which is padded to a multiple of */
4776 	/* the algorithms block size */
4777 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4778 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4779 				ciphertext_pad_len);
4780 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4781 
4782 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4783 
4784 	/* Create SNOW 3G operation */
4785 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4786 					tdata->cipher_iv.len,
4787 					tdata->validCipherLenInBits.len,
4788 					tdata->cipher.offset_bits);
4789 	if (retval < 0)
4790 		return retval;
4791 
4792 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
4793 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 0, 1,
4794 					       tdata->cipher_iv.len);
4795 		if (retval != TEST_SUCCESS)
4796 			return retval;
4797 	} else
4798 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4799 						ut_params->op);
4800 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4801 	ut_params->obuf = ut_params->op->sym->m_dst;
4802 	if (ut_params->obuf)
4803 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4804 	else
4805 		plaintext = ciphertext;
4806 
4807 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4808 
4809 	/* Validate obuf */
4810 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4811 				tdata->plaintext.data,
4812 				tdata->validDataLenInBits.len,
4813 				"SNOW 3G Plaintext data not as expected");
4814 	return 0;
4815 }
4816 
4817 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4818 {
4819 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4820 	struct crypto_unittest_params *ut_params = &unittest_params;
4821 
4822 	int retval;
4823 
4824 	uint8_t *plaintext, *ciphertext;
4825 	unsigned ciphertext_pad_len;
4826 	unsigned ciphertext_len;
4827 	struct rte_cryptodev_info dev_info;
4828 
4829 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4830 	uint64_t feat_flags = dev_info.feature_flags;
4831 
4832 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4833 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4834 		printf("Device does not support RAW data-path APIs.\n");
4835 		return -ENOTSUP;
4836 	}
4837 	/* Verify the capabilities */
4838 	struct rte_cryptodev_sym_capability_idx cap_idx;
4839 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4840 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4841 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4842 			&cap_idx) == NULL)
4843 		return TEST_SKIPPED;
4844 
4845 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4846 		return TEST_SKIPPED;
4847 
4848 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4849 		return TEST_SKIPPED;
4850 
4851 	/* Create SNOW 3G session */
4852 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4853 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4854 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4855 					tdata->key.data, tdata->key.len,
4856 					tdata->cipher_iv.len);
4857 	if (retval < 0)
4858 		return retval;
4859 
4860 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4861 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4862 
4863 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4864 			"Failed to allocate input buffer");
4865 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4866 			"Failed to allocate output buffer");
4867 
4868 	/* Clear mbuf payload */
4869 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4870 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4871 
4872 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4873 		       rte_pktmbuf_tailroom(ut_params->obuf));
4874 
4875 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4876 	/* Append data which is padded to a multiple of */
4877 	/* the algorithms block size */
4878 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4879 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4880 				ciphertext_pad_len);
4881 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4882 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4883 
4884 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4885 
4886 	/* Create SNOW 3G operation */
4887 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4888 					tdata->cipher_iv.len,
4889 					tdata->validCipherLenInBits.len,
4890 					0);
4891 	if (retval < 0)
4892 		return retval;
4893 
4894 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
4895 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 0, 1,
4896 					       tdata->cipher_iv.len);
4897 		if (retval != TEST_SUCCESS)
4898 			return retval;
4899 	} else
4900 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4901 						ut_params->op);
4902 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4903 	ut_params->obuf = ut_params->op->sym->m_dst;
4904 	if (ut_params->obuf)
4905 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4906 	else
4907 		plaintext = ciphertext;
4908 
4909 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4910 
4911 	/* Validate obuf */
4912 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4913 				tdata->plaintext.data,
4914 				tdata->validDataLenInBits.len,
4915 				"SNOW 3G Plaintext data not as expected");
4916 	return 0;
4917 }
4918 
4919 static int
4920 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4921 {
4922 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4923 	struct crypto_unittest_params *ut_params = &unittest_params;
4924 
4925 	int retval;
4926 
4927 	uint8_t *plaintext, *ciphertext;
4928 	unsigned int plaintext_pad_len;
4929 	unsigned int plaintext_len;
4930 
4931 	struct rte_cryptodev_info dev_info;
4932 
4933 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4934 	uint64_t feat_flags = dev_info.feature_flags;
4935 
4936 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4937 			((tdata->validAuthLenInBits.len % 8 != 0) ||
4938 			(tdata->validDataLenInBits.len % 8 != 0))) {
4939 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4940 		return TEST_SKIPPED;
4941 	}
4942 
4943 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4944 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4945 		printf("Device doesn't support RAW data-path APIs.\n");
4946 		return TEST_SKIPPED;
4947 	}
4948 
4949 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4950 		return TEST_SKIPPED;
4951 
4952 	/* Check if device supports ZUC EEA3 */
4953 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
4954 			tdata->key.len, tdata->cipher_iv.len) < 0)
4955 		return TEST_SKIPPED;
4956 
4957 	/* Check if device supports ZUC EIA3 */
4958 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
4959 			tdata->key.len, tdata->auth_iv.len,
4960 			tdata->digest.len) < 0)
4961 		return TEST_SKIPPED;
4962 
4963 	/* Create ZUC session */
4964 	retval = create_zuc_cipher_auth_encrypt_generate_session(
4965 			ts_params->valid_devs[0],
4966 			tdata);
4967 	if (retval != 0)
4968 		return retval;
4969 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4970 
4971 	/* clear mbuf payload */
4972 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4973 			rte_pktmbuf_tailroom(ut_params->ibuf));
4974 
4975 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4976 	/* Append data which is padded to a multiple of */
4977 	/* the algorithms block size */
4978 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4979 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4980 				plaintext_pad_len);
4981 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4982 
4983 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4984 
4985 	/* Create ZUC operation */
4986 	retval = create_zuc_cipher_hash_generate_operation(tdata);
4987 	if (retval < 0)
4988 		return retval;
4989 
4990 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
4991 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 1,
4992 					       tdata->cipher_iv.len);
4993 		if (retval != TEST_SUCCESS)
4994 			return retval;
4995 	} else
4996 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4997 			ut_params->op);
4998 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4999 	ut_params->obuf = ut_params->op->sym->m_src;
5000 	if (ut_params->obuf)
5001 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
5002 	else
5003 		ciphertext = plaintext;
5004 
5005 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5006 	/* Validate obuf */
5007 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5008 			ciphertext,
5009 			tdata->ciphertext.data,
5010 			tdata->validDataLenInBits.len,
5011 			"ZUC Ciphertext data not as expected");
5012 
5013 	ut_params->digest = rte_pktmbuf_mtod_offset(ut_params->obuf,
5014 						    uint8_t *,
5015 						    plaintext_pad_len);
5016 
5017 	/* Validate obuf */
5018 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5019 			ut_params->digest,
5020 			tdata->digest.data,
5021 			tdata->digest.len,
5022 			"ZUC Generated auth tag not as expected");
5023 	return 0;
5024 }
5025 
5026 static int
5027 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
5028 {
5029 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5030 	struct crypto_unittest_params *ut_params = &unittest_params;
5031 
5032 	int retval;
5033 
5034 	uint8_t *plaintext, *ciphertext;
5035 	unsigned plaintext_pad_len;
5036 	unsigned plaintext_len;
5037 	struct rte_cryptodev_info dev_info;
5038 
5039 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5040 	uint64_t feat_flags = dev_info.feature_flags;
5041 
5042 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5043 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5044 		printf("Device doesn't support RAW data-path APIs.\n");
5045 		return TEST_SKIPPED;
5046 	}
5047 
5048 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5049 		return TEST_SKIPPED;
5050 
5051 	/* Verify the capabilities */
5052 	struct rte_cryptodev_sym_capability_idx cap_idx;
5053 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5054 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5055 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5056 			&cap_idx) == NULL)
5057 		return TEST_SKIPPED;
5058 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5059 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5060 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5061 			&cap_idx) == NULL)
5062 		return TEST_SKIPPED;
5063 
5064 	/* Create SNOW 3G session */
5065 	retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
5066 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5067 			RTE_CRYPTO_AUTH_OP_GENERATE,
5068 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5069 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5070 			tdata->key.data, tdata->key.len,
5071 			tdata->key.data, tdata->key.len,
5072 			tdata->auth_iv.len, tdata->digest.len,
5073 			tdata->cipher_iv.len);
5074 	if (retval != 0)
5075 		return retval;
5076 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5077 
5078 	/* clear mbuf payload */
5079 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5080 			rte_pktmbuf_tailroom(ut_params->ibuf));
5081 
5082 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5083 	/* Append data which is padded to a multiple of */
5084 	/* the algorithms block size */
5085 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5086 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5087 				plaintext_pad_len);
5088 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5089 
5090 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5091 
5092 	/* Create SNOW 3G operation */
5093 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5094 			tdata->digest.len, tdata->auth_iv.data,
5095 			tdata->auth_iv.len,
5096 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5097 			tdata->cipher_iv.data, tdata->cipher_iv.len,
5098 			tdata->validCipherLenInBits.len,
5099 			0,
5100 			tdata->validAuthLenInBits.len,
5101 			0
5102 			);
5103 	if (retval < 0)
5104 		return retval;
5105 
5106 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
5107 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 1,
5108 					       tdata->cipher_iv.len);
5109 		if (retval != TEST_SUCCESS)
5110 			return retval;
5111 	} else
5112 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5113 			ut_params->op);
5114 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5115 	ut_params->obuf = ut_params->op->sym->m_src;
5116 	if (ut_params->obuf)
5117 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
5118 	else
5119 		ciphertext = plaintext;
5120 
5121 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5122 	/* Validate obuf */
5123 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5124 			ciphertext,
5125 			tdata->ciphertext.data,
5126 			tdata->validDataLenInBits.len,
5127 			"SNOW 3G Ciphertext data not as expected");
5128 
5129 	ut_params->digest = rte_pktmbuf_mtod_offset(ut_params->obuf,
5130 						    uint8_t *,
5131 						    plaintext_pad_len);
5132 
5133 	/* Validate obuf */
5134 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5135 			ut_params->digest,
5136 			tdata->digest.data,
5137 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5138 			"SNOW 3G Generated auth tag not as expected");
5139 	return 0;
5140 }
5141 
5142 static int
5143 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
5144 	uint8_t op_mode, uint8_t verify)
5145 {
5146 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5147 	struct crypto_unittest_params *ut_params = &unittest_params;
5148 
5149 	int retval;
5150 
5151 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5152 	unsigned int plaintext_pad_len;
5153 	unsigned int plaintext_len;
5154 	unsigned int ciphertext_pad_len;
5155 	unsigned int ciphertext_len;
5156 	unsigned int digest_offset;
5157 
5158 	struct rte_cryptodev_info dev_info;
5159 
5160 	/* Verify the capabilities */
5161 	struct rte_cryptodev_sym_capability_idx cap_idx;
5162 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5163 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5164 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5165 			&cap_idx) == NULL)
5166 		return TEST_SKIPPED;
5167 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5168 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5169 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5170 			&cap_idx) == NULL)
5171 		return TEST_SKIPPED;
5172 
5173 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5174 		return TEST_SKIPPED;
5175 
5176 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5177 
5178 	uint64_t feat_flags = dev_info.feature_flags;
5179 
5180 	if (op_mode == OUT_OF_PLACE) {
5181 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5182 			printf("Device doesn't support digest encrypted.\n");
5183 			return TEST_SKIPPED;
5184 		}
5185 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5186 			return TEST_SKIPPED;
5187 	}
5188 
5189 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5190 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5191 		printf("Device doesn't support RAW data-path APIs.\n");
5192 		return TEST_SKIPPED;
5193 	}
5194 
5195 	/* Create SNOW 3G session */
5196 	retval = create_wireless_algo_auth_cipher_session(
5197 			ts_params->valid_devs[0],
5198 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5199 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5200 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5201 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5202 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5203 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5204 			tdata->key.data, tdata->key.len,
5205 			tdata->key.data, tdata->key.len,
5206 			tdata->auth_iv.len, tdata->digest.len,
5207 			tdata->cipher_iv.len);
5208 	if (retval != 0)
5209 		return retval;
5210 
5211 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5212 	if (op_mode == OUT_OF_PLACE)
5213 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5214 
5215 	/* clear mbuf payload */
5216 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5217 		rte_pktmbuf_tailroom(ut_params->ibuf));
5218 	if (op_mode == OUT_OF_PLACE)
5219 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5220 			rte_pktmbuf_tailroom(ut_params->obuf));
5221 
5222 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5223 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5224 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5225 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5226 
5227 	if (verify) {
5228 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5229 					ciphertext_pad_len);
5230 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5231 		if (op_mode == OUT_OF_PLACE)
5232 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5233 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5234 			ciphertext_len);
5235 	} else {
5236 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5237 					plaintext_pad_len);
5238 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5239 		if (op_mode == OUT_OF_PLACE)
5240 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5241 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5242 	}
5243 
5244 	/* Create SNOW 3G operation */
5245 	retval = create_wireless_algo_auth_cipher_operation(
5246 		tdata->digest.data, tdata->digest.len,
5247 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5248 		tdata->auth_iv.data, tdata->auth_iv.len,
5249 		(tdata->digest.offset_bytes == 0 ?
5250 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5251 			: tdata->digest.offset_bytes),
5252 		tdata->validCipherLenInBits.len,
5253 		tdata->cipher.offset_bits,
5254 		tdata->validAuthLenInBits.len,
5255 		tdata->auth.offset_bits,
5256 		op_mode, 0, verify);
5257 
5258 	if (retval < 0)
5259 		return retval;
5260 
5261 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
5262 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 1,
5263 					       tdata->cipher_iv.len);
5264 		if (retval != TEST_SUCCESS)
5265 			return retval;
5266 	} else
5267 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5268 			ut_params->op);
5269 
5270 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5271 
5272 	ut_params->obuf = (op_mode == IN_PLACE ?
5273 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5274 
5275 	if (verify) {
5276 		if (ut_params->obuf)
5277 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5278 							uint8_t *);
5279 		else
5280 			plaintext = ciphertext +
5281 				(tdata->cipher.offset_bits >> 3);
5282 
5283 		debug_hexdump(stdout, "plaintext:", plaintext,
5284 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5285 		debug_hexdump(stdout, "plaintext expected:",
5286 			tdata->plaintext.data,
5287 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5288 	} else {
5289 		if (ut_params->obuf)
5290 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5291 							uint8_t *);
5292 		else
5293 			ciphertext = plaintext;
5294 
5295 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5296 			ciphertext_len);
5297 		debug_hexdump(stdout, "ciphertext expected:",
5298 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5299 
5300 		if (tdata->digest.offset_bytes == 0)
5301 			digest_offset = plaintext_pad_len;
5302 		else
5303 			digest_offset = tdata->digest.offset_bytes;
5304 		ut_params->digest = rte_pktmbuf_mtod_offset(ut_params->obuf,
5305 						    uint8_t *, digest_offset);
5306 
5307 		debug_hexdump(stdout, "digest:", ut_params->digest,
5308 			tdata->digest.len);
5309 		debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5310 				tdata->digest.len);
5311 	}
5312 
5313 	/* Validate obuf */
5314 	if (verify) {
5315 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5316 			plaintext,
5317 			tdata->plaintext.data,
5318 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5319 			 (tdata->digest.len << 3)),
5320 			tdata->cipher.offset_bits,
5321 			"SNOW 3G Plaintext data not as expected");
5322 	} else {
5323 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5324 			ciphertext,
5325 			tdata->ciphertext.data,
5326 			(tdata->validDataLenInBits.len -
5327 			 tdata->cipher.offset_bits),
5328 			tdata->cipher.offset_bits,
5329 			"SNOW 3G Ciphertext data not as expected");
5330 
5331 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5332 			ut_params->digest,
5333 			tdata->digest.data,
5334 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5335 			"SNOW 3G Generated auth tag not as expected");
5336 	}
5337 	return 0;
5338 }
5339 
5340 static int
5341 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5342 	uint8_t op_mode, uint8_t verify)
5343 {
5344 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5345 	struct crypto_unittest_params *ut_params = &unittest_params;
5346 
5347 	int retval;
5348 
5349 	const uint8_t *plaintext = NULL;
5350 	const uint8_t *ciphertext = NULL;
5351 	const uint8_t *digest = NULL;
5352 	unsigned int plaintext_pad_len;
5353 	unsigned int plaintext_len;
5354 	unsigned int ciphertext_pad_len;
5355 	unsigned int ciphertext_len;
5356 	uint8_t buffer[10000];
5357 	uint8_t digest_buffer[10000];
5358 
5359 	struct rte_cryptodev_info dev_info;
5360 
5361 	/* Verify the capabilities */
5362 	struct rte_cryptodev_sym_capability_idx cap_idx;
5363 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5364 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5365 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5366 			&cap_idx) == NULL)
5367 		return TEST_SKIPPED;
5368 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5369 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5370 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5371 			&cap_idx) == NULL)
5372 		return TEST_SKIPPED;
5373 
5374 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5375 		return TEST_SKIPPED;
5376 
5377 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5378 
5379 	uint64_t feat_flags = dev_info.feature_flags;
5380 
5381 	if (op_mode == IN_PLACE) {
5382 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5383 			printf("Device doesn't support in-place scatter-gather "
5384 					"in both input and output mbufs.\n");
5385 			return TEST_SKIPPED;
5386 		}
5387 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5388 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5389 			printf("Device doesn't support RAW data-path APIs.\n");
5390 			return TEST_SKIPPED;
5391 		}
5392 	} else {
5393 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5394 			return TEST_SKIPPED;
5395 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5396 			printf("Device doesn't support out-of-place scatter-gather "
5397 					"in both input and output mbufs.\n");
5398 			return TEST_SKIPPED;
5399 		}
5400 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5401 			printf("Device doesn't support digest encrypted.\n");
5402 			return TEST_SKIPPED;
5403 		}
5404 	}
5405 
5406 	/* Create SNOW 3G session */
5407 	retval = create_wireless_algo_auth_cipher_session(
5408 			ts_params->valid_devs[0],
5409 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5410 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5411 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5412 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5413 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5414 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5415 			tdata->key.data, tdata->key.len,
5416 			tdata->key.data, tdata->key.len,
5417 			tdata->auth_iv.len, tdata->digest.len,
5418 			tdata->cipher_iv.len);
5419 
5420 	if (retval != 0)
5421 		return retval;
5422 
5423 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5424 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5425 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5426 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5427 
5428 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5429 			plaintext_pad_len, 15, 0);
5430 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5431 			"Failed to allocate input buffer in mempool");
5432 
5433 	if (op_mode == OUT_OF_PLACE) {
5434 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5435 				plaintext_pad_len, 15, 0);
5436 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5437 				"Failed to allocate output buffer in mempool");
5438 	}
5439 
5440 	if (verify) {
5441 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5442 			tdata->ciphertext.data);
5443 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5444 					ciphertext_len, buffer);
5445 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5446 			ciphertext_len);
5447 	} else {
5448 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5449 			tdata->plaintext.data);
5450 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5451 					plaintext_len, buffer);
5452 		debug_hexdump(stdout, "plaintext:", plaintext,
5453 			plaintext_len);
5454 	}
5455 	memset(buffer, 0, sizeof(buffer));
5456 
5457 	/* Create SNOW 3G operation */
5458 	retval = create_wireless_algo_auth_cipher_operation(
5459 		tdata->digest.data, tdata->digest.len,
5460 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5461 		tdata->auth_iv.data, tdata->auth_iv.len,
5462 		(tdata->digest.offset_bytes == 0 ?
5463 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5464 			: tdata->digest.offset_bytes),
5465 		tdata->validCipherLenInBits.len,
5466 		tdata->cipher.offset_bits,
5467 		tdata->validAuthLenInBits.len,
5468 		tdata->auth.offset_bits,
5469 		op_mode, 1, verify);
5470 
5471 	if (retval < 0)
5472 		return retval;
5473 
5474 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
5475 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 1,
5476 					       tdata->cipher_iv.len);
5477 		if (retval != TEST_SUCCESS)
5478 			return retval;
5479 	} else
5480 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5481 			ut_params->op);
5482 
5483 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5484 
5485 	ut_params->obuf = (op_mode == IN_PLACE ?
5486 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5487 
5488 	if (verify) {
5489 		if (ut_params->obuf)
5490 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5491 					plaintext_len, buffer);
5492 		else
5493 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5494 					plaintext_len, buffer);
5495 
5496 		debug_hexdump(stdout, "plaintext:", plaintext,
5497 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5498 		debug_hexdump(stdout, "plaintext expected:",
5499 			tdata->plaintext.data,
5500 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5501 	} else {
5502 		if (ut_params->obuf)
5503 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5504 					ciphertext_len, buffer);
5505 		else
5506 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5507 					ciphertext_len, buffer);
5508 
5509 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5510 			ciphertext_len);
5511 		debug_hexdump(stdout, "ciphertext expected:",
5512 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5513 
5514 		if (ut_params->obuf)
5515 			digest = rte_pktmbuf_read(ut_params->obuf,
5516 				(tdata->digest.offset_bytes == 0 ?
5517 				plaintext_pad_len : tdata->digest.offset_bytes),
5518 				tdata->digest.len, digest_buffer);
5519 		else
5520 			digest = rte_pktmbuf_read(ut_params->ibuf,
5521 				(tdata->digest.offset_bytes == 0 ?
5522 				plaintext_pad_len : tdata->digest.offset_bytes),
5523 				tdata->digest.len, digest_buffer);
5524 
5525 		debug_hexdump(stdout, "digest:", digest,
5526 			tdata->digest.len);
5527 		debug_hexdump(stdout, "digest expected:",
5528 			tdata->digest.data, tdata->digest.len);
5529 	}
5530 
5531 	/* Validate obuf */
5532 	if (verify) {
5533 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5534 			plaintext,
5535 			tdata->plaintext.data,
5536 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5537 			 (tdata->digest.len << 3)),
5538 			tdata->cipher.offset_bits,
5539 			"SNOW 3G Plaintext data not as expected");
5540 	} else {
5541 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5542 			ciphertext,
5543 			tdata->ciphertext.data,
5544 			(tdata->validDataLenInBits.len -
5545 			 tdata->cipher.offset_bits),
5546 			tdata->cipher.offset_bits,
5547 			"SNOW 3G Ciphertext data not as expected");
5548 
5549 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5550 			digest,
5551 			tdata->digest.data,
5552 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5553 			"SNOW 3G Generated auth tag not as expected");
5554 	}
5555 	return 0;
5556 }
5557 
5558 static int
5559 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5560 	uint8_t op_mode, uint8_t verify)
5561 {
5562 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5563 	struct crypto_unittest_params *ut_params = &unittest_params;
5564 
5565 	int retval;
5566 
5567 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5568 	unsigned int plaintext_pad_len;
5569 	unsigned int plaintext_len;
5570 	unsigned int ciphertext_pad_len;
5571 	unsigned int ciphertext_len;
5572 	unsigned int digest_offset;
5573 
5574 	struct rte_cryptodev_info dev_info;
5575 
5576 	/* Verify the capabilities */
5577 	struct rte_cryptodev_sym_capability_idx cap_idx;
5578 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5579 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5580 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5581 			&cap_idx) == NULL)
5582 		return TEST_SKIPPED;
5583 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5584 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5585 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5586 			&cap_idx) == NULL)
5587 		return TEST_SKIPPED;
5588 
5589 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5590 
5591 	uint64_t feat_flags = dev_info.feature_flags;
5592 
5593 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5594 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5595 		printf("Device doesn't support RAW data-path APIs.\n");
5596 		return TEST_SKIPPED;
5597 	}
5598 
5599 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5600 		return TEST_SKIPPED;
5601 
5602 	if (op_mode == OUT_OF_PLACE) {
5603 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5604 			return TEST_SKIPPED;
5605 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5606 			printf("Device doesn't support digest encrypted.\n");
5607 			return TEST_SKIPPED;
5608 		}
5609 	}
5610 
5611 	/* Create KASUMI session */
5612 	retval = create_wireless_algo_auth_cipher_session(
5613 			ts_params->valid_devs[0],
5614 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5615 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5616 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5617 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5618 			RTE_CRYPTO_AUTH_KASUMI_F9,
5619 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5620 			tdata->key.data, tdata->key.len,
5621 			tdata->key.data, tdata->key.len,
5622 			0, tdata->digest.len,
5623 			tdata->cipher_iv.len);
5624 
5625 	if (retval != 0)
5626 		return retval;
5627 
5628 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5629 	if (op_mode == OUT_OF_PLACE)
5630 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5631 
5632 	/* clear mbuf payload */
5633 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5634 		rte_pktmbuf_tailroom(ut_params->ibuf));
5635 	if (op_mode == OUT_OF_PLACE)
5636 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5637 			rte_pktmbuf_tailroom(ut_params->obuf));
5638 
5639 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5640 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5641 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5642 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5643 
5644 	if (verify) {
5645 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5646 					ciphertext_pad_len);
5647 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5648 		if (op_mode == OUT_OF_PLACE)
5649 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5650 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5651 			ciphertext_len);
5652 	} else {
5653 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5654 					plaintext_pad_len);
5655 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5656 		if (op_mode == OUT_OF_PLACE)
5657 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5658 		debug_hexdump(stdout, "plaintext:", plaintext,
5659 			plaintext_len);
5660 	}
5661 
5662 	/* Create KASUMI operation */
5663 	retval = create_wireless_algo_auth_cipher_operation(
5664 		tdata->digest.data, tdata->digest.len,
5665 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5666 		NULL, 0,
5667 		(tdata->digest.offset_bytes == 0 ?
5668 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5669 			: tdata->digest.offset_bytes),
5670 		tdata->validCipherLenInBits.len,
5671 		tdata->validCipherOffsetInBits.len,
5672 		tdata->validAuthLenInBits.len,
5673 		0,
5674 		op_mode, 0, verify);
5675 
5676 	if (retval < 0)
5677 		return retval;
5678 
5679 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
5680 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 1,
5681 					       tdata->cipher_iv.len);
5682 		if (retval != TEST_SUCCESS)
5683 			return retval;
5684 	} else
5685 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5686 			ut_params->op);
5687 
5688 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5689 
5690 	ut_params->obuf = (op_mode == IN_PLACE ?
5691 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5692 
5693 
5694 	if (verify) {
5695 		if (ut_params->obuf)
5696 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5697 							uint8_t *);
5698 		else
5699 			plaintext = ciphertext;
5700 
5701 		debug_hexdump(stdout, "plaintext:", plaintext,
5702 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5703 		debug_hexdump(stdout, "plaintext expected:",
5704 			tdata->plaintext.data,
5705 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5706 	} else {
5707 		if (ut_params->obuf)
5708 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5709 							uint8_t *);
5710 		else
5711 			ciphertext = plaintext;
5712 
5713 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5714 			ciphertext_len);
5715 		debug_hexdump(stdout, "ciphertext expected:",
5716 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5717 
5718 		if (tdata->digest.offset_bytes == 0)
5719 			digest_offset = plaintext_pad_len;
5720 		else
5721 			digest_offset = tdata->digest.offset_bytes;
5722 		ut_params->digest = rte_pktmbuf_mtod_offset(ut_params->obuf,
5723 						    uint8_t *, digest_offset);
5724 
5725 		debug_hexdump(stdout, "digest:", ut_params->digest,
5726 			tdata->digest.len);
5727 		debug_hexdump(stdout, "digest expected:",
5728 			tdata->digest.data, tdata->digest.len);
5729 	}
5730 
5731 	/* Validate obuf */
5732 	if (verify) {
5733 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5734 			plaintext,
5735 			tdata->plaintext.data,
5736 			tdata->plaintext.len >> 3,
5737 			"KASUMI Plaintext data not as expected");
5738 	} else {
5739 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5740 			ciphertext,
5741 			tdata->ciphertext.data,
5742 			tdata->ciphertext.len >> 3,
5743 			"KASUMI Ciphertext data not as expected");
5744 
5745 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5746 			ut_params->digest,
5747 			tdata->digest.data,
5748 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5749 			"KASUMI Generated auth tag not as expected");
5750 	}
5751 	return 0;
5752 }
5753 
5754 static int
5755 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5756 	uint8_t op_mode, uint8_t verify)
5757 {
5758 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5759 	struct crypto_unittest_params *ut_params = &unittest_params;
5760 
5761 	int retval;
5762 
5763 	const uint8_t *plaintext = NULL;
5764 	const uint8_t *ciphertext = NULL;
5765 	const uint8_t *digest = NULL;
5766 	unsigned int plaintext_pad_len;
5767 	unsigned int plaintext_len;
5768 	unsigned int ciphertext_pad_len;
5769 	unsigned int ciphertext_len;
5770 	uint8_t buffer[10000];
5771 	uint8_t digest_buffer[10000];
5772 
5773 	struct rte_cryptodev_info dev_info;
5774 
5775 	/* Verify the capabilities */
5776 	struct rte_cryptodev_sym_capability_idx cap_idx;
5777 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5778 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5779 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5780 			&cap_idx) == NULL)
5781 		return TEST_SKIPPED;
5782 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5783 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5784 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5785 			&cap_idx) == NULL)
5786 		return TEST_SKIPPED;
5787 
5788 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5789 		return TEST_SKIPPED;
5790 
5791 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5792 
5793 	uint64_t feat_flags = dev_info.feature_flags;
5794 
5795 	if (op_mode == IN_PLACE) {
5796 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5797 			printf("Device doesn't support in-place scatter-gather "
5798 					"in both input and output mbufs.\n");
5799 			return TEST_SKIPPED;
5800 		}
5801 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5802 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5803 			printf("Device doesn't support RAW data-path APIs.\n");
5804 			return TEST_SKIPPED;
5805 		}
5806 	} else {
5807 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5808 			return TEST_SKIPPED;
5809 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5810 			printf("Device doesn't support out-of-place scatter-gather "
5811 					"in both input and output mbufs.\n");
5812 			return TEST_SKIPPED;
5813 		}
5814 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5815 			printf("Device doesn't support digest encrypted.\n");
5816 			return TEST_SKIPPED;
5817 		}
5818 	}
5819 
5820 	/* Create KASUMI session */
5821 	retval = create_wireless_algo_auth_cipher_session(
5822 			ts_params->valid_devs[0],
5823 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5824 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5825 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5826 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5827 			RTE_CRYPTO_AUTH_KASUMI_F9,
5828 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5829 			tdata->key.data, tdata->key.len,
5830 			tdata->key.data, tdata->key.len,
5831 			0, tdata->digest.len,
5832 			tdata->cipher_iv.len);
5833 
5834 	if (retval != 0)
5835 		return retval;
5836 
5837 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5838 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5839 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5840 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5841 
5842 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5843 			plaintext_pad_len, 15, 0);
5844 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5845 			"Failed to allocate input buffer in mempool");
5846 
5847 	if (op_mode == OUT_OF_PLACE) {
5848 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5849 				plaintext_pad_len, 15, 0);
5850 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5851 				"Failed to allocate output buffer in mempool");
5852 	}
5853 
5854 	if (verify) {
5855 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5856 			tdata->ciphertext.data);
5857 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5858 					ciphertext_len, buffer);
5859 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5860 			ciphertext_len);
5861 	} else {
5862 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5863 			tdata->plaintext.data);
5864 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5865 					plaintext_len, buffer);
5866 		debug_hexdump(stdout, "plaintext:", plaintext,
5867 			plaintext_len);
5868 	}
5869 	memset(buffer, 0, sizeof(buffer));
5870 
5871 	/* Create KASUMI operation */
5872 	retval = create_wireless_algo_auth_cipher_operation(
5873 		tdata->digest.data, tdata->digest.len,
5874 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5875 		NULL, 0,
5876 		(tdata->digest.offset_bytes == 0 ?
5877 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5878 			: tdata->digest.offset_bytes),
5879 		tdata->validCipherLenInBits.len,
5880 		tdata->validCipherOffsetInBits.len,
5881 		tdata->validAuthLenInBits.len,
5882 		0,
5883 		op_mode, 1, verify);
5884 
5885 	if (retval < 0)
5886 		return retval;
5887 
5888 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
5889 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 1,
5890 					       tdata->cipher_iv.len);
5891 		if (retval != TEST_SUCCESS)
5892 			return retval;
5893 	} else
5894 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5895 			ut_params->op);
5896 
5897 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5898 
5899 	ut_params->obuf = (op_mode == IN_PLACE ?
5900 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5901 
5902 	if (verify) {
5903 		if (ut_params->obuf)
5904 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5905 					plaintext_len, buffer);
5906 		else
5907 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5908 					plaintext_len, buffer);
5909 
5910 		debug_hexdump(stdout, "plaintext:", plaintext,
5911 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5912 		debug_hexdump(stdout, "plaintext expected:",
5913 			tdata->plaintext.data,
5914 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5915 	} else {
5916 		if (ut_params->obuf)
5917 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5918 					ciphertext_len, buffer);
5919 		else
5920 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5921 					ciphertext_len, buffer);
5922 
5923 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5924 			ciphertext_len);
5925 		debug_hexdump(stdout, "ciphertext expected:",
5926 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5927 
5928 		if (ut_params->obuf)
5929 			digest = rte_pktmbuf_read(ut_params->obuf,
5930 				(tdata->digest.offset_bytes == 0 ?
5931 				plaintext_pad_len : tdata->digest.offset_bytes),
5932 				tdata->digest.len, digest_buffer);
5933 		else
5934 			digest = rte_pktmbuf_read(ut_params->ibuf,
5935 				(tdata->digest.offset_bytes == 0 ?
5936 				plaintext_pad_len : tdata->digest.offset_bytes),
5937 				tdata->digest.len, digest_buffer);
5938 
5939 		debug_hexdump(stdout, "digest:", digest,
5940 			tdata->digest.len);
5941 		debug_hexdump(stdout, "digest expected:",
5942 			tdata->digest.data, tdata->digest.len);
5943 	}
5944 
5945 	/* Validate obuf */
5946 	if (verify) {
5947 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5948 			plaintext,
5949 			tdata->plaintext.data,
5950 			tdata->plaintext.len >> 3,
5951 			"KASUMI Plaintext data not as expected");
5952 	} else {
5953 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5954 			ciphertext,
5955 			tdata->ciphertext.data,
5956 			tdata->validDataLenInBits.len,
5957 			"KASUMI Ciphertext data not as expected");
5958 
5959 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5960 			digest,
5961 			tdata->digest.data,
5962 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5963 			"KASUMI Generated auth tag not as expected");
5964 	}
5965 	return 0;
5966 }
5967 
5968 static int
5969 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5970 {
5971 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5972 	struct crypto_unittest_params *ut_params = &unittest_params;
5973 
5974 	int retval;
5975 
5976 	uint8_t *plaintext, *ciphertext;
5977 	unsigned plaintext_pad_len;
5978 	unsigned plaintext_len;
5979 	struct rte_cryptodev_info dev_info;
5980 
5981 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5982 	uint64_t feat_flags = dev_info.feature_flags;
5983 
5984 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5985 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5986 		printf("Device doesn't support RAW data-path APIs.\n");
5987 		return TEST_SKIPPED;
5988 	}
5989 
5990 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5991 		return TEST_SKIPPED;
5992 
5993 	/* Verify the capabilities */
5994 	struct rte_cryptodev_sym_capability_idx cap_idx;
5995 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5996 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5997 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5998 			&cap_idx) == NULL)
5999 		return TEST_SKIPPED;
6000 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6001 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
6002 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6003 			&cap_idx) == NULL)
6004 		return TEST_SKIPPED;
6005 
6006 	/* Create KASUMI session */
6007 	retval = create_wireless_algo_cipher_auth_session(
6008 			ts_params->valid_devs[0],
6009 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6010 			RTE_CRYPTO_AUTH_OP_GENERATE,
6011 			RTE_CRYPTO_AUTH_KASUMI_F9,
6012 			RTE_CRYPTO_CIPHER_KASUMI_F8,
6013 			tdata->key.data, tdata->key.len,
6014 			tdata->key.data, tdata->key.len,
6015 			0, tdata->digest.len,
6016 			tdata->cipher_iv.len);
6017 	if (retval != 0)
6018 		return retval;
6019 
6020 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6021 
6022 	/* clear mbuf payload */
6023 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6024 			rte_pktmbuf_tailroom(ut_params->ibuf));
6025 
6026 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6027 	/* Append data which is padded to a multiple of */
6028 	/* the algorithms block size */
6029 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6030 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6031 				plaintext_pad_len);
6032 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6033 
6034 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6035 
6036 	/* Create KASUMI operation */
6037 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
6038 				tdata->digest.len, NULL, 0,
6039 				plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6040 				tdata->cipher_iv.data, tdata->cipher_iv.len,
6041 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
6042 				tdata->validCipherOffsetInBits.len,
6043 				tdata->validAuthLenInBits.len,
6044 				0
6045 				);
6046 	if (retval < 0)
6047 		return retval;
6048 
6049 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
6050 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 1,
6051 					       tdata->cipher_iv.len);
6052 		if (retval != TEST_SUCCESS)
6053 			return retval;
6054 	} else
6055 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6056 			ut_params->op);
6057 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6058 
6059 	if (ut_params->op->sym->m_dst)
6060 		ut_params->obuf = ut_params->op->sym->m_dst;
6061 	else
6062 		ut_params->obuf = ut_params->op->sym->m_src;
6063 
6064 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
6065 				tdata->validCipherOffsetInBits.len >> 3);
6066 
6067 	ut_params->digest = rte_pktmbuf_mtod_offset(ut_params->obuf,
6068 						    uint8_t *,
6069 						    plaintext_pad_len);
6070 
6071 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
6072 				(tdata->validCipherOffsetInBits.len >> 3);
6073 	/* Validate obuf */
6074 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6075 		ciphertext,
6076 		reference_ciphertext,
6077 		tdata->validCipherLenInBits.len,
6078 		"KASUMI Ciphertext data not as expected");
6079 
6080 	/* Validate obuf */
6081 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
6082 		ut_params->digest,
6083 		tdata->digest.data,
6084 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
6085 		"KASUMI Generated auth tag not as expected");
6086 	return 0;
6087 }
6088 
6089 static int
6090 check_cipher_capability(const struct crypto_testsuite_params *ts_params,
6091 			const enum rte_crypto_cipher_algorithm cipher_algo,
6092 			const uint16_t key_size, const uint16_t iv_size)
6093 {
6094 	struct rte_cryptodev_sym_capability_idx cap_idx;
6095 	const struct rte_cryptodev_symmetric_capability *cap;
6096 
6097 	/* Check if device supports the algorithm */
6098 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6099 	cap_idx.algo.cipher = cipher_algo;
6100 
6101 	cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6102 			&cap_idx);
6103 
6104 	if (cap == NULL)
6105 		return -1;
6106 
6107 	/* Check if device supports key size and IV size */
6108 	if (rte_cryptodev_sym_capability_check_cipher(cap, key_size,
6109 			iv_size) < 0) {
6110 		return -1;
6111 	}
6112 
6113 	return 0;
6114 }
6115 
6116 static int
6117 check_auth_capability(const struct crypto_testsuite_params *ts_params,
6118 			const enum rte_crypto_auth_algorithm auth_algo,
6119 			const uint16_t key_size, const uint16_t iv_size,
6120 			const uint16_t tag_size)
6121 {
6122 	struct rte_cryptodev_sym_capability_idx cap_idx;
6123 	const struct rte_cryptodev_symmetric_capability *cap;
6124 
6125 	/* Check if device supports the algorithm */
6126 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6127 	cap_idx.algo.auth = auth_algo;
6128 
6129 	cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6130 			&cap_idx);
6131 
6132 	if (cap == NULL)
6133 		return -1;
6134 
6135 	/* Check if device supports key size and IV size */
6136 	if (rte_cryptodev_sym_capability_check_auth(cap, key_size,
6137 			tag_size, iv_size) < 0) {
6138 		return -1;
6139 	}
6140 
6141 	return 0;
6142 }
6143 
6144 static int
6145 test_zuc_cipher(const struct wireless_test_data *tdata,
6146 		enum rte_crypto_cipher_operation direction)
6147 {
6148 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6149 	struct crypto_unittest_params *ut_params = &unittest_params;
6150 
6151 	int retval;
6152 	uint8_t *plaintext = NULL;
6153 	uint8_t *ciphertext = NULL;
6154 	unsigned int plaintext_pad_len, ciphertext_pad_len;
6155 	unsigned int plaintext_len = 0;
6156 	unsigned int ciphertext_len = 0;
6157 	struct rte_cryptodev_info dev_info;
6158 
6159 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6160 	uint64_t feat_flags = dev_info.feature_flags;
6161 
6162 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6163 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6164 		printf("Device doesn't support RAW data-path APIs.\n");
6165 		return TEST_SKIPPED;
6166 	}
6167 
6168 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6169 		return TEST_SKIPPED;
6170 
6171 	/* Check if device supports ZUC EEA3 */
6172 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6173 			tdata->key.len, tdata->cipher_iv.len) < 0)
6174 		return TEST_SKIPPED;
6175 
6176 	/* Create ZUC session */
6177 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6178 					direction,
6179 					RTE_CRYPTO_CIPHER_ZUC_EEA3,
6180 					tdata->key.data, tdata->key.len,
6181 					tdata->cipher_iv.len);
6182 	if (retval != 0)
6183 		return retval;
6184 
6185 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6186 
6187 	/* Clear mbuf payload */
6188 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6189 	       rte_pktmbuf_tailroom(ut_params->ibuf));
6190 
6191 	if (direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) {
6192 		plaintext_len = ceil_byte_length(tdata->plaintext.len);
6193 		/* Append data which is padded to a multiple */
6194 		/* of the algorithms block size */
6195 		plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6196 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6197 				plaintext_pad_len);
6198 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6199 
6200 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6201 	} else {
6202 		ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6203 		/* Append data which is padded to a multiple */
6204 		/* of the algorithms block size */
6205 		ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
6206 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6207 				ciphertext_pad_len);
6208 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6209 
6210 		debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
6211 	}
6212 
6213 	/* Create ZUC operation */
6214 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6215 					tdata->cipher_iv.len,
6216 					tdata->plaintext.len,
6217 					tdata->validCipherOffsetInBits.len);
6218 	if (retval < 0)
6219 		return retval;
6220 
6221 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
6222 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 0, 1,
6223 					       tdata->cipher_iv.len);
6224 		if (retval != TEST_SUCCESS)
6225 			return retval;
6226 	} else
6227 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6228 						ut_params->op);
6229 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6230 
6231 	ut_params->obuf = ut_params->op->sym->m_dst;
6232 
6233 	if (direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) {
6234 		if (ut_params->obuf)
6235 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
6236 		else
6237 			ciphertext = plaintext;
6238 
6239 		debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6240 
6241 		/* Validate obuf */
6242 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6243 				ciphertext,
6244 				tdata->ciphertext.data,
6245 				tdata->validCipherLenInBits.len,
6246 				"ZUC Ciphertext data not as expected");
6247 	} else {
6248 		if (ut_params->obuf)
6249 			plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
6250 		else
6251 			plaintext = ciphertext;
6252 
6253 		debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
6254 
6255 		const uint8_t *reference_plaintext = tdata->plaintext.data +
6256 				(tdata->validCipherOffsetInBits.len >> 3);
6257 
6258 		/* Validate obuf */
6259 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6260 				plaintext,
6261 				reference_plaintext,
6262 				tdata->validCipherLenInBits.len,
6263 				"ZUC Plaintext data not as expected");
6264 	}
6265 
6266 	return 0;
6267 }
6268 
6269 static int
6270 test_zuc_cipher_sgl(const struct wireless_test_data *tdata,
6271 		enum rte_crypto_cipher_operation direction)
6272 {
6273 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6274 	struct crypto_unittest_params *ut_params = &unittest_params;
6275 
6276 	int retval;
6277 
6278 	unsigned int plaintext_pad_len, ciphertext_pad_len;
6279 	unsigned int plaintext_len = 0;
6280 	unsigned int ciphertext_len = 0;
6281 	const uint8_t *ciphertext, *plaintext;
6282 	uint8_t buffer[2048];
6283 	struct rte_cryptodev_info dev_info;
6284 
6285 	/* Check if device supports ZUC EEA3 */
6286 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6287 			tdata->key.len, tdata->cipher_iv.len) < 0)
6288 		return TEST_SKIPPED;
6289 
6290 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6291 		return TEST_SKIPPED;
6292 
6293 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6294 
6295 	uint64_t feat_flags = dev_info.feature_flags;
6296 
6297 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6298 		printf("Device doesn't support in-place scatter-gather. "
6299 				"Test Skipped.\n");
6300 		return TEST_SKIPPED;
6301 	}
6302 
6303 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6304 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6305 		printf("Device doesn't support RAW data-path APIs.\n");
6306 		return TEST_SKIPPED;
6307 	}
6308 
6309 	if (direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) {
6310 		plaintext_len = ceil_byte_length(tdata->plaintext.len);
6311 
6312 		/* Append data which is padded to a multiple */
6313 		/* of the algorithms block size */
6314 		plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6315 
6316 		ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6317 				plaintext_pad_len, 10, 0);
6318 
6319 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6320 				tdata->plaintext.data);
6321 	} else {
6322 		ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6323 
6324 		/* Append data which is padded to a multiple */
6325 		/* of the algorithms block size */
6326 		ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
6327 
6328 		ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6329 				ciphertext_pad_len, 10, 0);
6330 
6331 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6332 				tdata->ciphertext.data);
6333 
6334 	}
6335 
6336 	/* Create ZUC session */
6337 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6338 			direction,
6339 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6340 			tdata->key.data, tdata->key.len,
6341 			tdata->cipher_iv.len);
6342 	if (retval < 0)
6343 		return retval;
6344 
6345 	/* Clear mbuf payload */
6346 	if (direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT)
6347 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
6348 	else
6349 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, tdata->ciphertext.data);
6350 
6351 	/* Create ZUC operation */
6352 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6353 			tdata->cipher_iv.len, tdata->plaintext.len,
6354 			tdata->validCipherOffsetInBits.len);
6355 	if (retval < 0)
6356 		return retval;
6357 
6358 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
6359 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 0, 1,
6360 					       tdata->cipher_iv.len);
6361 		if (retval != TEST_SUCCESS)
6362 			return retval;
6363 	} else
6364 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6365 						ut_params->op);
6366 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6367 
6368 	ut_params->obuf = ut_params->op->sym->m_dst;
6369 
6370 	if (direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) {
6371 		if (ut_params->obuf)
6372 			ciphertext = rte_pktmbuf_read(ut_params->obuf,
6373 				0, plaintext_len, buffer);
6374 		else
6375 			ciphertext = rte_pktmbuf_read(ut_params->ibuf,
6376 				0, plaintext_len, buffer);
6377 
6378 		/* Validate obuf */
6379 		debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6380 
6381 		/* Validate obuf */
6382 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6383 			ciphertext,
6384 			tdata->ciphertext.data,
6385 			tdata->validCipherLenInBits.len,
6386 			"ZUC Ciphertext data not as expected");
6387 	} else {
6388 		if (ut_params->obuf)
6389 			plaintext = rte_pktmbuf_read(ut_params->obuf,
6390 				0, ciphertext_len, buffer);
6391 		else
6392 			plaintext = rte_pktmbuf_read(ut_params->ibuf,
6393 				0, ciphertext_len, buffer);
6394 
6395 		/* Validate obuf */
6396 		debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
6397 
6398 		/* Validate obuf */
6399 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6400 			plaintext,
6401 			tdata->plaintext.data,
6402 			tdata->validCipherLenInBits.len,
6403 			"ZUC Plaintext data not as expected");
6404 		}
6405 
6406 	return 0;
6407 }
6408 
6409 static int
6410 test_zuc_authentication(const struct wireless_test_data *tdata,
6411 		enum rte_crypto_auth_operation auth_op)
6412 {
6413 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6414 	struct crypto_unittest_params *ut_params = &unittest_params;
6415 
6416 	int retval;
6417 	unsigned plaintext_pad_len;
6418 	unsigned plaintext_len;
6419 	uint8_t *plaintext;
6420 
6421 	struct rte_cryptodev_info dev_info;
6422 
6423 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6424 	uint64_t feat_flags = dev_info.feature_flags;
6425 
6426 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
6427 			(tdata->validAuthLenInBits.len % 8 != 0)) {
6428 		printf("Device doesn't support NON-Byte Aligned Data.\n");
6429 		return TEST_SKIPPED;
6430 	}
6431 
6432 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6433 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6434 		printf("Device doesn't support RAW data-path APIs.\n");
6435 		return TEST_SKIPPED;
6436 	}
6437 
6438 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6439 		return TEST_SKIPPED;
6440 
6441 	/* Check if device supports ZUC EIA3 */
6442 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6443 			tdata->key.len, tdata->auth_iv.len,
6444 			tdata->digest.len) < 0)
6445 		return TEST_SKIPPED;
6446 
6447 	/* Create ZUC session */
6448 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6449 			tdata->key.data, tdata->key.len,
6450 			tdata->auth_iv.len, tdata->digest.len,
6451 			auth_op, RTE_CRYPTO_AUTH_ZUC_EIA3);
6452 	if (retval != 0)
6453 		return retval;
6454 
6455 	/* alloc mbuf and set payload */
6456 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6457 
6458 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6459 	rte_pktmbuf_tailroom(ut_params->ibuf));
6460 
6461 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6462 	/* Append data which is padded to a multiple of */
6463 	/* the algorithms block size */
6464 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6465 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6466 				plaintext_pad_len);
6467 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6468 
6469 	/* Create ZUC operation */
6470 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
6471 			tdata->digest.len,
6472 			tdata->auth_iv.data, tdata->auth_iv.len,
6473 			plaintext_pad_len,
6474 			auth_op, tdata->validAuthLenInBits.len, 0);
6475 	if (retval < 0)
6476 		return retval;
6477 
6478 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
6479 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 1, 1,
6480 					       0);
6481 		if (retval != TEST_SUCCESS)
6482 			return retval;
6483 	} else
6484 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6485 				ut_params->op);
6486 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6487 	ut_params->obuf = ut_params->op->sym->m_src;
6488 	ut_params->digest = rte_pktmbuf_mtod_offset(ut_params->obuf,
6489 						    uint8_t *,
6490 						    plaintext_pad_len);
6491 
6492 	if (auth_op != RTE_CRYPTO_AUTH_OP_VERIFY) {
6493 		/* Validate obuf */
6494 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6495 				ut_params->digest,
6496 				tdata->digest.data,
6497 				tdata->digest.len,
6498 				"ZUC Generated auth tag not as expected");
6499 		return 0;
6500 	}
6501 
6502 	/* Validate obuf */
6503 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
6504 		return 0;
6505 	else
6506 		return -1;
6507 
6508 	return 0;
6509 }
6510 
6511 static int
6512 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6513 	uint8_t op_mode, uint8_t verify)
6514 {
6515 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6516 	struct crypto_unittest_params *ut_params = &unittest_params;
6517 
6518 	int retval;
6519 
6520 	uint8_t *plaintext = NULL, *ciphertext = NULL;
6521 	unsigned int plaintext_pad_len;
6522 	unsigned int plaintext_len;
6523 	unsigned int ciphertext_pad_len;
6524 	unsigned int ciphertext_len;
6525 	unsigned int digest_offset;
6526 
6527 	struct rte_cryptodev_info dev_info;
6528 
6529 	/* Check if device supports ZUC EEA3 */
6530 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6531 			tdata->key.len, tdata->cipher_iv.len) < 0)
6532 		return TEST_SKIPPED;
6533 
6534 	/* Check if device supports ZUC EIA3 */
6535 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6536 			tdata->key.len, tdata->auth_iv.len,
6537 			tdata->digest.len) < 0)
6538 		return TEST_SKIPPED;
6539 
6540 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6541 		return TEST_SKIPPED;
6542 
6543 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6544 
6545 	uint64_t feat_flags = dev_info.feature_flags;
6546 
6547 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6548 		printf("Device doesn't support digest encrypted.\n");
6549 		return TEST_SKIPPED;
6550 	}
6551 	if (op_mode == IN_PLACE) {
6552 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6553 			printf("Device doesn't support in-place scatter-gather "
6554 					"in both input and output mbufs.\n");
6555 			return TEST_SKIPPED;
6556 		}
6557 
6558 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6559 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6560 			printf("Device doesn't support RAW data-path APIs.\n");
6561 			return TEST_SKIPPED;
6562 		}
6563 	} else {
6564 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6565 			return TEST_SKIPPED;
6566 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6567 			printf("Device doesn't support out-of-place scatter-gather "
6568 					"in both input and output mbufs.\n");
6569 			return TEST_SKIPPED;
6570 		}
6571 	}
6572 
6573 	/* Create ZUC session */
6574 	retval = create_wireless_algo_auth_cipher_session(
6575 			ts_params->valid_devs[0],
6576 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6577 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6578 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6579 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6580 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6581 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6582 			tdata->key.data, tdata->key.len,
6583 			tdata->key.data, tdata->key.len,
6584 			tdata->auth_iv.len, tdata->digest.len,
6585 			tdata->cipher_iv.len);
6586 
6587 	if (retval != 0)
6588 		return retval;
6589 
6590 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6591 	if (op_mode == OUT_OF_PLACE)
6592 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6593 
6594 	/* clear mbuf payload */
6595 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6596 		rte_pktmbuf_tailroom(ut_params->ibuf));
6597 	if (op_mode == OUT_OF_PLACE)
6598 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6599 			rte_pktmbuf_tailroom(ut_params->obuf));
6600 
6601 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6602 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6603 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6604 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6605 
6606 	if (verify) {
6607 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6608 					ciphertext_pad_len);
6609 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6610 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6611 			ciphertext_len);
6612 	} else {
6613 		/* make sure enough space to cover partial digest verify case */
6614 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6615 					ciphertext_pad_len);
6616 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6617 		debug_hexdump(stdout, "plaintext:", plaintext,
6618 			plaintext_len);
6619 	}
6620 
6621 	if (op_mode == OUT_OF_PLACE)
6622 		rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6623 
6624 	/* Create ZUC operation */
6625 	retval = create_wireless_algo_auth_cipher_operation(
6626 		tdata->digest.data, tdata->digest.len,
6627 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6628 		tdata->auth_iv.data, tdata->auth_iv.len,
6629 		(tdata->digest.offset_bytes == 0 ?
6630 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6631 			: tdata->digest.offset_bytes),
6632 		tdata->validCipherLenInBits.len,
6633 		tdata->validCipherOffsetInBits.len,
6634 		tdata->validAuthLenInBits.len,
6635 		0,
6636 		op_mode, 0, verify);
6637 
6638 	if (retval < 0)
6639 		return retval;
6640 
6641 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
6642 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 1,
6643 					       tdata->cipher_iv.len);
6644 		if (retval != TEST_SUCCESS)
6645 			return retval;
6646 	} else
6647 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6648 			ut_params->op);
6649 
6650 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6651 
6652 	ut_params->obuf = (op_mode == IN_PLACE ?
6653 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6654 
6655 
6656 	if (verify) {
6657 		if (ut_params->obuf)
6658 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6659 							uint8_t *);
6660 		else
6661 			plaintext = ciphertext;
6662 
6663 		debug_hexdump(stdout, "plaintext:", plaintext,
6664 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6665 		debug_hexdump(stdout, "plaintext expected:",
6666 			tdata->plaintext.data,
6667 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6668 	} else {
6669 		if (ut_params->obuf)
6670 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6671 							uint8_t *);
6672 		else
6673 			ciphertext = plaintext;
6674 
6675 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6676 			ciphertext_len);
6677 		debug_hexdump(stdout, "ciphertext expected:",
6678 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6679 
6680 		if (tdata->digest.offset_bytes == 0)
6681 			digest_offset = plaintext_pad_len;
6682 		else
6683 			digest_offset =  tdata->digest.offset_bytes;
6684 		ut_params->digest = rte_pktmbuf_mtod_offset(ut_params->obuf,
6685 					    uint8_t *, digest_offset);
6686 
6687 		debug_hexdump(stdout, "digest:", ut_params->digest,
6688 			tdata->digest.len);
6689 		debug_hexdump(stdout, "digest expected:",
6690 			tdata->digest.data, tdata->digest.len);
6691 	}
6692 
6693 	/* Validate obuf */
6694 	if (verify) {
6695 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6696 			plaintext,
6697 			tdata->plaintext.data,
6698 			tdata->plaintext.len >> 3,
6699 			"ZUC Plaintext data not as expected");
6700 	} else {
6701 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6702 			ciphertext,
6703 			tdata->ciphertext.data,
6704 			tdata->ciphertext.len >> 3,
6705 			"ZUC Ciphertext data not as expected");
6706 
6707 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6708 			ut_params->digest,
6709 			tdata->digest.data,
6710 			tdata->digest.len,
6711 			"ZUC Generated auth tag not as expected");
6712 	}
6713 	return 0;
6714 }
6715 
6716 static int
6717 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6718 	uint8_t op_mode, uint8_t verify)
6719 {
6720 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6721 	struct crypto_unittest_params *ut_params = &unittest_params;
6722 
6723 	int retval;
6724 
6725 	const uint8_t *plaintext = NULL;
6726 	const uint8_t *ciphertext = NULL;
6727 	const uint8_t *digest = NULL;
6728 	unsigned int plaintext_pad_len;
6729 	unsigned int plaintext_len;
6730 	unsigned int ciphertext_pad_len;
6731 	unsigned int ciphertext_len;
6732 	uint8_t buffer[10000];
6733 	uint8_t digest_buffer[10000];
6734 
6735 	struct rte_cryptodev_info dev_info;
6736 
6737 	/* Check if device supports ZUC EEA3 */
6738 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6739 			tdata->key.len, tdata->cipher_iv.len) < 0)
6740 		return TEST_SKIPPED;
6741 
6742 	/* Check if device supports ZUC EIA3 */
6743 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6744 			tdata->key.len, tdata->auth_iv.len,
6745 			tdata->digest.len) < 0)
6746 		return TEST_SKIPPED;
6747 
6748 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6749 		return TEST_SKIPPED;
6750 
6751 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6752 
6753 	uint64_t feat_flags = dev_info.feature_flags;
6754 
6755 	if (op_mode == IN_PLACE) {
6756 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6757 			printf("Device doesn't support in-place scatter-gather "
6758 					"in both input and output mbufs.\n");
6759 			return TEST_SKIPPED;
6760 		}
6761 
6762 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6763 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6764 			printf("Device doesn't support RAW data-path APIs.\n");
6765 			return TEST_SKIPPED;
6766 		}
6767 	} else {
6768 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6769 			return TEST_SKIPPED;
6770 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6771 			printf("Device doesn't support out-of-place scatter-gather "
6772 					"in both input and output mbufs.\n");
6773 			return TEST_SKIPPED;
6774 		}
6775 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6776 			printf("Device doesn't support digest encrypted.\n");
6777 			return TEST_SKIPPED;
6778 		}
6779 	}
6780 
6781 	/* Create ZUC session */
6782 	retval = create_wireless_algo_auth_cipher_session(
6783 			ts_params->valid_devs[0],
6784 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6785 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6786 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6787 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6788 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6789 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6790 			tdata->key.data, tdata->key.len,
6791 			tdata->key.data, tdata->key.len,
6792 			tdata->auth_iv.len, tdata->digest.len,
6793 			tdata->cipher_iv.len);
6794 
6795 	if (retval != 0)
6796 		return retval;
6797 
6798 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6799 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6800 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6801 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6802 
6803 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6804 			plaintext_pad_len, 15, 0);
6805 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6806 			"Failed to allocate input buffer in mempool");
6807 
6808 	if (op_mode == OUT_OF_PLACE) {
6809 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6810 				plaintext_pad_len, 15, 0);
6811 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
6812 				"Failed to allocate output buffer in mempool");
6813 	}
6814 
6815 	if (verify) {
6816 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6817 			tdata->ciphertext.data);
6818 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6819 					ciphertext_len, buffer);
6820 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6821 			ciphertext_len);
6822 	} else {
6823 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6824 			tdata->plaintext.data);
6825 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6826 					plaintext_len, buffer);
6827 		debug_hexdump(stdout, "plaintext:", plaintext,
6828 			plaintext_len);
6829 	}
6830 	memset(buffer, 0, sizeof(buffer));
6831 
6832 	/* Create ZUC operation */
6833 	retval = create_wireless_algo_auth_cipher_operation(
6834 		tdata->digest.data, tdata->digest.len,
6835 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6836 		tdata->auth_iv.data, tdata->auth_iv.len,
6837 		(tdata->digest.offset_bytes == 0 ?
6838 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6839 			: tdata->digest.offset_bytes),
6840 		tdata->validCipherLenInBits.len,
6841 		tdata->validCipherOffsetInBits.len,
6842 		tdata->validAuthLenInBits.len,
6843 		0,
6844 		op_mode, 1, verify);
6845 
6846 	if (retval < 0)
6847 		return retval;
6848 
6849 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
6850 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 1,
6851 					       tdata->cipher_iv.len);
6852 		if (retval != TEST_SUCCESS)
6853 			return retval;
6854 	} else
6855 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6856 			ut_params->op);
6857 
6858 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6859 
6860 	ut_params->obuf = (op_mode == IN_PLACE ?
6861 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6862 
6863 	if (verify) {
6864 		if (ut_params->obuf)
6865 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6866 					plaintext_len, buffer);
6867 		else
6868 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6869 					plaintext_len, buffer);
6870 
6871 		debug_hexdump(stdout, "plaintext:", plaintext,
6872 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6873 		debug_hexdump(stdout, "plaintext expected:",
6874 			tdata->plaintext.data,
6875 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6876 	} else {
6877 		if (ut_params->obuf)
6878 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6879 					ciphertext_len, buffer);
6880 		else
6881 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6882 					ciphertext_len, buffer);
6883 
6884 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6885 			ciphertext_len);
6886 		debug_hexdump(stdout, "ciphertext expected:",
6887 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6888 
6889 		if (ut_params->obuf)
6890 			digest = rte_pktmbuf_read(ut_params->obuf,
6891 				(tdata->digest.offset_bytes == 0 ?
6892 				plaintext_pad_len : tdata->digest.offset_bytes),
6893 				tdata->digest.len, digest_buffer);
6894 		else
6895 			digest = rte_pktmbuf_read(ut_params->ibuf,
6896 				(tdata->digest.offset_bytes == 0 ?
6897 				plaintext_pad_len : tdata->digest.offset_bytes),
6898 				tdata->digest.len, digest_buffer);
6899 
6900 		debug_hexdump(stdout, "digest:", digest,
6901 			tdata->digest.len);
6902 		debug_hexdump(stdout, "digest expected:",
6903 			tdata->digest.data, tdata->digest.len);
6904 	}
6905 
6906 	/* Validate obuf */
6907 	if (verify) {
6908 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6909 			plaintext,
6910 			tdata->plaintext.data,
6911 			tdata->plaintext.len >> 3,
6912 			"ZUC Plaintext data not as expected");
6913 	} else {
6914 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6915 			ciphertext,
6916 			tdata->ciphertext.data,
6917 			tdata->validDataLenInBits.len,
6918 			"ZUC Ciphertext data not as expected");
6919 
6920 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6921 			digest,
6922 			tdata->digest.data,
6923 			tdata->digest.len,
6924 			"ZUC Generated auth tag not as expected");
6925 	}
6926 	return 0;
6927 }
6928 
6929 static int
6930 test_kasumi_encryption_test_case_1(void)
6931 {
6932 	return test_kasumi_encryption(&kasumi_test_case_1);
6933 }
6934 
6935 static int
6936 test_kasumi_encryption_test_case_1_sgl(void)
6937 {
6938 	return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6939 }
6940 
6941 static int
6942 test_kasumi_encryption_test_case_1_oop(void)
6943 {
6944 	return test_kasumi_encryption_oop(&kasumi_test_case_1);
6945 }
6946 
6947 static int
6948 test_kasumi_encryption_test_case_1_oop_sgl(void)
6949 {
6950 	return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6951 }
6952 
6953 static int
6954 test_kasumi_encryption_test_case_2(void)
6955 {
6956 	return test_kasumi_encryption(&kasumi_test_case_2);
6957 }
6958 
6959 static int
6960 test_kasumi_encryption_test_case_3(void)
6961 {
6962 	return test_kasumi_encryption(&kasumi_test_case_3);
6963 }
6964 
6965 static int
6966 test_kasumi_encryption_test_case_4(void)
6967 {
6968 	return test_kasumi_encryption(&kasumi_test_case_4);
6969 }
6970 
6971 static int
6972 test_kasumi_encryption_test_case_5(void)
6973 {
6974 	return test_kasumi_encryption(&kasumi_test_case_5);
6975 }
6976 
6977 static int
6978 test_kasumi_decryption_test_case_1(void)
6979 {
6980 	return test_kasumi_decryption(&kasumi_test_case_1);
6981 }
6982 
6983 static int
6984 test_kasumi_decryption_test_case_1_oop(void)
6985 {
6986 	return test_kasumi_decryption_oop(&kasumi_test_case_1);
6987 }
6988 
6989 static int
6990 test_kasumi_decryption_test_case_2(void)
6991 {
6992 	return test_kasumi_decryption(&kasumi_test_case_2);
6993 }
6994 
6995 static int
6996 test_kasumi_decryption_test_case_3(void)
6997 {
6998 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6999 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7000 		return TEST_SKIPPED;
7001 	return test_kasumi_decryption(&kasumi_test_case_3);
7002 }
7003 
7004 static int
7005 test_kasumi_decryption_test_case_4(void)
7006 {
7007 	return test_kasumi_decryption(&kasumi_test_case_4);
7008 }
7009 
7010 static int
7011 test_kasumi_decryption_test_case_5(void)
7012 {
7013 	return test_kasumi_decryption(&kasumi_test_case_5);
7014 }
7015 static int
7016 test_snow3g_encryption_test_case_1(void)
7017 {
7018 	return test_snow3g_encryption(&snow3g_test_case_1);
7019 }
7020 
7021 static int
7022 test_snow3g_encryption_test_case_1_oop(void)
7023 {
7024 	return test_snow3g_encryption_oop(&snow3g_test_case_1);
7025 }
7026 
7027 static int
7028 test_snow3g_encryption_test_case_1_oop_sgl(void)
7029 {
7030 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1, 1, 1);
7031 }
7032 
7033 static int
7034 test_snow3g_encryption_test_case_1_oop_lb_in_sgl_out(void)
7035 {
7036 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1, 0, 1);
7037 }
7038 
7039 static int
7040 test_snow3g_encryption_test_case_1_oop_sgl_in_lb_out(void)
7041 {
7042 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1, 1, 0);
7043 }
7044 
7045 static int
7046 test_snow3g_encryption_test_case_1_offset_oop(void)
7047 {
7048 	return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
7049 }
7050 
7051 static int
7052 test_snow3g_encryption_test_case_2(void)
7053 {
7054 	return test_snow3g_encryption(&snow3g_test_case_2);
7055 }
7056 
7057 static int
7058 test_snow3g_encryption_test_case_3(void)
7059 {
7060 	return test_snow3g_encryption(&snow3g_test_case_3);
7061 }
7062 
7063 static int
7064 test_snow3g_encryption_test_case_4(void)
7065 {
7066 	return test_snow3g_encryption(&snow3g_test_case_4);
7067 }
7068 
7069 static int
7070 test_snow3g_encryption_test_case_5(void)
7071 {
7072 	return test_snow3g_encryption(&snow3g_test_case_5);
7073 }
7074 
7075 static int
7076 test_snow3g_decryption_test_case_1(void)
7077 {
7078 	return test_snow3g_decryption(&snow3g_test_case_1);
7079 }
7080 
7081 static int
7082 test_snow3g_decryption_test_case_1_oop(void)
7083 {
7084 	return test_snow3g_decryption_oop(&snow3g_test_case_1);
7085 }
7086 
7087 static int
7088 test_snow3g_decryption_test_case_2(void)
7089 {
7090 	return test_snow3g_decryption(&snow3g_test_case_2);
7091 }
7092 
7093 static int
7094 test_snow3g_decryption_test_case_3(void)
7095 {
7096 	return test_snow3g_decryption(&snow3g_test_case_3);
7097 }
7098 
7099 static int
7100 test_snow3g_decryption_test_case_4(void)
7101 {
7102 	return test_snow3g_decryption(&snow3g_test_case_4);
7103 }
7104 
7105 static int
7106 test_snow3g_decryption_test_case_5(void)
7107 {
7108 	return test_snow3g_decryption(&snow3g_test_case_5);
7109 }
7110 
7111 /*
7112  * Function prepares snow3g_hash_test_data from snow3g_test_data.
7113  * Pattern digest from snow3g_test_data must be allocated as
7114  * 4 last bytes in plaintext.
7115  */
7116 static void
7117 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
7118 		struct snow3g_hash_test_data *output)
7119 {
7120 	if ((pattern != NULL) && (output != NULL)) {
7121 		output->key.len = pattern->key.len;
7122 
7123 		memcpy(output->key.data,
7124 		pattern->key.data, pattern->key.len);
7125 
7126 		output->auth_iv.len = pattern->auth_iv.len;
7127 
7128 		memcpy(output->auth_iv.data,
7129 		pattern->auth_iv.data, pattern->auth_iv.len);
7130 
7131 		output->plaintext.len = pattern->plaintext.len;
7132 
7133 		memcpy(output->plaintext.data,
7134 		pattern->plaintext.data, pattern->plaintext.len >> 3);
7135 
7136 		output->digest.len = pattern->digest.len;
7137 
7138 		memcpy(output->digest.data,
7139 		&pattern->plaintext.data[pattern->digest.offset_bytes],
7140 		pattern->digest.len);
7141 
7142 		output->validAuthLenInBits.len =
7143 		pattern->validAuthLenInBits.len;
7144 	}
7145 }
7146 
7147 /*
7148  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
7149  */
7150 static int
7151 test_snow3g_decryption_with_digest_test_case_1(void)
7152 {
7153 	int ret;
7154 	struct snow3g_hash_test_data snow3g_hash_data;
7155 	struct rte_cryptodev_info dev_info;
7156 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7157 
7158 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7159 	uint64_t feat_flags = dev_info.feature_flags;
7160 
7161 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7162 		printf("Device doesn't support encrypted digest operations.\n");
7163 		return TEST_SKIPPED;
7164 	}
7165 
7166 	/*
7167 	 * Function prepare data for hash verification test case.
7168 	 * Digest is allocated in 4 last bytes in plaintext, pattern.
7169 	 */
7170 	snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
7171 
7172 	ret = test_snow3g_decryption(&snow3g_test_case_7);
7173 	if (ret != 0)
7174 		return ret;
7175 
7176 	return test_snow3g_authentication_verify(&snow3g_hash_data);
7177 }
7178 
7179 static int
7180 test_snow3g_cipher_auth_test_case_1(void)
7181 {
7182 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
7183 }
7184 
7185 static int
7186 test_snow3g_auth_cipher_test_case_1(void)
7187 {
7188 	return test_snow3g_auth_cipher(
7189 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
7190 }
7191 
7192 static int
7193 test_snow3g_auth_cipher_test_case_2(void)
7194 {
7195 	return test_snow3g_auth_cipher(
7196 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
7197 }
7198 
7199 static int
7200 test_snow3g_auth_cipher_test_case_2_oop(void)
7201 {
7202 	return test_snow3g_auth_cipher(
7203 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7204 }
7205 
7206 static int
7207 test_snow3g_auth_cipher_part_digest_enc(void)
7208 {
7209 	return test_snow3g_auth_cipher(
7210 		&snow3g_auth_cipher_partial_digest_encryption,
7211 			IN_PLACE, 0);
7212 }
7213 
7214 static int
7215 test_snow3g_auth_cipher_part_digest_enc_oop(void)
7216 {
7217 	return test_snow3g_auth_cipher(
7218 		&snow3g_auth_cipher_partial_digest_encryption,
7219 			OUT_OF_PLACE, 0);
7220 }
7221 
7222 static int
7223 test_snow3g_auth_cipher_test_case_3_sgl(void)
7224 {
7225 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
7226 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7227 		return TEST_SKIPPED;
7228 	return test_snow3g_auth_cipher_sgl(
7229 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
7230 }
7231 
7232 static int
7233 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
7234 {
7235 	return test_snow3g_auth_cipher_sgl(
7236 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
7237 }
7238 
7239 static int
7240 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
7241 {
7242 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
7243 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7244 		return TEST_SKIPPED;
7245 	return test_snow3g_auth_cipher_sgl(
7246 		&snow3g_auth_cipher_partial_digest_encryption,
7247 			IN_PLACE, 0);
7248 }
7249 
7250 static int
7251 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
7252 {
7253 	return test_snow3g_auth_cipher_sgl(
7254 		&snow3g_auth_cipher_partial_digest_encryption,
7255 			OUT_OF_PLACE, 0);
7256 }
7257 
7258 static int
7259 test_snow3g_auth_cipher_total_digest_enc_1(void)
7260 {
7261 	return test_snow3g_auth_cipher(
7262 		&snow3g_auth_cipher_total_digest_encryption_1, IN_PLACE, 0);
7263 }
7264 
7265 static int
7266 test_snow3g_auth_cipher_total_digest_enc_1_oop(void)
7267 {
7268 	return test_snow3g_auth_cipher(
7269 		&snow3g_auth_cipher_total_digest_encryption_1, OUT_OF_PLACE, 0);
7270 }
7271 
7272 static int
7273 test_snow3g_auth_cipher_total_digest_enc_1_sgl(void)
7274 {
7275 	return test_snow3g_auth_cipher_sgl(
7276 		&snow3g_auth_cipher_total_digest_encryption_1, IN_PLACE, 0);
7277 }
7278 
7279 static int
7280 test_snow3g_auth_cipher_total_digest_enc_1_oop_sgl(void)
7281 {
7282 	return test_snow3g_auth_cipher_sgl(
7283 		&snow3g_auth_cipher_total_digest_encryption_1, OUT_OF_PLACE, 0);
7284 }
7285 
7286 static int
7287 test_snow3g_auth_cipher_verify_test_case_1(void)
7288 {
7289 	return test_snow3g_auth_cipher(
7290 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
7291 }
7292 
7293 static int
7294 test_snow3g_auth_cipher_verify_test_case_2(void)
7295 {
7296 	return test_snow3g_auth_cipher(
7297 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
7298 }
7299 
7300 static int
7301 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
7302 {
7303 	return test_snow3g_auth_cipher(
7304 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7305 }
7306 
7307 static int
7308 test_snow3g_auth_cipher_verify_part_digest_enc(void)
7309 {
7310 	return test_snow3g_auth_cipher(
7311 		&snow3g_auth_cipher_partial_digest_encryption,
7312 			IN_PLACE, 1);
7313 }
7314 
7315 static int
7316 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
7317 {
7318 	return test_snow3g_auth_cipher(
7319 		&snow3g_auth_cipher_partial_digest_encryption,
7320 			OUT_OF_PLACE, 1);
7321 }
7322 
7323 static int
7324 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
7325 {
7326 	return test_snow3g_auth_cipher_sgl(
7327 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
7328 }
7329 
7330 static int
7331 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
7332 {
7333 	return test_snow3g_auth_cipher_sgl(
7334 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
7335 }
7336 
7337 static int
7338 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
7339 {
7340 	return test_snow3g_auth_cipher_sgl(
7341 		&snow3g_auth_cipher_partial_digest_encryption,
7342 			IN_PLACE, 1);
7343 }
7344 
7345 static int
7346 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
7347 {
7348 	return test_snow3g_auth_cipher_sgl(
7349 		&snow3g_auth_cipher_partial_digest_encryption,
7350 			OUT_OF_PLACE, 1);
7351 }
7352 
7353 static int
7354 test_snow3g_auth_cipher_verify_total_digest_enc_1(void)
7355 {
7356 	return test_snow3g_auth_cipher(
7357 		&snow3g_auth_cipher_total_digest_encryption_1, IN_PLACE, 1);
7358 }
7359 
7360 static int
7361 test_snow3g_auth_cipher_verify_total_digest_enc_1_oop(void)
7362 {
7363 	return test_snow3g_auth_cipher(
7364 		&snow3g_auth_cipher_total_digest_encryption_1, OUT_OF_PLACE, 1);
7365 }
7366 
7367 static int
7368 test_snow3g_auth_cipher_verify_total_digest_enc_1_sgl(void)
7369 {
7370 	return test_snow3g_auth_cipher_sgl(
7371 		&snow3g_auth_cipher_total_digest_encryption_1, IN_PLACE, 1);
7372 }
7373 
7374 static int
7375 test_snow3g_auth_cipher_verify_total_digest_enc_1_oop_sgl(void)
7376 {
7377 	return test_snow3g_auth_cipher_sgl(
7378 		&snow3g_auth_cipher_total_digest_encryption_1, OUT_OF_PLACE, 1);
7379 }
7380 
7381 static int
7382 test_snow3g_auth_cipher_with_digest_test_case_1(void)
7383 {
7384 	return test_snow3g_auth_cipher(
7385 		&snow3g_test_case_7, IN_PLACE, 0);
7386 }
7387 
7388 static int
7389 test_kasumi_auth_cipher_test_case_1(void)
7390 {
7391 	return test_kasumi_auth_cipher(
7392 		&kasumi_test_case_3, IN_PLACE, 0);
7393 }
7394 
7395 static int
7396 test_kasumi_auth_cipher_test_case_2(void)
7397 {
7398 	return test_kasumi_auth_cipher(
7399 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7400 }
7401 
7402 static int
7403 test_kasumi_auth_cipher_test_case_2_oop(void)
7404 {
7405 	return test_kasumi_auth_cipher(
7406 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7407 }
7408 
7409 static int
7410 test_kasumi_auth_cipher_test_case_2_sgl(void)
7411 {
7412 	return test_kasumi_auth_cipher_sgl(
7413 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7414 }
7415 
7416 static int
7417 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
7418 {
7419 	return test_kasumi_auth_cipher_sgl(
7420 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7421 }
7422 
7423 static int
7424 test_kasumi_auth_cipher_verify_test_case_1(void)
7425 {
7426 	return test_kasumi_auth_cipher(
7427 		&kasumi_test_case_3, IN_PLACE, 1);
7428 }
7429 
7430 static int
7431 test_kasumi_auth_cipher_verify_test_case_2(void)
7432 {
7433 	return test_kasumi_auth_cipher(
7434 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7435 }
7436 
7437 static int
7438 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
7439 {
7440 	return test_kasumi_auth_cipher(
7441 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7442 }
7443 
7444 static int
7445 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
7446 {
7447 	return test_kasumi_auth_cipher_sgl(
7448 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7449 }
7450 
7451 static int
7452 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
7453 {
7454 	return test_kasumi_auth_cipher_sgl(
7455 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7456 }
7457 
7458 static int
7459 test_kasumi_cipher_auth_test_case_1(void)
7460 {
7461 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
7462 }
7463 
7464 static int
7465 test_zuc_encryption_test_case_1(void)
7466 {
7467 	return test_zuc_cipher(&zuc_test_case_cipher_193b,
7468 			RTE_CRYPTO_CIPHER_OP_ENCRYPT);
7469 }
7470 
7471 static int
7472 test_zuc_encryption_test_case_2(void)
7473 {
7474 	return test_zuc_cipher(&zuc_test_case_cipher_800b,
7475 			RTE_CRYPTO_CIPHER_OP_ENCRYPT);
7476 }
7477 
7478 static int
7479 test_zuc_encryption_test_case_3(void)
7480 {
7481 	return test_zuc_cipher(&zuc_test_case_cipher_1570b,
7482 			RTE_CRYPTO_CIPHER_OP_ENCRYPT);
7483 }
7484 
7485 static int
7486 test_zuc_encryption_test_case_4(void)
7487 {
7488 	return test_zuc_cipher(&zuc_test_case_cipher_2798b,
7489 			RTE_CRYPTO_CIPHER_OP_ENCRYPT);
7490 }
7491 
7492 static int
7493 test_zuc_encryption_test_case_5(void)
7494 {
7495 	return test_zuc_cipher(&zuc_test_case_cipher_4019b,
7496 			RTE_CRYPTO_CIPHER_OP_ENCRYPT);
7497 }
7498 
7499 static int
7500 test_zuc_encryption_test_case_6_sgl(void)
7501 {
7502 	return test_zuc_cipher_sgl(&zuc_test_case_cipher_193b,
7503 			RTE_CRYPTO_CIPHER_OP_ENCRYPT);
7504 }
7505 
7506 static int
7507 test_zuc_decryption_test_case_1(void)
7508 {
7509 	return test_zuc_cipher(&zuc_test_case_cipher_193b,
7510 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
7511 }
7512 
7513 static int
7514 test_zuc_decryption_test_case_2(void)
7515 {
7516 	return test_zuc_cipher(&zuc_test_case_cipher_800b,
7517 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
7518 }
7519 
7520 static int
7521 test_zuc_decryption_test_case_3(void)
7522 {
7523 	return test_zuc_cipher(&zuc_test_case_cipher_1570b,
7524 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
7525 }
7526 
7527 static int
7528 test_zuc_decryption_test_case_4(void)
7529 {
7530 	return test_zuc_cipher(&zuc_test_case_cipher_2798b,
7531 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
7532 }
7533 
7534 static int
7535 test_zuc_decryption_test_case_5(void)
7536 {
7537 	return test_zuc_cipher(&zuc_test_case_cipher_4019b,
7538 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
7539 }
7540 
7541 static int
7542 test_zuc_decryption_test_case_6_sgl(void)
7543 {
7544 	return test_zuc_cipher_sgl(&zuc_test_case_cipher_193b,
7545 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
7546 }
7547 
7548 static int
7549 test_zuc_hash_generate_test_case_1(void)
7550 {
7551 	return test_zuc_authentication(&zuc_test_case_auth_1b,
7552 			RTE_CRYPTO_AUTH_OP_GENERATE);
7553 }
7554 
7555 static int
7556 test_zuc_hash_generate_test_case_2(void)
7557 {
7558 	return test_zuc_authentication(&zuc_test_case_auth_90b,
7559 			RTE_CRYPTO_AUTH_OP_GENERATE);
7560 }
7561 
7562 static int
7563 test_zuc_hash_generate_test_case_3(void)
7564 {
7565 	return test_zuc_authentication(&zuc_test_case_auth_577b,
7566 			RTE_CRYPTO_AUTH_OP_GENERATE);
7567 }
7568 
7569 static int
7570 test_zuc_hash_generate_test_case_4(void)
7571 {
7572 	return test_zuc_authentication(&zuc_test_case_auth_2079b,
7573 			RTE_CRYPTO_AUTH_OP_GENERATE);
7574 }
7575 
7576 static int
7577 test_zuc_hash_generate_test_case_5(void)
7578 {
7579 	return test_zuc_authentication(&zuc_test_auth_5670b,
7580 			RTE_CRYPTO_AUTH_OP_GENERATE);
7581 }
7582 
7583 static int
7584 test_zuc_hash_generate_test_case_6(void)
7585 {
7586 	return test_zuc_authentication(&zuc_test_case_auth_128b,
7587 			RTE_CRYPTO_AUTH_OP_GENERATE);
7588 }
7589 
7590 static int
7591 test_zuc_hash_generate_test_case_7(void)
7592 {
7593 	return test_zuc_authentication(&zuc_test_case_auth_2080b,
7594 			RTE_CRYPTO_AUTH_OP_GENERATE);
7595 }
7596 
7597 static int
7598 test_zuc_hash_generate_test_case_8(void)
7599 {
7600 	return test_zuc_authentication(&zuc_test_case_auth_584b,
7601 			RTE_CRYPTO_AUTH_OP_GENERATE);
7602 }
7603 
7604 static int
7605 test_zuc_hash_verify_test_case_1(void)
7606 {
7607 	return test_zuc_authentication(&zuc_test_case_auth_1b,
7608 			RTE_CRYPTO_AUTH_OP_VERIFY);
7609 }
7610 
7611 static int
7612 test_zuc_hash_verify_test_case_2(void)
7613 {
7614 	return test_zuc_authentication(&zuc_test_case_auth_90b,
7615 			RTE_CRYPTO_AUTH_OP_VERIFY);
7616 }
7617 
7618 static int
7619 test_zuc_hash_verify_test_case_3(void)
7620 {
7621 	return test_zuc_authentication(&zuc_test_case_auth_577b,
7622 			RTE_CRYPTO_AUTH_OP_VERIFY);
7623 }
7624 
7625 static int
7626 test_zuc_hash_verify_test_case_4(void)
7627 {
7628 	return test_zuc_authentication(&zuc_test_case_auth_2079b,
7629 			RTE_CRYPTO_AUTH_OP_VERIFY);
7630 }
7631 
7632 static int
7633 test_zuc_hash_verify_test_case_5(void)
7634 {
7635 	return test_zuc_authentication(&zuc_test_auth_5670b,
7636 			RTE_CRYPTO_AUTH_OP_VERIFY);
7637 }
7638 
7639 static int
7640 test_zuc_hash_verify_test_case_6(void)
7641 {
7642 	return test_zuc_authentication(&zuc_test_case_auth_128b,
7643 			RTE_CRYPTO_AUTH_OP_VERIFY);
7644 }
7645 
7646 static int
7647 test_zuc_hash_verify_test_case_7(void)
7648 {
7649 	return test_zuc_authentication(&zuc_test_case_auth_2080b,
7650 			RTE_CRYPTO_AUTH_OP_VERIFY);
7651 }
7652 
7653 static int
7654 test_zuc_hash_verify_test_case_8(void)
7655 {
7656 	return test_zuc_authentication(&zuc_test_case_auth_584b,
7657 			RTE_CRYPTO_AUTH_OP_VERIFY);
7658 }
7659 
7660 static int
7661 test_zuc_cipher_auth_test_case_1(void)
7662 {
7663 	return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7664 }
7665 
7666 static int
7667 test_zuc_cipher_auth_test_case_2(void)
7668 {
7669 	return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7670 }
7671 
7672 static int
7673 test_zuc_auth_cipher_test_case_1(void)
7674 {
7675 	return test_zuc_auth_cipher(
7676 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7677 }
7678 
7679 static int
7680 test_zuc_auth_cipher_test_case_1_oop(void)
7681 {
7682 	return test_zuc_auth_cipher(
7683 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7684 }
7685 
7686 static int
7687 test_zuc_auth_cipher_test_case_1_sgl(void)
7688 {
7689 	return test_zuc_auth_cipher_sgl(
7690 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7691 }
7692 
7693 static int
7694 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7695 {
7696 	return test_zuc_auth_cipher_sgl(
7697 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7698 }
7699 
7700 static int
7701 test_zuc_auth_cipher_test_case_2(void)
7702 {
7703 	return test_zuc_auth_cipher(
7704 		&zuc_auth_cipher_test_case_2, IN_PLACE, 0);
7705 }
7706 
7707 static int
7708 test_zuc_auth_cipher_test_case_2_oop(void)
7709 {
7710 	return test_zuc_auth_cipher(
7711 		&zuc_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7712 }
7713 
7714 static int
7715 test_zuc_auth_cipher_verify_test_case_1(void)
7716 {
7717 	return test_zuc_auth_cipher(
7718 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7719 }
7720 
7721 static int
7722 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7723 {
7724 	return test_zuc_auth_cipher(
7725 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7726 }
7727 
7728 static int
7729 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7730 {
7731 	return test_zuc_auth_cipher_sgl(
7732 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7733 }
7734 
7735 static int
7736 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7737 {
7738 	return test_zuc_auth_cipher_sgl(
7739 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7740 }
7741 
7742 static int
7743 test_zuc_auth_cipher_verify_test_case_2(void)
7744 {
7745 	return test_zuc_auth_cipher(
7746 		&zuc_auth_cipher_test_case_2, IN_PLACE, 1);
7747 }
7748 
7749 static int
7750 test_zuc_auth_cipher_verify_test_case_2_oop(void)
7751 {
7752 	return test_zuc_auth_cipher(
7753 		&zuc_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7754 }
7755 
7756 static int
7757 test_zuc256_encryption_test_case_1(void)
7758 {
7759 	return test_zuc_cipher(&zuc256_test_case_cipher_1,
7760 			RTE_CRYPTO_CIPHER_OP_ENCRYPT);
7761 }
7762 
7763 static int
7764 test_zuc256_encryption_test_case_2(void)
7765 {
7766 	return test_zuc_cipher(&zuc256_test_case_cipher_2,
7767 			RTE_CRYPTO_CIPHER_OP_ENCRYPT);
7768 }
7769 
7770 static int
7771 test_zuc256_decryption_test_case_1(void)
7772 {
7773 	return test_zuc_cipher(&zuc256_test_case_cipher_1,
7774 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
7775 }
7776 
7777 static int
7778 test_zuc256_decryption_test_case_2(void)
7779 {
7780 	return test_zuc_cipher(&zuc256_test_case_cipher_2,
7781 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
7782 }
7783 
7784 static int
7785 test_zuc256_hash_generate_4b_tag_test_case_1(void)
7786 {
7787 	return test_zuc_authentication(&zuc256_test_case_auth_1,
7788 			RTE_CRYPTO_AUTH_OP_GENERATE);
7789 }
7790 
7791 static int
7792 test_zuc256_hash_generate_4b_tag_test_case_2(void)
7793 {
7794 	return test_zuc_authentication(&zuc256_test_case_auth_2,
7795 			RTE_CRYPTO_AUTH_OP_GENERATE);
7796 }
7797 
7798 static int
7799 test_zuc256_hash_generate_4b_tag_test_case_3(void)
7800 {
7801 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_32b,
7802 			RTE_CRYPTO_AUTH_OP_GENERATE);
7803 }
7804 
7805 static int
7806 test_zuc256_hash_generate_8b_tag_test_case_1(void)
7807 {
7808 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_64b,
7809 			RTE_CRYPTO_AUTH_OP_GENERATE);
7810 }
7811 
7812 static int
7813 test_zuc256_hash_generate_16b_tag_test_case_1(void)
7814 {
7815 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_128b,
7816 			RTE_CRYPTO_AUTH_OP_GENERATE);
7817 }
7818 
7819 static int
7820 test_zuc256_hash_verify_4b_tag_test_case_1(void)
7821 {
7822 	return test_zuc_authentication(&zuc256_test_case_auth_1,
7823 			RTE_CRYPTO_AUTH_OP_VERIFY);
7824 }
7825 
7826 static int
7827 test_zuc256_hash_verify_4b_tag_test_case_2(void)
7828 {
7829 	return test_zuc_authentication(&zuc256_test_case_auth_2,
7830 			RTE_CRYPTO_AUTH_OP_VERIFY);
7831 }
7832 
7833 static int
7834 test_zuc256_hash_verify_4b_tag_test_case_3(void)
7835 {
7836 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_32b,
7837 			RTE_CRYPTO_AUTH_OP_VERIFY);
7838 }
7839 
7840 static int
7841 test_zuc256_hash_verify_8b_tag_test_case_1(void)
7842 {
7843 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_64b,
7844 			RTE_CRYPTO_AUTH_OP_VERIFY);
7845 }
7846 
7847 static int
7848 test_zuc256_hash_verify_16b_tag_test_case_1(void)
7849 {
7850 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_128b,
7851 			RTE_CRYPTO_AUTH_OP_VERIFY);
7852 }
7853 
7854 static int
7855 test_zuc256_cipher_auth_4b_tag_test_case_1(void)
7856 {
7857 	return test_zuc_cipher_auth(&zuc256_test_case_cipher_auth_1);
7858 }
7859 
7860 static int
7861 test_zuc256_cipher_auth_4b_tag_test_case_2(void)
7862 {
7863 	return test_zuc_cipher_auth(&zuc256_test_case_cipher_auth_2);
7864 }
7865 
7866 static int
7867 test_zuc256_cipher_auth_8b_tag_test_case_1(void)
7868 {
7869 	return test_zuc_cipher_auth(&zuc256_test_case_cipher_auth_3);
7870 }
7871 
7872 static int
7873 test_zuc256_cipher_auth_16b_tag_test_case_1(void)
7874 {
7875 	return test_zuc_cipher_auth(&zuc256_test_case_cipher_auth_4);
7876 }
7877 
7878 static int
7879 test_zuc256_auth_cipher_4b_tag_test_case_1(void)
7880 {
7881 	return test_zuc_auth_cipher(
7882 		&zuc256_auth_cipher_test_case_1, IN_PLACE, 0);
7883 }
7884 
7885 static int
7886 test_zuc256_auth_cipher_4b_tag_test_case_2(void)
7887 {
7888 	return test_zuc_auth_cipher(
7889 		&zuc256_auth_cipher_test_case_2, IN_PLACE, 0);
7890 }
7891 
7892 static int
7893 test_zuc256_auth_cipher_8b_tag_test_case_1(void)
7894 {
7895 	return test_zuc_auth_cipher(
7896 		&zuc256_auth_cipher_test_case_3, IN_PLACE, 0);
7897 }
7898 
7899 static int
7900 test_zuc256_auth_cipher_16b_tag_test_case_1(void)
7901 {
7902 	return test_zuc_auth_cipher(
7903 		&zuc256_auth_cipher_test_case_4, IN_PLACE, 0);
7904 }
7905 
7906 static int
7907 test_zuc256_auth_cipher_verify_4b_tag_test_case_1(void)
7908 {
7909 	return test_zuc_auth_cipher(
7910 		&zuc256_auth_cipher_test_case_1, IN_PLACE, 1);
7911 }
7912 
7913 static int
7914 test_zuc256_auth_cipher_verify_4b_tag_test_case_2(void)
7915 {
7916 	return test_zuc_auth_cipher(
7917 		&zuc256_auth_cipher_test_case_2, IN_PLACE, 1);
7918 }
7919 
7920 static int
7921 test_zuc256_auth_cipher_verify_8b_tag_test_case_1(void)
7922 {
7923 	return test_zuc_auth_cipher(
7924 		&zuc256_auth_cipher_test_case_3, IN_PLACE, 1);
7925 }
7926 
7927 static int
7928 test_zuc256_auth_cipher_verify_16b_tag_test_case_1(void)
7929 {
7930 	return test_zuc_auth_cipher(
7931 		&zuc256_auth_cipher_test_case_4, IN_PLACE, 1);
7932 }
7933 
7934 static int
7935 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7936 {
7937 	uint8_t dev_id = testsuite_params.valid_devs[0];
7938 
7939 	struct rte_cryptodev_sym_capability_idx cap_idx;
7940 
7941 	/* Check if device supports particular cipher algorithm */
7942 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7943 	cap_idx.algo.cipher = tdata->cipher_algo;
7944 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7945 		return TEST_SKIPPED;
7946 
7947 	/* Check if device supports particular hash algorithm */
7948 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7949 	cap_idx.algo.auth = tdata->auth_algo;
7950 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7951 		return TEST_SKIPPED;
7952 
7953 	return 0;
7954 }
7955 
7956 static int
7957 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7958 	uint8_t op_mode, uint8_t verify)
7959 {
7960 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7961 	struct crypto_unittest_params *ut_params = &unittest_params;
7962 
7963 	int retval;
7964 
7965 	uint8_t *plaintext = NULL, *ciphertext = NULL;
7966 	unsigned int plaintext_pad_len;
7967 	unsigned int plaintext_len;
7968 	unsigned int ciphertext_pad_len;
7969 	unsigned int ciphertext_len;
7970 	unsigned int digest_offset;
7971 
7972 	struct rte_cryptodev_info dev_info;
7973 	struct rte_crypto_op *op;
7974 
7975 	/* Check if device supports particular algorithms separately */
7976 	if (test_mixed_check_if_unsupported(tdata))
7977 		return TEST_SKIPPED;
7978 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7979 		return TEST_SKIPPED;
7980 
7981 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
7982 		return TEST_SKIPPED;
7983 
7984 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7985 
7986 	uint64_t feat_flags = dev_info.feature_flags;
7987 
7988 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7989 		printf("Device doesn't support digest encrypted.\n");
7990 		return TEST_SKIPPED;
7991 	}
7992 
7993 	/* Create the session */
7994 	if (verify)
7995 		retval = create_wireless_algo_cipher_auth_session(
7996 				ts_params->valid_devs[0],
7997 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7998 				RTE_CRYPTO_AUTH_OP_VERIFY,
7999 				tdata->auth_algo,
8000 				tdata->cipher_algo,
8001 				tdata->auth_key.data, tdata->auth_key.len,
8002 				tdata->cipher_key.data, tdata->cipher_key.len,
8003 				tdata->auth_iv.len, tdata->digest_enc.len,
8004 				tdata->cipher_iv.len);
8005 	else
8006 		retval = create_wireless_algo_auth_cipher_session(
8007 				ts_params->valid_devs[0],
8008 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8009 				RTE_CRYPTO_AUTH_OP_GENERATE,
8010 				tdata->auth_algo,
8011 				tdata->cipher_algo,
8012 				tdata->auth_key.data, tdata->auth_key.len,
8013 				tdata->cipher_key.data, tdata->cipher_key.len,
8014 				tdata->auth_iv.len, tdata->digest_enc.len,
8015 				tdata->cipher_iv.len);
8016 	if (retval != 0)
8017 		return retval;
8018 
8019 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8020 	if (op_mode == OUT_OF_PLACE)
8021 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8022 
8023 	/* clear mbuf payload */
8024 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8025 		rte_pktmbuf_tailroom(ut_params->ibuf));
8026 	if (op_mode == OUT_OF_PLACE) {
8027 
8028 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
8029 				rte_pktmbuf_tailroom(ut_params->obuf));
8030 	}
8031 
8032 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
8033 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
8034 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
8035 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
8036 
8037 	if (verify) {
8038 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8039 				ciphertext_pad_len);
8040 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
8041 		debug_hexdump(stdout, "ciphertext:", ciphertext,
8042 				ciphertext_len);
8043 	} else {
8044 		/* make sure enough space to cover partial digest verify case */
8045 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8046 				ciphertext_pad_len);
8047 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
8048 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
8049 	}
8050 
8051 	if (op_mode == OUT_OF_PLACE)
8052 		rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
8053 
8054 	/* Create the operation */
8055 	retval = create_wireless_algo_auth_cipher_operation(
8056 			tdata->digest_enc.data, tdata->digest_enc.len,
8057 			tdata->cipher_iv.data, tdata->cipher_iv.len,
8058 			tdata->auth_iv.data, tdata->auth_iv.len,
8059 			(tdata->digest_enc.offset == 0 ?
8060 				plaintext_pad_len
8061 				: tdata->digest_enc.offset),
8062 			tdata->validCipherLen.len_bits,
8063 			tdata->cipher.offset_bits,
8064 			tdata->validAuthLen.len_bits,
8065 			tdata->auth.offset_bits,
8066 			op_mode, 0, verify);
8067 
8068 	if (retval < 0)
8069 		return retval;
8070 
8071 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
8072 
8073 	/* Check if the op failed because the device doesn't */
8074 	/* support this particular combination of algorithms */
8075 	if (op == NULL && ut_params->op->status ==
8076 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
8077 		printf("Device doesn't support this mixed combination. "
8078 				"Test Skipped.\n");
8079 		return TEST_SKIPPED;
8080 	}
8081 	ut_params->op = op;
8082 
8083 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
8084 
8085 	ut_params->obuf = (op_mode == IN_PLACE ?
8086 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
8087 
8088 	if (verify) {
8089 		if (ut_params->obuf)
8090 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
8091 							uint8_t *);
8092 		else
8093 			plaintext = ciphertext +
8094 					(tdata->cipher.offset_bits >> 3);
8095 
8096 		debug_hexdump(stdout, "plaintext:", plaintext,
8097 				tdata->plaintext.len_bits >> 3);
8098 		debug_hexdump(stdout, "plaintext expected:",
8099 				tdata->plaintext.data,
8100 				tdata->plaintext.len_bits >> 3);
8101 	} else {
8102 		if (ut_params->obuf)
8103 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
8104 					uint8_t *);
8105 		else
8106 			ciphertext = plaintext;
8107 
8108 		debug_hexdump(stdout, "ciphertext:", ciphertext,
8109 				ciphertext_len);
8110 		debug_hexdump(stdout, "ciphertext expected:",
8111 				tdata->ciphertext.data,
8112 				tdata->ciphertext.len_bits >> 3);
8113 
8114 		if (tdata->digest_enc.offset == 0)
8115 			digest_offset = plaintext_pad_len;
8116 		else
8117 			digest_offset = tdata->digest_enc.offset;
8118 
8119 		ut_params->digest = rte_pktmbuf_mtod_offset(ut_params->obuf,
8120 					    uint8_t *, digest_offset);
8121 
8122 		debug_hexdump(stdout, "digest:", ut_params->digest,
8123 				tdata->digest_enc.len);
8124 		debug_hexdump(stdout, "digest expected:",
8125 				tdata->digest_enc.data,
8126 				tdata->digest_enc.len);
8127 	}
8128 
8129 	if (!verify) {
8130 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
8131 				ut_params->digest,
8132 				tdata->digest_enc.data,
8133 				tdata->digest_enc.len,
8134 				"Generated auth tag not as expected");
8135 	}
8136 
8137 	if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
8138 		if (verify) {
8139 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
8140 					plaintext,
8141 					tdata->plaintext.data,
8142 					tdata->plaintext.len_bits >> 3,
8143 					"Plaintext data not as expected");
8144 		} else {
8145 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
8146 					ciphertext,
8147 					tdata->ciphertext.data,
8148 					tdata->validDataLen.len_bits,
8149 					"Ciphertext data not as expected");
8150 		}
8151 	}
8152 
8153 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8154 			"crypto op processing failed");
8155 
8156 	return 0;
8157 }
8158 
8159 static int
8160 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
8161 	uint8_t op_mode, uint8_t verify)
8162 {
8163 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8164 	struct crypto_unittest_params *ut_params = &unittest_params;
8165 
8166 	int retval;
8167 
8168 	const uint8_t *plaintext = NULL;
8169 	const uint8_t *ciphertext = NULL;
8170 	const uint8_t *digest = NULL;
8171 	unsigned int plaintext_pad_len;
8172 	unsigned int plaintext_len;
8173 	unsigned int ciphertext_pad_len;
8174 	unsigned int ciphertext_len;
8175 	uint8_t buffer[10000];
8176 	uint8_t digest_buffer[10000];
8177 
8178 	struct rte_cryptodev_info dev_info;
8179 	struct rte_crypto_op *op;
8180 
8181 	/* Check if device supports particular algorithms */
8182 	if (test_mixed_check_if_unsupported(tdata))
8183 		return TEST_SKIPPED;
8184 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8185 		return TEST_SKIPPED;
8186 
8187 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8188 
8189 	uint64_t feat_flags = dev_info.feature_flags;
8190 
8191 	if (op_mode == IN_PLACE) {
8192 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
8193 			printf("Device doesn't support in-place scatter-gather "
8194 					"in both input and output mbufs.\n");
8195 			return TEST_SKIPPED;
8196 		}
8197 	} else {
8198 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
8199 			printf("Device doesn't support out-of-place scatter-gather "
8200 					"in both input and output mbufs.\n");
8201 			return TEST_SKIPPED;
8202 		}
8203 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
8204 			printf("Device doesn't support digest encrypted.\n");
8205 			return TEST_SKIPPED;
8206 		}
8207 	}
8208 
8209 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8210 		return TEST_SKIPPED;
8211 
8212 	/* Create the session */
8213 	if (verify)
8214 		retval = create_wireless_algo_cipher_auth_session(
8215 				ts_params->valid_devs[0],
8216 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
8217 				RTE_CRYPTO_AUTH_OP_VERIFY,
8218 				tdata->auth_algo,
8219 				tdata->cipher_algo,
8220 				tdata->auth_key.data, tdata->auth_key.len,
8221 				tdata->cipher_key.data, tdata->cipher_key.len,
8222 				tdata->auth_iv.len, tdata->digest_enc.len,
8223 				tdata->cipher_iv.len);
8224 	else
8225 		retval = create_wireless_algo_auth_cipher_session(
8226 				ts_params->valid_devs[0],
8227 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8228 				RTE_CRYPTO_AUTH_OP_GENERATE,
8229 				tdata->auth_algo,
8230 				tdata->cipher_algo,
8231 				tdata->auth_key.data, tdata->auth_key.len,
8232 				tdata->cipher_key.data, tdata->cipher_key.len,
8233 				tdata->auth_iv.len, tdata->digest_enc.len,
8234 				tdata->cipher_iv.len);
8235 	if (retval != 0)
8236 		return retval;
8237 
8238 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
8239 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
8240 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
8241 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
8242 
8243 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
8244 			ciphertext_pad_len, 15, 0);
8245 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
8246 			"Failed to allocate input buffer in mempool");
8247 
8248 	if (op_mode == OUT_OF_PLACE) {
8249 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
8250 				plaintext_pad_len, 15, 0);
8251 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
8252 				"Failed to allocate output buffer in mempool");
8253 	}
8254 
8255 	if (verify) {
8256 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
8257 			tdata->ciphertext.data);
8258 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
8259 					ciphertext_len, buffer);
8260 		debug_hexdump(stdout, "ciphertext:", ciphertext,
8261 			ciphertext_len);
8262 	} else {
8263 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
8264 			tdata->plaintext.data);
8265 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
8266 					plaintext_len, buffer);
8267 		debug_hexdump(stdout, "plaintext:", plaintext,
8268 			plaintext_len);
8269 	}
8270 	memset(buffer, 0, sizeof(buffer));
8271 
8272 	/* Create the operation */
8273 	retval = create_wireless_algo_auth_cipher_operation(
8274 			tdata->digest_enc.data, tdata->digest_enc.len,
8275 			tdata->cipher_iv.data, tdata->cipher_iv.len,
8276 			tdata->auth_iv.data, tdata->auth_iv.len,
8277 			(tdata->digest_enc.offset == 0 ?
8278 				plaintext_pad_len
8279 				: tdata->digest_enc.offset),
8280 			tdata->validCipherLen.len_bits,
8281 			tdata->cipher.offset_bits,
8282 			tdata->validAuthLen.len_bits,
8283 			tdata->auth.offset_bits,
8284 			op_mode, 1, verify);
8285 
8286 	if (retval < 0)
8287 		return retval;
8288 
8289 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
8290 
8291 	/* Check if the op failed because the device doesn't */
8292 	/* support this particular combination of algorithms */
8293 	if (op == NULL && ut_params->op->status ==
8294 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
8295 		printf("Device doesn't support this mixed combination. "
8296 				"Test Skipped.\n");
8297 		return TEST_SKIPPED;
8298 	}
8299 	ut_params->op = op;
8300 
8301 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
8302 
8303 	ut_params->obuf = (op_mode == IN_PLACE ?
8304 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
8305 
8306 	if (verify) {
8307 		if (ut_params->obuf)
8308 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
8309 					plaintext_len, buffer);
8310 		else
8311 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
8312 					plaintext_len, buffer);
8313 
8314 		debug_hexdump(stdout, "plaintext:", plaintext,
8315 				(tdata->plaintext.len_bits >> 3) -
8316 				tdata->digest_enc.len);
8317 		debug_hexdump(stdout, "plaintext expected:",
8318 				tdata->plaintext.data,
8319 				(tdata->plaintext.len_bits >> 3) -
8320 				tdata->digest_enc.len);
8321 	} else {
8322 		if (ut_params->obuf)
8323 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
8324 					ciphertext_len, buffer);
8325 		else
8326 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
8327 					ciphertext_len, buffer);
8328 
8329 		debug_hexdump(stdout, "ciphertext:", ciphertext,
8330 			ciphertext_len);
8331 		debug_hexdump(stdout, "ciphertext expected:",
8332 			tdata->ciphertext.data,
8333 			tdata->ciphertext.len_bits >> 3);
8334 
8335 		if (ut_params->obuf)
8336 			digest = rte_pktmbuf_read(ut_params->obuf,
8337 					(tdata->digest_enc.offset == 0 ?
8338 						plaintext_pad_len :
8339 						tdata->digest_enc.offset),
8340 					tdata->digest_enc.len, digest_buffer);
8341 		else
8342 			digest = rte_pktmbuf_read(ut_params->ibuf,
8343 					(tdata->digest_enc.offset == 0 ?
8344 						plaintext_pad_len :
8345 						tdata->digest_enc.offset),
8346 					tdata->digest_enc.len, digest_buffer);
8347 
8348 		debug_hexdump(stdout, "digest:", digest,
8349 				tdata->digest_enc.len);
8350 		debug_hexdump(stdout, "digest expected:",
8351 				tdata->digest_enc.data, tdata->digest_enc.len);
8352 	}
8353 
8354 	if (!verify) {
8355 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
8356 				digest,
8357 				tdata->digest_enc.data,
8358 				tdata->digest_enc.len,
8359 				"Generated auth tag not as expected");
8360 	}
8361 
8362 	if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
8363 		if (verify) {
8364 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
8365 					plaintext,
8366 					tdata->plaintext.data,
8367 					tdata->plaintext.len_bits >> 3,
8368 					"Plaintext data not as expected");
8369 		} else {
8370 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
8371 					ciphertext,
8372 					tdata->ciphertext.data,
8373 					tdata->validDataLen.len_bits,
8374 					"Ciphertext data not as expected");
8375 		}
8376 	}
8377 
8378 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8379 			"crypto op processing failed");
8380 
8381 	return 0;
8382 }
8383 
8384 /** AUTH AES CMAC + CIPHER AES CTR */
8385 
8386 static int
8387 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
8388 {
8389 	return test_mixed_auth_cipher(
8390 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
8391 }
8392 
8393 static int
8394 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
8395 {
8396 	return test_mixed_auth_cipher(
8397 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
8398 }
8399 
8400 static int
8401 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
8402 {
8403 	return test_mixed_auth_cipher_sgl(
8404 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
8405 }
8406 
8407 static int
8408 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
8409 {
8410 	return test_mixed_auth_cipher_sgl(
8411 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
8412 }
8413 
8414 static int
8415 test_aes_cmac_aes_ctr_digest_enc_test_case_2(void)
8416 {
8417 	return test_mixed_auth_cipher(
8418 		&auth_aes_cmac_cipher_aes_ctr_test_case_2, IN_PLACE, 0);
8419 }
8420 
8421 static int
8422 test_aes_cmac_aes_ctr_digest_enc_test_case_2_oop(void)
8423 {
8424 	return test_mixed_auth_cipher(
8425 		&auth_aes_cmac_cipher_aes_ctr_test_case_2, OUT_OF_PLACE, 0);
8426 }
8427 
8428 static int
8429 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
8430 {
8431 	return test_mixed_auth_cipher(
8432 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
8433 }
8434 
8435 static int
8436 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_2(void)
8437 {
8438 	return test_mixed_auth_cipher(
8439 		&auth_aes_cmac_cipher_aes_ctr_test_case_2, IN_PLACE, 1);
8440 }
8441 
8442 static int
8443 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
8444 {
8445 	return test_mixed_auth_cipher(
8446 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
8447 }
8448 
8449 static int
8450 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
8451 {
8452 	return test_mixed_auth_cipher_sgl(
8453 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
8454 }
8455 
8456 static int
8457 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
8458 {
8459 	return test_mixed_auth_cipher_sgl(
8460 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
8461 }
8462 
8463 static int
8464 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_2_oop(void)
8465 {
8466 	return test_mixed_auth_cipher(
8467 		&auth_aes_cmac_cipher_aes_ctr_test_case_2, OUT_OF_PLACE, 1);
8468 }
8469 
8470 /** MIXED AUTH + CIPHER */
8471 
8472 static int
8473 test_auth_zuc_cipher_snow_test_case_1(void)
8474 {
8475 	return test_mixed_auth_cipher(
8476 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
8477 }
8478 
8479 static int
8480 test_verify_auth_zuc_cipher_snow_test_case_1(void)
8481 {
8482 	return test_mixed_auth_cipher(
8483 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
8484 }
8485 
8486 static int
8487 test_auth_zuc_cipher_snow_test_case_1_inplace(void)
8488 {
8489 	return test_mixed_auth_cipher(
8490 		&auth_zuc_cipher_snow_test_case_1, IN_PLACE, 0);
8491 }
8492 
8493 static int
8494 test_verify_auth_zuc_cipher_snow_test_case_1_inplace(void)
8495 {
8496 	return test_mixed_auth_cipher(
8497 		&auth_zuc_cipher_snow_test_case_1, IN_PLACE, 1);
8498 }
8499 
8500 
8501 static int
8502 test_auth_aes_cmac_cipher_snow_test_case_1(void)
8503 {
8504 	return test_mixed_auth_cipher(
8505 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
8506 }
8507 
8508 static int
8509 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
8510 {
8511 	return test_mixed_auth_cipher(
8512 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
8513 }
8514 
8515 static int
8516 test_auth_aes_cmac_cipher_snow_test_case_1_inplace(void)
8517 {
8518 	return test_mixed_auth_cipher(
8519 		&auth_aes_cmac_cipher_snow_test_case_1, IN_PLACE, 0);
8520 }
8521 
8522 static int
8523 test_verify_auth_aes_cmac_cipher_snow_test_case_1_inplace(void)
8524 {
8525 	return test_mixed_auth_cipher(
8526 		&auth_aes_cmac_cipher_snow_test_case_1, IN_PLACE, 1);
8527 }
8528 
8529 static int
8530 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
8531 {
8532 	return test_mixed_auth_cipher(
8533 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
8534 }
8535 
8536 static int
8537 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
8538 {
8539 	return test_mixed_auth_cipher(
8540 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
8541 }
8542 
8543 static int
8544 test_auth_zuc_cipher_aes_ctr_test_case_1_inplace(void)
8545 {
8546 	return test_mixed_auth_cipher(
8547 		&auth_zuc_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
8548 }
8549 
8550 static int
8551 test_verify_auth_zuc_cipher_aes_ctr_test_case_1_inplace(void)
8552 {
8553 	return test_mixed_auth_cipher(
8554 		&auth_zuc_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
8555 }
8556 
8557 static int
8558 test_auth_snow_cipher_aes_ctr_test_case_1(void)
8559 {
8560 	return test_mixed_auth_cipher(
8561 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
8562 }
8563 
8564 static int
8565 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
8566 {
8567 	return test_mixed_auth_cipher(
8568 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
8569 }
8570 
8571 static int
8572 test_auth_snow_cipher_aes_ctr_test_case_1_inplace_sgl(void)
8573 {
8574 	return test_mixed_auth_cipher_sgl(
8575 		&auth_snow_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
8576 }
8577 
8578 static int
8579 test_auth_snow_cipher_aes_ctr_test_case_1_inplace(void)
8580 {
8581 	return test_mixed_auth_cipher(
8582 		&auth_snow_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
8583 }
8584 
8585 static int
8586 test_verify_auth_snow_cipher_aes_ctr_test_case_1_inplace_sgl(void)
8587 {
8588 	return test_mixed_auth_cipher_sgl(
8589 		&auth_snow_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
8590 }
8591 
8592 static int
8593 test_verify_auth_snow_cipher_aes_ctr_test_case_1_inplace(void)
8594 {
8595 	return test_mixed_auth_cipher(
8596 		&auth_snow_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
8597 }
8598 
8599 static int
8600 test_auth_snow_cipher_zuc_test_case_1(void)
8601 {
8602 	return test_mixed_auth_cipher(
8603 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
8604 }
8605 
8606 static int
8607 test_verify_auth_snow_cipher_zuc_test_case_1(void)
8608 {
8609 	return test_mixed_auth_cipher(
8610 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
8611 }
8612 
8613 static int
8614 test_auth_snow_cipher_zuc_test_case_1_inplace(void)
8615 {
8616 	return test_mixed_auth_cipher(
8617 		&auth_snow_cipher_zuc_test_case_1, IN_PLACE, 0);
8618 }
8619 
8620 static int
8621 test_verify_auth_snow_cipher_zuc_test_case_1_inplace(void)
8622 {
8623 	return test_mixed_auth_cipher(
8624 		&auth_snow_cipher_zuc_test_case_1, IN_PLACE, 1);
8625 }
8626 
8627 static int
8628 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
8629 {
8630 	return test_mixed_auth_cipher(
8631 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
8632 }
8633 
8634 static int
8635 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
8636 {
8637 	return test_mixed_auth_cipher(
8638 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
8639 }
8640 static int
8641 test_auth_aes_cmac_cipher_zuc_test_case_1_inplace(void)
8642 {
8643 	return test_mixed_auth_cipher(
8644 		&auth_aes_cmac_cipher_zuc_test_case_1, IN_PLACE, 0);
8645 }
8646 
8647 static int
8648 test_verify_auth_aes_cmac_cipher_zuc_test_case_1_inplace(void)
8649 {
8650 	return test_mixed_auth_cipher(
8651 		&auth_aes_cmac_cipher_zuc_test_case_1, IN_PLACE, 1);
8652 }
8653 
8654 static int
8655 test_auth_null_cipher_snow_test_case_1(void)
8656 {
8657 	return test_mixed_auth_cipher(
8658 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
8659 }
8660 
8661 static int
8662 test_verify_auth_null_cipher_snow_test_case_1(void)
8663 {
8664 	return test_mixed_auth_cipher(
8665 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
8666 }
8667 
8668 static int
8669 test_auth_null_cipher_zuc_test_case_1(void)
8670 {
8671 	return test_mixed_auth_cipher(
8672 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
8673 }
8674 
8675 static int
8676 test_verify_auth_null_cipher_zuc_test_case_1(void)
8677 {
8678 	return test_mixed_auth_cipher(
8679 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
8680 }
8681 
8682 static int
8683 test_auth_snow_cipher_null_test_case_1(void)
8684 {
8685 	return test_mixed_auth_cipher(
8686 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
8687 }
8688 
8689 static int
8690 test_verify_auth_snow_cipher_null_test_case_1(void)
8691 {
8692 	return test_mixed_auth_cipher(
8693 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
8694 }
8695 
8696 static int
8697 test_auth_zuc_cipher_null_test_case_1(void)
8698 {
8699 	return test_mixed_auth_cipher(
8700 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
8701 }
8702 
8703 static int
8704 test_verify_auth_zuc_cipher_null_test_case_1(void)
8705 {
8706 	return test_mixed_auth_cipher(
8707 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
8708 }
8709 
8710 static int
8711 test_auth_null_cipher_aes_ctr_test_case_1(void)
8712 {
8713 	return test_mixed_auth_cipher(
8714 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
8715 }
8716 
8717 static int
8718 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
8719 {
8720 	return test_mixed_auth_cipher(
8721 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
8722 }
8723 
8724 static int
8725 test_auth_aes_cmac_cipher_null_test_case_1(void)
8726 {
8727 	return test_mixed_auth_cipher(
8728 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
8729 }
8730 
8731 static int
8732 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
8733 {
8734 	return test_mixed_auth_cipher(
8735 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
8736 }
8737 
8738 /* ***** AEAD algorithm Tests ***** */
8739 
8740 static int
8741 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
8742 		enum rte_crypto_aead_operation op,
8743 		const uint8_t *key, const uint8_t key_len,
8744 		const uint16_t aad_len, const uint8_t auth_len,
8745 		uint8_t iv_len)
8746 {
8747 	uint8_t aead_key[key_len];
8748 
8749 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8750 	struct crypto_unittest_params *ut_params = &unittest_params;
8751 
8752 	memcpy(aead_key, key, key_len);
8753 
8754 	/* Setup AEAD Parameters */
8755 	ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8756 	ut_params->aead_xform.next = NULL;
8757 	ut_params->aead_xform.aead.algo = algo;
8758 	ut_params->aead_xform.aead.op = op;
8759 	ut_params->aead_xform.aead.key.data = aead_key;
8760 	ut_params->aead_xform.aead.key.length = key_len;
8761 	ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
8762 	ut_params->aead_xform.aead.iv.length = iv_len;
8763 	ut_params->aead_xform.aead.digest_length = auth_len;
8764 	ut_params->aead_xform.aead.aad_length = aad_len;
8765 
8766 	debug_hexdump(stdout, "key:", key, key_len);
8767 
8768 	/* Create Crypto session*/
8769 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
8770 			&ut_params->aead_xform, ts_params->session_mpool);
8771 	if (ut_params->sess == NULL && rte_errno == ENOTSUP)
8772 		return TEST_SKIPPED;
8773 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
8774 	return 0;
8775 }
8776 
8777 static int
8778 create_aead_xform(struct rte_crypto_op *op,
8779 		enum rte_crypto_aead_algorithm algo,
8780 		enum rte_crypto_aead_operation aead_op,
8781 		uint8_t *key, const uint8_t key_len,
8782 		const uint8_t aad_len, const uint8_t auth_len,
8783 		uint8_t iv_len)
8784 {
8785 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
8786 			"failed to allocate space for crypto transform");
8787 
8788 	struct rte_crypto_sym_op *sym_op = op->sym;
8789 
8790 	/* Setup AEAD Parameters */
8791 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
8792 	sym_op->xform->next = NULL;
8793 	sym_op->xform->aead.algo = algo;
8794 	sym_op->xform->aead.op = aead_op;
8795 	sym_op->xform->aead.key.data = key;
8796 	sym_op->xform->aead.key.length = key_len;
8797 	sym_op->xform->aead.iv.offset = IV_OFFSET;
8798 	sym_op->xform->aead.iv.length = iv_len;
8799 	sym_op->xform->aead.digest_length = auth_len;
8800 	sym_op->xform->aead.aad_length = aad_len;
8801 
8802 	debug_hexdump(stdout, "key:", key, key_len);
8803 
8804 	return 0;
8805 }
8806 
8807 static int
8808 create_aead_operation(enum rte_crypto_aead_operation op,
8809 		const struct aead_test_data *tdata)
8810 {
8811 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8812 	struct crypto_unittest_params *ut_params = &unittest_params;
8813 
8814 	uint8_t *plaintext, *ciphertext;
8815 	unsigned int aad_pad_len, plaintext_pad_len;
8816 
8817 	/* Generate Crypto op data structure */
8818 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8819 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8820 	TEST_ASSERT_NOT_NULL(ut_params->op,
8821 			"Failed to allocate symmetric crypto operation struct");
8822 
8823 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
8824 
8825 	/* Append aad data */
8826 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
8827 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
8828 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8829 				aad_pad_len);
8830 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8831 				"no room to append aad");
8832 
8833 		sym_op->aead.aad.phys_addr =
8834 				rte_pktmbuf_iova(ut_params->ibuf);
8835 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
8836 		memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
8837 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data + 18,
8838 			tdata->aad.len);
8839 
8840 		/* Append IV at the end of the crypto operation*/
8841 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8842 				uint8_t *, IV_OFFSET);
8843 
8844 		/* Copy IV 1 byte after the IV pointer, according to the API */
8845 		rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
8846 		debug_hexdump(stdout, "iv:", iv_ptr + 1,
8847 			tdata->iv.len);
8848 	} else {
8849 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
8850 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8851 				aad_pad_len);
8852 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8853 				"no room to append aad");
8854 
8855 		sym_op->aead.aad.phys_addr =
8856 				rte_pktmbuf_iova(ut_params->ibuf);
8857 		memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
8858 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8859 			tdata->aad.len);
8860 
8861 		/* Append IV at the end of the crypto operation*/
8862 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8863 				uint8_t *, IV_OFFSET);
8864 
8865 		if (tdata->iv.len == 0) {
8866 			rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
8867 			debug_hexdump(stdout, "iv:", iv_ptr,
8868 				AES_GCM_J0_LENGTH);
8869 		} else {
8870 			rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
8871 			debug_hexdump(stdout, "iv:", iv_ptr,
8872 				tdata->iv.len);
8873 		}
8874 	}
8875 
8876 	/* Append plaintext/ciphertext */
8877 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8878 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8879 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8880 				plaintext_pad_len);
8881 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
8882 
8883 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
8884 		debug_hexdump(stdout, "plaintext:", plaintext,
8885 				tdata->plaintext.len);
8886 
8887 		if (ut_params->obuf) {
8888 			ciphertext = (uint8_t *)rte_pktmbuf_append(
8889 					ut_params->obuf,
8890 					plaintext_pad_len + aad_pad_len);
8891 			TEST_ASSERT_NOT_NULL(ciphertext,
8892 					"no room to append ciphertext");
8893 
8894 			memset(ciphertext + aad_pad_len, 0,
8895 					tdata->ciphertext.len);
8896 		}
8897 	} else {
8898 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
8899 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8900 				plaintext_pad_len);
8901 		TEST_ASSERT_NOT_NULL(ciphertext,
8902 				"no room to append ciphertext");
8903 
8904 		memcpy(ciphertext, tdata->ciphertext.data,
8905 				tdata->ciphertext.len);
8906 		debug_hexdump(stdout, "ciphertext:", ciphertext,
8907 				tdata->ciphertext.len);
8908 
8909 		if (ut_params->obuf) {
8910 			plaintext = (uint8_t *)rte_pktmbuf_append(
8911 					ut_params->obuf,
8912 					plaintext_pad_len + aad_pad_len);
8913 			TEST_ASSERT_NOT_NULL(plaintext,
8914 					"no room to append plaintext");
8915 
8916 			memset(plaintext + aad_pad_len, 0,
8917 					tdata->plaintext.len);
8918 		}
8919 	}
8920 
8921 	/* Append digest data */
8922 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8923 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8924 				ut_params->obuf ? ut_params->obuf :
8925 						ut_params->ibuf,
8926 						tdata->auth_tag.len);
8927 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8928 				"no room to append digest");
8929 		memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
8930 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8931 				ut_params->obuf ? ut_params->obuf :
8932 						ut_params->ibuf,
8933 						plaintext_pad_len +
8934 						aad_pad_len);
8935 	} else {
8936 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8937 				ut_params->ibuf, tdata->auth_tag.len);
8938 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8939 				"no room to append digest");
8940 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8941 				ut_params->ibuf,
8942 				plaintext_pad_len + aad_pad_len);
8943 
8944 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
8945 			tdata->auth_tag.len);
8946 		debug_hexdump(stdout, "digest:",
8947 			sym_op->aead.digest.data,
8948 			tdata->auth_tag.len);
8949 	}
8950 
8951 	sym_op->aead.data.length = tdata->plaintext.len;
8952 	sym_op->aead.data.offset = aad_pad_len;
8953 
8954 	return 0;
8955 }
8956 
8957 static int
8958 test_authenticated_encryption(const struct aead_test_data *tdata)
8959 {
8960 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8961 	struct crypto_unittest_params *ut_params = &unittest_params;
8962 
8963 	int retval;
8964 	uint8_t *ciphertext, *auth_tag;
8965 	uint16_t plaintext_pad_len;
8966 	uint32_t i;
8967 	struct rte_cryptodev_info dev_info;
8968 
8969 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8970 	uint64_t feat_flags = dev_info.feature_flags;
8971 
8972 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8973 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8974 		printf("Device doesn't support RAW data-path APIs.\n");
8975 		return TEST_SKIPPED;
8976 	}
8977 
8978 	/* Verify the capabilities */
8979 	struct rte_cryptodev_sym_capability_idx cap_idx;
8980 	const struct rte_cryptodev_symmetric_capability *capability;
8981 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8982 	cap_idx.algo.aead = tdata->algo;
8983 	capability = rte_cryptodev_sym_capability_get(
8984 			ts_params->valid_devs[0], &cap_idx);
8985 	if (capability == NULL)
8986 		return TEST_SKIPPED;
8987 	if (rte_cryptodev_sym_capability_check_aead(
8988 			capability, tdata->key.len, tdata->auth_tag.len,
8989 			tdata->aad.len, tdata->iv.len))
8990 		return TEST_SKIPPED;
8991 
8992 	/* Create AEAD session */
8993 	retval = create_aead_session(ts_params->valid_devs[0],
8994 			tdata->algo,
8995 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
8996 			tdata->key.data, tdata->key.len,
8997 			tdata->aad.len, tdata->auth_tag.len,
8998 			tdata->iv.len);
8999 	if (retval != TEST_SUCCESS)
9000 		return retval;
9001 
9002 	if (tdata->aad.len > MBUF_SIZE) {
9003 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
9004 		/* Populate full size of add data */
9005 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
9006 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
9007 	} else
9008 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9009 
9010 	/* clear mbuf payload */
9011 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9012 			rte_pktmbuf_tailroom(ut_params->ibuf));
9013 
9014 	/* Create AEAD operation */
9015 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9016 	if (retval < 0)
9017 		return retval;
9018 
9019 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9020 
9021 	ut_params->op->sym->m_src = ut_params->ibuf;
9022 
9023 	/* Process crypto operation */
9024 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9025 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
9026 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
9027 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 0, 0,
9028 					       0);
9029 		if (retval != TEST_SUCCESS)
9030 			return retval;
9031 	} else
9032 		TEST_ASSERT_NOT_NULL(
9033 			process_crypto_request(ts_params->valid_devs[0],
9034 			ut_params->op), "failed to process sym crypto op");
9035 
9036 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9037 			"crypto op processing failed");
9038 
9039 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9040 
9041 	if (ut_params->op->sym->m_dst) {
9042 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
9043 				uint8_t *);
9044 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
9045 				uint8_t *, plaintext_pad_len);
9046 	} else {
9047 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
9048 				uint8_t *,
9049 				ut_params->op->sym->cipher.data.offset);
9050 		auth_tag = ciphertext + plaintext_pad_len;
9051 	}
9052 
9053 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9054 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9055 
9056 	/* Validate obuf */
9057 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9058 			ciphertext,
9059 			tdata->ciphertext.data,
9060 			tdata->ciphertext.len,
9061 			"Ciphertext data not as expected");
9062 
9063 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9064 			auth_tag,
9065 			tdata->auth_tag.data,
9066 			tdata->auth_tag.len,
9067 			"Generated auth tag not as expected");
9068 
9069 	return 0;
9070 
9071 }
9072 
9073 #ifdef RTE_LIB_SECURITY
9074 static int
9075 security_proto_supported(enum rte_security_session_action_type action,
9076 	enum rte_security_session_protocol proto)
9077 {
9078 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9079 
9080 	const struct rte_security_capability *capabilities;
9081 	const struct rte_security_capability *capability;
9082 	uint16_t i = 0;
9083 
9084 	void *ctx = rte_cryptodev_get_sec_ctx(ts_params->valid_devs[0]);
9085 
9086 
9087 	capabilities = rte_security_capabilities_get(ctx);
9088 
9089 	if (capabilities == NULL)
9090 		return -ENOTSUP;
9091 
9092 	while ((capability = &capabilities[i++])->action !=
9093 			RTE_SECURITY_ACTION_TYPE_NONE) {
9094 		if (capability->action == action &&
9095 				capability->protocol == proto)
9096 			return 0;
9097 	}
9098 
9099 	return -ENOTSUP;
9100 }
9101 
9102 /* Basic algorithm run function for async inplace mode.
9103  * Creates a session from input parameters and runs one operation
9104  * on input_vec. Checks the output of the crypto operation against
9105  * output_vec.
9106  */
9107 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
9108 			   enum rte_crypto_auth_operation opa,
9109 			   const uint8_t *input_vec, unsigned int input_vec_len,
9110 			   const uint8_t *output_vec,
9111 			   unsigned int output_vec_len,
9112 			   enum rte_crypto_cipher_algorithm cipher_alg,
9113 			   const uint8_t *cipher_key, uint32_t cipher_key_len,
9114 			   enum rte_crypto_auth_algorithm auth_alg,
9115 			   const uint8_t *auth_key, uint32_t auth_key_len,
9116 			   uint8_t bearer, enum rte_security_pdcp_domain domain,
9117 			   uint8_t packet_direction, uint8_t sn_size,
9118 			   uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
9119 {
9120 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9121 	struct crypto_unittest_params *ut_params = &unittest_params;
9122 	uint8_t *plaintext;
9123 	int ret = TEST_SUCCESS;
9124 	void *ctx = rte_cryptodev_get_sec_ctx(ts_params->valid_devs[0]);
9125 	struct rte_cryptodev_info dev_info;
9126 	uint64_t feat_flags;
9127 
9128 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9129 	feat_flags = dev_info.feature_flags;
9130 
9131 	/* Verify the capabilities */
9132 	struct rte_security_capability_idx sec_cap_idx;
9133 
9134 	sec_cap_idx.action = ut_params->type;
9135 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
9136 	sec_cap_idx.pdcp.domain = domain;
9137 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
9138 		return TEST_SKIPPED;
9139 
9140 	/* Generate test mbuf data */
9141 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9142 
9143 	/* clear mbuf payload */
9144 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9145 			rte_pktmbuf_tailroom(ut_params->ibuf));
9146 
9147 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9148 						  input_vec_len);
9149 	memcpy(plaintext, input_vec, input_vec_len);
9150 
9151 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9152 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9153 		printf("Device does not support RAW data-path APIs.\n");
9154 		return TEST_SKIPPED;
9155 	}
9156 	/* Out of place support */
9157 	if (oop) {
9158 		/*
9159 		 * For out-op-place we need to alloc another mbuf
9160 		 */
9161 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9162 		rte_pktmbuf_append(ut_params->obuf, output_vec_len);
9163 	}
9164 
9165 	/* Setup Cipher Parameters */
9166 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9167 	ut_params->cipher_xform.cipher.algo = cipher_alg;
9168 	ut_params->cipher_xform.cipher.op = opc;
9169 	ut_params->cipher_xform.cipher.key.data = cipher_key;
9170 	ut_params->cipher_xform.cipher.key.length = cipher_key_len;
9171 	ut_params->cipher_xform.cipher.iv.length =
9172 				packet_direction ? 4 : 0;
9173 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9174 
9175 	/* Setup HMAC Parameters if ICV header is required */
9176 	if (auth_alg != 0) {
9177 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9178 		ut_params->auth_xform.next = NULL;
9179 		ut_params->auth_xform.auth.algo = auth_alg;
9180 		ut_params->auth_xform.auth.op = opa;
9181 		ut_params->auth_xform.auth.key.data = auth_key;
9182 		ut_params->auth_xform.auth.key.length = auth_key_len;
9183 
9184 		ut_params->cipher_xform.next = &ut_params->auth_xform;
9185 	} else {
9186 		ut_params->cipher_xform.next = NULL;
9187 	}
9188 
9189 	struct rte_security_session_conf sess_conf = {
9190 		.action_type = ut_params->type,
9191 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
9192 		{.pdcp = {
9193 			.bearer = bearer,
9194 			.domain = domain,
9195 			.pkt_dir = packet_direction,
9196 			.sn_size = sn_size,
9197 			.hfn = packet_direction ? 0 : hfn,
9198 			/**
9199 			 * hfn can be set as pdcp_test_hfn[i]
9200 			 * if hfn_ovrd is not set. Here, PDCP
9201 			 * packet direction is just used to
9202 			 * run half of the cases with session
9203 			 * HFN and other half with per packet
9204 			 * HFN.
9205 			 */
9206 			.hfn_threshold = hfn_threshold,
9207 			.hfn_ovrd = packet_direction ? 1 : 0,
9208 			.sdap_enabled = sdap,
9209 		} },
9210 		.crypto_xform = &ut_params->cipher_xform
9211 	};
9212 
9213 	/* Create security session */
9214 	ut_params->sec_session = rte_security_session_create(ctx,
9215 				&sess_conf, ts_params->session_mpool);
9216 
9217 	if (!ut_params->sec_session) {
9218 		printf("TestCase %s()-%d line %d failed %s: ",
9219 			__func__, i, __LINE__, "Failed to allocate session");
9220 		ret = TEST_FAILED;
9221 		goto on_err;
9222 	}
9223 
9224 	/* Generate crypto op data structure */
9225 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9226 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9227 	if (!ut_params->op) {
9228 		printf("TestCase %s()-%d line %d failed %s: ",
9229 			__func__, i, __LINE__,
9230 			"Failed to allocate symmetric crypto operation struct");
9231 		ret = TEST_FAILED;
9232 		goto on_err;
9233 	}
9234 
9235 	uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
9236 					uint32_t *, IV_OFFSET);
9237 	*per_pkt_hfn = packet_direction ? hfn : 0;
9238 
9239 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
9240 
9241 	/* set crypto operation source mbuf */
9242 	ut_params->op->sym->m_src = ut_params->ibuf;
9243 	if (oop)
9244 		ut_params->op->sym->m_dst = ut_params->obuf;
9245 
9246 	/* Process crypto operation */
9247 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
9248 		/* filling lengths */
9249 		ut_params->op->sym->cipher.data.length = ut_params->op->sym->m_src->pkt_len;
9250 		ut_params->op->sym->auth.data.length = ut_params->op->sym->m_src->pkt_len;
9251 
9252 		ret = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 0, 0);
9253 		if (ret != TEST_SUCCESS)
9254 			return ret;
9255 	} else {
9256 		ut_params->op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
9257 	}
9258 	if (ut_params->op == NULL) {
9259 		printf("TestCase %s()-%d line %d failed %s: ",
9260 			__func__, i, __LINE__,
9261 			"failed to process sym crypto op");
9262 		ret = TEST_FAILED;
9263 		goto on_err;
9264 	}
9265 
9266 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9267 		printf("TestCase %s()-%d line %d failed %s: ",
9268 			__func__, i, __LINE__, "crypto op processing failed");
9269 		ret = TEST_FAILED;
9270 		goto on_err;
9271 	}
9272 
9273 	/* Validate obuf */
9274 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
9275 			uint8_t *);
9276 	if (oop) {
9277 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
9278 				uint8_t *);
9279 	}
9280 
9281 	if (memcmp(ciphertext, output_vec, output_vec_len)) {
9282 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
9283 		rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
9284 		rte_hexdump(stdout, "reference", output_vec, output_vec_len);
9285 		ret = TEST_FAILED;
9286 		goto on_err;
9287 	}
9288 
9289 on_err:
9290 	rte_crypto_op_free(ut_params->op);
9291 	ut_params->op = NULL;
9292 
9293 	if (ut_params->sec_session)
9294 		rte_security_session_destroy(ctx, ut_params->sec_session);
9295 	ut_params->sec_session = NULL;
9296 
9297 	rte_pktmbuf_free(ut_params->ibuf);
9298 	ut_params->ibuf = NULL;
9299 	if (oop) {
9300 		rte_pktmbuf_free(ut_params->obuf);
9301 		ut_params->obuf = NULL;
9302 	}
9303 
9304 	return ret;
9305 }
9306 
9307 static int
9308 test_pdcp_proto_SGL(int i, int oop,
9309 	enum rte_crypto_cipher_operation opc,
9310 	enum rte_crypto_auth_operation opa,
9311 	uint8_t *input_vec,
9312 	unsigned int input_vec_len,
9313 	uint8_t *output_vec,
9314 	unsigned int output_vec_len,
9315 	uint32_t fragsz,
9316 	uint32_t fragsz_oop)
9317 {
9318 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9319 	struct crypto_unittest_params *ut_params = &unittest_params;
9320 	uint8_t *plaintext;
9321 	struct rte_mbuf *buf, *buf_oop = NULL;
9322 	int ret = TEST_SUCCESS;
9323 	int to_trn = 0;
9324 	int to_trn_tbl[16];
9325 	int segs = 1;
9326 	unsigned int trn_data = 0;
9327 	struct rte_cryptodev_info dev_info;
9328 	uint64_t feat_flags;
9329 	void *ctx = rte_cryptodev_get_sec_ctx(ts_params->valid_devs[0]);
9330 	struct rte_mbuf *temp_mbuf;
9331 
9332 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9333 	feat_flags = dev_info.feature_flags;
9334 
9335 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9336 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9337 		printf("Device does not support RAW data-path APIs.\n");
9338 		return -ENOTSUP;
9339 	}
9340 	/* Verify the capabilities */
9341 	struct rte_security_capability_idx sec_cap_idx;
9342 
9343 	sec_cap_idx.action = ut_params->type;
9344 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
9345 	sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
9346 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
9347 		return TEST_SKIPPED;
9348 
9349 	if (fragsz > input_vec_len)
9350 		fragsz = input_vec_len;
9351 
9352 	uint16_t plaintext_len = fragsz;
9353 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
9354 
9355 	if (fragsz_oop > output_vec_len)
9356 		frag_size_oop = output_vec_len;
9357 
9358 	int ecx = 0;
9359 	if (input_vec_len % fragsz != 0) {
9360 		if (input_vec_len / fragsz + 1 > 16)
9361 			return 1;
9362 	} else if (input_vec_len / fragsz > 16)
9363 		return 1;
9364 
9365 	/* Out of place support */
9366 	if (oop) {
9367 		/*
9368 		 * For out-op-place we need to alloc another mbuf
9369 		 */
9370 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9371 		rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
9372 		buf_oop = ut_params->obuf;
9373 	}
9374 
9375 	/* Generate test mbuf data */
9376 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9377 
9378 	/* clear mbuf payload */
9379 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9380 			rte_pktmbuf_tailroom(ut_params->ibuf));
9381 
9382 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9383 						  plaintext_len);
9384 	memcpy(plaintext, input_vec, plaintext_len);
9385 	trn_data += plaintext_len;
9386 
9387 	buf = ut_params->ibuf;
9388 
9389 	/*
9390 	 * Loop until no more fragments
9391 	 */
9392 
9393 	while (trn_data < input_vec_len) {
9394 		++segs;
9395 		to_trn = (input_vec_len - trn_data < fragsz) ?
9396 				(input_vec_len - trn_data) : fragsz;
9397 
9398 		to_trn_tbl[ecx++] = to_trn;
9399 
9400 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9401 		buf = buf->next;
9402 
9403 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
9404 				rte_pktmbuf_tailroom(buf));
9405 
9406 		/* OOP */
9407 		if (oop && !fragsz_oop) {
9408 			buf_oop->next =
9409 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
9410 			buf_oop = buf_oop->next;
9411 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
9412 					0, rte_pktmbuf_tailroom(buf_oop));
9413 			rte_pktmbuf_append(buf_oop, to_trn);
9414 		}
9415 
9416 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
9417 				to_trn);
9418 
9419 		memcpy(plaintext, input_vec + trn_data, to_trn);
9420 		trn_data += to_trn;
9421 	}
9422 
9423 	ut_params->ibuf->nb_segs = segs;
9424 
9425 	segs = 1;
9426 	if (fragsz_oop && oop) {
9427 		to_trn = 0;
9428 		ecx = 0;
9429 
9430 		trn_data = frag_size_oop;
9431 		while (trn_data < output_vec_len) {
9432 			++segs;
9433 			to_trn =
9434 				(output_vec_len - trn_data <
9435 						frag_size_oop) ?
9436 				(output_vec_len - trn_data) :
9437 						frag_size_oop;
9438 
9439 			to_trn_tbl[ecx++] = to_trn;
9440 
9441 			buf_oop->next =
9442 				rte_pktmbuf_alloc(ts_params->mbuf_pool);
9443 			buf_oop = buf_oop->next;
9444 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
9445 					0, rte_pktmbuf_tailroom(buf_oop));
9446 			rte_pktmbuf_append(buf_oop, to_trn);
9447 
9448 			trn_data += to_trn;
9449 		}
9450 		ut_params->obuf->nb_segs = segs;
9451 	}
9452 
9453 	/* Setup Cipher Parameters */
9454 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9455 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
9456 	ut_params->cipher_xform.cipher.op = opc;
9457 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
9458 	ut_params->cipher_xform.cipher.key.length =
9459 					pdcp_test_params[i].cipher_key_len;
9460 	ut_params->cipher_xform.cipher.iv.length = 0;
9461 
9462 	/* Setup HMAC Parameters if ICV header is required */
9463 	if (pdcp_test_params[i].auth_alg != 0) {
9464 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9465 		ut_params->auth_xform.next = NULL;
9466 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
9467 		ut_params->auth_xform.auth.op = opa;
9468 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
9469 		ut_params->auth_xform.auth.key.length =
9470 					pdcp_test_params[i].auth_key_len;
9471 
9472 		ut_params->cipher_xform.next = &ut_params->auth_xform;
9473 	} else {
9474 		ut_params->cipher_xform.next = NULL;
9475 	}
9476 
9477 	struct rte_security_session_conf sess_conf = {
9478 		.action_type = ut_params->type,
9479 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
9480 		{.pdcp = {
9481 			.bearer = pdcp_test_bearer[i],
9482 			.domain = pdcp_test_params[i].domain,
9483 			.pkt_dir = pdcp_test_packet_direction[i],
9484 			.sn_size = pdcp_test_data_sn_size[i],
9485 			.hfn = pdcp_test_hfn[i],
9486 			.hfn_threshold = pdcp_test_hfn_threshold[i],
9487 			.hfn_ovrd = 0,
9488 		} },
9489 		.crypto_xform = &ut_params->cipher_xform
9490 	};
9491 
9492 	/* Create security session */
9493 	ut_params->sec_session = rte_security_session_create(ctx,
9494 				&sess_conf, ts_params->session_mpool);
9495 
9496 	if (!ut_params->sec_session) {
9497 		printf("TestCase %s()-%d line %d failed %s: ",
9498 			__func__, i, __LINE__, "Failed to allocate session");
9499 		ret = TEST_FAILED;
9500 		goto on_err;
9501 	}
9502 
9503 	/* Generate crypto op data structure */
9504 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9505 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9506 	if (!ut_params->op) {
9507 		printf("TestCase %s()-%d line %d failed %s: ",
9508 			__func__, i, __LINE__,
9509 			"Failed to allocate symmetric crypto operation struct");
9510 		ret = TEST_FAILED;
9511 		goto on_err;
9512 	}
9513 
9514 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
9515 
9516 	/* set crypto operation source mbuf */
9517 	ut_params->op->sym->m_src = ut_params->ibuf;
9518 	if (oop)
9519 		ut_params->op->sym->m_dst = ut_params->obuf;
9520 
9521 	/* Process crypto operation */
9522 	temp_mbuf = ut_params->op->sym->m_src;
9523 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
9524 		/* filling lengths */
9525 		while (temp_mbuf) {
9526 			ut_params->op->sym->cipher.data.length
9527 				+= temp_mbuf->pkt_len;
9528 			ut_params->op->sym->auth.data.length
9529 				+= temp_mbuf->pkt_len;
9530 			temp_mbuf = temp_mbuf->next;
9531 		}
9532 
9533 		ret = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 0, 0);
9534 		if (ret != TEST_SUCCESS)
9535 			return ret;
9536 	} else {
9537 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
9538 							ut_params->op);
9539 	}
9540 	if (ut_params->op == NULL) {
9541 		printf("TestCase %s()-%d line %d failed %s: ",
9542 			__func__, i, __LINE__,
9543 			"failed to process sym crypto op");
9544 		ret = TEST_FAILED;
9545 		goto on_err;
9546 	}
9547 
9548 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9549 		printf("TestCase %s()-%d line %d failed %s: ",
9550 			__func__, i, __LINE__, "crypto op processing failed");
9551 		ret = TEST_FAILED;
9552 		goto on_err;
9553 	}
9554 
9555 	/* Validate obuf */
9556 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
9557 			uint8_t *);
9558 	if (oop) {
9559 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
9560 				uint8_t *);
9561 	}
9562 	if (fragsz_oop)
9563 		fragsz = frag_size_oop;
9564 	if (memcmp(ciphertext, output_vec, fragsz)) {
9565 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
9566 		rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
9567 		rte_hexdump(stdout, "reference", output_vec, fragsz);
9568 		ret = TEST_FAILED;
9569 		goto on_err;
9570 	}
9571 
9572 	buf = ut_params->op->sym->m_src->next;
9573 	if (oop)
9574 		buf = ut_params->op->sym->m_dst->next;
9575 
9576 	unsigned int off = fragsz;
9577 
9578 	ecx = 0;
9579 	while (buf) {
9580 		ciphertext = rte_pktmbuf_mtod(buf,
9581 				uint8_t *);
9582 		if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
9583 			printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
9584 			rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
9585 			rte_hexdump(stdout, "reference", output_vec + off,
9586 					to_trn_tbl[ecx]);
9587 			ret = TEST_FAILED;
9588 			goto on_err;
9589 		}
9590 		off += to_trn_tbl[ecx++];
9591 		buf = buf->next;
9592 	}
9593 on_err:
9594 	rte_crypto_op_free(ut_params->op);
9595 	ut_params->op = NULL;
9596 
9597 	if (ut_params->sec_session)
9598 		rte_security_session_destroy(ctx, ut_params->sec_session);
9599 	ut_params->sec_session = NULL;
9600 
9601 	rte_pktmbuf_free(ut_params->ibuf);
9602 	ut_params->ibuf = NULL;
9603 	if (oop) {
9604 		rte_pktmbuf_free(ut_params->obuf);
9605 		ut_params->obuf = NULL;
9606 	}
9607 
9608 	return ret;
9609 }
9610 
9611 int
9612 test_pdcp_proto_cplane_encap(int i)
9613 {
9614 	return test_pdcp_proto(
9615 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
9616 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
9617 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
9618 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
9619 		pdcp_test_params[i].cipher_key_len,
9620 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
9621 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
9622 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
9623 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
9624 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
9625 }
9626 
9627 int
9628 test_pdcp_proto_uplane_encap(int i)
9629 {
9630 	return test_pdcp_proto(
9631 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
9632 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
9633 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
9634 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
9635 		pdcp_test_params[i].cipher_key_len,
9636 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
9637 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
9638 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
9639 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
9640 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
9641 }
9642 
9643 int
9644 test_pdcp_proto_uplane_encap_with_int(int i)
9645 {
9646 	return test_pdcp_proto(
9647 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
9648 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
9649 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
9650 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
9651 		pdcp_test_params[i].cipher_key_len,
9652 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
9653 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
9654 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
9655 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
9656 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
9657 }
9658 
9659 int
9660 test_pdcp_proto_cplane_decap(int i)
9661 {
9662 	return test_pdcp_proto(
9663 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
9664 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
9665 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
9666 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
9667 		pdcp_test_params[i].cipher_key_len,
9668 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
9669 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
9670 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
9671 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
9672 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
9673 }
9674 
9675 int
9676 test_pdcp_proto_uplane_decap(int i)
9677 {
9678 	return test_pdcp_proto(
9679 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
9680 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
9681 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
9682 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
9683 		pdcp_test_params[i].cipher_key_len,
9684 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
9685 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
9686 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
9687 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
9688 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
9689 }
9690 
9691 int
9692 test_pdcp_proto_uplane_decap_with_int(int i)
9693 {
9694 	return test_pdcp_proto(
9695 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
9696 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
9697 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
9698 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
9699 		pdcp_test_params[i].cipher_key_len,
9700 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
9701 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
9702 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
9703 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
9704 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
9705 }
9706 
9707 static int
9708 test_PDCP_PROTO_SGL_in_place_32B(void)
9709 {
9710 	/* i can be used for running any PDCP case
9711 	 * In this case it is uplane 12-bit AES-SNOW DL encap
9712 	 */
9713 	int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
9714 	return test_pdcp_proto_SGL(i, IN_PLACE,
9715 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9716 			RTE_CRYPTO_AUTH_OP_GENERATE,
9717 			pdcp_test_data_in[i],
9718 			pdcp_test_data_in_len[i],
9719 			pdcp_test_data_out[i],
9720 			pdcp_test_data_in_len[i]+4,
9721 			32, 0);
9722 }
9723 static int
9724 test_PDCP_PROTO_SGL_oop_32B_128B(void)
9725 {
9726 	/* i can be used for running any PDCP case
9727 	 * In this case it is uplane 18-bit NULL-NULL DL encap
9728 	 */
9729 	int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
9730 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
9731 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9732 			RTE_CRYPTO_AUTH_OP_GENERATE,
9733 			pdcp_test_data_in[i],
9734 			pdcp_test_data_in_len[i],
9735 			pdcp_test_data_out[i],
9736 			pdcp_test_data_in_len[i]+4,
9737 			32, 128);
9738 }
9739 static int
9740 test_PDCP_PROTO_SGL_oop_32B_40B(void)
9741 {
9742 	/* i can be used for running any PDCP case
9743 	 * In this case it is uplane 18-bit AES DL encap
9744 	 */
9745 	int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
9746 			+ DOWNLINK;
9747 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
9748 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9749 			RTE_CRYPTO_AUTH_OP_GENERATE,
9750 			pdcp_test_data_in[i],
9751 			pdcp_test_data_in_len[i],
9752 			pdcp_test_data_out[i],
9753 			pdcp_test_data_in_len[i],
9754 			32, 40);
9755 }
9756 static int
9757 test_PDCP_PROTO_SGL_oop_128B_32B(void)
9758 {
9759 	/* i can be used for running any PDCP case
9760 	 * In this case it is cplane 12-bit AES-ZUC DL encap
9761 	 */
9762 	int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
9763 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
9764 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9765 			RTE_CRYPTO_AUTH_OP_GENERATE,
9766 			pdcp_test_data_in[i],
9767 			pdcp_test_data_in_len[i],
9768 			pdcp_test_data_out[i],
9769 			pdcp_test_data_in_len[i]+4,
9770 			128, 32);
9771 }
9772 
9773 static int
9774 test_PDCP_SDAP_PROTO_encap_all(void)
9775 {
9776 	int i = 0, size = 0;
9777 	int err, all_err = TEST_SUCCESS;
9778 	const struct pdcp_sdap_test *cur_test;
9779 
9780 	size = RTE_DIM(list_pdcp_sdap_tests);
9781 
9782 	for (i = 0; i < size; i++) {
9783 		cur_test = &list_pdcp_sdap_tests[i];
9784 		err = test_pdcp_proto(
9785 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9786 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9787 			cur_test->in_len, cur_test->data_out,
9788 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9789 			cur_test->param.cipher_alg, cur_test->cipher_key,
9790 			cur_test->param.cipher_key_len,
9791 			cur_test->param.auth_alg,
9792 			cur_test->auth_key, cur_test->param.auth_key_len,
9793 			cur_test->bearer, cur_test->param.domain,
9794 			cur_test->packet_direction, cur_test->sn_size,
9795 			cur_test->hfn,
9796 			cur_test->hfn_threshold, SDAP_ENABLED);
9797 		if (err) {
9798 			printf("\t%d) %s: Encapsulation failed\n",
9799 					cur_test->test_idx,
9800 					cur_test->param.name);
9801 			err = TEST_FAILED;
9802 		} else {
9803 			printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
9804 					cur_test->param.name);
9805 			err = TEST_SUCCESS;
9806 		}
9807 		all_err += err;
9808 	}
9809 
9810 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9811 
9812 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9813 }
9814 
9815 static int
9816 test_PDCP_PROTO_short_mac(void)
9817 {
9818 	int i = 0, size = 0;
9819 	int err, all_err = TEST_SUCCESS;
9820 	const struct pdcp_short_mac_test *cur_test;
9821 
9822 	size = RTE_DIM(list_pdcp_smac_tests);
9823 
9824 	for (i = 0; i < size; i++) {
9825 		cur_test = &list_pdcp_smac_tests[i];
9826 		err = test_pdcp_proto(
9827 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9828 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9829 			cur_test->in_len, cur_test->data_out,
9830 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9831 			RTE_CRYPTO_CIPHER_NULL, NULL,
9832 			0, cur_test->param.auth_alg,
9833 			cur_test->auth_key, cur_test->param.auth_key_len,
9834 			0, cur_test->param.domain, 0, 0,
9835 			0, 0, 0);
9836 		if (err) {
9837 			printf("\t%d) %s: Short MAC test failed\n",
9838 					cur_test->test_idx,
9839 					cur_test->param.name);
9840 			err = TEST_FAILED;
9841 		} else {
9842 			printf("\t%d) %s: Short MAC test PASS\n",
9843 					cur_test->test_idx,
9844 					cur_test->param.name);
9845 			rte_hexdump(stdout, "MAC I",
9846 				    cur_test->data_out + cur_test->in_len + 2,
9847 				    2);
9848 			err = TEST_SUCCESS;
9849 		}
9850 		all_err += err;
9851 	}
9852 
9853 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9854 
9855 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9856 
9857 }
9858 
9859 static int
9860 test_PDCP_SDAP_PROTO_decap_all(void)
9861 {
9862 	int i = 0, size = 0;
9863 	int err, all_err = TEST_SUCCESS;
9864 	const struct pdcp_sdap_test *cur_test;
9865 
9866 	size = RTE_DIM(list_pdcp_sdap_tests);
9867 
9868 	for (i = 0; i < size; i++) {
9869 		cur_test = &list_pdcp_sdap_tests[i];
9870 		err = test_pdcp_proto(
9871 			i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
9872 			RTE_CRYPTO_AUTH_OP_VERIFY,
9873 			cur_test->data_out,
9874 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9875 			cur_test->data_in, cur_test->in_len,
9876 			cur_test->param.cipher_alg,
9877 			cur_test->cipher_key, cur_test->param.cipher_key_len,
9878 			cur_test->param.auth_alg, cur_test->auth_key,
9879 			cur_test->param.auth_key_len, cur_test->bearer,
9880 			cur_test->param.domain, cur_test->packet_direction,
9881 			cur_test->sn_size, cur_test->hfn,
9882 			cur_test->hfn_threshold, SDAP_ENABLED);
9883 		if (err) {
9884 			printf("\t%d) %s: Decapsulation failed\n",
9885 					cur_test->test_idx,
9886 					cur_test->param.name);
9887 			err = TEST_FAILED;
9888 		} else {
9889 			printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
9890 					cur_test->param.name);
9891 			err = TEST_SUCCESS;
9892 		}
9893 		all_err += err;
9894 	}
9895 
9896 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9897 
9898 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9899 }
9900 
9901 static inline void
9902 ext_mbuf_callback_fn_free(void *addr __rte_unused, void *opaque __rte_unused)
9903 {
9904 }
9905 
9906 static inline void
9907 ext_mbuf_memzone_free(int nb_segs)
9908 {
9909 	int i;
9910 
9911 	for (i = 0; i <= nb_segs; i++) {
9912 		char mz_name[RTE_MEMZONE_NAMESIZE];
9913 		const struct rte_memzone *memzone;
9914 		snprintf(mz_name, RTE_MEMZONE_NAMESIZE, "ext_buf_%d", i);
9915 		memzone = rte_memzone_lookup(mz_name);
9916 		if (memzone != NULL) {
9917 			rte_memzone_free(memzone);
9918 			memzone = NULL;
9919 		}
9920 	}
9921 }
9922 
9923 static inline struct rte_mbuf *
9924 ext_mbuf_create(struct rte_mempool *mbuf_pool, int pkt_len,
9925 		int nb_segs, const void *input_text)
9926 {
9927 	struct rte_mbuf *m = NULL, *mbuf = NULL;
9928 	size_t data_off = 0;
9929 	uint8_t *dst;
9930 	int i, size;
9931 	int t_len;
9932 
9933 	if (pkt_len < 1) {
9934 		printf("Packet size must be 1 or more (is %d)\n", pkt_len);
9935 		return NULL;
9936 	}
9937 
9938 	if (nb_segs < 1) {
9939 		printf("Number of segments must be 1 or more (is %d)\n",
9940 				nb_segs);
9941 		return NULL;
9942 	}
9943 
9944 	t_len = pkt_len >= nb_segs ? pkt_len / nb_segs : 1;
9945 	size = pkt_len;
9946 
9947 	/* Create chained mbuf_src with external buffer */
9948 	for (i = 0; size > 0; i++) {
9949 		struct rte_mbuf_ext_shared_info *ret_shinfo = NULL;
9950 		uint16_t data_len = RTE_MIN(size, t_len);
9951 		char mz_name[RTE_MEMZONE_NAMESIZE];
9952 		const struct rte_memzone *memzone;
9953 		void *ext_buf_addr = NULL;
9954 		rte_iova_t buf_iova;
9955 		bool freed = false;
9956 		uint16_t buf_len;
9957 
9958 		buf_len = RTE_ALIGN_CEIL(data_len + 1024 +
9959 			sizeof(struct rte_mbuf_ext_shared_info), 8);
9960 
9961 		snprintf(mz_name, RTE_MEMZONE_NAMESIZE, "ext_buf_%d", i);
9962 		memzone = rte_memzone_lookup(mz_name);
9963 		if (memzone != NULL && memzone->len != buf_len) {
9964 			rte_memzone_free(memzone);
9965 			memzone = NULL;
9966 		}
9967 		if (memzone == NULL) {
9968 			memzone = rte_memzone_reserve_aligned(mz_name, buf_len, SOCKET_ID_ANY,
9969 				RTE_MEMZONE_IOVA_CONTIG, RTE_CACHE_LINE_SIZE);
9970 			if (memzone == NULL) {
9971 				printf("Can't allocate memory zone %s\n", mz_name);
9972 				return NULL;
9973 			}
9974 		}
9975 
9976 		ext_buf_addr = memzone->addr;
9977 		memcpy(ext_buf_addr, RTE_PTR_ADD(input_text, data_off), data_len);
9978 
9979 		/* Create buffer to hold rte_mbuf header */
9980 		m = rte_pktmbuf_alloc(mbuf_pool);
9981 		if (i == 0)
9982 			mbuf = m;
9983 
9984 		if (m == NULL) {
9985 			printf("Cannot create segment for source mbuf");
9986 			goto fail;
9987 		}
9988 
9989 		/* Save shared data (like callback function) in external buffer's end */
9990 		ret_shinfo = rte_pktmbuf_ext_shinfo_init_helper(ext_buf_addr, &buf_len,
9991 			ext_mbuf_callback_fn_free, &freed);
9992 		if (ret_shinfo == NULL) {
9993 			printf("Shared mem initialization failed!\n");
9994 			goto fail;
9995 		}
9996 
9997 		buf_iova = rte_mem_virt2iova(ext_buf_addr);
9998 
9999 		/* Attach external buffer to mbuf */
10000 		rte_pktmbuf_attach_extbuf(m, ext_buf_addr, buf_iova, buf_len,
10001 			ret_shinfo);
10002 		if (m->ol_flags != RTE_MBUF_F_EXTERNAL) {
10003 			printf("External buffer is not attached to mbuf\n");
10004 			goto fail;
10005 		}
10006 
10007 		dst = (uint8_t *)rte_pktmbuf_append(m, data_len);
10008 		if (dst == NULL) {
10009 			printf("Cannot append %d bytes to the mbuf\n", data_len);
10010 			goto fail;
10011 		}
10012 
10013 		if (mbuf != m)
10014 			rte_pktmbuf_chain(mbuf, m);
10015 
10016 		size -= data_len;
10017 		data_off += data_len;
10018 	}
10019 
10020 	return mbuf;
10021 
10022 fail:
10023 	rte_pktmbuf_free(mbuf);
10024 	ext_mbuf_memzone_free(nb_segs);
10025 	return NULL;
10026 }
10027 
10028 static int
10029 test_ipsec_proto_crypto_op_enq(struct crypto_testsuite_params *ts_params,
10030 			       struct crypto_unittest_params *ut_params,
10031 			       struct rte_security_ipsec_xform *ipsec_xform,
10032 			       const struct ipsec_test_data *td,
10033 			       const struct ipsec_test_flags *flags,
10034 			       int pkt_num)
10035 {
10036 	uint8_t dev_id = ts_params->valid_devs[0];
10037 	enum rte_security_ipsec_sa_direction dir;
10038 	int ret;
10039 
10040 	dir = ipsec_xform->direction;
10041 
10042 	/* Generate crypto op data structure */
10043 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10044 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10045 	if (!ut_params->op) {
10046 		printf("Could not allocate crypto op");
10047 		return TEST_FAILED;
10048 	}
10049 
10050 	/* Attach session to operation */
10051 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
10052 
10053 	/* Set crypto operation mbufs */
10054 	ut_params->op->sym->m_src = ut_params->ibuf;
10055 	ut_params->op->sym->m_dst = NULL;
10056 
10057 	/* Copy IV in crypto operation when IV generation is disabled */
10058 	if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
10059 	    ipsec_xform->options.iv_gen_disable == 1) {
10060 		uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
10061 							uint8_t *,
10062 							IV_OFFSET);
10063 		int len;
10064 
10065 		if (td->aead)
10066 			len = td->xform.aead.aead.iv.length;
10067 		else if (td->aes_gmac)
10068 			len = td->xform.chain.auth.auth.iv.length;
10069 		else
10070 			len = td->xform.chain.cipher.cipher.iv.length;
10071 
10072 		memcpy(iv, td->iv.data, len);
10073 	}
10074 
10075 	/* Process crypto operation */
10076 	process_crypto_request(dev_id, ut_params->op);
10077 
10078 	ret = test_ipsec_status_check(td, ut_params->op, flags, dir, pkt_num);
10079 
10080 	rte_crypto_op_free(ut_params->op);
10081 	ut_params->op = NULL;
10082 
10083 	return ret;
10084 }
10085 
10086 static int
10087 test_ipsec_proto_mbuf_enq(struct crypto_testsuite_params *ts_params,
10088 			  struct crypto_unittest_params *ut_params,
10089 			  void *ctx)
10090 {
10091 	uint64_t timeout, userdata;
10092 	struct rte_ether_hdr *hdr;
10093 	struct rte_mbuf *m;
10094 	void **sec_sess;
10095 	int ret;
10096 
10097 	RTE_SET_USED(ts_params);
10098 
10099 	hdr = (void *)rte_pktmbuf_prepend(ut_params->ibuf, sizeof(struct rte_ether_hdr));
10100 	hdr->ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
10101 
10102 	ut_params->ibuf->l2_len = sizeof(struct rte_ether_hdr);
10103 	ut_params->ibuf->port = 0;
10104 
10105 	sec_sess = &ut_params->sec_session;
10106 	ret = rte_security_inb_pkt_rx_inject(ctx, &ut_params->ibuf, sec_sess, 1);
10107 
10108 	if (ret != 1)
10109 		return TEST_FAILED;
10110 
10111 	ut_params->ibuf = NULL;
10112 
10113 	/* Add a timeout for 1 s */
10114 	timeout = rte_get_tsc_cycles() + rte_get_tsc_hz();
10115 
10116 	do {
10117 		/* Get packet from port 0, queue 0 */
10118 		ret = rte_eth_rx_burst(0, 0, &m, 1);
10119 	} while ((ret == 0) && (rte_get_tsc_cycles() < timeout));
10120 
10121 	if (ret == 0) {
10122 		printf("Could not receive packets from ethdev\n");
10123 		return TEST_FAILED;
10124 	}
10125 
10126 	if (m == NULL) {
10127 		printf("Received mbuf is NULL\n");
10128 		return TEST_FAILED;
10129 	}
10130 
10131 	ut_params->ibuf = m;
10132 
10133 	if (!(m->ol_flags & RTE_MBUF_F_RX_SEC_OFFLOAD)) {
10134 		printf("Received packet is not Rx security processed\n");
10135 		return TEST_FAILED;
10136 	}
10137 
10138 	if (m->ol_flags & RTE_MBUF_F_RX_SEC_OFFLOAD_FAILED) {
10139 		printf("Received packet has failed Rx security processing\n");
10140 		return TEST_FAILED;
10141 	}
10142 
10143 	/*
10144 	 * 'ut_params' is set as userdata. Verify that the field is returned
10145 	 * correctly.
10146 	 */
10147 	userdata = *(uint64_t *)rte_security_dynfield(m);
10148 	if (userdata != (uint64_t)ut_params) {
10149 		printf("Userdata retrieved not matching expected\n");
10150 		return TEST_FAILED;
10151 	}
10152 
10153 	/* Trim L2 header */
10154 	rte_pktmbuf_adj(m, sizeof(struct rte_ether_hdr));
10155 
10156 	return TEST_SUCCESS;
10157 }
10158 
10159 static int
10160 test_ipsec_proto_process(const struct ipsec_test_data td[],
10161 			 struct ipsec_test_data res_d[],
10162 			 int nb_td,
10163 			 bool silent,
10164 			 const struct ipsec_test_flags *flags)
10165 {
10166 	uint16_t v6_src[8] = {0x2607, 0xf8b0, 0x400c, 0x0c03, 0x0000, 0x0000,
10167 				0x0000, 0x001a};
10168 	uint16_t v6_dst[8] = {0x2001, 0x0470, 0xe5bf, 0xdead, 0x4957, 0x2174,
10169 				0xe82c, 0x4887};
10170 	const struct rte_ipv4_hdr *ipv4 =
10171 			(const struct rte_ipv4_hdr *)td[0].output_text.data;
10172 	int nb_segs = flags->nb_segs_in_mbuf ? flags->nb_segs_in_mbuf : 1;
10173 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10174 	struct crypto_unittest_params *ut_params = &unittest_params;
10175 	struct rte_security_capability_idx sec_cap_idx;
10176 	const struct rte_security_capability *sec_cap;
10177 	struct rte_security_ipsec_xform ipsec_xform;
10178 	uint8_t dev_id = ts_params->valid_devs[0];
10179 	enum rte_security_ipsec_sa_direction dir;
10180 	struct ipsec_test_data *res_d_tmp = NULL;
10181 	uint8_t input_text[IPSEC_TEXT_MAX_LEN];
10182 	int salt_len, i, ret = TEST_SUCCESS;
10183 	void *ctx;
10184 	uint32_t src, dst;
10185 	uint32_t verify;
10186 
10187 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
10188 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
10189 
10190 	/* Use first test data to create session */
10191 
10192 	/* Copy IPsec xform */
10193 	memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform));
10194 
10195 	dir = ipsec_xform.direction;
10196 	verify = flags->tunnel_hdr_verify;
10197 
10198 	memcpy(&src, &ipv4->src_addr, sizeof(ipv4->src_addr));
10199 	memcpy(&dst, &ipv4->dst_addr, sizeof(ipv4->dst_addr));
10200 
10201 	if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) {
10202 		if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR)
10203 			src += 1;
10204 		else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR)
10205 			dst += 1;
10206 	}
10207 
10208 	if (td->ipsec_xform.mode == RTE_SECURITY_IPSEC_SA_MODE_TUNNEL) {
10209 		if (td->ipsec_xform.tunnel.type ==
10210 				RTE_SECURITY_IPSEC_TUNNEL_IPV4) {
10211 			memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src,
10212 			       sizeof(src));
10213 			memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst,
10214 			       sizeof(dst));
10215 
10216 			if (flags->df == TEST_IPSEC_SET_DF_0_INNER_1)
10217 				ipsec_xform.tunnel.ipv4.df = 0;
10218 
10219 			if (flags->df == TEST_IPSEC_SET_DF_1_INNER_0)
10220 				ipsec_xform.tunnel.ipv4.df = 1;
10221 
10222 			if (flags->dscp == TEST_IPSEC_SET_DSCP_0_INNER_1)
10223 				ipsec_xform.tunnel.ipv4.dscp = 0;
10224 
10225 			if (flags->dscp == TEST_IPSEC_SET_DSCP_1_INNER_0)
10226 				ipsec_xform.tunnel.ipv4.dscp =
10227 						TEST_IPSEC_DSCP_VAL;
10228 
10229 		} else {
10230 			if (flags->dscp == TEST_IPSEC_SET_DSCP_0_INNER_1)
10231 				ipsec_xform.tunnel.ipv6.dscp = 0;
10232 
10233 			if (flags->dscp == TEST_IPSEC_SET_DSCP_1_INNER_0)
10234 				ipsec_xform.tunnel.ipv6.dscp =
10235 						TEST_IPSEC_DSCP_VAL;
10236 
10237 			memcpy(&ipsec_xform.tunnel.ipv6.src_addr, &v6_src,
10238 			       sizeof(v6_src));
10239 			memcpy(&ipsec_xform.tunnel.ipv6.dst_addr, &v6_dst,
10240 			       sizeof(v6_dst));
10241 		}
10242 	}
10243 
10244 	ctx = rte_cryptodev_get_sec_ctx(dev_id);
10245 
10246 	sec_cap_idx.action = ut_params->type;
10247 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
10248 	sec_cap_idx.ipsec.proto = ipsec_xform.proto;
10249 	sec_cap_idx.ipsec.mode = ipsec_xform.mode;
10250 	sec_cap_idx.ipsec.direction = ipsec_xform.direction;
10251 
10252 	if (flags->udp_encap)
10253 		ipsec_xform.options.udp_encap = 1;
10254 
10255 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
10256 	if (sec_cap == NULL)
10257 		return TEST_SKIPPED;
10258 
10259 	/* Copy cipher session parameters */
10260 	if (td[0].aead) {
10261 		memcpy(&ut_params->aead_xform, &td[0].xform.aead,
10262 		       sizeof(ut_params->aead_xform));
10263 		ut_params->aead_xform.aead.key.data = td[0].key.data;
10264 		ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
10265 
10266 		/* Verify crypto capabilities */
10267 		if (test_sec_crypto_caps_aead_verify(sec_cap, &ut_params->aead_xform) != 0) {
10268 			if (!silent)
10269 				RTE_LOG(INFO, USER1,
10270 					"Crypto capabilities not supported\n");
10271 			return TEST_SKIPPED;
10272 		}
10273 	} else if (td[0].auth_only) {
10274 		memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth,
10275 		       sizeof(ut_params->auth_xform));
10276 		ut_params->auth_xform.auth.key.data = td[0].auth_key.data;
10277 
10278 		if (test_sec_crypto_caps_auth_verify(sec_cap, &ut_params->auth_xform) != 0) {
10279 			if (!silent)
10280 				RTE_LOG(INFO, USER1,
10281 					"Auth crypto capabilities not supported\n");
10282 			return TEST_SKIPPED;
10283 		}
10284 	} else {
10285 		memcpy(&ut_params->cipher_xform, &td[0].xform.chain.cipher,
10286 		       sizeof(ut_params->cipher_xform));
10287 		memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth,
10288 		       sizeof(ut_params->auth_xform));
10289 		ut_params->cipher_xform.cipher.key.data = td[0].key.data;
10290 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10291 		ut_params->auth_xform.auth.key.data = td[0].auth_key.data;
10292 
10293 		/* Verify crypto capabilities */
10294 
10295 		if (test_sec_crypto_caps_cipher_verify(sec_cap, &ut_params->cipher_xform) != 0) {
10296 			if (!silent)
10297 				RTE_LOG(INFO, USER1,
10298 					"Cipher crypto capabilities not supported\n");
10299 			return TEST_SKIPPED;
10300 		}
10301 
10302 		if (test_sec_crypto_caps_auth_verify(sec_cap, &ut_params->auth_xform) != 0) {
10303 			if (!silent)
10304 				RTE_LOG(INFO, USER1,
10305 					"Auth crypto capabilities not supported\n");
10306 			return TEST_SKIPPED;
10307 		}
10308 	}
10309 
10310 	if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
10311 		return TEST_SKIPPED;
10312 
10313 	struct rte_security_session_conf sess_conf = {
10314 		.action_type = ut_params->type,
10315 		.protocol = RTE_SECURITY_PROTOCOL_IPSEC,
10316 	};
10317 
10318 	if (td[0].aead || td[0].aes_gmac) {
10319 		salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
10320 		memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
10321 	}
10322 
10323 	if (td[0].aead) {
10324 		sess_conf.ipsec = ipsec_xform;
10325 		sess_conf.crypto_xform = &ut_params->aead_xform;
10326 	} else if (td[0].auth_only) {
10327 		sess_conf.ipsec = ipsec_xform;
10328 		sess_conf.crypto_xform = &ut_params->auth_xform;
10329 	} else {
10330 		sess_conf.ipsec = ipsec_xform;
10331 		if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) {
10332 			sess_conf.crypto_xform = &ut_params->cipher_xform;
10333 			ut_params->cipher_xform.next = &ut_params->auth_xform;
10334 		} else {
10335 			sess_conf.crypto_xform = &ut_params->auth_xform;
10336 			ut_params->auth_xform.next = &ut_params->cipher_xform;
10337 		}
10338 	}
10339 
10340 	if (dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS && flags->rx_inject)
10341 		sess_conf.userdata = ut_params;
10342 
10343 	/* Create security session */
10344 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
10345 					ts_params->session_mpool);
10346 
10347 	if (ut_params->sec_session == NULL)
10348 		return TEST_SKIPPED;
10349 
10350 	for (i = 0; i < nb_td; i++) {
10351 		if (flags->antireplay &&
10352 		    (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)) {
10353 			sess_conf.ipsec.esn.value = td[i].ipsec_xform.esn.value;
10354 			ret = rte_security_session_update(ctx,
10355 				ut_params->sec_session, &sess_conf);
10356 			if (ret) {
10357 				printf("Could not update sequence number in "
10358 				       "session\n");
10359 				return TEST_SKIPPED;
10360 			}
10361 		}
10362 
10363 		/* Copy test data before modification */
10364 		memcpy(input_text, td[i].input_text.data, td[i].input_text.len);
10365 		if (test_ipsec_pkt_update(input_text, flags)) {
10366 			ret = TEST_FAILED;
10367 			goto mbuf_free;
10368 		}
10369 
10370 		/* Setup source mbuf payload */
10371 		if (flags->use_ext_mbuf) {
10372 			ut_params->ibuf = ext_mbuf_create(ts_params->mbuf_pool,
10373 					td[i].input_text.len, nb_segs, input_text);
10374 		} else {
10375 			ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
10376 					td[i].input_text.len, nb_segs, 0);
10377 			pktmbuf_write(ut_params->ibuf, 0, td[i].input_text.len, input_text);
10378 		}
10379 
10380 		if (dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS && flags->rx_inject)
10381 			ret = test_ipsec_proto_mbuf_enq(ts_params, ut_params,
10382 							ctx);
10383 		else
10384 			ret = test_ipsec_proto_crypto_op_enq(ts_params,
10385 							     ut_params,
10386 							     &ipsec_xform,
10387 							     &td[i], flags,
10388 							     i + 1);
10389 
10390 		if (ret != TEST_SUCCESS)
10391 			goto mbuf_free;
10392 
10393 		if (res_d != NULL)
10394 			res_d_tmp = &res_d[i];
10395 
10396 		ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
10397 					      res_d_tmp, silent, flags);
10398 		if (ret != TEST_SUCCESS)
10399 			goto mbuf_free;
10400 
10401 		ret = test_ipsec_stats_verify(ctx, ut_params->sec_session,
10402 					      flags, dir);
10403 		if (ret != TEST_SUCCESS)
10404 			goto mbuf_free;
10405 
10406 		rte_pktmbuf_free(ut_params->ibuf);
10407 		ut_params->ibuf = NULL;
10408 	}
10409 
10410 mbuf_free:
10411 	if (flags->use_ext_mbuf)
10412 		ext_mbuf_memzone_free(nb_segs);
10413 
10414 	rte_pktmbuf_free(ut_params->ibuf);
10415 	ut_params->ibuf = NULL;
10416 
10417 	if (ut_params->sec_session)
10418 		rte_security_session_destroy(ctx, ut_params->sec_session);
10419 	ut_params->sec_session = NULL;
10420 
10421 	return ret;
10422 }
10423 
10424 static int
10425 test_ipsec_proto_known_vec(const void *test_data)
10426 {
10427 	struct ipsec_test_data td_outb;
10428 	struct ipsec_test_flags flags;
10429 
10430 	memset(&flags, 0, sizeof(flags));
10431 
10432 	memcpy(&td_outb, test_data, sizeof(td_outb));
10433 
10434 	if (td_outb.aes_gmac || td_outb.aead ||
10435 	    ((td_outb.ipsec_xform.proto != RTE_SECURITY_IPSEC_SA_PROTO_AH) &&
10436 	     (td_outb.xform.chain.cipher.cipher.algo != RTE_CRYPTO_CIPHER_NULL))) {
10437 		/* Disable IV gen to be able to test with known vectors */
10438 		td_outb.ipsec_xform.options.iv_gen_disable = 1;
10439 	}
10440 
10441 	return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
10442 }
10443 
10444 static int
10445 test_ipsec_proto_known_vec_ext_mbuf(const void *test_data)
10446 {
10447 	struct ipsec_test_data td_outb;
10448 	struct ipsec_test_flags flags;
10449 
10450 	memset(&flags, 0, sizeof(flags));
10451 	flags.use_ext_mbuf = true;
10452 
10453 	memcpy(&td_outb, test_data, sizeof(td_outb));
10454 
10455 	if (td_outb.aes_gmac || td_outb.aead ||
10456 	    ((td_outb.ipsec_xform.proto != RTE_SECURITY_IPSEC_SA_PROTO_AH) &&
10457 	     (td_outb.xform.chain.cipher.cipher.algo != RTE_CRYPTO_CIPHER_NULL))) {
10458 		/* Disable IV gen to be able to test with known vectors */
10459 		td_outb.ipsec_xform.options.iv_gen_disable = 1;
10460 	}
10461 
10462 	return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
10463 }
10464 
10465 static int
10466 test_ipsec_proto_known_vec_inb(const void *test_data)
10467 {
10468 	const struct ipsec_test_data *td = test_data;
10469 	struct ipsec_test_flags flags;
10470 	struct ipsec_test_data td_inb;
10471 
10472 	memset(&flags, 0, sizeof(flags));
10473 
10474 	if (td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)
10475 		test_ipsec_td_in_from_out(td, &td_inb);
10476 	else
10477 		memcpy(&td_inb, td, sizeof(td_inb));
10478 
10479 	return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
10480 }
10481 
10482 static int
10483 test_ipsec_proto_known_vec_fragmented(const void *test_data)
10484 {
10485 	struct ipsec_test_data td_outb;
10486 	struct ipsec_test_flags flags;
10487 
10488 	memset(&flags, 0, sizeof(flags));
10489 	flags.fragment = true;
10490 
10491 	memcpy(&td_outb, test_data, sizeof(td_outb));
10492 
10493 	/* Disable IV gen to be able to test with known vectors */
10494 	td_outb.ipsec_xform.options.iv_gen_disable = 1;
10495 
10496 	return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
10497 }
10498 
10499 static int
10500 test_ipsec_proto_known_vec_inb_rx_inject(const void *test_data)
10501 {
10502 	const struct ipsec_test_data *td = test_data;
10503 	struct ipsec_test_flags flags;
10504 	struct ipsec_test_data td_inb;
10505 
10506 	memset(&flags, 0, sizeof(flags));
10507 	flags.rx_inject = true;
10508 
10509 	if (td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)
10510 		test_ipsec_td_in_from_out(td, &td_inb);
10511 	else
10512 		memcpy(&td_inb, td, sizeof(td_inb));
10513 
10514 	return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
10515 }
10516 
10517 static int
10518 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
10519 {
10520 	struct ipsec_test_data td_outb[TEST_SEC_PKTS_MAX];
10521 	struct ipsec_test_data td_inb[TEST_SEC_PKTS_MAX];
10522 	unsigned int i, nb_pkts = 1, pass_cnt = 0;
10523 	int ret;
10524 
10525 	if (flags->iv_gen ||
10526 	    flags->sa_expiry_pkts_soft ||
10527 	    flags->sa_expiry_pkts_hard)
10528 		nb_pkts = TEST_SEC_PKTS_MAX;
10529 
10530 	for (i = 0; i < RTE_DIM(sec_alg_list); i++) {
10531 		test_ipsec_td_prepare(sec_alg_list[i].param1,
10532 				      sec_alg_list[i].param2,
10533 				      flags,
10534 				      td_outb,
10535 				      nb_pkts);
10536 
10537 		if (!td_outb->aead) {
10538 			enum rte_crypto_cipher_algorithm cipher_alg;
10539 			enum rte_crypto_auth_algorithm auth_alg;
10540 
10541 			cipher_alg = td_outb->xform.chain.cipher.cipher.algo;
10542 			auth_alg = td_outb->xform.chain.auth.auth.algo;
10543 
10544 			if (td_outb->aes_gmac && cipher_alg != RTE_CRYPTO_CIPHER_NULL)
10545 				continue;
10546 
10547 			/* ICV is not applicable for NULL auth */
10548 			if (flags->icv_corrupt &&
10549 			    auth_alg == RTE_CRYPTO_AUTH_NULL)
10550 				continue;
10551 
10552 			/* IV is not applicable for NULL cipher */
10553 			if (flags->iv_gen &&
10554 			    cipher_alg == RTE_CRYPTO_CIPHER_NULL)
10555 				continue;
10556 		}
10557 
10558 		ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
10559 					       flags);
10560 		if (ret == TEST_SKIPPED)
10561 			continue;
10562 
10563 		if (ret == TEST_FAILED)
10564 			return TEST_FAILED;
10565 
10566 		test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
10567 
10568 		ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
10569 					       flags);
10570 		if (ret == TEST_SKIPPED)
10571 			continue;
10572 
10573 		if (ret == TEST_FAILED)
10574 			return TEST_FAILED;
10575 
10576 		if (flags->display_alg)
10577 			test_sec_alg_display(sec_alg_list[i].param1, sec_alg_list[i].param2);
10578 
10579 		pass_cnt++;
10580 	}
10581 
10582 	if (pass_cnt > 0)
10583 		return TEST_SUCCESS;
10584 	else
10585 		return TEST_SKIPPED;
10586 }
10587 
10588 static int
10589 test_ipsec_ah_proto_all(const struct ipsec_test_flags *flags)
10590 {
10591 	struct ipsec_test_data td_outb[TEST_SEC_PKTS_MAX];
10592 	struct ipsec_test_data td_inb[TEST_SEC_PKTS_MAX];
10593 	unsigned int i, nb_pkts = 1, pass_cnt = 0;
10594 	int ret;
10595 
10596 	for (i = 0; i < RTE_DIM(sec_auth_only_alg_list); i++) {
10597 		test_ipsec_td_prepare(sec_auth_only_alg_list[i].param1,
10598 				      sec_auth_only_alg_list[i].param2,
10599 				      flags,
10600 				      td_outb,
10601 				      nb_pkts);
10602 
10603 		ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
10604 					       flags);
10605 		if (ret == TEST_SKIPPED)
10606 			continue;
10607 
10608 		if (ret == TEST_FAILED)
10609 			return TEST_FAILED;
10610 
10611 		test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
10612 
10613 		ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
10614 					       flags);
10615 		if (ret == TEST_SKIPPED)
10616 			continue;
10617 
10618 		if (ret == TEST_FAILED)
10619 			return TEST_FAILED;
10620 
10621 		if (flags->display_alg)
10622 			test_sec_alg_display(sec_auth_only_alg_list[i].param1,
10623 					     sec_auth_only_alg_list[i].param2);
10624 
10625 		pass_cnt++;
10626 	}
10627 
10628 	if (pass_cnt > 0)
10629 		return TEST_SUCCESS;
10630 	else
10631 		return TEST_SKIPPED;
10632 }
10633 
10634 static int
10635 test_ipsec_proto_display_list(void)
10636 {
10637 	struct ipsec_test_flags flags;
10638 
10639 	memset(&flags, 0, sizeof(flags));
10640 
10641 	flags.display_alg = true;
10642 
10643 	return test_ipsec_proto_all(&flags);
10644 }
10645 
10646 static int
10647 test_ipsec_proto_ah_tunnel_ipv4(void)
10648 {
10649 	struct ipsec_test_flags flags;
10650 
10651 	memset(&flags, 0, sizeof(flags));
10652 
10653 	flags.ah = true;
10654 	flags.display_alg = true;
10655 
10656 	return test_ipsec_ah_proto_all(&flags);
10657 }
10658 
10659 static int
10660 test_ipsec_proto_ah_transport_ipv4(void)
10661 {
10662 	struct ipsec_test_flags flags;
10663 
10664 	memset(&flags, 0, sizeof(flags));
10665 
10666 	flags.ah = true;
10667 	flags.transport = true;
10668 
10669 	return test_ipsec_ah_proto_all(&flags);
10670 }
10671 
10672 static int
10673 test_ipsec_proto_iv_gen(void)
10674 {
10675 	struct ipsec_test_flags flags;
10676 
10677 	memset(&flags, 0, sizeof(flags));
10678 
10679 	flags.iv_gen = true;
10680 
10681 	return test_ipsec_proto_all(&flags);
10682 }
10683 
10684 static int
10685 test_ipsec_proto_sa_exp_pkts_soft(void)
10686 {
10687 	struct ipsec_test_flags flags;
10688 
10689 	memset(&flags, 0, sizeof(flags));
10690 
10691 	flags.sa_expiry_pkts_soft = true;
10692 
10693 	return test_ipsec_proto_all(&flags);
10694 }
10695 
10696 static int
10697 test_ipsec_proto_sa_exp_pkts_hard(void)
10698 {
10699 	struct ipsec_test_flags flags;
10700 
10701 	memset(&flags, 0, sizeof(flags));
10702 
10703 	flags.sa_expiry_pkts_hard = true;
10704 
10705 	return test_ipsec_proto_all(&flags);
10706 }
10707 
10708 static int
10709 test_ipsec_proto_err_icv_corrupt(void)
10710 {
10711 	struct ipsec_test_flags flags;
10712 
10713 	memset(&flags, 0, sizeof(flags));
10714 
10715 	flags.icv_corrupt = true;
10716 
10717 	return test_ipsec_proto_all(&flags);
10718 }
10719 
10720 static int
10721 test_ipsec_proto_udp_encap_custom_ports(void)
10722 {
10723 	struct ipsec_test_flags flags;
10724 
10725 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
10726 			RTE_STR(CRYPTODEV_NAME_CN10K_PMD)))
10727 		return TEST_SKIPPED;
10728 
10729 	memset(&flags, 0, sizeof(flags));
10730 
10731 	flags.udp_encap = true;
10732 	flags.udp_encap_custom_ports = true;
10733 
10734 	return test_ipsec_proto_all(&flags);
10735 }
10736 
10737 static int
10738 test_ipsec_proto_udp_encap(void)
10739 {
10740 	struct ipsec_test_flags flags;
10741 
10742 	memset(&flags, 0, sizeof(flags));
10743 
10744 	flags.udp_encap = true;
10745 
10746 	return test_ipsec_proto_all(&flags);
10747 }
10748 
10749 static int
10750 test_ipsec_proto_tunnel_src_dst_addr_verify(void)
10751 {
10752 	struct ipsec_test_flags flags;
10753 
10754 	memset(&flags, 0, sizeof(flags));
10755 
10756 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
10757 
10758 	return test_ipsec_proto_all(&flags);
10759 }
10760 
10761 static int
10762 test_ipsec_proto_tunnel_dst_addr_verify(void)
10763 {
10764 	struct ipsec_test_flags flags;
10765 
10766 	memset(&flags, 0, sizeof(flags));
10767 
10768 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
10769 
10770 	return test_ipsec_proto_all(&flags);
10771 }
10772 
10773 static int
10774 test_ipsec_proto_udp_ports_verify(void)
10775 {
10776 	struct ipsec_test_flags flags;
10777 
10778 	memset(&flags, 0, sizeof(flags));
10779 
10780 	flags.udp_encap = true;
10781 	flags.udp_ports_verify = true;
10782 
10783 	return test_ipsec_proto_all(&flags);
10784 }
10785 
10786 static int
10787 test_ipsec_proto_inner_ip_csum(void)
10788 {
10789 	struct ipsec_test_flags flags;
10790 
10791 	memset(&flags, 0, sizeof(flags));
10792 
10793 	flags.ip_csum = true;
10794 
10795 	return test_ipsec_proto_all(&flags);
10796 }
10797 
10798 static int
10799 test_ipsec_proto_inner_l4_csum(void)
10800 {
10801 	struct ipsec_test_flags flags;
10802 
10803 	memset(&flags, 0, sizeof(flags));
10804 
10805 	flags.l4_csum = true;
10806 
10807 	return test_ipsec_proto_all(&flags);
10808 }
10809 
10810 static int
10811 test_ipsec_proto_tunnel_v4_in_v4(void)
10812 {
10813 	struct ipsec_test_flags flags;
10814 
10815 	memset(&flags, 0, sizeof(flags));
10816 
10817 	flags.ipv6 = false;
10818 	flags.tunnel_ipv6 = false;
10819 
10820 	return test_ipsec_proto_all(&flags);
10821 }
10822 
10823 static int
10824 test_ipsec_proto_tunnel_v6_in_v6(void)
10825 {
10826 	struct ipsec_test_flags flags;
10827 
10828 	memset(&flags, 0, sizeof(flags));
10829 
10830 	flags.ipv6 = true;
10831 	flags.tunnel_ipv6 = true;
10832 
10833 	return test_ipsec_proto_all(&flags);
10834 }
10835 
10836 static int
10837 test_ipsec_proto_tunnel_v4_in_v6(void)
10838 {
10839 	struct ipsec_test_flags flags;
10840 
10841 	memset(&flags, 0, sizeof(flags));
10842 
10843 	flags.ipv6 = false;
10844 	flags.tunnel_ipv6 = true;
10845 
10846 	return test_ipsec_proto_all(&flags);
10847 }
10848 
10849 static int
10850 test_ipsec_proto_tunnel_v6_in_v4(void)
10851 {
10852 	struct ipsec_test_flags flags;
10853 
10854 	memset(&flags, 0, sizeof(flags));
10855 
10856 	flags.ipv6 = true;
10857 	flags.tunnel_ipv6 = false;
10858 
10859 	return test_ipsec_proto_all(&flags);
10860 }
10861 
10862 static int
10863 test_ipsec_proto_transport_v4(void)
10864 {
10865 	struct ipsec_test_flags flags;
10866 
10867 	memset(&flags, 0, sizeof(flags));
10868 
10869 	flags.ipv6 = false;
10870 	flags.transport = true;
10871 
10872 	return test_ipsec_proto_all(&flags);
10873 }
10874 
10875 static int
10876 test_ipsec_proto_transport_l4_csum(void)
10877 {
10878 	struct ipsec_test_flags flags = {
10879 		.l4_csum = true,
10880 		.transport = true,
10881 	};
10882 
10883 	return test_ipsec_proto_all(&flags);
10884 }
10885 
10886 static int
10887 test_ipsec_proto_stats(void)
10888 {
10889 	struct ipsec_test_flags flags;
10890 
10891 	memset(&flags, 0, sizeof(flags));
10892 
10893 	flags.stats_success = true;
10894 
10895 	return test_ipsec_proto_all(&flags);
10896 }
10897 
10898 static int
10899 test_ipsec_proto_pkt_fragment(void)
10900 {
10901 	struct ipsec_test_flags flags;
10902 
10903 	memset(&flags, 0, sizeof(flags));
10904 
10905 	flags.fragment = true;
10906 
10907 	return test_ipsec_proto_all(&flags);
10908 
10909 }
10910 
10911 static int
10912 test_ipsec_proto_copy_df_inner_0(void)
10913 {
10914 	struct ipsec_test_flags flags;
10915 
10916 	memset(&flags, 0, sizeof(flags));
10917 
10918 	flags.df = TEST_IPSEC_COPY_DF_INNER_0;
10919 
10920 	return test_ipsec_proto_all(&flags);
10921 }
10922 
10923 static int
10924 test_ipsec_proto_copy_df_inner_1(void)
10925 {
10926 	struct ipsec_test_flags flags;
10927 
10928 	memset(&flags, 0, sizeof(flags));
10929 
10930 	flags.df = TEST_IPSEC_COPY_DF_INNER_1;
10931 
10932 	return test_ipsec_proto_all(&flags);
10933 }
10934 
10935 static int
10936 test_ipsec_proto_set_df_0_inner_1(void)
10937 {
10938 	struct ipsec_test_flags flags;
10939 
10940 	memset(&flags, 0, sizeof(flags));
10941 
10942 	flags.df = TEST_IPSEC_SET_DF_0_INNER_1;
10943 
10944 	return test_ipsec_proto_all(&flags);
10945 }
10946 
10947 static int
10948 test_ipsec_proto_set_df_1_inner_0(void)
10949 {
10950 	struct ipsec_test_flags flags;
10951 
10952 	memset(&flags, 0, sizeof(flags));
10953 
10954 	flags.df = TEST_IPSEC_SET_DF_1_INNER_0;
10955 
10956 	return test_ipsec_proto_all(&flags);
10957 }
10958 
10959 static int
10960 test_ipsec_proto_ipv4_copy_dscp_inner_0(void)
10961 {
10962 	struct ipsec_test_flags flags;
10963 
10964 	memset(&flags, 0, sizeof(flags));
10965 
10966 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
10967 
10968 	return test_ipsec_proto_all(&flags);
10969 }
10970 
10971 static int
10972 test_ipsec_proto_ipv4_copy_dscp_inner_1(void)
10973 {
10974 	struct ipsec_test_flags flags;
10975 
10976 	memset(&flags, 0, sizeof(flags));
10977 
10978 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
10979 
10980 	return test_ipsec_proto_all(&flags);
10981 }
10982 
10983 static int
10984 test_ipsec_proto_ipv4_set_dscp_0_inner_1(void)
10985 {
10986 	struct ipsec_test_flags flags;
10987 
10988 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
10989 			RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
10990 		return TEST_SKIPPED;
10991 
10992 	memset(&flags, 0, sizeof(flags));
10993 
10994 	flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
10995 
10996 	return test_ipsec_proto_all(&flags);
10997 }
10998 
10999 static int
11000 test_ipsec_proto_ipv4_set_dscp_1_inner_0(void)
11001 {
11002 	struct ipsec_test_flags flags;
11003 
11004 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
11005 			RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
11006 		return TEST_SKIPPED;
11007 
11008 	memset(&flags, 0, sizeof(flags));
11009 
11010 	flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
11011 
11012 	return test_ipsec_proto_all(&flags);
11013 }
11014 
11015 static int
11016 test_ipsec_proto_ipv6_copy_dscp_inner_0(void)
11017 {
11018 	struct ipsec_test_flags flags;
11019 
11020 	memset(&flags, 0, sizeof(flags));
11021 
11022 	flags.ipv6 = true;
11023 	flags.tunnel_ipv6 = true;
11024 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
11025 
11026 	return test_ipsec_proto_all(&flags);
11027 }
11028 
11029 static int
11030 test_ipsec_proto_ipv6_copy_dscp_inner_1(void)
11031 {
11032 	struct ipsec_test_flags flags;
11033 
11034 	memset(&flags, 0, sizeof(flags));
11035 
11036 	flags.ipv6 = true;
11037 	flags.tunnel_ipv6 = true;
11038 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
11039 
11040 	return test_ipsec_proto_all(&flags);
11041 }
11042 
11043 static int
11044 test_ipsec_proto_ipv6_set_dscp_0_inner_1(void)
11045 {
11046 	struct ipsec_test_flags flags;
11047 
11048 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
11049 			RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
11050 		return TEST_SKIPPED;
11051 
11052 	memset(&flags, 0, sizeof(flags));
11053 
11054 	flags.ipv6 = true;
11055 	flags.tunnel_ipv6 = true;
11056 	flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
11057 
11058 	return test_ipsec_proto_all(&flags);
11059 }
11060 
11061 static int
11062 test_ipsec_proto_ipv6_set_dscp_1_inner_0(void)
11063 {
11064 	struct ipsec_test_flags flags;
11065 
11066 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
11067 			RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
11068 		return TEST_SKIPPED;
11069 
11070 	memset(&flags, 0, sizeof(flags));
11071 
11072 	flags.ipv6 = true;
11073 	flags.tunnel_ipv6 = true;
11074 	flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
11075 
11076 	return test_ipsec_proto_all(&flags);
11077 }
11078 
11079 static int
11080 test_ipsec_proto_sgl(void)
11081 {
11082 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11083 	struct rte_cryptodev_info dev_info;
11084 
11085 	struct ipsec_test_flags flags = {
11086 		.nb_segs_in_mbuf = 5
11087 	};
11088 
11089 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11090 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
11091 		printf("Device doesn't support in-place scatter-gather. "
11092 				"Test Skipped.\n");
11093 		return TEST_SKIPPED;
11094 	}
11095 
11096 	return test_ipsec_proto_all(&flags);
11097 }
11098 
11099 static int
11100 test_ipsec_proto_sgl_ext_mbuf(void)
11101 {
11102 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11103 	struct rte_cryptodev_info dev_info;
11104 
11105 	struct ipsec_test_flags flags = {
11106 		.nb_segs_in_mbuf = 5,
11107 		.use_ext_mbuf = 1
11108 	};
11109 
11110 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11111 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
11112 		printf("Device doesn't support in-place scatter-gather. "
11113 				"Test Skipped.\n");
11114 		return TEST_SKIPPED;
11115 	}
11116 
11117 	return test_ipsec_proto_all(&flags);
11118 }
11119 
11120 static int
11121 test_ipsec_pkt_replay(const void *test_data, const uint64_t esn[],
11122 		      bool replayed_pkt[], uint32_t nb_pkts, bool esn_en,
11123 		      uint64_t winsz)
11124 {
11125 	struct ipsec_test_data td_outb[TEST_SEC_PKTS_MAX];
11126 	struct ipsec_test_data td_inb[TEST_SEC_PKTS_MAX];
11127 	struct ipsec_test_flags flags;
11128 	uint32_t i = 0, ret = 0;
11129 
11130 	if (nb_pkts == 0)
11131 		return TEST_FAILED;
11132 
11133 	memset(&flags, 0, sizeof(flags));
11134 	flags.antireplay = true;
11135 
11136 	for (i = 0; i < nb_pkts; i++) {
11137 		memcpy(&td_outb[i], test_data, sizeof(td_outb[i]));
11138 		td_outb[i].ipsec_xform.options.iv_gen_disable = 1;
11139 		td_outb[i].ipsec_xform.replay_win_sz = winsz;
11140 		td_outb[i].ipsec_xform.options.esn = esn_en;
11141 	}
11142 
11143 	for (i = 0; i < nb_pkts; i++)
11144 		td_outb[i].ipsec_xform.esn.value = esn[i];
11145 
11146 	ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
11147 				       &flags);
11148 	if (ret != TEST_SUCCESS)
11149 		return ret;
11150 
11151 	test_ipsec_td_update(td_inb, td_outb, nb_pkts, &flags);
11152 
11153 	for (i = 0; i < nb_pkts; i++) {
11154 		td_inb[i].ipsec_xform.options.esn = esn_en;
11155 		/* Set antireplay flag for packets to be dropped */
11156 		td_inb[i].ar_packet = replayed_pkt[i];
11157 	}
11158 
11159 	ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
11160 				       &flags);
11161 
11162 	return ret;
11163 }
11164 
11165 static int
11166 test_ipsec_proto_pkt_antireplay(const void *test_data, uint64_t winsz)
11167 {
11168 
11169 	uint32_t nb_pkts = 5;
11170 	bool replayed_pkt[5];
11171 	uint64_t esn[5];
11172 
11173 	/* 1. Advance the TOP of the window to WS * 2 */
11174 	esn[0] = winsz * 2;
11175 	/* 2. Test sequence number within the new window(WS + 1) */
11176 	esn[1] = winsz + 1;
11177 	/* 3. Test sequence number less than the window BOTTOM */
11178 	esn[2] = winsz;
11179 	/* 4. Test sequence number in the middle of the window */
11180 	esn[3] = winsz + (winsz / 2);
11181 	/* 5. Test replay of the packet in the middle of the window */
11182 	esn[4] = winsz + (winsz / 2);
11183 
11184 	replayed_pkt[0] = false;
11185 	replayed_pkt[1] = false;
11186 	replayed_pkt[2] = true;
11187 	replayed_pkt[3] = false;
11188 	replayed_pkt[4] = true;
11189 
11190 	return test_ipsec_pkt_replay(test_data, esn, replayed_pkt, nb_pkts,
11191 				     false, winsz);
11192 }
11193 
11194 static int
11195 test_ipsec_proto_pkt_antireplay1024(const void *test_data)
11196 {
11197 	return test_ipsec_proto_pkt_antireplay(test_data, 1024);
11198 }
11199 
11200 static int
11201 test_ipsec_proto_pkt_antireplay2048(const void *test_data)
11202 {
11203 	return test_ipsec_proto_pkt_antireplay(test_data, 2048);
11204 }
11205 
11206 static int
11207 test_ipsec_proto_pkt_antireplay4096(const void *test_data)
11208 {
11209 	return test_ipsec_proto_pkt_antireplay(test_data, 4096);
11210 }
11211 
11212 static int
11213 test_ipsec_proto_pkt_esn_antireplay(const void *test_data, uint64_t winsz)
11214 {
11215 
11216 	uint32_t nb_pkts = 7;
11217 	bool replayed_pkt[7];
11218 	uint64_t esn[7];
11219 
11220 	/* Set the initial sequence number */
11221 	esn[0] = (uint64_t)(0xFFFFFFFF - winsz);
11222 	/* 1. Advance the TOP of the window to (1<<32 + WS/2) */
11223 	esn[1] = (uint64_t)((1ULL << 32) + (winsz / 2));
11224 	/* 2. Test sequence number within new window (1<<32 + WS/2 + 1) */
11225 	esn[2] = (uint64_t)((1ULL << 32) - (winsz / 2) + 1);
11226 	/* 3. Test with sequence number within window (1<<32 - 1) */
11227 	esn[3] = (uint64_t)((1ULL << 32) - 1);
11228 	/* 4. Test with sequence number within window (1<<32 - 1) */
11229 	esn[4] = (uint64_t)(1ULL << 32);
11230 	/* 5. Test with duplicate sequence number within
11231 	 * new window (1<<32 - 1)
11232 	 */
11233 	esn[5] = (uint64_t)((1ULL << 32) - 1);
11234 	/* 6. Test with duplicate sequence number within new window (1<<32) */
11235 	esn[6] = (uint64_t)(1ULL << 32);
11236 
11237 	replayed_pkt[0] = false;
11238 	replayed_pkt[1] = false;
11239 	replayed_pkt[2] = false;
11240 	replayed_pkt[3] = false;
11241 	replayed_pkt[4] = false;
11242 	replayed_pkt[5] = true;
11243 	replayed_pkt[6] = true;
11244 
11245 	return test_ipsec_pkt_replay(test_data, esn, replayed_pkt, nb_pkts,
11246 				     true, winsz);
11247 }
11248 
11249 static int
11250 test_ipsec_proto_pkt_esn_antireplay1024(const void *test_data)
11251 {
11252 	return test_ipsec_proto_pkt_esn_antireplay(test_data, 1024);
11253 }
11254 
11255 static int
11256 test_ipsec_proto_pkt_esn_antireplay2048(const void *test_data)
11257 {
11258 	return test_ipsec_proto_pkt_esn_antireplay(test_data, 2048);
11259 }
11260 
11261 static int
11262 test_ipsec_proto_pkt_esn_antireplay4096(const void *test_data)
11263 {
11264 	return test_ipsec_proto_pkt_esn_antireplay(test_data, 4096);
11265 }
11266 
11267 static int
11268 test_PDCP_PROTO_all(void)
11269 {
11270 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11271 	struct crypto_unittest_params *ut_params = &unittest_params;
11272 	struct rte_cryptodev_info dev_info;
11273 	int status;
11274 
11275 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11276 	uint64_t feat_flags = dev_info.feature_flags;
11277 
11278 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
11279 		return TEST_SKIPPED;
11280 
11281 	/* Set action type */
11282 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
11283 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
11284 		gbl_action_type;
11285 
11286 	if (security_proto_supported(ut_params->type,
11287 			RTE_SECURITY_PROTOCOL_PDCP) < 0)
11288 		return TEST_SKIPPED;
11289 
11290 	status = test_PDCP_PROTO_cplane_encap_all();
11291 	status += test_PDCP_PROTO_cplane_decap_all();
11292 	status += test_PDCP_PROTO_uplane_encap_all();
11293 	status += test_PDCP_PROTO_uplane_decap_all();
11294 	status += test_PDCP_PROTO_SGL_in_place_32B();
11295 	status += test_PDCP_PROTO_SGL_oop_32B_128B();
11296 	status += test_PDCP_PROTO_SGL_oop_32B_40B();
11297 	status += test_PDCP_PROTO_SGL_oop_128B_32B();
11298 	status += test_PDCP_SDAP_PROTO_encap_all();
11299 	status += test_PDCP_SDAP_PROTO_decap_all();
11300 	status += test_PDCP_PROTO_short_mac();
11301 
11302 	if (status)
11303 		return TEST_FAILED;
11304 	else
11305 		return TEST_SUCCESS;
11306 }
11307 
11308 static int
11309 test_ipsec_proto_ipv4_ttl_decrement(void)
11310 {
11311 	struct ipsec_test_flags flags = {
11312 		.dec_ttl_or_hop_limit = true
11313 	};
11314 
11315 	return test_ipsec_proto_all(&flags);
11316 }
11317 
11318 static int
11319 test_ipsec_proto_ipv6_hop_limit_decrement(void)
11320 {
11321 	struct ipsec_test_flags flags = {
11322 		.ipv6 = true,
11323 		.dec_ttl_or_hop_limit = true
11324 	};
11325 
11326 	return test_ipsec_proto_all(&flags);
11327 }
11328 
11329 static int
11330 test_docsis_proto_uplink(const void *data)
11331 {
11332 	const struct docsis_test_data *d_td = data;
11333 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11334 	struct crypto_unittest_params *ut_params = &unittest_params;
11335 	uint8_t *plaintext = NULL;
11336 	uint8_t *ciphertext = NULL;
11337 	uint8_t *iv_ptr;
11338 	int32_t cipher_len, crc_len;
11339 	uint32_t crc_data_len;
11340 	int ret = TEST_SUCCESS;
11341 
11342 	void *ctx = rte_cryptodev_get_sec_ctx(ts_params->valid_devs[0]);
11343 
11344 	/* Verify the capabilities */
11345 	struct rte_security_capability_idx sec_cap_idx;
11346 	const struct rte_security_capability *sec_cap;
11347 	const struct rte_cryptodev_capabilities *crypto_cap;
11348 	const struct rte_cryptodev_symmetric_capability *sym_cap;
11349 	int j = 0;
11350 
11351 	/* Set action type */
11352 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
11353 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
11354 		gbl_action_type;
11355 
11356 	if (security_proto_supported(ut_params->type,
11357 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
11358 		return TEST_SKIPPED;
11359 
11360 	sec_cap_idx.action = ut_params->type;
11361 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
11362 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
11363 
11364 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
11365 	if (sec_cap == NULL)
11366 		return TEST_SKIPPED;
11367 
11368 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
11369 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
11370 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
11371 				crypto_cap->sym.xform_type ==
11372 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
11373 				crypto_cap->sym.cipher.algo ==
11374 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
11375 			sym_cap = &crypto_cap->sym;
11376 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
11377 						d_td->key.len,
11378 						d_td->iv.len) == 0)
11379 				break;
11380 		}
11381 	}
11382 
11383 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
11384 		return TEST_SKIPPED;
11385 
11386 	/* Setup source mbuf payload */
11387 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11388 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11389 			rte_pktmbuf_tailroom(ut_params->ibuf));
11390 
11391 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11392 			d_td->ciphertext.len);
11393 
11394 	memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
11395 
11396 	/* Setup cipher session parameters */
11397 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11398 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
11399 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
11400 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
11401 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
11402 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
11403 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
11404 	ut_params->cipher_xform.next = NULL;
11405 
11406 	/* Setup DOCSIS session parameters */
11407 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
11408 
11409 	struct rte_security_session_conf sess_conf = {
11410 		.action_type = ut_params->type,
11411 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
11412 		.docsis = ut_params->docsis_xform,
11413 		.crypto_xform = &ut_params->cipher_xform,
11414 	};
11415 
11416 	/* Create security session */
11417 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
11418 					ts_params->session_mpool);
11419 
11420 	if (!ut_params->sec_session) {
11421 		printf("Test function %s line %u: failed to allocate session\n",
11422 			__func__, __LINE__);
11423 		ret = TEST_FAILED;
11424 		goto on_err;
11425 	}
11426 
11427 	/* Generate crypto op data structure */
11428 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11429 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11430 	if (!ut_params->op) {
11431 		printf("Test function %s line %u: failed to allocate symmetric "
11432 			"crypto operation\n", __func__, __LINE__);
11433 		ret = TEST_FAILED;
11434 		goto on_err;
11435 	}
11436 
11437 	/* Setup CRC operation parameters */
11438 	crc_len = d_td->ciphertext.no_crc == false ?
11439 			(d_td->ciphertext.len -
11440 				d_td->ciphertext.crc_offset -
11441 				RTE_ETHER_CRC_LEN) :
11442 			0;
11443 	crc_len = crc_len > 0 ? crc_len : 0;
11444 	crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
11445 	ut_params->op->sym->auth.data.length = crc_len;
11446 	ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
11447 
11448 	/* Setup cipher operation parameters */
11449 	cipher_len = d_td->ciphertext.no_cipher == false ?
11450 			(d_td->ciphertext.len -
11451 				d_td->ciphertext.cipher_offset) :
11452 			0;
11453 	cipher_len = cipher_len > 0 ? cipher_len : 0;
11454 	ut_params->op->sym->cipher.data.length = cipher_len;
11455 	ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
11456 
11457 	/* Setup cipher IV */
11458 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
11459 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
11460 
11461 	/* Attach session to operation */
11462 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
11463 
11464 	/* Set crypto operation mbufs */
11465 	ut_params->op->sym->m_src = ut_params->ibuf;
11466 	ut_params->op->sym->m_dst = NULL;
11467 
11468 	/* Process crypto operation */
11469 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
11470 			NULL) {
11471 		printf("Test function %s line %u: failed to process security "
11472 			"crypto op\n", __func__, __LINE__);
11473 		ret = TEST_FAILED;
11474 		goto on_err;
11475 	}
11476 
11477 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
11478 		printf("Test function %s line %u: failed to process crypto op\n",
11479 			__func__, __LINE__);
11480 		ret = TEST_FAILED;
11481 		goto on_err;
11482 	}
11483 
11484 	/* Validate plaintext */
11485 	plaintext = ciphertext;
11486 
11487 	if (memcmp(plaintext, d_td->plaintext.data,
11488 			d_td->plaintext.len - crc_data_len)) {
11489 		printf("Test function %s line %u: plaintext not as expected\n",
11490 			__func__, __LINE__);
11491 		rte_hexdump(stdout, "expected", d_td->plaintext.data,
11492 				d_td->plaintext.len);
11493 		rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
11494 		ret = TEST_FAILED;
11495 		goto on_err;
11496 	}
11497 
11498 on_err:
11499 	rte_crypto_op_free(ut_params->op);
11500 	ut_params->op = NULL;
11501 
11502 	if (ut_params->sec_session)
11503 		rte_security_session_destroy(ctx, ut_params->sec_session);
11504 	ut_params->sec_session = NULL;
11505 
11506 	rte_pktmbuf_free(ut_params->ibuf);
11507 	ut_params->ibuf = NULL;
11508 
11509 	return ret;
11510 }
11511 
11512 static int
11513 test_docsis_proto_downlink(const void *data)
11514 {
11515 	const struct docsis_test_data *d_td = data;
11516 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11517 	struct crypto_unittest_params *ut_params = &unittest_params;
11518 	uint8_t *plaintext = NULL;
11519 	uint8_t *ciphertext = NULL;
11520 	uint8_t *iv_ptr;
11521 	int32_t cipher_len, crc_len;
11522 	int ret = TEST_SUCCESS;
11523 
11524 	void *ctx = rte_cryptodev_get_sec_ctx(ts_params->valid_devs[0]);
11525 
11526 	/* Verify the capabilities */
11527 	struct rte_security_capability_idx sec_cap_idx;
11528 	const struct rte_security_capability *sec_cap;
11529 	const struct rte_cryptodev_capabilities *crypto_cap;
11530 	const struct rte_cryptodev_symmetric_capability *sym_cap;
11531 	int j = 0;
11532 
11533 	/* Set action type */
11534 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
11535 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
11536 		gbl_action_type;
11537 
11538 	if (security_proto_supported(ut_params->type,
11539 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
11540 		return TEST_SKIPPED;
11541 
11542 	sec_cap_idx.action = ut_params->type;
11543 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
11544 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
11545 
11546 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
11547 	if (sec_cap == NULL)
11548 		return TEST_SKIPPED;
11549 
11550 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
11551 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
11552 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
11553 				crypto_cap->sym.xform_type ==
11554 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
11555 				crypto_cap->sym.cipher.algo ==
11556 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
11557 			sym_cap = &crypto_cap->sym;
11558 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
11559 						d_td->key.len,
11560 						d_td->iv.len) == 0)
11561 				break;
11562 		}
11563 	}
11564 
11565 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
11566 		return TEST_SKIPPED;
11567 
11568 	/* Setup source mbuf payload */
11569 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11570 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11571 			rte_pktmbuf_tailroom(ut_params->ibuf));
11572 
11573 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11574 			d_td->plaintext.len);
11575 
11576 	memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
11577 
11578 	/* Setup cipher session parameters */
11579 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11580 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
11581 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11582 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
11583 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
11584 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
11585 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
11586 	ut_params->cipher_xform.next = NULL;
11587 
11588 	/* Setup DOCSIS session parameters */
11589 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
11590 
11591 	struct rte_security_session_conf sess_conf = {
11592 		.action_type = ut_params->type,
11593 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
11594 		.docsis = ut_params->docsis_xform,
11595 		.crypto_xform = &ut_params->cipher_xform,
11596 	};
11597 
11598 	/* Create security session */
11599 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
11600 					ts_params->session_mpool);
11601 
11602 	if (!ut_params->sec_session) {
11603 		printf("Test function %s line %u: failed to allocate session\n",
11604 			__func__, __LINE__);
11605 		ret = TEST_FAILED;
11606 		goto on_err;
11607 	}
11608 
11609 	/* Generate crypto op data structure */
11610 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11611 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11612 	if (!ut_params->op) {
11613 		printf("Test function %s line %u: failed to allocate symmetric "
11614 			"crypto operation\n", __func__, __LINE__);
11615 		ret = TEST_FAILED;
11616 		goto on_err;
11617 	}
11618 
11619 	/* Setup CRC operation parameters */
11620 	crc_len = d_td->plaintext.no_crc == false ?
11621 			(d_td->plaintext.len -
11622 				d_td->plaintext.crc_offset -
11623 				RTE_ETHER_CRC_LEN) :
11624 			0;
11625 	crc_len = crc_len > 0 ? crc_len : 0;
11626 	ut_params->op->sym->auth.data.length = crc_len;
11627 	ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
11628 
11629 	/* Setup cipher operation parameters */
11630 	cipher_len = d_td->plaintext.no_cipher == false ?
11631 			(d_td->plaintext.len -
11632 				d_td->plaintext.cipher_offset) :
11633 			0;
11634 	cipher_len = cipher_len > 0 ? cipher_len : 0;
11635 	ut_params->op->sym->cipher.data.length = cipher_len;
11636 	ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
11637 
11638 	/* Setup cipher IV */
11639 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
11640 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
11641 
11642 	/* Attach session to operation */
11643 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
11644 
11645 	/* Set crypto operation mbufs */
11646 	ut_params->op->sym->m_src = ut_params->ibuf;
11647 	ut_params->op->sym->m_dst = NULL;
11648 
11649 	/* Process crypto operation */
11650 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
11651 			NULL) {
11652 		printf("Test function %s line %u: failed to process crypto op\n",
11653 			__func__, __LINE__);
11654 		ret = TEST_FAILED;
11655 		goto on_err;
11656 	}
11657 
11658 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
11659 		printf("Test function %s line %u: crypto op processing failed\n",
11660 			__func__, __LINE__);
11661 		ret = TEST_FAILED;
11662 		goto on_err;
11663 	}
11664 
11665 	/* Validate ciphertext */
11666 	ciphertext = plaintext;
11667 
11668 	if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
11669 		printf("Test function %s line %u: plaintext not as expected\n",
11670 			__func__, __LINE__);
11671 		rte_hexdump(stdout, "expected", d_td->ciphertext.data,
11672 				d_td->ciphertext.len);
11673 		rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
11674 		ret = TEST_FAILED;
11675 		goto on_err;
11676 	}
11677 
11678 on_err:
11679 	rte_crypto_op_free(ut_params->op);
11680 	ut_params->op = NULL;
11681 
11682 	if (ut_params->sec_session)
11683 		rte_security_session_destroy(ctx, ut_params->sec_session);
11684 	ut_params->sec_session = NULL;
11685 
11686 	rte_pktmbuf_free(ut_params->ibuf);
11687 	ut_params->ibuf = NULL;
11688 
11689 	return ret;
11690 }
11691 
11692 static void
11693 test_tls_record_imp_nonce_update(const struct tls_record_test_data *td,
11694 				 struct rte_security_tls_record_xform *tls_record_xform)
11695 {
11696 	unsigned int imp_nonce_len;
11697 	uint8_t *imp_nonce;
11698 
11699 	switch (tls_record_xform->ver) {
11700 	case RTE_SECURITY_VERSION_TLS_1_2:
11701 		imp_nonce_len = RTE_SECURITY_TLS_1_2_IMP_NONCE_LEN;
11702 		imp_nonce = tls_record_xform->tls_1_2.imp_nonce;
11703 		break;
11704 	case RTE_SECURITY_VERSION_DTLS_1_2:
11705 		imp_nonce_len = RTE_SECURITY_DTLS_1_2_IMP_NONCE_LEN;
11706 		imp_nonce = tls_record_xform->dtls_1_2.imp_nonce;
11707 		break;
11708 	case RTE_SECURITY_VERSION_TLS_1_3:
11709 		imp_nonce_len = RTE_SECURITY_TLS_1_3_IMP_NONCE_LEN;
11710 		imp_nonce = tls_record_xform->tls_1_3.imp_nonce;
11711 		break;
11712 	default:
11713 		return;
11714 	}
11715 
11716 	imp_nonce_len = RTE_MIN(imp_nonce_len, td[0].imp_nonce.len);
11717 	memcpy(imp_nonce, td[0].imp_nonce.data, imp_nonce_len);
11718 }
11719 
11720 static int
11721 test_tls_record_proto_process(const struct tls_record_test_data td[],
11722 			      struct tls_record_test_data res_d[], int nb_td, bool silent,
11723 			      const struct tls_record_test_flags *flags)
11724 {
11725 	int nb_segs = flags->nb_segs_in_mbuf ? flags->nb_segs_in_mbuf : 1;
11726 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11727 	struct crypto_unittest_params *ut_params = &unittest_params;
11728 	struct rte_security_tls_record_xform tls_record_xform;
11729 	struct rte_security_capability_idx sec_cap_idx;
11730 	const struct rte_security_capability *sec_cap;
11731 	struct tls_record_test_data *res_d_tmp = NULL;
11732 	enum rte_security_tls_sess_type sess_type;
11733 	uint8_t dev_id = ts_params->valid_devs[0];
11734 	struct rte_security_ctx *ctx;
11735 	int i, ret = TEST_SUCCESS;
11736 
11737 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
11738 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
11739 
11740 	/* Use first test data to create session */
11741 
11742 	/* Copy TLS record xform */
11743 	memcpy(&tls_record_xform, &td[0].tls_record_xform, sizeof(tls_record_xform));
11744 
11745 	sess_type = tls_record_xform.type;
11746 
11747 	ctx = rte_cryptodev_get_sec_ctx(dev_id);
11748 
11749 	sec_cap_idx.action = ut_params->type;
11750 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_TLS_RECORD;
11751 	sec_cap_idx.tls_record.type = tls_record_xform.type;
11752 	sec_cap_idx.tls_record.ver = tls_record_xform.ver;
11753 
11754 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
11755 	if (sec_cap == NULL)
11756 		return TEST_SKIPPED;
11757 
11758 	/* Copy cipher session parameters */
11759 	if (td[0].aead) {
11760 		memcpy(&ut_params->aead_xform, &td[0].xform.aead, sizeof(ut_params->aead_xform));
11761 		ut_params->aead_xform.aead.key.data = td[0].key.data;
11762 		ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
11763 
11764 		/* Verify crypto capabilities */
11765 		if (test_sec_crypto_caps_aead_verify(sec_cap, &ut_params->aead_xform) != 0) {
11766 			if (!silent)
11767 				RTE_LOG(INFO, USER1, "Crypto capabilities not supported\n");
11768 			return TEST_SKIPPED;
11769 		}
11770 	} else {
11771 		memcpy(&ut_params->cipher_xform, &td[0].xform.chain.cipher,
11772 		       sizeof(ut_params->cipher_xform));
11773 		memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth,
11774 		       sizeof(ut_params->auth_xform));
11775 		ut_params->cipher_xform.cipher.key.data = td[0].key.data;
11776 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
11777 		ut_params->auth_xform.auth.key.data = td[0].auth_key.data;
11778 
11779 		/* Verify crypto capabilities */
11780 
11781 		if (test_sec_crypto_caps_cipher_verify(sec_cap, &ut_params->cipher_xform) != 0) {
11782 			if (!silent)
11783 				RTE_LOG(INFO, USER1, "Cipher crypto capabilities not supported\n");
11784 			return TEST_SKIPPED;
11785 		}
11786 
11787 		if (test_sec_crypto_caps_auth_verify(sec_cap, &ut_params->auth_xform) != 0) {
11788 			if (!silent)
11789 				RTE_LOG(INFO, USER1, "Auth crypto capabilities not supported\n");
11790 			return TEST_SKIPPED;
11791 		}
11792 	}
11793 
11794 	if (test_tls_record_sec_caps_verify(&tls_record_xform, sec_cap, silent) != 0)
11795 		return TEST_SKIPPED;
11796 
11797 	struct rte_security_session_conf sess_conf = {
11798 		.action_type = ut_params->type,
11799 		.protocol = RTE_SECURITY_PROTOCOL_TLS_RECORD,
11800 	};
11801 
11802 	if (td[0].aead)
11803 		test_tls_record_imp_nonce_update(&td[0], &tls_record_xform);
11804 
11805 	sess_conf.tls_record = tls_record_xform;
11806 
11807 	if (td[0].aead) {
11808 		sess_conf.crypto_xform = &ut_params->aead_xform;
11809 	} else {
11810 		if (sess_type == RTE_SECURITY_TLS_SESS_TYPE_READ) {
11811 			sess_conf.crypto_xform = &ut_params->cipher_xform;
11812 			ut_params->cipher_xform.next = &ut_params->auth_xform;
11813 		} else {
11814 			sess_conf.crypto_xform = &ut_params->auth_xform;
11815 			ut_params->auth_xform.next = &ut_params->cipher_xform;
11816 		}
11817 	}
11818 
11819 	/* Create security session */
11820 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
11821 					ts_params->session_mpool);
11822 	if (ut_params->sec_session == NULL)
11823 		return TEST_SKIPPED;
11824 
11825 	for (i = 0; i < nb_td; i++) {
11826 		/* Setup source mbuf payload */
11827 		ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, td[i].input_text.len,
11828 				nb_segs, 0);
11829 		pktmbuf_write(ut_params->ibuf, 0, td[i].input_text.len, td[i].input_text.data);
11830 
11831 		/* Generate crypto op data structure */
11832 		ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11833 						    RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11834 		if (ut_params->op == NULL) {
11835 			printf("Could not allocate crypto op");
11836 			ret = TEST_FAILED;
11837 			goto crypto_op_free;
11838 		}
11839 
11840 		/* Attach session to operation */
11841 		rte_security_attach_session(ut_params->op, ut_params->sec_session);
11842 
11843 		/* Set crypto operation mbufs */
11844 		ut_params->op->sym->m_src = ut_params->ibuf;
11845 		ut_params->op->sym->m_dst = NULL;
11846 		ut_params->op->param1.tls_record.content_type = td[i].app_type;
11847 
11848 		/* Copy IV in crypto operation when IV generation is disabled */
11849 		if (sess_type == RTE_SECURITY_TLS_SESS_TYPE_WRITE &&
11850 		    tls_record_xform.options.iv_gen_disable == 1) {
11851 			uint8_t *iv;
11852 			int len;
11853 
11854 			iv = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET);
11855 			if (td[i].aead)
11856 				len = td[i].xform.aead.aead.iv.length - 4;
11857 			else
11858 				len = td[i].xform.chain.cipher.cipher.iv.length;
11859 			memcpy(iv, td[i].iv.data, len);
11860 		}
11861 
11862 		/* Process crypto operation */
11863 		process_crypto_request(dev_id, ut_params->op);
11864 
11865 		ret = test_tls_record_status_check(ut_params->op);
11866 		if (ret != TEST_SUCCESS)
11867 			goto crypto_op_free;
11868 
11869 		if (res_d != NULL)
11870 			res_d_tmp = &res_d[i];
11871 
11872 		ret = test_tls_record_post_process(ut_params->ibuf, &td[i], res_d_tmp, silent);
11873 		if (ret != TEST_SUCCESS)
11874 			goto crypto_op_free;
11875 
11876 
11877 		rte_crypto_op_free(ut_params->op);
11878 		ut_params->op = NULL;
11879 
11880 		rte_pktmbuf_free(ut_params->ibuf);
11881 		ut_params->ibuf = NULL;
11882 	}
11883 
11884 crypto_op_free:
11885 	rte_crypto_op_free(ut_params->op);
11886 	ut_params->op = NULL;
11887 
11888 	rte_pktmbuf_free(ut_params->ibuf);
11889 	ut_params->ibuf = NULL;
11890 
11891 	if (ut_params->sec_session)
11892 		rte_security_session_destroy(ctx, ut_params->sec_session);
11893 	ut_params->sec_session = NULL;
11894 
11895 	RTE_SET_USED(flags);
11896 
11897 	return ret;
11898 }
11899 
11900 static int
11901 test_tls_record_proto_known_vec(const void *test_data)
11902 {
11903 	struct tls_record_test_data td_write;
11904 	struct tls_record_test_flags flags;
11905 
11906 	memset(&flags, 0, sizeof(flags));
11907 
11908 	memcpy(&td_write, test_data, sizeof(td_write));
11909 
11910 	/* Disable IV gen to be able to test with known vectors */
11911 	td_write.tls_record_xform.options.iv_gen_disable = 1;
11912 
11913 	return test_tls_record_proto_process(&td_write, NULL, 1, false, &flags);
11914 }
11915 
11916 static int
11917 test_tls_record_proto_known_vec_read(const void *test_data)
11918 {
11919 	const struct tls_record_test_data *td = test_data;
11920 	struct tls_record_test_flags flags;
11921 	struct tls_record_test_data td_inb;
11922 
11923 	memset(&flags, 0, sizeof(flags));
11924 
11925 	if (td->tls_record_xform.type == RTE_SECURITY_TLS_SESS_TYPE_WRITE)
11926 		test_tls_record_td_read_from_write(td, &td_inb);
11927 	else
11928 		memcpy(&td_inb, td, sizeof(td_inb));
11929 
11930 	return test_tls_record_proto_process(&td_inb, NULL, 1, false, &flags);
11931 }
11932 
11933 static int
11934 test_tls_record_proto_all(const struct tls_record_test_flags *flags)
11935 {
11936 	struct tls_record_test_data td_outb[TEST_SEC_PKTS_MAX];
11937 	struct tls_record_test_data td_inb[TEST_SEC_PKTS_MAX];
11938 	unsigned int i, nb_pkts = 1, pass_cnt = 0;
11939 	int ret;
11940 
11941 	for (i = 0; i < RTE_DIM(sec_alg_list); i++) {
11942 		test_tls_record_td_prepare(sec_alg_list[i].param1, sec_alg_list[i].param2, flags,
11943 					   td_outb, nb_pkts);
11944 
11945 		ret = test_tls_record_proto_process(td_outb, td_inb, nb_pkts, true, flags);
11946 		if (ret == TEST_SKIPPED)
11947 			continue;
11948 
11949 		if (ret == TEST_FAILED)
11950 			return TEST_FAILED;
11951 
11952 		test_tls_record_td_update(td_inb, td_outb, nb_pkts, flags);
11953 
11954 		ret = test_tls_record_proto_process(td_inb, NULL, nb_pkts, true, flags);
11955 		if (ret == TEST_SKIPPED)
11956 			continue;
11957 
11958 		if (ret == TEST_FAILED)
11959 			return TEST_FAILED;
11960 
11961 		if (flags->display_alg)
11962 			test_sec_alg_display(sec_alg_list[i].param1, sec_alg_list[i].param2);
11963 
11964 		pass_cnt++;
11965 	}
11966 
11967 	if (pass_cnt > 0)
11968 		return TEST_SUCCESS;
11969 	else
11970 		return TEST_SKIPPED;
11971 }
11972 
11973 static int
11974 test_tls_record_proto_display_list(void)
11975 {
11976 	struct tls_record_test_flags flags;
11977 
11978 	memset(&flags, 0, sizeof(flags));
11979 
11980 	flags.display_alg = true;
11981 
11982 	return test_tls_record_proto_all(&flags);
11983 }
11984 
11985 static int
11986 test_tls_record_proto_sgl(void)
11987 {
11988 	struct tls_record_test_flags flags = {
11989 		.nb_segs_in_mbuf = 5
11990 	};
11991 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11992 	struct rte_cryptodev_info dev_info;
11993 
11994 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11995 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
11996 		printf("Device doesn't support in-place scatter-gather. Test Skipped.\n");
11997 		return TEST_SKIPPED;
11998 	}
11999 
12000 	return test_tls_record_proto_all(&flags);
12001 }
12002 
12003 #endif
12004 
12005 static int
12006 test_AES_GCM_authenticated_encryption_test_case_1(void)
12007 {
12008 	return test_authenticated_encryption(&gcm_test_case_1);
12009 }
12010 
12011 static int
12012 test_AES_GCM_authenticated_encryption_test_case_2(void)
12013 {
12014 	return test_authenticated_encryption(&gcm_test_case_2);
12015 }
12016 
12017 static int
12018 test_AES_GCM_authenticated_encryption_test_case_3(void)
12019 {
12020 	return test_authenticated_encryption(&gcm_test_case_3);
12021 }
12022 
12023 static int
12024 test_AES_GCM_authenticated_encryption_test_case_4(void)
12025 {
12026 	return test_authenticated_encryption(&gcm_test_case_4);
12027 }
12028 
12029 static int
12030 test_AES_GCM_authenticated_encryption_test_case_5(void)
12031 {
12032 	return test_authenticated_encryption(&gcm_test_case_5);
12033 }
12034 
12035 static int
12036 test_AES_GCM_authenticated_encryption_test_case_6(void)
12037 {
12038 	return test_authenticated_encryption(&gcm_test_case_6);
12039 }
12040 
12041 static int
12042 test_AES_GCM_authenticated_encryption_test_case_7(void)
12043 {
12044 	return test_authenticated_encryption(&gcm_test_case_7);
12045 }
12046 
12047 static int
12048 test_AES_GCM_authenticated_encryption_test_case_8(void)
12049 {
12050 	return test_authenticated_encryption(&gcm_test_case_8);
12051 }
12052 
12053 static int
12054 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
12055 {
12056 	return test_authenticated_encryption(&gcm_J0_test_case_1);
12057 }
12058 
12059 static int
12060 test_AES_GCM_auth_encryption_test_case_192_1(void)
12061 {
12062 	return test_authenticated_encryption(&gcm_test_case_192_1);
12063 }
12064 
12065 static int
12066 test_AES_GCM_auth_encryption_test_case_192_2(void)
12067 {
12068 	return test_authenticated_encryption(&gcm_test_case_192_2);
12069 }
12070 
12071 static int
12072 test_AES_GCM_auth_encryption_test_case_192_3(void)
12073 {
12074 	return test_authenticated_encryption(&gcm_test_case_192_3);
12075 }
12076 
12077 static int
12078 test_AES_GCM_auth_encryption_test_case_192_4(void)
12079 {
12080 	return test_authenticated_encryption(&gcm_test_case_192_4);
12081 }
12082 
12083 static int
12084 test_AES_GCM_auth_encryption_test_case_192_5(void)
12085 {
12086 	return test_authenticated_encryption(&gcm_test_case_192_5);
12087 }
12088 
12089 static int
12090 test_AES_GCM_auth_encryption_test_case_192_6(void)
12091 {
12092 	return test_authenticated_encryption(&gcm_test_case_192_6);
12093 }
12094 
12095 static int
12096 test_AES_GCM_auth_encryption_test_case_192_7(void)
12097 {
12098 	return test_authenticated_encryption(&gcm_test_case_192_7);
12099 }
12100 
12101 static int
12102 test_AES_GCM_auth_encryption_test_case_256_1(void)
12103 {
12104 	return test_authenticated_encryption(&gcm_test_case_256_1);
12105 }
12106 
12107 static int
12108 test_AES_GCM_auth_encryption_test_case_256_2(void)
12109 {
12110 	return test_authenticated_encryption(&gcm_test_case_256_2);
12111 }
12112 
12113 static int
12114 test_AES_GCM_auth_encryption_test_case_256_3(void)
12115 {
12116 	return test_authenticated_encryption(&gcm_test_case_256_3);
12117 }
12118 
12119 static int
12120 test_AES_GCM_auth_encryption_test_case_256_4(void)
12121 {
12122 	return test_authenticated_encryption(&gcm_test_case_256_4);
12123 }
12124 
12125 static int
12126 test_AES_GCM_auth_encryption_test_case_256_5(void)
12127 {
12128 	return test_authenticated_encryption(&gcm_test_case_256_5);
12129 }
12130 
12131 static int
12132 test_AES_GCM_auth_encryption_test_case_256_6(void)
12133 {
12134 	return test_authenticated_encryption(&gcm_test_case_256_6);
12135 }
12136 
12137 static int
12138 test_AES_GCM_auth_encryption_test_case_256_7(void)
12139 {
12140 	return test_authenticated_encryption(&gcm_test_case_256_7);
12141 }
12142 
12143 static int
12144 test_AES_GCM_auth_encryption_test_case_aad_1(void)
12145 {
12146 	return test_authenticated_encryption(&gcm_test_case_aad_1);
12147 }
12148 
12149 static int
12150 test_AES_GCM_auth_encryption_test_case_aad_2(void)
12151 {
12152 	return test_authenticated_encryption(&gcm_test_case_aad_2);
12153 }
12154 
12155 static int
12156 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
12157 {
12158 	struct aead_test_data tdata;
12159 	int res;
12160 
12161 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
12162 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
12163 	tdata.iv.data[0] += 1;
12164 	res = test_authenticated_encryption(&tdata);
12165 	if (res == TEST_SKIPPED)
12166 		return res;
12167 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
12168 	return TEST_SUCCESS;
12169 }
12170 
12171 static int
12172 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
12173 {
12174 	struct aead_test_data tdata;
12175 	int res;
12176 
12177 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
12178 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
12179 	tdata.plaintext.data[0] += 1;
12180 	res = test_authenticated_encryption(&tdata);
12181 	if (res == TEST_SKIPPED)
12182 		return res;
12183 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
12184 	return TEST_SUCCESS;
12185 }
12186 
12187 static int
12188 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
12189 {
12190 	struct aead_test_data tdata;
12191 	int res;
12192 
12193 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
12194 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
12195 	tdata.ciphertext.data[0] += 1;
12196 	res = test_authenticated_encryption(&tdata);
12197 	if (res == TEST_SKIPPED)
12198 		return res;
12199 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
12200 	return TEST_SUCCESS;
12201 }
12202 
12203 static int
12204 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
12205 {
12206 	struct aead_test_data tdata;
12207 	int res;
12208 
12209 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
12210 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
12211 	tdata.aad.len += 1;
12212 	res = test_authenticated_encryption(&tdata);
12213 	if (res == TEST_SKIPPED)
12214 		return res;
12215 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
12216 	return TEST_SUCCESS;
12217 }
12218 
12219 static int
12220 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
12221 {
12222 	struct aead_test_data tdata;
12223 	uint8_t aad[gcm_test_case_7.aad.len];
12224 	int res;
12225 
12226 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
12227 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
12228 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
12229 	aad[0] += 1;
12230 	tdata.aad.data = aad;
12231 	res = test_authenticated_encryption(&tdata);
12232 	if (res == TEST_SKIPPED)
12233 		return res;
12234 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
12235 	return TEST_SUCCESS;
12236 }
12237 
12238 static int
12239 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
12240 {
12241 	struct aead_test_data tdata;
12242 	int res;
12243 
12244 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
12245 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
12246 	tdata.auth_tag.data[0] += 1;
12247 	res = test_authenticated_encryption(&tdata);
12248 	if (res == TEST_SKIPPED)
12249 		return res;
12250 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
12251 	return TEST_SUCCESS;
12252 }
12253 
12254 static int
12255 test_authenticated_decryption(const struct aead_test_data *tdata)
12256 {
12257 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12258 	struct crypto_unittest_params *ut_params = &unittest_params;
12259 
12260 	int retval;
12261 	uint8_t *plaintext;
12262 	uint32_t i;
12263 	struct rte_cryptodev_info dev_info;
12264 
12265 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12266 	uint64_t feat_flags = dev_info.feature_flags;
12267 
12268 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12269 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12270 		printf("Device doesn't support RAW data-path APIs.\n");
12271 		return TEST_SKIPPED;
12272 	}
12273 
12274 	/* Verify the capabilities */
12275 	struct rte_cryptodev_sym_capability_idx cap_idx;
12276 	const struct rte_cryptodev_symmetric_capability *capability;
12277 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12278 	cap_idx.algo.aead = tdata->algo;
12279 	capability = rte_cryptodev_sym_capability_get(
12280 			ts_params->valid_devs[0], &cap_idx);
12281 	if (capability == NULL)
12282 		return TEST_SKIPPED;
12283 	if (rte_cryptodev_sym_capability_check_aead(
12284 			capability, tdata->key.len, tdata->auth_tag.len,
12285 			tdata->aad.len, tdata->iv.len))
12286 		return TEST_SKIPPED;
12287 
12288 	/* Create AEAD session */
12289 	retval = create_aead_session(ts_params->valid_devs[0],
12290 			tdata->algo,
12291 			RTE_CRYPTO_AEAD_OP_DECRYPT,
12292 			tdata->key.data, tdata->key.len,
12293 			tdata->aad.len, tdata->auth_tag.len,
12294 			tdata->iv.len);
12295 	if (retval != TEST_SUCCESS)
12296 		return retval;
12297 
12298 	/* alloc mbuf and set payload */
12299 	if (tdata->aad.len > MBUF_SIZE) {
12300 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12301 		/* Populate full size of add data */
12302 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
12303 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
12304 	} else
12305 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12306 
12307 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12308 			rte_pktmbuf_tailroom(ut_params->ibuf));
12309 
12310 	/* Create AEAD operation */
12311 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
12312 	if (retval < 0)
12313 		return retval;
12314 
12315 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12316 
12317 	ut_params->op->sym->m_src = ut_params->ibuf;
12318 
12319 	/* Process crypto operation */
12320 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12321 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
12322 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
12323 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 0, 0,
12324 					       0);
12325 		if (retval != TEST_SUCCESS)
12326 			return retval;
12327 	} else
12328 		TEST_ASSERT_NOT_NULL(
12329 			process_crypto_request(ts_params->valid_devs[0],
12330 			ut_params->op), "failed to process sym crypto op");
12331 
12332 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12333 			"crypto op processing failed");
12334 
12335 	if (ut_params->op->sym->m_dst)
12336 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
12337 				uint8_t *);
12338 	else
12339 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
12340 				uint8_t *,
12341 				ut_params->op->sym->cipher.data.offset);
12342 
12343 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
12344 
12345 	/* Validate obuf */
12346 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12347 			plaintext,
12348 			tdata->plaintext.data,
12349 			tdata->plaintext.len,
12350 			"Plaintext data not as expected");
12351 
12352 	TEST_ASSERT_EQUAL(ut_params->op->status,
12353 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12354 			"Authentication failed");
12355 
12356 	return 0;
12357 }
12358 
12359 static int
12360 test_AES_GCM_authenticated_decryption_test_case_1(void)
12361 {
12362 	return test_authenticated_decryption(&gcm_test_case_1);
12363 }
12364 
12365 static int
12366 test_AES_GCM_authenticated_decryption_test_case_2(void)
12367 {
12368 	return test_authenticated_decryption(&gcm_test_case_2);
12369 }
12370 
12371 static int
12372 test_AES_GCM_authenticated_decryption_test_case_3(void)
12373 {
12374 	return test_authenticated_decryption(&gcm_test_case_3);
12375 }
12376 
12377 static int
12378 test_AES_GCM_authenticated_decryption_test_case_4(void)
12379 {
12380 	return test_authenticated_decryption(&gcm_test_case_4);
12381 }
12382 
12383 static int
12384 test_AES_GCM_authenticated_decryption_test_case_5(void)
12385 {
12386 	return test_authenticated_decryption(&gcm_test_case_5);
12387 }
12388 
12389 static int
12390 test_AES_GCM_authenticated_decryption_test_case_6(void)
12391 {
12392 	return test_authenticated_decryption(&gcm_test_case_6);
12393 }
12394 
12395 static int
12396 test_AES_GCM_authenticated_decryption_test_case_7(void)
12397 {
12398 	return test_authenticated_decryption(&gcm_test_case_7);
12399 }
12400 
12401 static int
12402 test_AES_GCM_authenticated_decryption_test_case_8(void)
12403 {
12404 	return test_authenticated_decryption(&gcm_test_case_8);
12405 }
12406 
12407 static int
12408 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
12409 {
12410 	return test_authenticated_decryption(&gcm_J0_test_case_1);
12411 }
12412 
12413 static int
12414 test_AES_GCM_auth_decryption_test_case_192_1(void)
12415 {
12416 	return test_authenticated_decryption(&gcm_test_case_192_1);
12417 }
12418 
12419 static int
12420 test_AES_GCM_auth_decryption_test_case_192_2(void)
12421 {
12422 	return test_authenticated_decryption(&gcm_test_case_192_2);
12423 }
12424 
12425 static int
12426 test_AES_GCM_auth_decryption_test_case_192_3(void)
12427 {
12428 	return test_authenticated_decryption(&gcm_test_case_192_3);
12429 }
12430 
12431 static int
12432 test_AES_GCM_auth_decryption_test_case_192_4(void)
12433 {
12434 	return test_authenticated_decryption(&gcm_test_case_192_4);
12435 }
12436 
12437 static int
12438 test_AES_GCM_auth_decryption_test_case_192_5(void)
12439 {
12440 	return test_authenticated_decryption(&gcm_test_case_192_5);
12441 }
12442 
12443 static int
12444 test_AES_GCM_auth_decryption_test_case_192_6(void)
12445 {
12446 	return test_authenticated_decryption(&gcm_test_case_192_6);
12447 }
12448 
12449 static int
12450 test_AES_GCM_auth_decryption_test_case_192_7(void)
12451 {
12452 	return test_authenticated_decryption(&gcm_test_case_192_7);
12453 }
12454 
12455 static int
12456 test_AES_GCM_auth_decryption_test_case_256_1(void)
12457 {
12458 	return test_authenticated_decryption(&gcm_test_case_256_1);
12459 }
12460 
12461 static int
12462 test_AES_GCM_auth_decryption_test_case_256_2(void)
12463 {
12464 	return test_authenticated_decryption(&gcm_test_case_256_2);
12465 }
12466 
12467 static int
12468 test_AES_GCM_auth_decryption_test_case_256_3(void)
12469 {
12470 	return test_authenticated_decryption(&gcm_test_case_256_3);
12471 }
12472 
12473 static int
12474 test_AES_GCM_auth_decryption_test_case_256_4(void)
12475 {
12476 	return test_authenticated_decryption(&gcm_test_case_256_4);
12477 }
12478 
12479 static int
12480 test_AES_GCM_auth_decryption_test_case_256_5(void)
12481 {
12482 	return test_authenticated_decryption(&gcm_test_case_256_5);
12483 }
12484 
12485 static int
12486 test_AES_GCM_auth_decryption_test_case_256_6(void)
12487 {
12488 	return test_authenticated_decryption(&gcm_test_case_256_6);
12489 }
12490 
12491 static int
12492 test_AES_GCM_auth_decryption_test_case_256_7(void)
12493 {
12494 	return test_authenticated_decryption(&gcm_test_case_256_7);
12495 }
12496 
12497 static int
12498 test_AES_GCM_auth_decryption_test_case_aad_1(void)
12499 {
12500 	return test_authenticated_decryption(&gcm_test_case_aad_1);
12501 }
12502 
12503 static int
12504 test_AES_GCM_auth_decryption_test_case_aad_2(void)
12505 {
12506 	return test_authenticated_decryption(&gcm_test_case_aad_2);
12507 }
12508 
12509 static int
12510 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
12511 {
12512 	struct aead_test_data tdata;
12513 	int res;
12514 
12515 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
12516 	tdata.iv.data[0] += 1;
12517 	res = test_authenticated_decryption(&tdata);
12518 	if (res == TEST_SKIPPED)
12519 		return res;
12520 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
12521 	return TEST_SUCCESS;
12522 }
12523 
12524 static int
12525 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
12526 {
12527 	struct aead_test_data tdata;
12528 	int res;
12529 
12530 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
12531 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
12532 	tdata.plaintext.data[0] += 1;
12533 	res = test_authenticated_decryption(&tdata);
12534 	if (res == TEST_SKIPPED)
12535 		return res;
12536 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
12537 	return TEST_SUCCESS;
12538 }
12539 
12540 static int
12541 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
12542 {
12543 	struct aead_test_data tdata;
12544 	int res;
12545 
12546 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
12547 	tdata.ciphertext.data[0] += 1;
12548 	res = test_authenticated_decryption(&tdata);
12549 	if (res == TEST_SKIPPED)
12550 		return res;
12551 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
12552 	return TEST_SUCCESS;
12553 }
12554 
12555 static int
12556 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
12557 {
12558 	struct aead_test_data tdata;
12559 	int res;
12560 
12561 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
12562 	tdata.aad.len += 1;
12563 	res = test_authenticated_decryption(&tdata);
12564 	if (res == TEST_SKIPPED)
12565 		return res;
12566 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
12567 	return TEST_SUCCESS;
12568 }
12569 
12570 static int
12571 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
12572 {
12573 	struct aead_test_data tdata;
12574 	uint8_t aad[gcm_test_case_7.aad.len];
12575 	int res;
12576 
12577 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
12578 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
12579 	aad[0] += 1;
12580 	tdata.aad.data = aad;
12581 	res = test_authenticated_decryption(&tdata);
12582 	if (res == TEST_SKIPPED)
12583 		return res;
12584 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
12585 	return TEST_SUCCESS;
12586 }
12587 
12588 static int
12589 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
12590 {
12591 	struct aead_test_data tdata;
12592 	int res;
12593 
12594 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
12595 	tdata.auth_tag.data[0] += 1;
12596 	res = test_authenticated_decryption(&tdata);
12597 	if (res == TEST_SKIPPED)
12598 		return res;
12599 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
12600 	return TEST_SUCCESS;
12601 }
12602 
12603 static int
12604 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
12605 {
12606 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12607 	struct crypto_unittest_params *ut_params = &unittest_params;
12608 
12609 	int retval;
12610 	uint8_t *ciphertext, *auth_tag;
12611 	uint16_t plaintext_pad_len;
12612 	struct rte_cryptodev_info dev_info;
12613 
12614 	/* Verify the capabilities */
12615 	struct rte_cryptodev_sym_capability_idx cap_idx;
12616 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12617 	cap_idx.algo.aead = tdata->algo;
12618 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12619 			&cap_idx) == NULL)
12620 		return TEST_SKIPPED;
12621 
12622 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12623 	uint64_t feat_flags = dev_info.feature_flags;
12624 
12625 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12626 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)))
12627 		return TEST_SKIPPED;
12628 
12629 	/* not supported with CPU crypto */
12630 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12631 		return TEST_SKIPPED;
12632 
12633 	/* Create AEAD session */
12634 	retval = create_aead_session(ts_params->valid_devs[0],
12635 			tdata->algo,
12636 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
12637 			tdata->key.data, tdata->key.len,
12638 			tdata->aad.len, tdata->auth_tag.len,
12639 			tdata->iv.len);
12640 	if (retval < 0)
12641 		return retval;
12642 
12643 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12644 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12645 
12646 	/* clear mbuf payload */
12647 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12648 			rte_pktmbuf_tailroom(ut_params->ibuf));
12649 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
12650 			rte_pktmbuf_tailroom(ut_params->obuf));
12651 
12652 	/* Create AEAD operation */
12653 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
12654 	if (retval < 0)
12655 		return retval;
12656 
12657 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12658 
12659 	ut_params->op->sym->m_src = ut_params->ibuf;
12660 	ut_params->op->sym->m_dst = ut_params->obuf;
12661 
12662 	/* Process crypto operation */
12663 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
12664 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 0, 0,
12665 					       0);
12666 		if (retval != TEST_SUCCESS)
12667 			return retval;
12668 	} else
12669 		TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
12670 			ut_params->op), "failed to process sym crypto op");
12671 
12672 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12673 			"crypto op processing failed");
12674 
12675 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12676 
12677 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
12678 			ut_params->op->sym->cipher.data.offset);
12679 	auth_tag = ciphertext + plaintext_pad_len;
12680 
12681 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
12682 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
12683 
12684 	/* Validate obuf */
12685 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12686 			ciphertext,
12687 			tdata->ciphertext.data,
12688 			tdata->ciphertext.len,
12689 			"Ciphertext data not as expected");
12690 
12691 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12692 			auth_tag,
12693 			tdata->auth_tag.data,
12694 			tdata->auth_tag.len,
12695 			"Generated auth tag not as expected");
12696 
12697 	return 0;
12698 
12699 }
12700 
12701 static int
12702 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
12703 {
12704 	return test_authenticated_encryption_oop(&gcm_test_case_5);
12705 }
12706 
12707 static int
12708 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
12709 {
12710 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12711 	struct crypto_unittest_params *ut_params = &unittest_params;
12712 
12713 	int retval;
12714 	uint8_t *plaintext;
12715 	struct rte_cryptodev_info dev_info;
12716 
12717 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12718 	uint64_t feat_flags = dev_info.feature_flags;
12719 
12720 	/* Verify the capabilities */
12721 	struct rte_cryptodev_sym_capability_idx cap_idx;
12722 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12723 	cap_idx.algo.aead = tdata->algo;
12724 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12725 			&cap_idx) == NULL)
12726 		return TEST_SKIPPED;
12727 
12728 	/* not supported with CPU crypto and raw data-path APIs*/
12729 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
12730 			global_api_test_type == CRYPTODEV_RAW_API_TEST)
12731 		return TEST_SKIPPED;
12732 
12733 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12734 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12735 		printf("Device does not support RAW data-path APIs.\n");
12736 		return TEST_SKIPPED;
12737 	}
12738 
12739 	/* Create AEAD session */
12740 	retval = create_aead_session(ts_params->valid_devs[0],
12741 			tdata->algo,
12742 			RTE_CRYPTO_AEAD_OP_DECRYPT,
12743 			tdata->key.data, tdata->key.len,
12744 			tdata->aad.len, tdata->auth_tag.len,
12745 			tdata->iv.len);
12746 	if (retval < 0)
12747 		return retval;
12748 
12749 	/* alloc mbuf and set payload */
12750 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12751 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12752 
12753 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12754 			rte_pktmbuf_tailroom(ut_params->ibuf));
12755 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
12756 			rte_pktmbuf_tailroom(ut_params->obuf));
12757 
12758 	/* Create AEAD operation */
12759 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
12760 	if (retval < 0)
12761 		return retval;
12762 
12763 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12764 
12765 	ut_params->op->sym->m_src = ut_params->ibuf;
12766 	ut_params->op->sym->m_dst = ut_params->obuf;
12767 
12768 	/* Process crypto operation */
12769 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
12770 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 0, 0,
12771 					       0);
12772 		if (retval != TEST_SUCCESS)
12773 			return retval;
12774 	} else
12775 		TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
12776 			ut_params->op), "failed to process sym crypto op");
12777 
12778 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12779 			"crypto op processing failed");
12780 
12781 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
12782 			ut_params->op->sym->cipher.data.offset);
12783 
12784 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
12785 
12786 	/* Validate obuf */
12787 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12788 			plaintext,
12789 			tdata->plaintext.data,
12790 			tdata->plaintext.len,
12791 			"Plaintext data not as expected");
12792 
12793 	TEST_ASSERT_EQUAL(ut_params->op->status,
12794 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12795 			"Authentication failed");
12796 	return 0;
12797 }
12798 
12799 static int
12800 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
12801 {
12802 	return test_authenticated_decryption_oop(&gcm_test_case_5);
12803 }
12804 
12805 static int
12806 test_authenticated_encryption_sessionless(
12807 		const struct aead_test_data *tdata)
12808 {
12809 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12810 	struct crypto_unittest_params *ut_params = &unittest_params;
12811 
12812 	int retval;
12813 	uint8_t *ciphertext, *auth_tag;
12814 	uint16_t plaintext_pad_len;
12815 	uint8_t key[tdata->key.len + 1];
12816 	struct rte_cryptodev_info dev_info;
12817 
12818 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12819 	uint64_t feat_flags = dev_info.feature_flags;
12820 
12821 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
12822 		printf("Device doesn't support Sessionless ops.\n");
12823 		return TEST_SKIPPED;
12824 	}
12825 
12826 	/* not supported with CPU crypto */
12827 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12828 		return TEST_SKIPPED;
12829 
12830 	/* Verify the capabilities */
12831 	struct rte_cryptodev_sym_capability_idx cap_idx;
12832 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12833 	cap_idx.algo.aead = tdata->algo;
12834 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12835 			&cap_idx) == NULL)
12836 		return TEST_SKIPPED;
12837 
12838 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12839 
12840 	/* clear mbuf payload */
12841 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12842 			rte_pktmbuf_tailroom(ut_params->ibuf));
12843 
12844 	/* Create AEAD operation */
12845 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
12846 	if (retval < 0)
12847 		return retval;
12848 
12849 	/* Create GCM xform */
12850 	memcpy(key, tdata->key.data, tdata->key.len);
12851 	retval = create_aead_xform(ut_params->op,
12852 			tdata->algo,
12853 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
12854 			key, tdata->key.len,
12855 			tdata->aad.len, tdata->auth_tag.len,
12856 			tdata->iv.len);
12857 	if (retval < 0)
12858 		return retval;
12859 
12860 	ut_params->op->sym->m_src = ut_params->ibuf;
12861 
12862 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
12863 			RTE_CRYPTO_OP_SESSIONLESS,
12864 			"crypto op session type not sessionless");
12865 
12866 	/* Process crypto operation */
12867 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
12868 			ut_params->op), "failed to process sym crypto op");
12869 
12870 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
12871 
12872 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12873 			"crypto op status not success");
12874 
12875 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12876 
12877 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
12878 			ut_params->op->sym->cipher.data.offset);
12879 	auth_tag = ciphertext + plaintext_pad_len;
12880 
12881 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
12882 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
12883 
12884 	/* Validate obuf */
12885 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12886 			ciphertext,
12887 			tdata->ciphertext.data,
12888 			tdata->ciphertext.len,
12889 			"Ciphertext data not as expected");
12890 
12891 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12892 			auth_tag,
12893 			tdata->auth_tag.data,
12894 			tdata->auth_tag.len,
12895 			"Generated auth tag not as expected");
12896 
12897 	return 0;
12898 
12899 }
12900 
12901 static int
12902 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
12903 {
12904 	return test_authenticated_encryption_sessionless(
12905 			&gcm_test_case_5);
12906 }
12907 
12908 static int
12909 test_authenticated_decryption_sessionless(
12910 		const struct aead_test_data *tdata)
12911 {
12912 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12913 	struct crypto_unittest_params *ut_params = &unittest_params;
12914 
12915 	int retval;
12916 	uint8_t *plaintext;
12917 	uint8_t key[tdata->key.len + 1];
12918 	struct rte_cryptodev_info dev_info;
12919 
12920 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12921 	uint64_t feat_flags = dev_info.feature_flags;
12922 
12923 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
12924 		printf("Device doesn't support Sessionless ops.\n");
12925 		return TEST_SKIPPED;
12926 	}
12927 
12928 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12929 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12930 		printf("Device doesn't support RAW data-path APIs.\n");
12931 		return TEST_SKIPPED;
12932 	}
12933 
12934 	/* not supported with CPU crypto */
12935 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12936 		return TEST_SKIPPED;
12937 
12938 	/* Verify the capabilities */
12939 	struct rte_cryptodev_sym_capability_idx cap_idx;
12940 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12941 	cap_idx.algo.aead = tdata->algo;
12942 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12943 			&cap_idx) == NULL)
12944 		return TEST_SKIPPED;
12945 
12946 	/* alloc mbuf and set payload */
12947 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12948 
12949 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12950 			rte_pktmbuf_tailroom(ut_params->ibuf));
12951 
12952 	/* Create AEAD operation */
12953 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
12954 	if (retval < 0)
12955 		return retval;
12956 
12957 	/* Create AEAD xform */
12958 	memcpy(key, tdata->key.data, tdata->key.len);
12959 	retval = create_aead_xform(ut_params->op,
12960 			tdata->algo,
12961 			RTE_CRYPTO_AEAD_OP_DECRYPT,
12962 			key, tdata->key.len,
12963 			tdata->aad.len, tdata->auth_tag.len,
12964 			tdata->iv.len);
12965 	if (retval < 0)
12966 		return retval;
12967 
12968 	ut_params->op->sym->m_src = ut_params->ibuf;
12969 
12970 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
12971 			RTE_CRYPTO_OP_SESSIONLESS,
12972 			"crypto op session type not sessionless");
12973 
12974 	/* Process crypto operation */
12975 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
12976 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 0, 0,
12977 					       0);
12978 		if (retval != TEST_SUCCESS)
12979 			return retval;
12980 	} else
12981 		TEST_ASSERT_NOT_NULL(process_crypto_request(
12982 			ts_params->valid_devs[0], ut_params->op),
12983 				"failed to process sym crypto op");
12984 
12985 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
12986 
12987 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12988 			"crypto op status not success");
12989 
12990 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
12991 			ut_params->op->sym->cipher.data.offset);
12992 
12993 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
12994 
12995 	/* Validate obuf */
12996 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12997 			plaintext,
12998 			tdata->plaintext.data,
12999 			tdata->plaintext.len,
13000 			"Plaintext data not as expected");
13001 
13002 	TEST_ASSERT_EQUAL(ut_params->op->status,
13003 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13004 			"Authentication failed");
13005 	return 0;
13006 }
13007 
13008 static int
13009 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
13010 {
13011 	return test_authenticated_decryption_sessionless(
13012 			&gcm_test_case_5);
13013 }
13014 
13015 static int
13016 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
13017 {
13018 	return test_authenticated_encryption(&ccm_test_case_128_1);
13019 }
13020 
13021 static int
13022 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
13023 {
13024 	return test_authenticated_encryption(&ccm_test_case_128_2);
13025 }
13026 
13027 static int
13028 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
13029 {
13030 	return test_authenticated_encryption(&ccm_test_case_128_3);
13031 }
13032 
13033 static int
13034 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
13035 {
13036 	return test_authenticated_decryption(&ccm_test_case_128_1);
13037 }
13038 
13039 static int
13040 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
13041 {
13042 	return test_authenticated_decryption(&ccm_test_case_128_2);
13043 }
13044 
13045 static int
13046 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
13047 {
13048 	return test_authenticated_decryption(&ccm_test_case_128_3);
13049 }
13050 
13051 static int
13052 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
13053 {
13054 	return test_authenticated_encryption(&ccm_test_case_192_1);
13055 }
13056 
13057 static int
13058 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
13059 {
13060 	return test_authenticated_encryption(&ccm_test_case_192_2);
13061 }
13062 
13063 static int
13064 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
13065 {
13066 	return test_authenticated_encryption(&ccm_test_case_192_3);
13067 }
13068 
13069 static int
13070 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
13071 {
13072 	return test_authenticated_decryption(&ccm_test_case_192_1);
13073 }
13074 
13075 static int
13076 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
13077 {
13078 	return test_authenticated_decryption(&ccm_test_case_192_2);
13079 }
13080 
13081 static int
13082 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
13083 {
13084 	return test_authenticated_decryption(&ccm_test_case_192_3);
13085 }
13086 
13087 static int
13088 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
13089 {
13090 	return test_authenticated_encryption(&ccm_test_case_256_1);
13091 }
13092 
13093 static int
13094 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
13095 {
13096 	return test_authenticated_encryption(&ccm_test_case_256_2);
13097 }
13098 
13099 static int
13100 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
13101 {
13102 	return test_authenticated_encryption(&ccm_test_case_256_3);
13103 }
13104 
13105 static int
13106 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
13107 {
13108 	return test_authenticated_decryption(&ccm_test_case_256_1);
13109 }
13110 
13111 static int
13112 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
13113 {
13114 	return test_authenticated_decryption(&ccm_test_case_256_2);
13115 }
13116 
13117 static int
13118 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
13119 {
13120 	return test_authenticated_decryption(&ccm_test_case_256_3);
13121 }
13122 
13123 static int
13124 test_stats(void)
13125 {
13126 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13127 	struct rte_cryptodev_stats stats;
13128 
13129 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13130 		return TEST_SKIPPED;
13131 
13132 	/* Verify the capabilities */
13133 	struct rte_cryptodev_sym_capability_idx cap_idx;
13134 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13135 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
13136 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13137 			&cap_idx) == NULL)
13138 		return TEST_SKIPPED;
13139 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13140 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
13141 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13142 			&cap_idx) == NULL)
13143 		return TEST_SKIPPED;
13144 
13145 	if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
13146 			== -ENOTSUP)
13147 		return TEST_SKIPPED;
13148 
13149 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
13150 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
13151 			&stats) == -ENODEV),
13152 		"rte_cryptodev_stats_get invalid dev failed");
13153 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
13154 		"rte_cryptodev_stats_get invalid Param failed");
13155 
13156 	/* Test expected values */
13157 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
13158 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
13159 			&stats),
13160 		"rte_cryptodev_stats_get failed");
13161 	TEST_ASSERT((stats.enqueued_count == 1),
13162 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
13163 	TEST_ASSERT((stats.dequeued_count == 1),
13164 		"rte_cryptodev_stats_get returned unexpected dequeued stat");
13165 	TEST_ASSERT((stats.enqueue_err_count == 0),
13166 		"rte_cryptodev_stats_get returned unexpected enqueued error count stat");
13167 	TEST_ASSERT((stats.dequeue_err_count == 0),
13168 		"rte_cryptodev_stats_get returned unexpected dequeued error count stat");
13169 
13170 	/* invalid device but should ignore and not reset device stats*/
13171 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
13172 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
13173 			&stats),
13174 		"rte_cryptodev_stats_get failed");
13175 	TEST_ASSERT((stats.enqueued_count == 1),
13176 		"rte_cryptodev_stats_get returned unexpected enqueued stat after invalid reset");
13177 
13178 	/* check that a valid reset clears stats */
13179 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
13180 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
13181 			&stats),
13182 					  "rte_cryptodev_stats_get failed");
13183 	TEST_ASSERT((stats.enqueued_count == 0),
13184 		"rte_cryptodev_stats_get returned unexpected enqueued stat after valid reset");
13185 	TEST_ASSERT((stats.dequeued_count == 0),
13186 		"rte_cryptodev_stats_get returned unexpected dequeued stat after valid reset");
13187 
13188 	return TEST_SUCCESS;
13189 }
13190 
13191 static int
13192 test_device_reconfigure(void)
13193 {
13194 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13195 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
13196 	struct rte_cryptodev_qp_conf qp_conf = {
13197 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT,
13198 		.mp_session = ts_params->session_mpool
13199 	};
13200 	uint16_t qp_id, dev_id, num_devs = 0;
13201 
13202 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
13203 			"Need at least %d devices for test", 1);
13204 
13205 	dev_id = ts_params->valid_devs[0];
13206 
13207 	/* Stop the device in case it's started so it can be configured */
13208 	rte_cryptodev_stop(dev_id);
13209 
13210 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
13211 			"Failed test for rte_cryptodev_configure: "
13212 			"dev_num %u", dev_id);
13213 
13214 	/* Reconfigure with same configure params */
13215 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
13216 			"Failed test for rte_cryptodev_configure: "
13217 			"dev_num %u", dev_id);
13218 
13219 	/* Reconfigure with just one queue pair */
13220 	ts_params->conf.nb_queue_pairs = 1;
13221 
13222 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
13223 			&ts_params->conf),
13224 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
13225 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
13226 
13227 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
13228 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
13229 				ts_params->valid_devs[0], qp_id, &qp_conf,
13230 				rte_cryptodev_socket_id(
13231 						ts_params->valid_devs[0])),
13232 				"Failed test for "
13233 				"rte_cryptodev_queue_pair_setup: num_inflights "
13234 				"%u on qp %u on cryptodev %u",
13235 				qp_conf.nb_descriptors, qp_id,
13236 				ts_params->valid_devs[0]);
13237 	}
13238 
13239 	/* Reconfigure with max number of queue pairs */
13240 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
13241 
13242 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
13243 			&ts_params->conf),
13244 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
13245 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
13246 
13247 	qp_conf.mp_session = ts_params->session_mpool;
13248 
13249 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
13250 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
13251 				ts_params->valid_devs[0], qp_id, &qp_conf,
13252 				rte_cryptodev_socket_id(
13253 						ts_params->valid_devs[0])),
13254 				"Failed test for "
13255 				"rte_cryptodev_queue_pair_setup: num_inflights "
13256 				"%u on qp %u on cryptodev %u",
13257 				qp_conf.nb_descriptors, qp_id,
13258 				ts_params->valid_devs[0]);
13259 	}
13260 
13261 	/* Start the device */
13262 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
13263 			"Failed to start cryptodev %u",
13264 			ts_params->valid_devs[0]);
13265 
13266 	/* Test expected values */
13267 	return test_AES_CBC_HMAC_SHA1_encrypt_digest();
13268 }
13269 
13270 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
13271 				   struct crypto_unittest_params *ut_params,
13272 				   enum rte_crypto_auth_operation op,
13273 				   const struct HMAC_MD5_vector *test_case)
13274 {
13275 	uint8_t key[64];
13276 
13277 	memcpy(key, test_case->key.data, test_case->key.len);
13278 
13279 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13280 	ut_params->auth_xform.next = NULL;
13281 	ut_params->auth_xform.auth.op = op;
13282 
13283 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
13284 
13285 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
13286 	ut_params->auth_xform.auth.key.length = test_case->key.len;
13287 	ut_params->auth_xform.auth.key.data = key;
13288 
13289 	ut_params->sess = rte_cryptodev_sym_session_create(
13290 		ts_params->valid_devs[0], &ut_params->auth_xform,
13291 			ts_params->session_mpool);
13292 	if (ut_params->sess == NULL && rte_errno == ENOTSUP)
13293 		return TEST_SKIPPED;
13294 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13295 
13296 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13297 
13298 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13299 			rte_pktmbuf_tailroom(ut_params->ibuf));
13300 
13301 	return 0;
13302 }
13303 
13304 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
13305 			      const struct HMAC_MD5_vector *test_case,
13306 			      uint8_t **plaintext)
13307 {
13308 	uint16_t plaintext_pad_len;
13309 
13310 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13311 
13312 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
13313 				16);
13314 
13315 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13316 			plaintext_pad_len);
13317 	memcpy(*plaintext, test_case->plaintext.data,
13318 			test_case->plaintext.len);
13319 
13320 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13321 			ut_params->ibuf, MD5_DIGEST_LEN);
13322 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13323 			"no room to append digest");
13324 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13325 			ut_params->ibuf, plaintext_pad_len);
13326 
13327 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
13328 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
13329 			   test_case->auth_tag.len);
13330 	}
13331 
13332 	sym_op->auth.data.offset = 0;
13333 	sym_op->auth.data.length = test_case->plaintext.len;
13334 
13335 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13336 	ut_params->op->sym->m_src = ut_params->ibuf;
13337 
13338 	return 0;
13339 }
13340 
13341 static int
13342 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
13343 {
13344 	uint16_t plaintext_pad_len;
13345 	uint8_t *plaintext, *auth_tag;
13346 	int ret;
13347 
13348 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13349 	struct crypto_unittest_params *ut_params = &unittest_params;
13350 	struct rte_cryptodev_info dev_info;
13351 
13352 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13353 	uint64_t feat_flags = dev_info.feature_flags;
13354 
13355 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13356 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13357 		printf("Device doesn't support RAW data-path APIs.\n");
13358 		return TEST_SKIPPED;
13359 	}
13360 
13361 	/* Verify the capabilities */
13362 	struct rte_cryptodev_sym_capability_idx cap_idx;
13363 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13364 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
13365 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13366 			&cap_idx) == NULL)
13367 		return TEST_SKIPPED;
13368 
13369 	if (MD5_HMAC_create_session(ts_params, ut_params,
13370 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
13371 		return TEST_FAILED;
13372 
13373 	/* Generate Crypto op data structure */
13374 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13375 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13376 	TEST_ASSERT_NOT_NULL(ut_params->op,
13377 			"Failed to allocate symmetric crypto operation struct");
13378 
13379 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
13380 				16);
13381 
13382 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
13383 		return TEST_FAILED;
13384 
13385 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13386 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13387 			ut_params->op);
13388 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
13389 		ret = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 1, 0, 0);
13390 		if (ret != TEST_SUCCESS)
13391 			return ret;
13392 	} else
13393 		TEST_ASSERT_NOT_NULL(
13394 			process_crypto_request(ts_params->valid_devs[0],
13395 				ut_params->op),
13396 				"failed to process sym crypto op");
13397 
13398 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13399 			"crypto op processing failed");
13400 
13401 	if (ut_params->op->sym->m_dst) {
13402 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
13403 				uint8_t *, plaintext_pad_len);
13404 	} else {
13405 		auth_tag = plaintext + plaintext_pad_len;
13406 	}
13407 
13408 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13409 			auth_tag,
13410 			test_case->auth_tag.data,
13411 			test_case->auth_tag.len,
13412 			"HMAC_MD5 generated tag not as expected");
13413 
13414 	return TEST_SUCCESS;
13415 }
13416 
13417 static int
13418 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
13419 {
13420 	uint8_t *plaintext;
13421 	int ret;
13422 
13423 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13424 	struct crypto_unittest_params *ut_params = &unittest_params;
13425 	struct rte_cryptodev_info dev_info;
13426 
13427 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13428 	uint64_t feat_flags = dev_info.feature_flags;
13429 
13430 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13431 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13432 		printf("Device doesn't support RAW data-path APIs.\n");
13433 		return TEST_SKIPPED;
13434 	}
13435 
13436 	/* Verify the capabilities */
13437 	struct rte_cryptodev_sym_capability_idx cap_idx;
13438 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13439 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
13440 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13441 			&cap_idx) == NULL)
13442 		return TEST_SKIPPED;
13443 
13444 	if (MD5_HMAC_create_session(ts_params, ut_params,
13445 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
13446 		return TEST_FAILED;
13447 	}
13448 
13449 	/* Generate Crypto op data structure */
13450 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13451 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13452 	TEST_ASSERT_NOT_NULL(ut_params->op,
13453 			"Failed to allocate symmetric crypto operation struct");
13454 
13455 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
13456 		return TEST_FAILED;
13457 
13458 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13459 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13460 			ut_params->op);
13461 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
13462 		ret = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 1, 0, 0);
13463 		if (ret != TEST_SUCCESS)
13464 			return ret;
13465 	} else
13466 		TEST_ASSERT_NOT_NULL(
13467 			process_crypto_request(ts_params->valid_devs[0],
13468 				ut_params->op),
13469 				"failed to process sym crypto op");
13470 
13471 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13472 			"HMAC_MD5 crypto op processing failed");
13473 
13474 	return TEST_SUCCESS;
13475 }
13476 
13477 static int
13478 test_MD5_HMAC_generate_case_1(void)
13479 {
13480 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
13481 }
13482 
13483 static int
13484 test_MD5_HMAC_verify_case_1(void)
13485 {
13486 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
13487 }
13488 
13489 static int
13490 test_MD5_HMAC_generate_case_2(void)
13491 {
13492 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
13493 }
13494 
13495 static int
13496 test_MD5_HMAC_verify_case_2(void)
13497 {
13498 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
13499 }
13500 
13501 static int
13502 test_multi_session(void)
13503 {
13504 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13505 	struct crypto_unittest_params *ut_params = &unittest_params;
13506 	struct rte_cryptodev_info dev_info;
13507 	int i, nb_sess, ret = TEST_SUCCESS;
13508 	void **sessions;
13509 
13510 	/* Verify the capabilities */
13511 	struct rte_cryptodev_sym_capability_idx cap_idx;
13512 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13513 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
13514 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13515 			&cap_idx) == NULL)
13516 		return TEST_SKIPPED;
13517 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13518 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
13519 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13520 			&cap_idx) == NULL)
13521 		return TEST_SKIPPED;
13522 
13523 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
13524 			aes_cbc_key, hmac_sha512_key);
13525 
13526 
13527 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13528 
13529 	sessions = rte_malloc(NULL,
13530 			sizeof(void *) *
13531 			(MAX_NB_SESSIONS + 1), 0);
13532 
13533 	/* Create multiple crypto sessions*/
13534 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
13535 		sessions[i] = rte_cryptodev_sym_session_create(
13536 			ts_params->valid_devs[0], &ut_params->auth_xform,
13537 				ts_params->session_mpool);
13538 		if (sessions[i] == NULL && rte_errno == ENOTSUP) {
13539 			nb_sess = i;
13540 			ret = TEST_SKIPPED;
13541 			break;
13542 		}
13543 
13544 		TEST_ASSERT_NOT_NULL(sessions[i],
13545 				"Session creation failed at session number %u",
13546 				i);
13547 
13548 		/* Attempt to send a request on each session */
13549 		ret = test_AES_CBC_HMAC_SHA512_decrypt_perform(
13550 			sessions[i],
13551 			ut_params,
13552 			ts_params,
13553 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
13554 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
13555 			aes_cbc_iv);
13556 
13557 		/* free crypto operation structure */
13558 		rte_crypto_op_free(ut_params->op);
13559 
13560 		/*
13561 		 * free mbuf - both obuf and ibuf are usually the same,
13562 		 * so check if they point at the same address is necessary,
13563 		 * to avoid freeing the mbuf twice.
13564 		 */
13565 		if (ut_params->obuf) {
13566 			rte_pktmbuf_free(ut_params->obuf);
13567 			if (ut_params->ibuf == ut_params->obuf)
13568 				ut_params->ibuf = 0;
13569 			ut_params->obuf = 0;
13570 		}
13571 		if (ut_params->ibuf) {
13572 			rte_pktmbuf_free(ut_params->ibuf);
13573 			ut_params->ibuf = 0;
13574 		}
13575 
13576 		if (ret != TEST_SUCCESS) {
13577 			i++;
13578 			break;
13579 		}
13580 	}
13581 
13582 	nb_sess = i;
13583 
13584 	for (i = 0; i < nb_sess; i++) {
13585 		rte_cryptodev_sym_session_free(ts_params->valid_devs[0],
13586 				sessions[i]);
13587 	}
13588 
13589 	rte_free(sessions);
13590 
13591 	if (ret != TEST_SKIPPED)
13592 		TEST_ASSERT_SUCCESS(ret, "Failed to perform decrypt on request number %u.", i - 1);
13593 
13594 	return ret;
13595 }
13596 
13597 struct multi_session_params {
13598 	struct crypto_unittest_params ut_params;
13599 	uint8_t *cipher_key;
13600 	uint8_t *hmac_key;
13601 	const uint8_t *cipher;
13602 	const uint8_t *digest;
13603 	uint8_t *iv;
13604 };
13605 
13606 #define MB_SESSION_NUMBER 3
13607 
13608 static int
13609 test_multi_session_random_usage(void)
13610 {
13611 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13612 	struct rte_cryptodev_info dev_info;
13613 	int index = 0, ret = TEST_SUCCESS;
13614 	uint32_t nb_sess, i, j;
13615 	void **sessions;
13616 	struct multi_session_params ut_paramz[] = {
13617 
13618 		{
13619 			.cipher_key = ms_aes_cbc_key0,
13620 			.hmac_key = ms_hmac_key0,
13621 			.cipher = ms_aes_cbc_cipher0,
13622 			.digest = ms_hmac_digest0,
13623 			.iv = ms_aes_cbc_iv0
13624 		},
13625 		{
13626 			.cipher_key = ms_aes_cbc_key1,
13627 			.hmac_key = ms_hmac_key1,
13628 			.cipher = ms_aes_cbc_cipher1,
13629 			.digest = ms_hmac_digest1,
13630 			.iv = ms_aes_cbc_iv1
13631 		},
13632 		{
13633 			.cipher_key = ms_aes_cbc_key2,
13634 			.hmac_key = ms_hmac_key2,
13635 			.cipher = ms_aes_cbc_cipher2,
13636 			.digest = ms_hmac_digest2,
13637 			.iv = ms_aes_cbc_iv2
13638 		},
13639 
13640 	};
13641 
13642 	/* Verify the capabilities */
13643 	struct rte_cryptodev_sym_capability_idx cap_idx;
13644 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13645 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
13646 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13647 			&cap_idx) == NULL)
13648 		return TEST_SKIPPED;
13649 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13650 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
13651 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13652 			&cap_idx) == NULL)
13653 		return TEST_SKIPPED;
13654 
13655 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13656 
13657 	sessions = rte_malloc(NULL, (sizeof(void *)
13658 					* MAX_NB_SESSIONS) + 1, 0);
13659 
13660 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
13661 
13662 		rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
13663 				sizeof(struct crypto_unittest_params));
13664 
13665 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
13666 				&ut_paramz[i].ut_params,
13667 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
13668 
13669 		/* Create multiple crypto sessions*/
13670 		sessions[i] = rte_cryptodev_sym_session_create(
13671 				ts_params->valid_devs[0],
13672 				&ut_paramz[i].ut_params.auth_xform,
13673 				ts_params->session_mpool);
13674 		if (sessions[i] == NULL && rte_errno == ENOTSUP) {
13675 			nb_sess = i;
13676 			ret = TEST_SKIPPED;
13677 			goto session_clear;
13678 		}
13679 
13680 		TEST_ASSERT_NOT_NULL(sessions[i],
13681 				"Session creation failed at session number %u",
13682 				i);
13683 	}
13684 
13685 	nb_sess = i;
13686 
13687 	srand(time(NULL));
13688 	for (i = 0; i < 40000; i++) {
13689 
13690 		j = rand() % MB_SESSION_NUMBER;
13691 
13692 		ret = test_AES_CBC_HMAC_SHA512_decrypt_perform(
13693 					sessions[j],
13694 					&ut_paramz[j].ut_params,
13695 					ts_params, ut_paramz[j].cipher,
13696 					ut_paramz[j].digest,
13697 					ut_paramz[j].iv);
13698 
13699 		rte_crypto_op_free(ut_paramz[j].ut_params.op);
13700 
13701 		/*
13702 		 * free mbuf - both obuf and ibuf are usually the same,
13703 		 * so check if they point at the same address is necessary,
13704 		 * to avoid freeing the mbuf twice.
13705 		 */
13706 		if (ut_paramz[j].ut_params.obuf) {
13707 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
13708 			if (ut_paramz[j].ut_params.ibuf
13709 					== ut_paramz[j].ut_params.obuf)
13710 				ut_paramz[j].ut_params.ibuf = 0;
13711 			ut_paramz[j].ut_params.obuf = 0;
13712 		}
13713 		if (ut_paramz[j].ut_params.ibuf) {
13714 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
13715 			ut_paramz[j].ut_params.ibuf = 0;
13716 		}
13717 
13718 		if (ret != TEST_SKIPPED) {
13719 			index = i;
13720 			break;
13721 		}
13722 	}
13723 
13724 session_clear:
13725 	for (i = 0; i < nb_sess; i++) {
13726 		rte_cryptodev_sym_session_free(ts_params->valid_devs[0],
13727 				sessions[i]);
13728 	}
13729 
13730 	rte_free(sessions);
13731 
13732 	if (ret != TEST_SKIPPED)
13733 		TEST_ASSERT_SUCCESS(ret, "Failed to perform decrypt on request number %u.", index);
13734 
13735 	return TEST_SUCCESS;
13736 }
13737 
13738 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
13739 			0xab, 0xab, 0xab, 0xab,
13740 			0xab, 0xab, 0xab, 0xab,
13741 			0xab, 0xab, 0xab, 0xab};
13742 
13743 static int
13744 test_null_invalid_operation(void)
13745 {
13746 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13747 	struct crypto_unittest_params *ut_params = &unittest_params;
13748 
13749 	/* This test is for NULL PMD only */
13750 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
13751 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
13752 		return TEST_SKIPPED;
13753 
13754 	/* Setup Cipher Parameters */
13755 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13756 	ut_params->cipher_xform.next = NULL;
13757 
13758 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
13759 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13760 
13761 	/* Create Crypto session*/
13762 	ut_params->sess = rte_cryptodev_sym_session_create(
13763 			ts_params->valid_devs[0], &ut_params->cipher_xform,
13764 			ts_params->session_mpool);
13765 	TEST_ASSERT(ut_params->sess == NULL,
13766 			"Session creation succeeded unexpectedly");
13767 
13768 	/* Setup HMAC Parameters */
13769 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13770 	ut_params->auth_xform.next = NULL;
13771 
13772 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
13773 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13774 
13775 	/* Create Crypto session*/
13776 	ut_params->sess = rte_cryptodev_sym_session_create(
13777 			ts_params->valid_devs[0], &ut_params->auth_xform,
13778 			ts_params->session_mpool);
13779 	TEST_ASSERT(ut_params->sess == NULL,
13780 			"Session creation succeeded unexpectedly");
13781 
13782 	return TEST_SUCCESS;
13783 }
13784 
13785 
13786 #define NULL_BURST_LENGTH (32)
13787 
13788 static int
13789 test_null_burst_operation(void)
13790 {
13791 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13792 	struct crypto_unittest_params *ut_params = &unittest_params;
13793 
13794 	unsigned i, burst_len = NULL_BURST_LENGTH;
13795 
13796 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
13797 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
13798 
13799 	/* This test is for NULL PMD only */
13800 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
13801 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
13802 		return TEST_SKIPPED;
13803 
13804 	/* Setup Cipher Parameters */
13805 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13806 	ut_params->cipher_xform.next = &ut_params->auth_xform;
13807 
13808 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
13809 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13810 
13811 	/* Setup HMAC Parameters */
13812 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13813 	ut_params->auth_xform.next = NULL;
13814 
13815 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
13816 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13817 
13818 	/* Create Crypto session*/
13819 	ut_params->sess = rte_cryptodev_sym_session_create(
13820 				ts_params->valid_devs[0],
13821 				&ut_params->auth_xform,
13822 				ts_params->session_mpool);
13823 	if (ut_params->sess == NULL && rte_errno == ENOTSUP)
13824 		return TEST_SKIPPED;
13825 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13826 
13827 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
13828 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
13829 			burst_len, "failed to generate burst of crypto ops");
13830 
13831 	/* Generate an operation for each mbuf in burst */
13832 	for (i = 0; i < burst_len; i++) {
13833 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13834 
13835 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
13836 
13837 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
13838 				sizeof(unsigned));
13839 		*data = i;
13840 
13841 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
13842 
13843 		burst[i]->sym->m_src = m;
13844 	}
13845 
13846 	/* Process crypto operation */
13847 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
13848 			0, burst, burst_len),
13849 			burst_len,
13850 			"Error enqueuing burst");
13851 
13852 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
13853 			0, burst_dequeued, burst_len),
13854 			burst_len,
13855 			"Error dequeuing burst");
13856 
13857 
13858 	for (i = 0; i < burst_len; i++) {
13859 		TEST_ASSERT_EQUAL(
13860 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
13861 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
13862 					uint32_t *),
13863 			"data not as expected");
13864 
13865 		rte_pktmbuf_free(burst[i]->sym->m_src);
13866 		rte_crypto_op_free(burst[i]);
13867 	}
13868 
13869 	return TEST_SUCCESS;
13870 }
13871 
13872 static uint16_t
13873 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
13874 		  uint16_t nb_ops, void *user_param)
13875 {
13876 	RTE_SET_USED(dev_id);
13877 	RTE_SET_USED(qp_id);
13878 	RTE_SET_USED(ops);
13879 	RTE_SET_USED(user_param);
13880 
13881 	printf("crypto enqueue callback called\n");
13882 	return nb_ops;
13883 }
13884 
13885 static uint16_t
13886 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
13887 		  uint16_t nb_ops, void *user_param)
13888 {
13889 	RTE_SET_USED(dev_id);
13890 	RTE_SET_USED(qp_id);
13891 	RTE_SET_USED(ops);
13892 	RTE_SET_USED(user_param);
13893 
13894 	printf("crypto dequeue callback called\n");
13895 	return nb_ops;
13896 }
13897 
13898 /*
13899  * Thread using enqueue/dequeue callback with RCU.
13900  */
13901 static int
13902 test_enqdeq_callback_thread(void *arg)
13903 {
13904 	RTE_SET_USED(arg);
13905 	/* DP thread calls rte_cryptodev_enqueue_burst()/
13906 	 * rte_cryptodev_dequeue_burst() and invokes callback.
13907 	 */
13908 	test_null_burst_operation();
13909 	return 0;
13910 }
13911 
13912 static int
13913 test_enq_callback_setup(void)
13914 {
13915 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13916 	struct rte_cryptodev_info dev_info;
13917 	struct rte_cryptodev_qp_conf qp_conf = {
13918 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
13919 	};
13920 
13921 	struct rte_cryptodev_cb *cb;
13922 	uint16_t qp_id = 0;
13923 
13924 	/* Stop the device in case it's started so it can be configured */
13925 	rte_cryptodev_stop(ts_params->valid_devs[0]);
13926 
13927 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13928 
13929 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
13930 			&ts_params->conf),
13931 			"Failed to configure cryptodev %u",
13932 			ts_params->valid_devs[0]);
13933 
13934 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
13935 	qp_conf.mp_session = ts_params->session_mpool;
13936 
13937 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
13938 			ts_params->valid_devs[0], qp_id, &qp_conf,
13939 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
13940 			"Failed test for "
13941 			"rte_cryptodev_queue_pair_setup: num_inflights "
13942 			"%u on qp %u on cryptodev %u",
13943 			qp_conf.nb_descriptors, qp_id,
13944 			ts_params->valid_devs[0]);
13945 
13946 	/* Test with invalid crypto device */
13947 	cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
13948 			qp_id, test_enq_callback, NULL);
13949 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
13950 			"cryptodev %u did not fail",
13951 			qp_id, RTE_CRYPTO_MAX_DEVS);
13952 
13953 	/* Test with invalid queue pair */
13954 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
13955 			dev_info.max_nb_queue_pairs + 1,
13956 			test_enq_callback, NULL);
13957 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
13958 			"cryptodev %u did not fail",
13959 			dev_info.max_nb_queue_pairs + 1,
13960 			ts_params->valid_devs[0]);
13961 
13962 	/* Test with NULL callback */
13963 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
13964 			qp_id, NULL, NULL);
13965 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
13966 			"cryptodev %u did not fail",
13967 			qp_id, ts_params->valid_devs[0]);
13968 
13969 	/* Test with valid configuration */
13970 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
13971 			qp_id, test_enq_callback, NULL);
13972 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
13973 			"qp %u on cryptodev %u",
13974 			qp_id, ts_params->valid_devs[0]);
13975 
13976 	rte_cryptodev_start(ts_params->valid_devs[0]);
13977 
13978 	/* Launch a thread */
13979 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
13980 				rte_get_next_lcore(-1, 1, 0));
13981 
13982 	/* Wait until reader exited. */
13983 	rte_eal_mp_wait_lcore();
13984 
13985 	/* Test with invalid crypto device */
13986 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
13987 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
13988 			"Expected call to fail as crypto device is invalid");
13989 
13990 	/* Test with invalid queue pair */
13991 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
13992 			ts_params->valid_devs[0],
13993 			dev_info.max_nb_queue_pairs + 1, cb),
13994 			"Expected call to fail as queue pair is invalid");
13995 
13996 	/* Test with NULL callback */
13997 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
13998 			ts_params->valid_devs[0], qp_id, NULL),
13999 			"Expected call to fail as callback is NULL");
14000 
14001 	/* Test with valid configuration */
14002 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
14003 			ts_params->valid_devs[0], qp_id, cb),
14004 			"Failed test to remove callback on "
14005 			"qp %u on cryptodev %u",
14006 			qp_id, ts_params->valid_devs[0]);
14007 
14008 	return TEST_SUCCESS;
14009 }
14010 
14011 static int
14012 test_deq_callback_setup(void)
14013 {
14014 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14015 	struct rte_cryptodev_info dev_info;
14016 	struct rte_cryptodev_qp_conf qp_conf = {
14017 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
14018 	};
14019 
14020 	struct rte_cryptodev_cb *cb;
14021 	uint16_t qp_id = 0;
14022 
14023 	/* Stop the device in case it's started so it can be configured */
14024 	rte_cryptodev_stop(ts_params->valid_devs[0]);
14025 
14026 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
14027 
14028 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
14029 			&ts_params->conf),
14030 			"Failed to configure cryptodev %u",
14031 			ts_params->valid_devs[0]);
14032 
14033 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
14034 	qp_conf.mp_session = ts_params->session_mpool;
14035 
14036 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
14037 			ts_params->valid_devs[0], qp_id, &qp_conf,
14038 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
14039 			"Failed test for "
14040 			"rte_cryptodev_queue_pair_setup: num_inflights "
14041 			"%u on qp %u on cryptodev %u",
14042 			qp_conf.nb_descriptors, qp_id,
14043 			ts_params->valid_devs[0]);
14044 
14045 	/* Test with invalid crypto device */
14046 	cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
14047 			qp_id, test_deq_callback, NULL);
14048 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
14049 			"cryptodev %u did not fail",
14050 			qp_id, RTE_CRYPTO_MAX_DEVS);
14051 
14052 	/* Test with invalid queue pair */
14053 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
14054 			dev_info.max_nb_queue_pairs + 1,
14055 			test_deq_callback, NULL);
14056 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
14057 			"cryptodev %u did not fail",
14058 			dev_info.max_nb_queue_pairs + 1,
14059 			ts_params->valid_devs[0]);
14060 
14061 	/* Test with NULL callback */
14062 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
14063 			qp_id, NULL, NULL);
14064 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
14065 			"cryptodev %u did not fail",
14066 			qp_id, ts_params->valid_devs[0]);
14067 
14068 	/* Test with valid configuration */
14069 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
14070 			qp_id, test_deq_callback, NULL);
14071 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
14072 			"qp %u on cryptodev %u",
14073 			qp_id, ts_params->valid_devs[0]);
14074 
14075 	rte_cryptodev_start(ts_params->valid_devs[0]);
14076 
14077 	/* Launch a thread */
14078 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
14079 				rte_get_next_lcore(-1, 1, 0));
14080 
14081 	/* Wait until reader exited. */
14082 	rte_eal_mp_wait_lcore();
14083 
14084 	/* Test with invalid crypto device */
14085 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
14086 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
14087 			"Expected call to fail as crypto device is invalid");
14088 
14089 	/* Test with invalid queue pair */
14090 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
14091 			ts_params->valid_devs[0],
14092 			dev_info.max_nb_queue_pairs + 1, cb),
14093 			"Expected call to fail as queue pair is invalid");
14094 
14095 	/* Test with NULL callback */
14096 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
14097 			ts_params->valid_devs[0], qp_id, NULL),
14098 			"Expected call to fail as callback is NULL");
14099 
14100 	/* Test with valid configuration */
14101 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
14102 			ts_params->valid_devs[0], qp_id, cb),
14103 			"Failed test to remove callback on "
14104 			"qp %u on cryptodev %u",
14105 			qp_id, ts_params->valid_devs[0]);
14106 
14107 	return TEST_SUCCESS;
14108 }
14109 
14110 static void
14111 generate_gmac_large_plaintext(uint8_t *data)
14112 {
14113 	uint16_t i;
14114 
14115 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
14116 		memcpy(&data[i], &data[0], 32);
14117 }
14118 
14119 static int
14120 create_gmac_operation(enum rte_crypto_auth_operation op,
14121 		const struct gmac_test_data *tdata)
14122 {
14123 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14124 	struct crypto_unittest_params *ut_params = &unittest_params;
14125 	struct rte_crypto_sym_op *sym_op;
14126 
14127 	uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
14128 
14129 	/* Generate Crypto op data structure */
14130 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
14131 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
14132 	TEST_ASSERT_NOT_NULL(ut_params->op,
14133 			"Failed to allocate symmetric crypto operation struct");
14134 
14135 	sym_op = ut_params->op->sym;
14136 
14137 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
14138 			ut_params->ibuf, tdata->gmac_tag.len);
14139 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
14140 			"no room to append digest");
14141 
14142 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
14143 			ut_params->ibuf, plaintext_pad_len);
14144 
14145 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
14146 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
14147 				tdata->gmac_tag.len);
14148 		debug_hexdump(stdout, "digest:",
14149 				sym_op->auth.digest.data,
14150 				tdata->gmac_tag.len);
14151 	}
14152 
14153 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
14154 			uint8_t *, IV_OFFSET);
14155 
14156 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
14157 
14158 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
14159 
14160 	sym_op->cipher.data.length = 0;
14161 	sym_op->cipher.data.offset = 0;
14162 
14163 	sym_op->auth.data.offset = 0;
14164 	sym_op->auth.data.length = tdata->plaintext.len;
14165 
14166 	return 0;
14167 }
14168 
14169 static int
14170 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
14171 		const struct gmac_test_data *tdata,
14172 		void *digest_mem, uint64_t digest_phys)
14173 {
14174 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14175 	struct crypto_unittest_params *ut_params = &unittest_params;
14176 	struct rte_crypto_sym_op *sym_op;
14177 
14178 	/* Generate Crypto op data structure */
14179 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
14180 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
14181 	TEST_ASSERT_NOT_NULL(ut_params->op,
14182 			"Failed to allocate symmetric crypto operation struct");
14183 
14184 	sym_op = ut_params->op->sym;
14185 
14186 	sym_op->auth.digest.data = digest_mem;
14187 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
14188 			"no room to append digest");
14189 
14190 	sym_op->auth.digest.phys_addr = digest_phys;
14191 
14192 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
14193 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
14194 				tdata->gmac_tag.len);
14195 		debug_hexdump(stdout, "digest:",
14196 				sym_op->auth.digest.data,
14197 				tdata->gmac_tag.len);
14198 	}
14199 
14200 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
14201 			uint8_t *, IV_OFFSET);
14202 
14203 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
14204 
14205 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
14206 
14207 	sym_op->cipher.data.length = 0;
14208 	sym_op->cipher.data.offset = 0;
14209 
14210 	sym_op->auth.data.offset = 0;
14211 	sym_op->auth.data.length = tdata->plaintext.len;
14212 
14213 	return 0;
14214 }
14215 
14216 static int create_gmac_session(uint8_t dev_id,
14217 		const struct gmac_test_data *tdata,
14218 		enum rte_crypto_auth_operation auth_op)
14219 {
14220 	uint8_t auth_key[tdata->key.len];
14221 
14222 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14223 	struct crypto_unittest_params *ut_params = &unittest_params;
14224 
14225 	memcpy(auth_key, tdata->key.data, tdata->key.len);
14226 
14227 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
14228 	ut_params->auth_xform.next = NULL;
14229 
14230 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
14231 	ut_params->auth_xform.auth.op = auth_op;
14232 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
14233 	ut_params->auth_xform.auth.key.length = tdata->key.len;
14234 	ut_params->auth_xform.auth.key.data = auth_key;
14235 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
14236 	ut_params->auth_xform.auth.iv.length = tdata->iv.len;
14237 
14238 
14239 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
14240 			&ut_params->auth_xform, ts_params->session_mpool);
14241 	if (ut_params->sess == NULL && rte_errno == ENOTSUP)
14242 		return TEST_SKIPPED;
14243 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
14244 
14245 	return 0;
14246 }
14247 
14248 static int
14249 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
14250 {
14251 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14252 	struct crypto_unittest_params *ut_params = &unittest_params;
14253 	struct rte_cryptodev_info dev_info;
14254 
14255 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
14256 	uint64_t feat_flags = dev_info.feature_flags;
14257 
14258 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
14259 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
14260 		printf("Device doesn't support RAW data-path APIs.\n");
14261 		return TEST_SKIPPED;
14262 	}
14263 
14264 	int retval;
14265 
14266 	uint8_t *auth_tag, *plaintext;
14267 	uint16_t plaintext_pad_len;
14268 
14269 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
14270 			      "No GMAC length in the source data");
14271 
14272 	/* Verify the capabilities */
14273 	struct rte_cryptodev_sym_capability_idx cap_idx;
14274 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
14275 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
14276 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
14277 			&cap_idx) == NULL)
14278 		return TEST_SKIPPED;
14279 
14280 	retval = create_gmac_session(ts_params->valid_devs[0],
14281 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
14282 
14283 	if (retval == TEST_SKIPPED)
14284 		return TEST_SKIPPED;
14285 	if (retval < 0)
14286 		return retval;
14287 
14288 	if (tdata->plaintext.len > MBUF_SIZE)
14289 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
14290 	else
14291 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14292 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
14293 			"Failed to allocate input buffer in mempool");
14294 
14295 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14296 			rte_pktmbuf_tailroom(ut_params->ibuf));
14297 
14298 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
14299 	/*
14300 	 * Runtime generate the large plain text instead of use hard code
14301 	 * plain text vector. It is done to avoid create huge source file
14302 	 * with the test vector.
14303 	 */
14304 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
14305 		generate_gmac_large_plaintext(tdata->plaintext.data);
14306 
14307 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14308 				plaintext_pad_len);
14309 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
14310 
14311 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
14312 	debug_hexdump(stdout, "plaintext:", plaintext,
14313 			tdata->plaintext.len);
14314 
14315 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
14316 			tdata);
14317 
14318 	if (retval < 0)
14319 		return retval;
14320 
14321 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
14322 
14323 	ut_params->op->sym->m_src = ut_params->ibuf;
14324 
14325 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14326 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
14327 			ut_params->op);
14328 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
14329 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 1, 0,
14330 					       0);
14331 		if (retval != TEST_SUCCESS)
14332 			return retval;
14333 	} else
14334 		TEST_ASSERT_NOT_NULL(
14335 			process_crypto_request(ts_params->valid_devs[0],
14336 			ut_params->op), "failed to process sym crypto op");
14337 
14338 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
14339 			"crypto op processing failed");
14340 
14341 	if (ut_params->op->sym->m_dst) {
14342 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
14343 				uint8_t *, plaintext_pad_len);
14344 	} else {
14345 		auth_tag = plaintext + plaintext_pad_len;
14346 	}
14347 
14348 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
14349 
14350 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
14351 			auth_tag,
14352 			tdata->gmac_tag.data,
14353 			tdata->gmac_tag.len,
14354 			"GMAC Generated auth tag not as expected");
14355 
14356 	return 0;
14357 }
14358 
14359 static int
14360 test_AES_GMAC_authentication_test_case_1(void)
14361 {
14362 	return test_AES_GMAC_authentication(&gmac_test_case_1);
14363 }
14364 
14365 static int
14366 test_AES_GMAC_authentication_test_case_2(void)
14367 {
14368 	return test_AES_GMAC_authentication(&gmac_test_case_2);
14369 }
14370 
14371 static int
14372 test_AES_GMAC_authentication_test_case_3(void)
14373 {
14374 	return test_AES_GMAC_authentication(&gmac_test_case_3);
14375 }
14376 
14377 static int
14378 test_AES_GMAC_authentication_test_case_4(void)
14379 {
14380 	return test_AES_GMAC_authentication(&gmac_test_case_4);
14381 }
14382 
14383 static int
14384 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
14385 {
14386 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14387 	struct crypto_unittest_params *ut_params = &unittest_params;
14388 	int retval;
14389 	uint32_t plaintext_pad_len;
14390 	uint8_t *plaintext;
14391 	struct rte_cryptodev_info dev_info;
14392 
14393 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
14394 	uint64_t feat_flags = dev_info.feature_flags;
14395 
14396 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
14397 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
14398 		printf("Device doesn't support RAW data-path APIs.\n");
14399 		return TEST_SKIPPED;
14400 	}
14401 
14402 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
14403 			      "No GMAC length in the source data");
14404 
14405 	/* Verify the capabilities */
14406 	struct rte_cryptodev_sym_capability_idx cap_idx;
14407 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
14408 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
14409 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
14410 			&cap_idx) == NULL)
14411 		return TEST_SKIPPED;
14412 
14413 	retval = create_gmac_session(ts_params->valid_devs[0],
14414 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
14415 
14416 	if (retval == TEST_SKIPPED)
14417 		return TEST_SKIPPED;
14418 	if (retval < 0)
14419 		return retval;
14420 
14421 	if (tdata->plaintext.len > MBUF_SIZE)
14422 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
14423 	else
14424 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14425 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
14426 			"Failed to allocate input buffer in mempool");
14427 
14428 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14429 			rte_pktmbuf_tailroom(ut_params->ibuf));
14430 
14431 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
14432 
14433 	/*
14434 	 * Runtime generate the large plain text instead of use hard code
14435 	 * plain text vector. It is done to avoid create huge source file
14436 	 * with the test vector.
14437 	 */
14438 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
14439 		generate_gmac_large_plaintext(tdata->plaintext.data);
14440 
14441 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14442 				plaintext_pad_len);
14443 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
14444 
14445 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
14446 	debug_hexdump(stdout, "plaintext:", plaintext,
14447 			tdata->plaintext.len);
14448 
14449 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
14450 			tdata);
14451 
14452 	if (retval < 0)
14453 		return retval;
14454 
14455 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
14456 
14457 	ut_params->op->sym->m_src = ut_params->ibuf;
14458 
14459 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14460 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
14461 			ut_params->op);
14462 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
14463 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 1, 0,
14464 					       0);
14465 		if (retval != TEST_SUCCESS)
14466 			return retval;
14467 	} else
14468 		TEST_ASSERT_NOT_NULL(
14469 			process_crypto_request(ts_params->valid_devs[0],
14470 			ut_params->op), "failed to process sym crypto op");
14471 
14472 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
14473 			"crypto op processing failed");
14474 
14475 	return 0;
14476 
14477 }
14478 
14479 static int
14480 test_AES_GMAC_authentication_verify_test_case_1(void)
14481 {
14482 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
14483 }
14484 
14485 static int
14486 test_AES_GMAC_authentication_verify_test_case_2(void)
14487 {
14488 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
14489 }
14490 
14491 static int
14492 test_AES_GMAC_authentication_verify_test_case_3(void)
14493 {
14494 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
14495 }
14496 
14497 static int
14498 test_AES_GMAC_authentication_verify_test_case_4(void)
14499 {
14500 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
14501 }
14502 
14503 static int
14504 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
14505 				uint32_t fragsz)
14506 {
14507 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14508 	struct crypto_unittest_params *ut_params = &unittest_params;
14509 	struct rte_cryptodev_info dev_info;
14510 	uint64_t feature_flags;
14511 	unsigned int trn_data = 0;
14512 	void *digest_mem = NULL;
14513 	uint32_t segs = 1;
14514 	unsigned int to_trn = 0;
14515 	struct rte_mbuf *buf = NULL;
14516 	uint8_t *auth_tag, *plaintext;
14517 	int retval;
14518 
14519 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
14520 			      "No GMAC length in the source data");
14521 
14522 	/* Verify the capabilities */
14523 	struct rte_cryptodev_sym_capability_idx cap_idx;
14524 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
14525 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
14526 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
14527 			&cap_idx) == NULL)
14528 		return TEST_SKIPPED;
14529 
14530 	/* Check for any input SGL support */
14531 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
14532 	feature_flags = dev_info.feature_flags;
14533 
14534 	if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
14535 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
14536 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
14537 		return TEST_SKIPPED;
14538 
14539 	if (fragsz > tdata->plaintext.len)
14540 		fragsz = tdata->plaintext.len;
14541 
14542 	uint16_t plaintext_len = fragsz;
14543 
14544 	retval = create_gmac_session(ts_params->valid_devs[0],
14545 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
14546 
14547 	if (retval == TEST_SKIPPED)
14548 		return TEST_SKIPPED;
14549 	if (retval < 0)
14550 		return retval;
14551 
14552 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14553 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
14554 			"Failed to allocate input buffer in mempool");
14555 
14556 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14557 			rte_pktmbuf_tailroom(ut_params->ibuf));
14558 
14559 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14560 				plaintext_len);
14561 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
14562 
14563 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
14564 
14565 	trn_data += plaintext_len;
14566 
14567 	buf = ut_params->ibuf;
14568 
14569 	/*
14570 	 * Loop until no more fragments
14571 	 */
14572 
14573 	while (trn_data < tdata->plaintext.len) {
14574 		++segs;
14575 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
14576 				(tdata->plaintext.len - trn_data) : fragsz;
14577 
14578 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14579 		buf = buf->next;
14580 
14581 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
14582 				rte_pktmbuf_tailroom(buf));
14583 
14584 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
14585 				to_trn);
14586 
14587 		memcpy(plaintext, tdata->plaintext.data + trn_data,
14588 				to_trn);
14589 		trn_data += to_trn;
14590 		if (trn_data  == tdata->plaintext.len)
14591 			digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
14592 					tdata->gmac_tag.len);
14593 	}
14594 	ut_params->ibuf->nb_segs = segs;
14595 
14596 	/*
14597 	 * Place digest at the end of the last buffer
14598 	 */
14599 	uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
14600 
14601 	if (!digest_mem) {
14602 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14603 				+ tdata->gmac_tag.len);
14604 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
14605 				tdata->plaintext.len);
14606 	}
14607 
14608 	retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
14609 			tdata, digest_mem, digest_phys);
14610 
14611 	if (retval < 0)
14612 		return retval;
14613 
14614 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
14615 
14616 	ut_params->op->sym->m_src = ut_params->ibuf;
14617 
14618 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14619 		return TEST_SKIPPED;
14620 
14621 	TEST_ASSERT_NOT_NULL(
14622 		process_crypto_request(ts_params->valid_devs[0],
14623 		ut_params->op), "failed to process sym crypto op");
14624 
14625 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
14626 			"crypto op processing failed");
14627 
14628 	auth_tag = digest_mem;
14629 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
14630 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
14631 			auth_tag,
14632 			tdata->gmac_tag.data,
14633 			tdata->gmac_tag.len,
14634 			"GMAC Generated auth tag not as expected");
14635 
14636 	return 0;
14637 }
14638 
14639 /* Segment size not multiple of block size (16B) */
14640 static int
14641 test_AES_GMAC_authentication_SGL_40B(void)
14642 {
14643 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
14644 }
14645 
14646 static int
14647 test_AES_GMAC_authentication_SGL_80B(void)
14648 {
14649 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
14650 }
14651 
14652 static int
14653 test_AES_GMAC_authentication_SGL_2048B(void)
14654 {
14655 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
14656 }
14657 
14658 /* Segment size not multiple of block size (16B) */
14659 static int
14660 test_AES_GMAC_authentication_SGL_2047B(void)
14661 {
14662 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
14663 }
14664 
14665 struct test_crypto_vector {
14666 	enum rte_crypto_cipher_algorithm crypto_algo;
14667 	unsigned int cipher_offset;
14668 	unsigned int cipher_len;
14669 
14670 	struct {
14671 		uint8_t data[64];
14672 		unsigned int len;
14673 	} cipher_key;
14674 
14675 	struct {
14676 		uint8_t data[64];
14677 		unsigned int len;
14678 	} iv;
14679 
14680 	struct {
14681 		const uint8_t *data;
14682 		unsigned int len;
14683 	} plaintext;
14684 
14685 	struct {
14686 		const uint8_t *data;
14687 		unsigned int len;
14688 	} ciphertext;
14689 
14690 	enum rte_crypto_auth_algorithm auth_algo;
14691 	unsigned int auth_offset;
14692 
14693 	struct {
14694 		uint8_t data[128];
14695 		unsigned int len;
14696 	} auth_key;
14697 
14698 	struct {
14699 		const uint8_t *data;
14700 		unsigned int len;
14701 	} aad;
14702 
14703 	struct {
14704 		uint8_t data[128];
14705 		unsigned int len;
14706 	} digest;
14707 };
14708 
14709 static const struct test_crypto_vector
14710 hmac_sha1_test_crypto_vector = {
14711 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
14712 	.plaintext = {
14713 		.data = plaintext_hash,
14714 		.len = 512
14715 	},
14716 	.auth_key = {
14717 		.data = {
14718 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
14719 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
14720 			0xDE, 0xF4, 0xDE, 0xAD
14721 		},
14722 		.len = 20
14723 	},
14724 	.digest = {
14725 		.data = {
14726 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
14727 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
14728 			0x3F, 0x91, 0x64, 0x59
14729 		},
14730 		.len = 20
14731 	}
14732 };
14733 
14734 static const struct test_crypto_vector
14735 aes128_gmac_test_vector = {
14736 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
14737 	.plaintext = {
14738 		.data = plaintext_hash,
14739 		.len = 512
14740 	},
14741 	.iv = {
14742 		.data = {
14743 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
14744 			0x08, 0x09, 0x0A, 0x0B
14745 		},
14746 		.len = 12
14747 	},
14748 	.auth_key = {
14749 		.data = {
14750 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
14751 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
14752 		},
14753 		.len = 16
14754 	},
14755 	.digest = {
14756 		.data = {
14757 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
14758 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
14759 		},
14760 		.len = 16
14761 	}
14762 };
14763 
14764 static const struct test_crypto_vector
14765 aes128cbc_hmac_sha1_test_vector = {
14766 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
14767 	.cipher_offset = 0,
14768 	.cipher_len = 512,
14769 	.cipher_key = {
14770 		.data = {
14771 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
14772 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
14773 		},
14774 		.len = 16
14775 	},
14776 	.iv = {
14777 		.data = {
14778 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
14779 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
14780 		},
14781 		.len = 16
14782 	},
14783 	.plaintext = {
14784 		.data = plaintext_hash,
14785 		.len = 512
14786 	},
14787 	.ciphertext = {
14788 		.data = ciphertext512_aes128cbc,
14789 		.len = 512
14790 	},
14791 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
14792 	.auth_offset = 0,
14793 	.auth_key = {
14794 		.data = {
14795 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
14796 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
14797 			0xDE, 0xF4, 0xDE, 0xAD
14798 		},
14799 		.len = 20
14800 	},
14801 	.digest = {
14802 		.data = {
14803 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
14804 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
14805 			0x18, 0x8C, 0x1D, 0x32
14806 		},
14807 		.len = 20
14808 	}
14809 };
14810 
14811 static const struct test_crypto_vector
14812 aes128cbc_hmac_sha1_aad_test_vector = {
14813 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
14814 	.cipher_offset = 8,
14815 	.cipher_len = 496,
14816 	.cipher_key = {
14817 		.data = {
14818 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
14819 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
14820 		},
14821 		.len = 16
14822 	},
14823 	.iv = {
14824 		.data = {
14825 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
14826 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
14827 		},
14828 		.len = 16
14829 	},
14830 	.plaintext = {
14831 		.data = plaintext_hash,
14832 		.len = 512
14833 	},
14834 	.ciphertext = {
14835 		.data = ciphertext512_aes128cbc_aad,
14836 		.len = 512
14837 	},
14838 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
14839 	.auth_offset = 0,
14840 	.auth_key = {
14841 		.data = {
14842 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
14843 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
14844 			0xDE, 0xF4, 0xDE, 0xAD
14845 		},
14846 		.len = 20
14847 	},
14848 	.digest = {
14849 		.data = {
14850 			0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
14851 			0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
14852 			0x62, 0x0F, 0xFB, 0x10
14853 		},
14854 		.len = 20
14855 	}
14856 };
14857 
14858 static void
14859 data_corruption(uint8_t *data)
14860 {
14861 	data[0] += 1;
14862 }
14863 
14864 static void
14865 tag_corruption(uint8_t *data, unsigned int tag_offset)
14866 {
14867 	data[tag_offset] += 1;
14868 }
14869 
14870 static int
14871 create_auth_session(struct crypto_unittest_params *ut_params,
14872 		uint8_t dev_id,
14873 		const struct test_crypto_vector *reference,
14874 		enum rte_crypto_auth_operation auth_op)
14875 {
14876 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14877 	uint8_t auth_key[reference->auth_key.len + 1];
14878 
14879 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
14880 
14881 	/* Setup Authentication Parameters */
14882 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
14883 	ut_params->auth_xform.auth.op = auth_op;
14884 	ut_params->auth_xform.next = NULL;
14885 	ut_params->auth_xform.auth.algo = reference->auth_algo;
14886 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
14887 	ut_params->auth_xform.auth.key.data = auth_key;
14888 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
14889 
14890 	/* Create Crypto session*/
14891 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
14892 				&ut_params->auth_xform,
14893 				ts_params->session_mpool);
14894 	if (ut_params->sess == NULL && rte_errno == ENOTSUP)
14895 		return TEST_SKIPPED;
14896 
14897 	return 0;
14898 }
14899 
14900 static int
14901 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
14902 		uint8_t dev_id,
14903 		const struct test_crypto_vector *reference,
14904 		enum rte_crypto_auth_operation auth_op,
14905 		enum rte_crypto_cipher_operation cipher_op)
14906 {
14907 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14908 	uint8_t cipher_key[reference->cipher_key.len + 1];
14909 	uint8_t auth_key[reference->auth_key.len + 1];
14910 
14911 	memcpy(cipher_key, reference->cipher_key.data,
14912 			reference->cipher_key.len);
14913 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
14914 
14915 	/* Setup Authentication Parameters */
14916 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
14917 	ut_params->auth_xform.auth.op = auth_op;
14918 	ut_params->auth_xform.auth.algo = reference->auth_algo;
14919 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
14920 	ut_params->auth_xform.auth.key.data = auth_key;
14921 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
14922 
14923 	if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
14924 		ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
14925 		ut_params->auth_xform.auth.iv.length = reference->iv.len;
14926 	} else {
14927 		ut_params->auth_xform.next = &ut_params->cipher_xform;
14928 
14929 		/* Setup Cipher Parameters */
14930 		ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
14931 		ut_params->cipher_xform.next = NULL;
14932 		ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
14933 		ut_params->cipher_xform.cipher.op = cipher_op;
14934 		ut_params->cipher_xform.cipher.key.data = cipher_key;
14935 		ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
14936 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
14937 		ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
14938 	}
14939 
14940 	/* Create Crypto session*/
14941 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
14942 				&ut_params->auth_xform,
14943 				ts_params->session_mpool);
14944 	if (ut_params->sess == NULL && rte_errno == ENOTSUP)
14945 		return TEST_SKIPPED;
14946 
14947 	return 0;
14948 }
14949 
14950 static int
14951 create_auth_operation(struct crypto_testsuite_params *ts_params,
14952 		struct crypto_unittest_params *ut_params,
14953 		const struct test_crypto_vector *reference,
14954 		unsigned int auth_generate)
14955 {
14956 	/* Generate Crypto op data structure */
14957 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
14958 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
14959 	TEST_ASSERT_NOT_NULL(ut_params->op,
14960 			"Failed to allocate pktmbuf offload");
14961 
14962 	/* Set crypto operation data parameters */
14963 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
14964 
14965 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
14966 
14967 	/* set crypto operation source mbuf */
14968 	sym_op->m_src = ut_params->ibuf;
14969 
14970 	/* digest */
14971 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
14972 			ut_params->ibuf, reference->digest.len);
14973 
14974 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
14975 			"no room to append auth tag");
14976 
14977 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
14978 			ut_params->ibuf, reference->plaintext.len);
14979 
14980 	if (auth_generate)
14981 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
14982 	else
14983 		memcpy(sym_op->auth.digest.data,
14984 				reference->digest.data,
14985 				reference->digest.len);
14986 
14987 	debug_hexdump(stdout, "digest:",
14988 			sym_op->auth.digest.data,
14989 			reference->digest.len);
14990 
14991 	sym_op->auth.data.length = reference->plaintext.len;
14992 	sym_op->auth.data.offset = 0;
14993 
14994 	return 0;
14995 }
14996 
14997 static int
14998 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
14999 		struct crypto_unittest_params *ut_params,
15000 		const struct test_crypto_vector *reference,
15001 		unsigned int auth_generate)
15002 {
15003 	/* Generate Crypto op data structure */
15004 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
15005 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
15006 	TEST_ASSERT_NOT_NULL(ut_params->op,
15007 			"Failed to allocate pktmbuf offload");
15008 
15009 	/* Set crypto operation data parameters */
15010 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
15011 
15012 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
15013 
15014 	/* set crypto operation source mbuf */
15015 	sym_op->m_src = ut_params->ibuf;
15016 
15017 	/* digest */
15018 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
15019 			ut_params->ibuf, reference->digest.len);
15020 
15021 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
15022 			"no room to append auth tag");
15023 
15024 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
15025 			ut_params->ibuf, reference->ciphertext.len);
15026 
15027 	if (auth_generate)
15028 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
15029 	else
15030 		memcpy(sym_op->auth.digest.data,
15031 				reference->digest.data,
15032 				reference->digest.len);
15033 
15034 	debug_hexdump(stdout, "digest:",
15035 			sym_op->auth.digest.data,
15036 			reference->digest.len);
15037 
15038 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
15039 			reference->iv.data, reference->iv.len);
15040 
15041 	sym_op->cipher.data.length = 0;
15042 	sym_op->cipher.data.offset = 0;
15043 
15044 	sym_op->auth.data.length = reference->plaintext.len;
15045 	sym_op->auth.data.offset = 0;
15046 
15047 	return 0;
15048 }
15049 
15050 static int
15051 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
15052 		struct crypto_unittest_params *ut_params,
15053 		const struct test_crypto_vector *reference,
15054 		unsigned int auth_generate)
15055 {
15056 	/* Generate Crypto op data structure */
15057 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
15058 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
15059 	TEST_ASSERT_NOT_NULL(ut_params->op,
15060 			"Failed to allocate pktmbuf offload");
15061 
15062 	/* Set crypto operation data parameters */
15063 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
15064 
15065 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
15066 
15067 	/* set crypto operation source mbuf */
15068 	sym_op->m_src = ut_params->ibuf;
15069 
15070 	/* digest */
15071 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
15072 			ut_params->ibuf, reference->digest.len);
15073 
15074 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
15075 			"no room to append auth tag");
15076 
15077 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
15078 			ut_params->ibuf, reference->ciphertext.len);
15079 
15080 	if (auth_generate)
15081 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
15082 	else
15083 		memcpy(sym_op->auth.digest.data,
15084 				reference->digest.data,
15085 				reference->digest.len);
15086 
15087 	debug_hexdump(stdout, "digest:",
15088 			sym_op->auth.digest.data,
15089 			reference->digest.len);
15090 
15091 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
15092 			reference->iv.data, reference->iv.len);
15093 
15094 	sym_op->cipher.data.length = reference->cipher_len;
15095 	sym_op->cipher.data.offset = reference->cipher_offset;
15096 
15097 	sym_op->auth.data.length = reference->plaintext.len;
15098 	sym_op->auth.data.offset = reference->auth_offset;
15099 
15100 	return 0;
15101 }
15102 
15103 static int
15104 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
15105 		struct crypto_unittest_params *ut_params,
15106 		const struct test_crypto_vector *reference)
15107 {
15108 	return create_auth_operation(ts_params, ut_params, reference, 0);
15109 }
15110 
15111 static int
15112 create_auth_verify_GMAC_operation(
15113 		struct crypto_testsuite_params *ts_params,
15114 		struct crypto_unittest_params *ut_params,
15115 		const struct test_crypto_vector *reference)
15116 {
15117 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
15118 }
15119 
15120 static int
15121 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
15122 		struct crypto_unittest_params *ut_params,
15123 		const struct test_crypto_vector *reference)
15124 {
15125 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
15126 }
15127 
15128 static int
15129 test_authentication_verify_fail_when_data_corruption(
15130 		struct crypto_testsuite_params *ts_params,
15131 		struct crypto_unittest_params *ut_params,
15132 		const struct test_crypto_vector *reference,
15133 		unsigned int data_corrupted)
15134 {
15135 	int retval;
15136 
15137 	uint8_t *plaintext;
15138 	struct rte_cryptodev_info dev_info;
15139 
15140 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
15141 	uint64_t feat_flags = dev_info.feature_flags;
15142 
15143 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
15144 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
15145 		printf("Device doesn't support RAW data-path APIs.\n");
15146 		return TEST_SKIPPED;
15147 	}
15148 
15149 	/* Verify the capabilities */
15150 	struct rte_cryptodev_sym_capability_idx cap_idx;
15151 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
15152 	cap_idx.algo.auth = reference->auth_algo;
15153 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
15154 			&cap_idx) == NULL)
15155 		return TEST_SKIPPED;
15156 
15157 
15158 	/* Create session */
15159 	retval = create_auth_session(ut_params,
15160 			ts_params->valid_devs[0],
15161 			reference,
15162 			RTE_CRYPTO_AUTH_OP_VERIFY);
15163 
15164 	if (retval == TEST_SKIPPED)
15165 		return TEST_SKIPPED;
15166 	if (retval < 0)
15167 		return retval;
15168 
15169 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
15170 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
15171 			"Failed to allocate input buffer in mempool");
15172 
15173 	/* clear mbuf payload */
15174 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
15175 			rte_pktmbuf_tailroom(ut_params->ibuf));
15176 
15177 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
15178 			reference->plaintext.len);
15179 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
15180 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
15181 
15182 	debug_hexdump(stdout, "plaintext:", plaintext,
15183 		reference->plaintext.len);
15184 
15185 	/* Create operation */
15186 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
15187 
15188 	if (retval < 0)
15189 		return retval;
15190 
15191 	if (data_corrupted)
15192 		data_corruption(plaintext);
15193 	else
15194 		tag_corruption(plaintext, reference->plaintext.len);
15195 
15196 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
15197 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
15198 			ut_params->op);
15199 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
15200 			RTE_CRYPTO_OP_STATUS_SUCCESS,
15201 			"authentication not failed");
15202 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
15203 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 1, 0,
15204 					       0);
15205 		if (retval != TEST_SUCCESS)
15206 			return retval;
15207 	} else {
15208 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
15209 			ut_params->op);
15210 	}
15211 	if (ut_params->op == NULL)
15212 		return 0;
15213 	else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
15214 		return 0;
15215 
15216 	return -1;
15217 }
15218 
15219 static int
15220 test_authentication_verify_GMAC_fail_when_corruption(
15221 		struct crypto_testsuite_params *ts_params,
15222 		struct crypto_unittest_params *ut_params,
15223 		const struct test_crypto_vector *reference,
15224 		unsigned int data_corrupted)
15225 {
15226 	int retval;
15227 	uint8_t *plaintext;
15228 	struct rte_cryptodev_info dev_info;
15229 
15230 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
15231 	uint64_t feat_flags = dev_info.feature_flags;
15232 
15233 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
15234 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
15235 		printf("Device doesn't support RAW data-path APIs.\n");
15236 		return TEST_SKIPPED;
15237 	}
15238 
15239 	/* Verify the capabilities */
15240 	struct rte_cryptodev_sym_capability_idx cap_idx;
15241 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
15242 	cap_idx.algo.auth = reference->auth_algo;
15243 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
15244 			&cap_idx) == NULL)
15245 		return TEST_SKIPPED;
15246 
15247 	/* Create session */
15248 	retval = create_auth_cipher_session(ut_params,
15249 			ts_params->valid_devs[0],
15250 			reference,
15251 			RTE_CRYPTO_AUTH_OP_VERIFY,
15252 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
15253 	if (retval == TEST_SKIPPED)
15254 		return TEST_SKIPPED;
15255 	if (retval < 0)
15256 		return retval;
15257 
15258 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
15259 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
15260 			"Failed to allocate input buffer in mempool");
15261 
15262 	/* clear mbuf payload */
15263 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
15264 			rte_pktmbuf_tailroom(ut_params->ibuf));
15265 
15266 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
15267 			reference->plaintext.len);
15268 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
15269 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
15270 
15271 	debug_hexdump(stdout, "plaintext:", plaintext,
15272 		reference->plaintext.len);
15273 
15274 	/* Create operation */
15275 	retval = create_auth_verify_GMAC_operation(ts_params,
15276 			ut_params,
15277 			reference);
15278 
15279 	if (retval < 0)
15280 		return retval;
15281 
15282 	if (data_corrupted)
15283 		data_corruption(plaintext);
15284 	else
15285 		tag_corruption(plaintext, reference->aad.len);
15286 
15287 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
15288 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
15289 			ut_params->op);
15290 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
15291 			RTE_CRYPTO_OP_STATUS_SUCCESS,
15292 			"authentication not failed");
15293 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
15294 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 1, 0,
15295 					       0);
15296 		if (retval != TEST_SUCCESS)
15297 			return retval;
15298 	} else {
15299 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
15300 			ut_params->op);
15301 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
15302 	}
15303 
15304 	return 0;
15305 }
15306 
15307 static int
15308 test_authenticated_decryption_fail_when_corruption(
15309 		struct crypto_testsuite_params *ts_params,
15310 		struct crypto_unittest_params *ut_params,
15311 		const struct test_crypto_vector *reference,
15312 		unsigned int data_corrupted)
15313 {
15314 	int retval;
15315 
15316 	uint8_t *ciphertext;
15317 	struct rte_cryptodev_info dev_info;
15318 
15319 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
15320 	uint64_t feat_flags = dev_info.feature_flags;
15321 
15322 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
15323 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
15324 		printf("Device doesn't support RAW data-path APIs.\n");
15325 		return TEST_SKIPPED;
15326 	}
15327 
15328 	/* Verify the capabilities */
15329 	struct rte_cryptodev_sym_capability_idx cap_idx;
15330 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
15331 	cap_idx.algo.auth = reference->auth_algo;
15332 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
15333 			&cap_idx) == NULL)
15334 		return TEST_SKIPPED;
15335 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
15336 	cap_idx.algo.cipher = reference->crypto_algo;
15337 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
15338 			&cap_idx) == NULL)
15339 		return TEST_SKIPPED;
15340 
15341 	/* Create session */
15342 	retval = create_auth_cipher_session(ut_params,
15343 			ts_params->valid_devs[0],
15344 			reference,
15345 			RTE_CRYPTO_AUTH_OP_VERIFY,
15346 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
15347 	if (retval == TEST_SKIPPED)
15348 		return TEST_SKIPPED;
15349 	if (retval < 0)
15350 		return retval;
15351 
15352 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
15353 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
15354 			"Failed to allocate input buffer in mempool");
15355 
15356 	/* clear mbuf payload */
15357 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
15358 			rte_pktmbuf_tailroom(ut_params->ibuf));
15359 
15360 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
15361 			reference->ciphertext.len);
15362 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
15363 	memcpy(ciphertext, reference->ciphertext.data,
15364 			reference->ciphertext.len);
15365 
15366 	/* Create operation */
15367 	retval = create_cipher_auth_verify_operation(ts_params,
15368 			ut_params,
15369 			reference);
15370 
15371 	if (retval < 0)
15372 		return retval;
15373 
15374 	if (data_corrupted)
15375 		data_corruption(ciphertext);
15376 	else
15377 		tag_corruption(ciphertext, reference->ciphertext.len);
15378 
15379 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
15380 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
15381 			ut_params->op);
15382 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
15383 			RTE_CRYPTO_OP_STATUS_SUCCESS,
15384 			"authentication not failed");
15385 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
15386 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 0,
15387 					       0);
15388 		if (retval != TEST_SUCCESS)
15389 			return retval;
15390 	} else {
15391 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
15392 			ut_params->op);
15393 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
15394 	}
15395 
15396 	return 0;
15397 }
15398 
15399 static int
15400 test_authenticated_encrypt_with_esn(
15401 		struct crypto_testsuite_params *ts_params,
15402 		struct crypto_unittest_params *ut_params,
15403 		const struct test_crypto_vector *reference)
15404 {
15405 	int retval;
15406 
15407 	uint8_t *authciphertext, *plaintext, *auth_tag;
15408 	uint16_t plaintext_pad_len;
15409 	uint8_t cipher_key[reference->cipher_key.len + 1];
15410 	uint8_t auth_key[reference->auth_key.len + 1];
15411 	struct rte_cryptodev_info dev_info;
15412 
15413 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
15414 	uint64_t feat_flags = dev_info.feature_flags;
15415 
15416 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
15417 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
15418 		printf("Device doesn't support RAW data-path APIs.\n");
15419 		return TEST_SKIPPED;
15420 	}
15421 
15422 	/* Verify the capabilities */
15423 	struct rte_cryptodev_sym_capability_idx cap_idx;
15424 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
15425 	cap_idx.algo.auth = reference->auth_algo;
15426 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
15427 			&cap_idx) == NULL)
15428 		return TEST_SKIPPED;
15429 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
15430 	cap_idx.algo.cipher = reference->crypto_algo;
15431 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
15432 			&cap_idx) == NULL)
15433 		return TEST_SKIPPED;
15434 
15435 	/* Create session */
15436 	memcpy(cipher_key, reference->cipher_key.data,
15437 			reference->cipher_key.len);
15438 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
15439 
15440 	/* Setup Cipher Parameters */
15441 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
15442 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
15443 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
15444 	ut_params->cipher_xform.cipher.key.data = cipher_key;
15445 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
15446 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
15447 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
15448 
15449 	ut_params->cipher_xform.next = &ut_params->auth_xform;
15450 
15451 	/* Setup Authentication Parameters */
15452 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
15453 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
15454 	ut_params->auth_xform.auth.algo = reference->auth_algo;
15455 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
15456 	ut_params->auth_xform.auth.key.data = auth_key;
15457 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
15458 	ut_params->auth_xform.next = NULL;
15459 
15460 	/* Create Crypto session*/
15461 	ut_params->sess = rte_cryptodev_sym_session_create(
15462 			ts_params->valid_devs[0], &ut_params->cipher_xform,
15463 			ts_params->session_mpool);
15464 	if (ut_params->sess == NULL && rte_errno == ENOTSUP)
15465 		return TEST_SKIPPED;
15466 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
15467 
15468 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
15469 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
15470 			"Failed to allocate input buffer in mempool");
15471 
15472 	/* clear mbuf payload */
15473 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
15474 			rte_pktmbuf_tailroom(ut_params->ibuf));
15475 
15476 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
15477 			reference->plaintext.len);
15478 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
15479 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
15480 
15481 	/* Create operation */
15482 	retval = create_cipher_auth_operation(ts_params,
15483 			ut_params,
15484 			reference, 0);
15485 
15486 	if (retval < 0)
15487 		return retval;
15488 
15489 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
15490 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
15491 			ut_params->op);
15492 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
15493 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 0,
15494 					       0);
15495 		if (retval != TEST_SUCCESS)
15496 			return retval;
15497 	} else
15498 		ut_params->op = process_crypto_request(
15499 			ts_params->valid_devs[0], ut_params->op);
15500 
15501 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
15502 
15503 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
15504 			"crypto op processing failed");
15505 
15506 	plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
15507 
15508 	authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
15509 			ut_params->op->sym->auth.data.offset);
15510 	auth_tag = authciphertext + plaintext_pad_len;
15511 	debug_hexdump(stdout, "ciphertext:", authciphertext,
15512 			reference->ciphertext.len);
15513 	debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
15514 
15515 	/* Validate obuf */
15516 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
15517 			authciphertext,
15518 			reference->ciphertext.data,
15519 			reference->ciphertext.len,
15520 			"Ciphertext data not as expected");
15521 
15522 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
15523 			auth_tag,
15524 			reference->digest.data,
15525 			reference->digest.len,
15526 			"Generated digest not as expected");
15527 
15528 	return TEST_SUCCESS;
15529 
15530 }
15531 
15532 static int
15533 test_authenticated_decrypt_with_esn(
15534 		struct crypto_testsuite_params *ts_params,
15535 		struct crypto_unittest_params *ut_params,
15536 		const struct test_crypto_vector *reference)
15537 {
15538 	int retval;
15539 
15540 	uint8_t *ciphertext;
15541 	uint8_t cipher_key[reference->cipher_key.len + 1];
15542 	uint8_t auth_key[reference->auth_key.len + 1];
15543 	struct rte_cryptodev_info dev_info;
15544 
15545 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
15546 	uint64_t feat_flags = dev_info.feature_flags;
15547 
15548 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
15549 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
15550 		printf("Device doesn't support RAW data-path APIs.\n");
15551 		return TEST_SKIPPED;
15552 	}
15553 
15554 	/* Verify the capabilities */
15555 	struct rte_cryptodev_sym_capability_idx cap_idx;
15556 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
15557 	cap_idx.algo.auth = reference->auth_algo;
15558 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
15559 			&cap_idx) == NULL)
15560 		return TEST_SKIPPED;
15561 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
15562 	cap_idx.algo.cipher = reference->crypto_algo;
15563 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
15564 			&cap_idx) == NULL)
15565 		return TEST_SKIPPED;
15566 
15567 	/* Create session */
15568 	memcpy(cipher_key, reference->cipher_key.data,
15569 			reference->cipher_key.len);
15570 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
15571 
15572 	/* Setup Authentication Parameters */
15573 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
15574 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
15575 	ut_params->auth_xform.auth.algo = reference->auth_algo;
15576 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
15577 	ut_params->auth_xform.auth.key.data = auth_key;
15578 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
15579 	ut_params->auth_xform.next = &ut_params->cipher_xform;
15580 
15581 	/* Setup Cipher Parameters */
15582 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
15583 	ut_params->cipher_xform.next = NULL;
15584 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
15585 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
15586 	ut_params->cipher_xform.cipher.key.data = cipher_key;
15587 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
15588 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
15589 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
15590 
15591 	/* Create Crypto session*/
15592 	ut_params->sess = rte_cryptodev_sym_session_create(
15593 			ts_params->valid_devs[0], &ut_params->auth_xform,
15594 			ts_params->session_mpool);
15595 	if (ut_params->sess == NULL && rte_errno == ENOTSUP)
15596 		return TEST_SKIPPED;
15597 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
15598 
15599 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
15600 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
15601 			"Failed to allocate input buffer in mempool");
15602 
15603 	/* clear mbuf payload */
15604 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
15605 			rte_pktmbuf_tailroom(ut_params->ibuf));
15606 
15607 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
15608 			reference->ciphertext.len);
15609 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
15610 	memcpy(ciphertext, reference->ciphertext.data,
15611 			reference->ciphertext.len);
15612 
15613 	/* Create operation */
15614 	retval = create_cipher_auth_verify_operation(ts_params,
15615 			ut_params,
15616 			reference);
15617 
15618 	if (retval < 0)
15619 		return retval;
15620 
15621 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
15622 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
15623 			ut_params->op);
15624 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
15625 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 1, 1, 0,
15626 					       0);
15627 		if (retval != TEST_SUCCESS)
15628 			return retval;
15629 	} else
15630 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
15631 			ut_params->op);
15632 
15633 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
15634 	TEST_ASSERT_EQUAL(ut_params->op->status,
15635 			RTE_CRYPTO_OP_STATUS_SUCCESS,
15636 			"crypto op processing passed");
15637 
15638 	ut_params->obuf = ut_params->op->sym->m_src;
15639 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
15640 
15641 	return 0;
15642 }
15643 
15644 static int
15645 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
15646 		const struct aead_test_data *tdata,
15647 		void *digest_mem, uint64_t digest_phys)
15648 {
15649 	struct crypto_testsuite_params *ts_params = &testsuite_params;
15650 	struct crypto_unittest_params *ut_params = &unittest_params;
15651 
15652 	const unsigned int auth_tag_len = tdata->auth_tag.len;
15653 	const unsigned int iv_len = tdata->iv.len;
15654 	unsigned int aad_len = tdata->aad.len;
15655 	unsigned int aad_len_pad = 0;
15656 
15657 	/* Generate Crypto op data structure */
15658 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
15659 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
15660 	TEST_ASSERT_NOT_NULL(ut_params->op,
15661 		"Failed to allocate symmetric crypto operation struct");
15662 
15663 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
15664 
15665 	sym_op->aead.digest.data = digest_mem;
15666 
15667 	TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
15668 			"no room to append digest");
15669 
15670 	sym_op->aead.digest.phys_addr = digest_phys;
15671 
15672 	if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
15673 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
15674 				auth_tag_len);
15675 		debug_hexdump(stdout, "digest:",
15676 				sym_op->aead.digest.data,
15677 				auth_tag_len);
15678 	}
15679 
15680 	/* Append aad data */
15681 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
15682 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
15683 				uint8_t *, IV_OFFSET);
15684 
15685 		/* Copy IV 1 byte after the IV pointer, according to the API */
15686 		rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
15687 
15688 		aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
15689 
15690 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
15691 				ut_params->ibuf, aad_len);
15692 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
15693 				"no room to prepend aad");
15694 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
15695 				ut_params->ibuf);
15696 
15697 		memset(sym_op->aead.aad.data, 0, aad_len);
15698 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
15699 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
15700 
15701 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
15702 		debug_hexdump(stdout, "aad:",
15703 				sym_op->aead.aad.data, aad_len);
15704 	} else {
15705 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
15706 				uint8_t *, IV_OFFSET);
15707 
15708 		rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
15709 
15710 		aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
15711 
15712 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
15713 				ut_params->ibuf, aad_len_pad);
15714 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
15715 				"no room to prepend aad");
15716 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
15717 				ut_params->ibuf);
15718 
15719 		memset(sym_op->aead.aad.data, 0, aad_len);
15720 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
15721 
15722 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
15723 		debug_hexdump(stdout, "aad:",
15724 				sym_op->aead.aad.data, aad_len);
15725 	}
15726 
15727 	sym_op->aead.data.length = tdata->plaintext.len;
15728 	sym_op->aead.data.offset = aad_len_pad;
15729 
15730 	return 0;
15731 }
15732 
15733 #define SGL_MAX_NO	16
15734 
15735 static int
15736 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
15737 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
15738 {
15739 	struct crypto_testsuite_params *ts_params = &testsuite_params;
15740 	struct crypto_unittest_params *ut_params = &unittest_params;
15741 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
15742 	int retval;
15743 	int to_trn = 0;
15744 	int to_trn_tbl[SGL_MAX_NO];
15745 	int segs = 1;
15746 	unsigned int trn_data = 0;
15747 	uint8_t *plaintext, *ciphertext, *auth_tag;
15748 	struct rte_cryptodev_info dev_info;
15749 
15750 	/* Verify the capabilities */
15751 	struct rte_cryptodev_sym_capability_idx cap_idx;
15752 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
15753 	cap_idx.algo.aead = tdata->algo;
15754 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
15755 			&cap_idx) == NULL)
15756 		return TEST_SKIPPED;
15757 
15758 	/*
15759 	 * SGL not supported on AESNI_MB PMD CPU crypto,
15760 	 * OOP not supported on AESNI_GCM CPU crypto
15761 	 */
15762 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO &&
15763 			(gbl_driver_id == rte_cryptodev_driver_id_get(
15764 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) || oop))
15765 		return TEST_SKIPPED;
15766 
15767 	/* Detailed check for the particular SGL support flag */
15768 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
15769 	if (!oop) {
15770 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
15771 		if (sgl_in && (!(dev_info.feature_flags &
15772 				RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
15773 			return TEST_SKIPPED;
15774 
15775 		uint64_t feat_flags = dev_info.feature_flags;
15776 
15777 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
15778 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
15779 			printf("Device doesn't support RAW data-path APIs.\n");
15780 			return TEST_SKIPPED;
15781 		}
15782 	} else {
15783 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
15784 		unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
15785 				tdata->plaintext.len;
15786 		/* Raw data path API does not support OOP */
15787 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
15788 			return TEST_SKIPPED;
15789 		if (sgl_in && !sgl_out) {
15790 			if (!(dev_info.feature_flags &
15791 					RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
15792 				return TEST_SKIPPED;
15793 		} else if (!sgl_in && sgl_out) {
15794 			if (!(dev_info.feature_flags &
15795 					RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
15796 				return TEST_SKIPPED;
15797 		} else if (sgl_in && sgl_out) {
15798 			if (!(dev_info.feature_flags &
15799 					RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
15800 				return TEST_SKIPPED;
15801 		}
15802 	}
15803 
15804 	if (fragsz > tdata->plaintext.len)
15805 		fragsz = tdata->plaintext.len;
15806 
15807 	uint16_t plaintext_len = fragsz;
15808 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
15809 
15810 	if (fragsz_oop > tdata->plaintext.len)
15811 		frag_size_oop = tdata->plaintext.len;
15812 
15813 	int ecx = 0;
15814 	void *digest_mem = NULL;
15815 
15816 	uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
15817 
15818 	if (tdata->plaintext.len % fragsz != 0) {
15819 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
15820 			return 1;
15821 	}	else {
15822 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
15823 			return 1;
15824 	}
15825 
15826 	/*
15827 	 * For out-op-place we need to alloc another mbuf
15828 	 */
15829 	if (oop) {
15830 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
15831 		rte_pktmbuf_append(ut_params->obuf,
15832 				frag_size_oop + prepend_len);
15833 		buf_oop = ut_params->obuf;
15834 	}
15835 
15836 	/* Create AEAD session */
15837 	retval = create_aead_session(ts_params->valid_devs[0],
15838 			tdata->algo,
15839 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
15840 			tdata->key.data, tdata->key.len,
15841 			tdata->aad.len, tdata->auth_tag.len,
15842 			tdata->iv.len);
15843 	if (retval < 0)
15844 		return retval;
15845 
15846 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
15847 
15848 	/* clear mbuf payload */
15849 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
15850 			rte_pktmbuf_tailroom(ut_params->ibuf));
15851 
15852 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
15853 			plaintext_len);
15854 
15855 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
15856 
15857 	trn_data += plaintext_len;
15858 
15859 	buf = ut_params->ibuf;
15860 
15861 	/*
15862 	 * Loop until no more fragments
15863 	 */
15864 
15865 	while (trn_data < tdata->plaintext.len) {
15866 		++segs;
15867 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
15868 				(tdata->plaintext.len - trn_data) : fragsz;
15869 
15870 		to_trn_tbl[ecx++] = to_trn;
15871 
15872 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
15873 		buf = buf->next;
15874 
15875 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
15876 				rte_pktmbuf_tailroom(buf));
15877 
15878 		/* OOP */
15879 		if (oop && !fragsz_oop) {
15880 			buf_last_oop = buf_oop->next =
15881 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
15882 			buf_oop = buf_oop->next;
15883 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
15884 					0, rte_pktmbuf_tailroom(buf_oop));
15885 			rte_pktmbuf_append(buf_oop, to_trn);
15886 		}
15887 
15888 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
15889 				to_trn);
15890 
15891 		memcpy(plaintext, tdata->plaintext.data + trn_data,
15892 				to_trn);
15893 		trn_data += to_trn;
15894 		if (trn_data  == tdata->plaintext.len) {
15895 			if (oop) {
15896 				if (!fragsz_oop)
15897 					digest_mem = rte_pktmbuf_append(buf_oop,
15898 						tdata->auth_tag.len);
15899 			} else
15900 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
15901 					tdata->auth_tag.len);
15902 		}
15903 	}
15904 
15905 	uint64_t digest_phys = 0;
15906 
15907 	ut_params->ibuf->nb_segs = segs;
15908 
15909 	segs = 1;
15910 	if (fragsz_oop && oop) {
15911 		to_trn = 0;
15912 		ecx = 0;
15913 
15914 		if (frag_size_oop == tdata->plaintext.len) {
15915 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
15916 				tdata->auth_tag.len);
15917 
15918 			digest_phys = rte_pktmbuf_iova_offset(
15919 					ut_params->obuf,
15920 					tdata->plaintext.len + prepend_len);
15921 		}
15922 
15923 		trn_data = frag_size_oop;
15924 		while (trn_data < tdata->plaintext.len) {
15925 			++segs;
15926 			to_trn =
15927 				(tdata->plaintext.len - trn_data <
15928 						frag_size_oop) ?
15929 				(tdata->plaintext.len - trn_data) :
15930 						frag_size_oop;
15931 
15932 			to_trn_tbl[ecx++] = to_trn;
15933 
15934 			buf_last_oop = buf_oop->next =
15935 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
15936 			buf_oop = buf_oop->next;
15937 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
15938 					0, rte_pktmbuf_tailroom(buf_oop));
15939 			rte_pktmbuf_append(buf_oop, to_trn);
15940 
15941 			trn_data += to_trn;
15942 
15943 			if (trn_data  == tdata->plaintext.len) {
15944 				digest_mem = rte_pktmbuf_append(buf_oop,
15945 					tdata->auth_tag.len);
15946 			}
15947 		}
15948 
15949 		ut_params->obuf->nb_segs = segs;
15950 	}
15951 
15952 	/*
15953 	 * Place digest at the end of the last buffer
15954 	 */
15955 	if (!digest_phys)
15956 		digest_phys = rte_pktmbuf_iova(buf) + to_trn;
15957 	if (oop && buf_last_oop)
15958 		digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
15959 
15960 	if (!digest_mem && !oop) {
15961 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
15962 				+ tdata->auth_tag.len);
15963 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
15964 				tdata->plaintext.len);
15965 	}
15966 
15967 	/* Create AEAD operation */
15968 	retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
15969 			tdata, digest_mem, digest_phys);
15970 
15971 	if (retval < 0)
15972 		return retval;
15973 
15974 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
15975 
15976 	ut_params->op->sym->m_src = ut_params->ibuf;
15977 	if (oop)
15978 		ut_params->op->sym->m_dst = ut_params->obuf;
15979 
15980 	/* Process crypto operation */
15981 	if (oop == IN_PLACE &&
15982 			gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
15983 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
15984 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
15985 		retval = process_sym_raw_dp_op(ts_params->valid_devs[0], 0, ut_params->op, 0, 0, 0,
15986 					       0);
15987 		if (retval != TEST_SUCCESS)
15988 			return retval;
15989 	} else
15990 		TEST_ASSERT_NOT_NULL(
15991 			process_crypto_request(ts_params->valid_devs[0],
15992 			ut_params->op), "failed to process sym crypto op");
15993 
15994 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
15995 			"crypto op processing failed");
15996 
15997 
15998 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
15999 			uint8_t *, prepend_len);
16000 	if (oop) {
16001 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
16002 				uint8_t *, prepend_len);
16003 	}
16004 
16005 	if (fragsz_oop)
16006 		fragsz = fragsz_oop;
16007 
16008 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
16009 			ciphertext,
16010 			tdata->ciphertext.data,
16011 			fragsz,
16012 			"Ciphertext data not as expected");
16013 
16014 	buf = ut_params->op->sym->m_src->next;
16015 	if (oop)
16016 		buf = ut_params->op->sym->m_dst->next;
16017 
16018 	unsigned int off = fragsz;
16019 
16020 	ecx = 0;
16021 	while (buf) {
16022 		ciphertext = rte_pktmbuf_mtod(buf,
16023 				uint8_t *);
16024 
16025 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
16026 				ciphertext,
16027 				tdata->ciphertext.data + off,
16028 				to_trn_tbl[ecx],
16029 				"Ciphertext data not as expected");
16030 
16031 		off += to_trn_tbl[ecx++];
16032 		buf = buf->next;
16033 	}
16034 
16035 	auth_tag = digest_mem;
16036 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
16037 			auth_tag,
16038 			tdata->auth_tag.data,
16039 			tdata->auth_tag.len,
16040 			"Generated auth tag not as expected");
16041 
16042 	return 0;
16043 }
16044 
16045 static int
16046 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
16047 {
16048 	return test_authenticated_encryption_SGL(
16049 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
16050 }
16051 
16052 static int
16053 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
16054 {
16055 	return test_authenticated_encryption_SGL(
16056 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
16057 }
16058 
16059 static int
16060 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
16061 {
16062 	return test_authenticated_encryption_SGL(
16063 			&gcm_test_case_8, OUT_OF_PLACE, 400,
16064 			gcm_test_case_8.plaintext.len);
16065 }
16066 
16067 static int
16068 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
16069 {
16070 	/* This test is not for OPENSSL PMD */
16071 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
16072 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
16073 		return TEST_SKIPPED;
16074 
16075 	return test_authenticated_encryption_SGL(
16076 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
16077 }
16078 
16079 static int
16080 test_authentication_verify_fail_when_data_corrupted(
16081 		struct crypto_testsuite_params *ts_params,
16082 		struct crypto_unittest_params *ut_params,
16083 		const struct test_crypto_vector *reference)
16084 {
16085 	return test_authentication_verify_fail_when_data_corruption(
16086 			ts_params, ut_params, reference, 1);
16087 }
16088 
16089 static int
16090 test_authentication_verify_fail_when_tag_corrupted(
16091 		struct crypto_testsuite_params *ts_params,
16092 		struct crypto_unittest_params *ut_params,
16093 		const struct test_crypto_vector *reference)
16094 {
16095 	return test_authentication_verify_fail_when_data_corruption(
16096 			ts_params, ut_params, reference, 0);
16097 }
16098 
16099 static int
16100 test_authentication_verify_GMAC_fail_when_data_corrupted(
16101 		struct crypto_testsuite_params *ts_params,
16102 		struct crypto_unittest_params *ut_params,
16103 		const struct test_crypto_vector *reference)
16104 {
16105 	return test_authentication_verify_GMAC_fail_when_corruption(
16106 			ts_params, ut_params, reference, 1);
16107 }
16108 
16109 static int
16110 test_authentication_verify_GMAC_fail_when_tag_corrupted(
16111 		struct crypto_testsuite_params *ts_params,
16112 		struct crypto_unittest_params *ut_params,
16113 		const struct test_crypto_vector *reference)
16114 {
16115 	return test_authentication_verify_GMAC_fail_when_corruption(
16116 			ts_params, ut_params, reference, 0);
16117 }
16118 
16119 static int
16120 test_authenticated_decryption_fail_when_data_corrupted(
16121 		struct crypto_testsuite_params *ts_params,
16122 		struct crypto_unittest_params *ut_params,
16123 		const struct test_crypto_vector *reference)
16124 {
16125 	return test_authenticated_decryption_fail_when_corruption(
16126 			ts_params, ut_params, reference, 1);
16127 }
16128 
16129 static int
16130 test_authenticated_decryption_fail_when_tag_corrupted(
16131 		struct crypto_testsuite_params *ts_params,
16132 		struct crypto_unittest_params *ut_params,
16133 		const struct test_crypto_vector *reference)
16134 {
16135 	return test_authenticated_decryption_fail_when_corruption(
16136 			ts_params, ut_params, reference, 0);
16137 }
16138 
16139 static int
16140 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
16141 {
16142 	return test_authentication_verify_fail_when_data_corrupted(
16143 			&testsuite_params, &unittest_params,
16144 			&hmac_sha1_test_crypto_vector);
16145 }
16146 
16147 static int
16148 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
16149 {
16150 	return test_authentication_verify_fail_when_tag_corrupted(
16151 			&testsuite_params, &unittest_params,
16152 			&hmac_sha1_test_crypto_vector);
16153 }
16154 
16155 static int
16156 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
16157 {
16158 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
16159 			&testsuite_params, &unittest_params,
16160 			&aes128_gmac_test_vector);
16161 }
16162 
16163 static int
16164 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
16165 {
16166 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
16167 			&testsuite_params, &unittest_params,
16168 			&aes128_gmac_test_vector);
16169 }
16170 
16171 static int
16172 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
16173 {
16174 	return test_authenticated_decryption_fail_when_data_corrupted(
16175 			&testsuite_params,
16176 			&unittest_params,
16177 			&aes128cbc_hmac_sha1_test_vector);
16178 }
16179 
16180 static int
16181 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
16182 {
16183 	return test_authenticated_decryption_fail_when_tag_corrupted(
16184 			&testsuite_params,
16185 			&unittest_params,
16186 			&aes128cbc_hmac_sha1_test_vector);
16187 }
16188 
16189 static int
16190 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
16191 {
16192 	return test_authenticated_encrypt_with_esn(
16193 			&testsuite_params,
16194 			&unittest_params,
16195 			&aes128cbc_hmac_sha1_aad_test_vector);
16196 }
16197 
16198 static int
16199 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
16200 {
16201 	return test_authenticated_decrypt_with_esn(
16202 			&testsuite_params,
16203 			&unittest_params,
16204 			&aes128cbc_hmac_sha1_aad_test_vector);
16205 }
16206 
16207 static int
16208 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
16209 {
16210 	return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
16211 }
16212 
16213 static int
16214 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
16215 {
16216 	return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
16217 }
16218 
16219 static int
16220 test_chacha20_poly1305_encrypt_SGL_out_of_place(void)
16221 {
16222 	return test_authenticated_encryption_SGL(
16223 		&chacha20_poly1305_case_2, OUT_OF_PLACE, 32,
16224 		chacha20_poly1305_case_2.plaintext.len);
16225 }
16226 
16227 #ifdef RTE_CRYPTO_SCHEDULER
16228 
16229 /* global AESNI worker IDs for the scheduler test */
16230 uint8_t aesni_ids[2];
16231 
16232 static int
16233 scheduler_testsuite_setup(void)
16234 {
16235 	uint32_t i = 0;
16236 	int32_t nb_devs, ret;
16237 	char vdev_args[VDEV_ARGS_SIZE] = {""};
16238 	char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
16239 		"ordering=enable,name=cryptodev_test_scheduler,corelist="};
16240 	uint16_t worker_core_count = 0;
16241 	uint16_t socket_id = 0;
16242 
16243 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
16244 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
16245 
16246 		/* Identify the Worker Cores
16247 		 * Use 2 worker cores for the device args
16248 		 */
16249 		RTE_LCORE_FOREACH_WORKER(i) {
16250 			if (worker_core_count > 1)
16251 				break;
16252 			snprintf(vdev_args, sizeof(vdev_args),
16253 					"%s%d", temp_str, i);
16254 			strcpy(temp_str, vdev_args);
16255 			strlcat(temp_str, ";", sizeof(temp_str));
16256 			worker_core_count++;
16257 			socket_id = rte_lcore_to_socket_id(i);
16258 		}
16259 		if (worker_core_count != 2) {
16260 			RTE_LOG(ERR, USER1,
16261 				"Cryptodev scheduler test require at least "
16262 				"two worker cores to run. "
16263 				"Please use the correct coremask.\n");
16264 			return TEST_FAILED;
16265 		}
16266 		strcpy(temp_str, vdev_args);
16267 		snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
16268 				temp_str, socket_id);
16269 		RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
16270 		nb_devs = rte_cryptodev_device_count_by_driver(
16271 				rte_cryptodev_driver_id_get(
16272 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
16273 		if (nb_devs < 1) {
16274 			ret = rte_vdev_init(
16275 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
16276 					vdev_args);
16277 			TEST_ASSERT(ret == 0,
16278 				"Failed to create instance %u of pmd : %s",
16279 				i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
16280 		}
16281 	}
16282 	return testsuite_setup();
16283 }
16284 
16285 static int
16286 test_scheduler_attach_worker_op(void)
16287 {
16288 	struct crypto_testsuite_params *ts_params = &testsuite_params;
16289 	uint8_t sched_id = ts_params->valid_devs[0];
16290 	uint32_t i, nb_devs_attached = 0;
16291 	int ret;
16292 	char vdev_name[32];
16293 	unsigned int count = rte_cryptodev_count();
16294 
16295 	/* create 2 AESNI_MB vdevs on top of existing devices */
16296 	for (i = count; i < count + 2; i++) {
16297 		snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
16298 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
16299 				i);
16300 		ret = rte_vdev_init(vdev_name, NULL);
16301 
16302 		TEST_ASSERT(ret == 0,
16303 			"Failed to create instance %u of"
16304 			" pmd : %s",
16305 			i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
16306 
16307 		if (ret < 0) {
16308 			RTE_LOG(ERR, USER1,
16309 				"Failed to create 2 AESNI MB PMDs.\n");
16310 			return TEST_SKIPPED;
16311 		}
16312 	}
16313 
16314 	/* attach 2 AESNI_MB cdevs */
16315 	for (i = count; i < count + 2; i++) {
16316 		struct rte_cryptodev_info info;
16317 		unsigned int session_size;
16318 
16319 		rte_cryptodev_info_get(i, &info);
16320 		if (info.driver_id != rte_cryptodev_driver_id_get(
16321 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
16322 			continue;
16323 
16324 		session_size = rte_cryptodev_sym_get_private_session_size(i);
16325 		/*
16326 		 * Create the session mempool again, since now there are new devices
16327 		 * to use the mempool.
16328 		 */
16329 		if (ts_params->session_mpool) {
16330 			rte_mempool_free(ts_params->session_mpool);
16331 			ts_params->session_mpool = NULL;
16332 		}
16333 
16334 		if (info.sym.max_nb_sessions != 0 &&
16335 				info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
16336 			RTE_LOG(ERR, USER1,
16337 					"Device does not support "
16338 					"at least %u sessions\n",
16339 					MAX_NB_SESSIONS);
16340 			return TEST_FAILED;
16341 		}
16342 		/*
16343 		 * Create mempool with maximum number of sessions,
16344 		 * to include the session headers
16345 		 */
16346 		if (ts_params->session_mpool == NULL) {
16347 			ts_params->session_mpool =
16348 				rte_cryptodev_sym_session_pool_create(
16349 						"test_sess_mp",
16350 						MAX_NB_SESSIONS, session_size,
16351 						0, 0, SOCKET_ID_ANY);
16352 			TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
16353 					"session mempool allocation failed");
16354 		}
16355 
16356 		ts_params->qp_conf.mp_session = ts_params->session_mpool;
16357 
16358 		ret = rte_cryptodev_scheduler_worker_attach(sched_id,
16359 				(uint8_t)i);
16360 
16361 		TEST_ASSERT(ret == 0,
16362 			"Failed to attach device %u of pmd : %s", i,
16363 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
16364 
16365 		aesni_ids[nb_devs_attached] = (uint8_t)i;
16366 
16367 		nb_devs_attached++;
16368 	}
16369 
16370 	return 0;
16371 }
16372 
16373 static int
16374 test_scheduler_detach_worker_op(void)
16375 {
16376 	struct crypto_testsuite_params *ts_params = &testsuite_params;
16377 	uint8_t sched_id = ts_params->valid_devs[0];
16378 	uint32_t i;
16379 	int ret;
16380 
16381 	for (i = 0; i < 2; i++) {
16382 		ret = rte_cryptodev_scheduler_worker_detach(sched_id,
16383 				aesni_ids[i]);
16384 		TEST_ASSERT(ret == 0,
16385 			"Failed to detach device %u", aesni_ids[i]);
16386 	}
16387 
16388 	return 0;
16389 }
16390 
16391 static int
16392 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
16393 {
16394 	struct crypto_testsuite_params *ts_params = &testsuite_params;
16395 	uint8_t sched_id = ts_params->valid_devs[0];
16396 	/* set mode */
16397 	return rte_cryptodev_scheduler_mode_set(sched_id,
16398 		scheduler_mode);
16399 }
16400 
16401 static int
16402 test_scheduler_mode_roundrobin_op(void)
16403 {
16404 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
16405 			0, "Failed to set roundrobin mode");
16406 	return 0;
16407 
16408 }
16409 
16410 static int
16411 test_scheduler_mode_multicore_op(void)
16412 {
16413 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
16414 			0, "Failed to set multicore mode");
16415 
16416 	return 0;
16417 }
16418 
16419 static int
16420 test_scheduler_mode_failover_op(void)
16421 {
16422 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
16423 			0, "Failed to set failover mode");
16424 
16425 	return 0;
16426 }
16427 
16428 static int
16429 test_scheduler_mode_pkt_size_distr_op(void)
16430 {
16431 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
16432 			0, "Failed to set pktsize mode");
16433 
16434 	return 0;
16435 }
16436 
16437 static int
16438 scheduler_multicore_testsuite_setup(void)
16439 {
16440 	if (test_scheduler_attach_worker_op() < 0)
16441 		return TEST_SKIPPED;
16442 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
16443 		return TEST_SKIPPED;
16444 	return 0;
16445 }
16446 
16447 static int
16448 scheduler_roundrobin_testsuite_setup(void)
16449 {
16450 	if (test_scheduler_attach_worker_op() < 0)
16451 		return TEST_SKIPPED;
16452 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
16453 		return TEST_SKIPPED;
16454 	return 0;
16455 }
16456 
16457 static int
16458 scheduler_failover_testsuite_setup(void)
16459 {
16460 	if (test_scheduler_attach_worker_op() < 0)
16461 		return TEST_SKIPPED;
16462 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
16463 		return TEST_SKIPPED;
16464 	return 0;
16465 }
16466 
16467 static int
16468 scheduler_pkt_size_distr_testsuite_setup(void)
16469 {
16470 	if (test_scheduler_attach_worker_op() < 0)
16471 		return TEST_SKIPPED;
16472 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
16473 		return TEST_SKIPPED;
16474 	return 0;
16475 }
16476 
16477 static void
16478 scheduler_mode_testsuite_teardown(void)
16479 {
16480 	test_scheduler_detach_worker_op();
16481 }
16482 
16483 #endif /* RTE_CRYPTO_SCHEDULER */
16484 
16485 static struct unit_test_suite end_testsuite = {
16486 	.suite_name = NULL,
16487 	.setup = NULL,
16488 	.teardown = NULL,
16489 	.unit_test_suites = NULL
16490 };
16491 
16492 #ifdef RTE_LIB_SECURITY
16493 static struct unit_test_suite ipsec_proto_testsuite  = {
16494 	.suite_name = "IPsec Proto Unit Test Suite",
16495 	.setup = ipsec_proto_testsuite_setup,
16496 	.unit_test_cases = {
16497 		TEST_CASE_NAMED_WITH_DATA(
16498 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
16499 			ut_setup_security, ut_teardown,
16500 			test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
16501 		TEST_CASE_NAMED_WITH_DATA(
16502 			"Outbound known vector ext_mbuf mode (ESP tunnel mode IPv4 AES-GCM 128)",
16503 			ut_setup_security, ut_teardown,
16504 			test_ipsec_proto_known_vec_ext_mbuf, &pkt_aes_128_gcm),
16505 		TEST_CASE_NAMED_WITH_DATA(
16506 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
16507 			ut_setup_security, ut_teardown,
16508 			test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
16509 		TEST_CASE_NAMED_WITH_DATA(
16510 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
16511 			ut_setup_security, ut_teardown,
16512 			test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
16513 		TEST_CASE_NAMED_WITH_DATA(
16514 			"Outbound known vector (ESP tunnel mode IPv4 AES-CCM 256)",
16515 			ut_setup_security, ut_teardown,
16516 			test_ipsec_proto_known_vec, &pkt_aes_256_ccm),
16517 		TEST_CASE_NAMED_WITH_DATA(
16518 			"Outbound known vector (ESP tunnel mode IPv4 AES-CBC MD5 [12B ICV])",
16519 			ut_setup_security, ut_teardown,
16520 			test_ipsec_proto_known_vec,
16521 			&pkt_aes_128_cbc_md5),
16522 		TEST_CASE_NAMED_WITH_DATA(
16523 			"Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
16524 			ut_setup_security, ut_teardown,
16525 			test_ipsec_proto_known_vec,
16526 			&pkt_aes_128_cbc_hmac_sha256),
16527 		TEST_CASE_NAMED_WITH_DATA(
16528 			"Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
16529 			ut_setup_security, ut_teardown,
16530 			test_ipsec_proto_known_vec,
16531 			&pkt_aes_128_cbc_hmac_sha384),
16532 		TEST_CASE_NAMED_WITH_DATA(
16533 			"Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
16534 			ut_setup_security, ut_teardown,
16535 			test_ipsec_proto_known_vec,
16536 			&pkt_aes_128_cbc_hmac_sha512),
16537 		TEST_CASE_NAMED_WITH_DATA(
16538 			"Outbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
16539 			ut_setup_security, ut_teardown,
16540 			test_ipsec_proto_known_vec, &pkt_aes_256_gcm_v6),
16541 		TEST_CASE_NAMED_WITH_DATA(
16542 			"Outbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
16543 			ut_setup_security, ut_teardown,
16544 			test_ipsec_proto_known_vec,
16545 			&pkt_aes_128_cbc_hmac_sha256_v6),
16546 		TEST_CASE_NAMED_WITH_DATA(
16547 			"Outbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
16548 			ut_setup_security, ut_teardown,
16549 			test_ipsec_proto_known_vec,
16550 			&pkt_null_aes_xcbc),
16551 		TEST_CASE_NAMED_WITH_DATA(
16552 			"Outbound known vector (ESP tunnel mode IPv4 DES-CBC HMAC-SHA256 [16B ICV])",
16553 			ut_setup_security, ut_teardown,
16554 			test_ipsec_proto_known_vec,
16555 			&pkt_des_cbc_hmac_sha256),
16556 		TEST_CASE_NAMED_WITH_DATA(
16557 			"Outbound known vector (ESP tunnel mode IPv4 DES-CBC HMAC-SHA384 [24B ICV])",
16558 			ut_setup_security, ut_teardown,
16559 			test_ipsec_proto_known_vec,
16560 			&pkt_des_cbc_hmac_sha384),
16561 		TEST_CASE_NAMED_WITH_DATA(
16562 			"Outbound known vector (ESP tunnel mode IPv4 DES-CBC HMAC-SHA512 [32B ICV])",
16563 			ut_setup_security, ut_teardown,
16564 			test_ipsec_proto_known_vec,
16565 			&pkt_des_cbc_hmac_sha512),
16566 		TEST_CASE_NAMED_WITH_DATA(
16567 			"Outbound known vector (ESP tunnel mode IPv4 3DES-CBC HMAC-SHA256 [16B ICV])",
16568 			ut_setup_security, ut_teardown,
16569 			test_ipsec_proto_known_vec, &pkt_3des_cbc_hmac_sha256),
16570 		TEST_CASE_NAMED_WITH_DATA(
16571 			"Outbound known vector (ESP tunnel mode IPv4 3DES-CBC HMAC-SHA384 [24B ICV])",
16572 			ut_setup_security, ut_teardown,
16573 			test_ipsec_proto_known_vec, &pkt_3des_cbc_hmac_sha384),
16574 		TEST_CASE_NAMED_WITH_DATA(
16575 			"Outbound known vector (ESP tunnel mode IPv4 3DES-CBC HMAC-SHA512 [32B ICV])",
16576 			ut_setup_security, ut_teardown,
16577 			test_ipsec_proto_known_vec, &pkt_3des_cbc_hmac_sha512),
16578 		TEST_CASE_NAMED_WITH_DATA(
16579 			"Outbound known vector (ESP tunnel mode IPv6 DES-CBC HMAC-SHA256 [16B ICV])",
16580 			ut_setup_security, ut_teardown,
16581 			test_ipsec_proto_known_vec,
16582 			&pkt_des_cbc_hmac_sha256_v6),
16583 		TEST_CASE_NAMED_WITH_DATA(
16584 			"Outbound known vector (ESP tunnel mode IPv6 3DES-CBC HMAC-SHA256 [16B ICV])",
16585 			ut_setup_security, ut_teardown,
16586 			test_ipsec_proto_known_vec, &pkt_3des_cbc_hmac_sha256_v6),
16587 		TEST_CASE_NAMED_WITH_DATA(
16588 			"Outbound known vector (AH tunnel mode IPv4 HMAC-SHA256)",
16589 			ut_setup_security, ut_teardown,
16590 			test_ipsec_proto_known_vec,
16591 			&pkt_ah_tunnel_sha256),
16592 		TEST_CASE_NAMED_WITH_DATA(
16593 			"Outbound known vector (AH transport mode IPv4 HMAC-SHA256)",
16594 			ut_setup_security, ut_teardown,
16595 			test_ipsec_proto_known_vec,
16596 			&pkt_ah_transport_sha256),
16597 		TEST_CASE_NAMED_WITH_DATA(
16598 			"Outbound known vector (AH transport mode IPv4 AES-GMAC 128)",
16599 			ut_setup_security, ut_teardown,
16600 			test_ipsec_proto_known_vec,
16601 			&pkt_ah_ipv4_aes_gmac_128),
16602 		TEST_CASE_NAMED_WITH_DATA(
16603 			"Outbound fragmented packet",
16604 			ut_setup_security, ut_teardown,
16605 			test_ipsec_proto_known_vec_fragmented,
16606 			&pkt_aes_128_gcm_frag),
16607 		TEST_CASE_NAMED_WITH_DATA(
16608 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
16609 			ut_setup_security, ut_teardown,
16610 			test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
16611 		TEST_CASE_NAMED_WITH_DATA(
16612 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
16613 			ut_setup_security, ut_teardown,
16614 			test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
16615 		TEST_CASE_NAMED_WITH_DATA(
16616 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
16617 			ut_setup_security, ut_teardown,
16618 			test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
16619 		TEST_CASE_NAMED_WITH_DATA(
16620 			"Inbound known vector (ESP tunnel mode IPv4 AES-CCM 256)",
16621 			ut_setup_security, ut_teardown,
16622 			test_ipsec_proto_known_vec_inb, &pkt_aes_256_ccm),
16623 		TEST_CASE_NAMED_WITH_DATA(
16624 			"Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128)",
16625 			ut_setup_security, ut_teardown,
16626 			test_ipsec_proto_known_vec_inb, &pkt_aes_128_cbc_null),
16627 		TEST_CASE_NAMED_WITH_DATA(
16628 			"Inbound known vector (ESP tunnel mode IPv4 AES-CBC MD5 [12B ICV])",
16629 			ut_setup_security, ut_teardown,
16630 			test_ipsec_proto_known_vec_inb,
16631 			&pkt_aes_128_cbc_md5),
16632 		TEST_CASE_NAMED_WITH_DATA(
16633 			"Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
16634 			ut_setup_security, ut_teardown,
16635 			test_ipsec_proto_known_vec_inb,
16636 			&pkt_aes_128_cbc_hmac_sha256),
16637 		TEST_CASE_NAMED_WITH_DATA(
16638 			"Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
16639 			ut_setup_security, ut_teardown,
16640 			test_ipsec_proto_known_vec_inb,
16641 			&pkt_aes_128_cbc_hmac_sha384),
16642 		TEST_CASE_NAMED_WITH_DATA(
16643 			"Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
16644 			ut_setup_security, ut_teardown,
16645 			test_ipsec_proto_known_vec_inb,
16646 			&pkt_aes_128_cbc_hmac_sha512),
16647 		TEST_CASE_NAMED_WITH_DATA(
16648 			"Inbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
16649 			ut_setup_security, ut_teardown,
16650 			test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm_v6),
16651 		TEST_CASE_NAMED_WITH_DATA(
16652 			"Inbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
16653 			ut_setup_security, ut_teardown,
16654 			test_ipsec_proto_known_vec_inb,
16655 			&pkt_aes_128_cbc_hmac_sha256_v6),
16656 		TEST_CASE_NAMED_WITH_DATA(
16657 			"Inbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
16658 			ut_setup_security, ut_teardown,
16659 			test_ipsec_proto_known_vec_inb,
16660 			&pkt_null_aes_xcbc),
16661 		TEST_CASE_NAMED_WITH_DATA(
16662 			"Inbound known vector (ESP tunnel mode IPv4 DES-CBC HMAC-SHA256 [16B ICV])",
16663 			ut_setup_security, ut_teardown,
16664 			test_ipsec_proto_known_vec_inb,
16665 			&pkt_des_cbc_hmac_sha256),
16666 		TEST_CASE_NAMED_WITH_DATA(
16667 			"Inbound known vector (ESP tunnel mode IPv4 DES-CBC HMAC-SHA384 [24B ICV])",
16668 			ut_setup_security, ut_teardown,
16669 			test_ipsec_proto_known_vec_inb,
16670 			&pkt_des_cbc_hmac_sha384),
16671 		TEST_CASE_NAMED_WITH_DATA(
16672 			"Inbound known vector (ESP tunnel mode IPv4 DES-CBC HMAC-SHA512 [32B ICV])",
16673 			ut_setup_security, ut_teardown,
16674 			test_ipsec_proto_known_vec_inb,
16675 			&pkt_des_cbc_hmac_sha512),
16676 		TEST_CASE_NAMED_WITH_DATA(
16677 			"Inbound known vector (ESP tunnel mode IPv4 3DES-CBC HMAC-SHA256 [16B ICV])",
16678 			ut_setup_security, ut_teardown,
16679 			test_ipsec_proto_known_vec_inb, &pkt_3des_cbc_hmac_sha256),
16680 		TEST_CASE_NAMED_WITH_DATA(
16681 			"Inbound known vector (ESP tunnel mode IPv4 3DES-CBC HMAC-SHA384 [24B ICV])",
16682 			ut_setup_security, ut_teardown,
16683 			test_ipsec_proto_known_vec_inb, &pkt_3des_cbc_hmac_sha384),
16684 		TEST_CASE_NAMED_WITH_DATA(
16685 			"Inbound known vector (ESP tunnel mode IPv4 3DES-CBC HMAC-SHA512 [32B ICV])",
16686 			ut_setup_security, ut_teardown,
16687 			test_ipsec_proto_known_vec_inb, &pkt_3des_cbc_hmac_sha512),
16688 		TEST_CASE_NAMED_WITH_DATA(
16689 			"Inbound known vector (ESP tunnel mode IPv6 DES-CBC HMAC-SHA256 [16B ICV])",
16690 			ut_setup_security, ut_teardown,
16691 			test_ipsec_proto_known_vec_inb,
16692 			&pkt_des_cbc_hmac_sha256_v6),
16693 		TEST_CASE_NAMED_WITH_DATA(
16694 			"Inbound known vector (ESP tunnel mode IPv6 3DES-CBC HMAC-SHA256 [16B ICV])",
16695 			ut_setup_security, ut_teardown,
16696 			test_ipsec_proto_known_vec_inb, &pkt_3des_cbc_hmac_sha256_v6),
16697 		TEST_CASE_NAMED_WITH_DATA(
16698 			"Inbound known vector (AH tunnel mode IPv4 HMAC-SHA256)",
16699 			ut_setup_security, ut_teardown,
16700 			test_ipsec_proto_known_vec_inb,
16701 			&pkt_ah_tunnel_sha256),
16702 		TEST_CASE_NAMED_WITH_DATA(
16703 			"Inbound known vector (AH transport mode IPv4 HMAC-SHA256)",
16704 			ut_setup_security, ut_teardown,
16705 			test_ipsec_proto_known_vec_inb,
16706 			&pkt_ah_transport_sha256),
16707 		TEST_CASE_NAMED_WITH_DATA(
16708 			"Inbound known vector (AH transport mode IPv4 AES-GMAC 128)",
16709 			ut_setup_security, ut_teardown,
16710 			test_ipsec_proto_known_vec_inb,
16711 			&pkt_ah_ipv4_aes_gmac_128),
16712 		TEST_CASE_NAMED_ST(
16713 			"Combined test alg list",
16714 			ut_setup_security, ut_teardown,
16715 			test_ipsec_proto_display_list),
16716 		TEST_CASE_NAMED_ST(
16717 			"Combined test alg list (AH)",
16718 			ut_setup_security, ut_teardown,
16719 			test_ipsec_proto_ah_tunnel_ipv4),
16720 		TEST_CASE_NAMED_ST(
16721 			"IV generation",
16722 			ut_setup_security, ut_teardown,
16723 			test_ipsec_proto_iv_gen),
16724 		TEST_CASE_NAMED_ST(
16725 			"UDP encapsulation",
16726 			ut_setup_security, ut_teardown,
16727 			test_ipsec_proto_udp_encap),
16728 		TEST_CASE_NAMED_ST(
16729 			"UDP encapsulation with custom ports",
16730 			ut_setup_security, ut_teardown,
16731 			test_ipsec_proto_udp_encap_custom_ports),
16732 		TEST_CASE_NAMED_ST(
16733 			"UDP encapsulation ports verification test",
16734 			ut_setup_security, ut_teardown,
16735 			test_ipsec_proto_udp_ports_verify),
16736 		TEST_CASE_NAMED_ST(
16737 			"SA expiry packets soft",
16738 			ut_setup_security, ut_teardown,
16739 			test_ipsec_proto_sa_exp_pkts_soft),
16740 		TEST_CASE_NAMED_ST(
16741 			"SA expiry packets hard",
16742 			ut_setup_security, ut_teardown,
16743 			test_ipsec_proto_sa_exp_pkts_hard),
16744 		TEST_CASE_NAMED_ST(
16745 			"Negative test: ICV corruption",
16746 			ut_setup_security, ut_teardown,
16747 			test_ipsec_proto_err_icv_corrupt),
16748 		TEST_CASE_NAMED_ST(
16749 			"Tunnel dst addr verification",
16750 			ut_setup_security, ut_teardown,
16751 			test_ipsec_proto_tunnel_dst_addr_verify),
16752 		TEST_CASE_NAMED_ST(
16753 			"Tunnel src and dst addr verification",
16754 			ut_setup_security, ut_teardown,
16755 			test_ipsec_proto_tunnel_src_dst_addr_verify),
16756 		TEST_CASE_NAMED_ST(
16757 			"Inner IP checksum",
16758 			ut_setup_security, ut_teardown,
16759 			test_ipsec_proto_inner_ip_csum),
16760 		TEST_CASE_NAMED_ST(
16761 			"Inner L4 checksum",
16762 			ut_setup_security, ut_teardown,
16763 			test_ipsec_proto_inner_l4_csum),
16764 		TEST_CASE_NAMED_ST(
16765 			"Tunnel IPv4 in IPv4",
16766 			ut_setup_security, ut_teardown,
16767 			test_ipsec_proto_tunnel_v4_in_v4),
16768 		TEST_CASE_NAMED_ST(
16769 			"Tunnel IPv6 in IPv6",
16770 			ut_setup_security, ut_teardown,
16771 			test_ipsec_proto_tunnel_v6_in_v6),
16772 		TEST_CASE_NAMED_ST(
16773 			"Tunnel IPv4 in IPv6",
16774 			ut_setup_security, ut_teardown,
16775 			test_ipsec_proto_tunnel_v4_in_v6),
16776 		TEST_CASE_NAMED_ST(
16777 			"Tunnel IPv6 in IPv4",
16778 			ut_setup_security, ut_teardown,
16779 			test_ipsec_proto_tunnel_v6_in_v4),
16780 		TEST_CASE_NAMED_ST(
16781 			"Transport IPv4",
16782 			ut_setup_security, ut_teardown,
16783 			test_ipsec_proto_transport_v4),
16784 		TEST_CASE_NAMED_ST(
16785 			"AH transport IPv4",
16786 			ut_setup_security, ut_teardown,
16787 			test_ipsec_proto_ah_transport_ipv4),
16788 		TEST_CASE_NAMED_ST(
16789 			"Transport l4 checksum",
16790 			ut_setup_security, ut_teardown,
16791 			test_ipsec_proto_transport_l4_csum),
16792 		TEST_CASE_NAMED_ST(
16793 			"Statistics: success",
16794 			ut_setup_security, ut_teardown,
16795 			test_ipsec_proto_stats),
16796 		TEST_CASE_NAMED_ST(
16797 			"Fragmented packet",
16798 			ut_setup_security, ut_teardown,
16799 			test_ipsec_proto_pkt_fragment),
16800 		TEST_CASE_NAMED_ST(
16801 			"Tunnel header copy DF (inner 0)",
16802 			ut_setup_security, ut_teardown,
16803 			test_ipsec_proto_copy_df_inner_0),
16804 		TEST_CASE_NAMED_ST(
16805 			"Tunnel header copy DF (inner 1)",
16806 			ut_setup_security, ut_teardown,
16807 			test_ipsec_proto_copy_df_inner_1),
16808 		TEST_CASE_NAMED_ST(
16809 			"Tunnel header set DF 0 (inner 1)",
16810 			ut_setup_security, ut_teardown,
16811 			test_ipsec_proto_set_df_0_inner_1),
16812 		TEST_CASE_NAMED_ST(
16813 			"Tunnel header set DF 1 (inner 0)",
16814 			ut_setup_security, ut_teardown,
16815 			test_ipsec_proto_set_df_1_inner_0),
16816 		TEST_CASE_NAMED_ST(
16817 			"Tunnel header IPv4 copy DSCP (inner 0)",
16818 			ut_setup_security, ut_teardown,
16819 			test_ipsec_proto_ipv4_copy_dscp_inner_0),
16820 		TEST_CASE_NAMED_ST(
16821 			"Tunnel header IPv4 copy DSCP (inner 1)",
16822 			ut_setup_security, ut_teardown,
16823 			test_ipsec_proto_ipv4_copy_dscp_inner_1),
16824 		TEST_CASE_NAMED_ST(
16825 			"Tunnel header IPv4 set DSCP 0 (inner 1)",
16826 			ut_setup_security, ut_teardown,
16827 			test_ipsec_proto_ipv4_set_dscp_0_inner_1),
16828 		TEST_CASE_NAMED_ST(
16829 			"Tunnel header IPv4 set DSCP 1 (inner 0)",
16830 			ut_setup_security, ut_teardown,
16831 			test_ipsec_proto_ipv4_set_dscp_1_inner_0),
16832 		TEST_CASE_NAMED_ST(
16833 			"Tunnel header IPv6 copy DSCP (inner 0)",
16834 			ut_setup_security, ut_teardown,
16835 			test_ipsec_proto_ipv6_copy_dscp_inner_0),
16836 		TEST_CASE_NAMED_ST(
16837 			"Tunnel header IPv6 copy DSCP (inner 1)",
16838 			ut_setup_security, ut_teardown,
16839 			test_ipsec_proto_ipv6_copy_dscp_inner_1),
16840 		TEST_CASE_NAMED_ST(
16841 			"Tunnel header IPv6 set DSCP 0 (inner 1)",
16842 			ut_setup_security, ut_teardown,
16843 			test_ipsec_proto_ipv6_set_dscp_0_inner_1),
16844 		TEST_CASE_NAMED_ST(
16845 			"Tunnel header IPv6 set DSCP 1 (inner 0)",
16846 			ut_setup_security, ut_teardown,
16847 			test_ipsec_proto_ipv6_set_dscp_1_inner_0),
16848 		TEST_CASE_NAMED_WITH_DATA(
16849 			"Antireplay with window size 1024",
16850 			ut_setup_security, ut_teardown,
16851 			test_ipsec_proto_pkt_antireplay1024, &pkt_aes_128_gcm),
16852 		TEST_CASE_NAMED_WITH_DATA(
16853 			"Antireplay with window size 2048",
16854 			ut_setup_security, ut_teardown,
16855 			test_ipsec_proto_pkt_antireplay2048, &pkt_aes_128_gcm),
16856 		TEST_CASE_NAMED_WITH_DATA(
16857 			"Antireplay with window size 4096",
16858 			ut_setup_security, ut_teardown,
16859 			test_ipsec_proto_pkt_antireplay4096, &pkt_aes_128_gcm),
16860 		TEST_CASE_NAMED_WITH_DATA(
16861 			"ESN and Antireplay with window size 1024",
16862 			ut_setup_security, ut_teardown,
16863 			test_ipsec_proto_pkt_esn_antireplay1024,
16864 			&pkt_aes_128_gcm),
16865 		TEST_CASE_NAMED_WITH_DATA(
16866 			"ESN and Antireplay with window size 2048",
16867 			ut_setup_security, ut_teardown,
16868 			test_ipsec_proto_pkt_esn_antireplay2048,
16869 			&pkt_aes_128_gcm),
16870 		TEST_CASE_NAMED_WITH_DATA(
16871 			"ESN and Antireplay with window size 4096",
16872 			ut_setup_security, ut_teardown,
16873 			test_ipsec_proto_pkt_esn_antireplay4096,
16874 			&pkt_aes_128_gcm),
16875 		TEST_CASE_NAMED_ST(
16876 			"Tunnel header IPv4 decrement inner TTL",
16877 			ut_setup_security, ut_teardown,
16878 			test_ipsec_proto_ipv4_ttl_decrement),
16879 		TEST_CASE_NAMED_ST(
16880 			"Tunnel header IPv6 decrement inner hop limit",
16881 			ut_setup_security, ut_teardown,
16882 			test_ipsec_proto_ipv6_hop_limit_decrement),
16883 		TEST_CASE_NAMED_ST(
16884 			"Multi-segmented mode",
16885 			ut_setup_security, ut_teardown,
16886 			test_ipsec_proto_sgl),
16887 		TEST_CASE_NAMED_ST(
16888 			"Multi-segmented external mbuf mode",
16889 			ut_setup_security, ut_teardown,
16890 			test_ipsec_proto_sgl_ext_mbuf),
16891 		TEST_CASE_NAMED_WITH_DATA(
16892 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128) Rx inject",
16893 			ut_setup_security_rx_inject, ut_teardown_rx_inject,
16894 			test_ipsec_proto_known_vec_inb_rx_inject, &pkt_aes_128_gcm),
16895 		TEST_CASES_END() /**< NULL terminate unit test array */
16896 	}
16897 };
16898 
16899 static struct unit_test_suite pdcp_proto_testsuite  = {
16900 	.suite_name = "PDCP Proto Unit Test Suite",
16901 	.setup = pdcp_proto_testsuite_setup,
16902 	.unit_test_cases = {
16903 		TEST_CASE_ST(ut_setup_security, ut_teardown,
16904 			test_PDCP_PROTO_all),
16905 		TEST_CASES_END() /**< NULL terminate unit test array */
16906 	}
16907 };
16908 
16909 static struct unit_test_suite tls12_record_proto_testsuite  = {
16910 	.suite_name = "TLS 1.2 Record Protocol Unit Test Suite",
16911 	.setup = tls_record_proto_testsuite_setup,
16912 	.unit_test_cases = {
16913 		TEST_CASE_NAMED_WITH_DATA(
16914 			"Write record known vector AES-GCM-128 (vector 1)",
16915 			ut_setup_security, ut_teardown,
16916 			test_tls_record_proto_known_vec, &tls_test_data_aes_128_gcm_v1),
16917 		TEST_CASE_NAMED_WITH_DATA(
16918 			"Write record known vector AES-GCM-128 (vector 2)",
16919 			ut_setup_security, ut_teardown,
16920 			test_tls_record_proto_known_vec, &tls_test_data_aes_128_gcm_v2),
16921 		TEST_CASE_NAMED_WITH_DATA(
16922 			"Write record known vector AES-GCM-256",
16923 			ut_setup_security, ut_teardown,
16924 			test_tls_record_proto_known_vec, &tls_test_data_aes_256_gcm),
16925 		TEST_CASE_NAMED_WITH_DATA(
16926 			"Write record known vector AES-CBC-128-SHA1",
16927 			ut_setup_security, ut_teardown,
16928 			test_tls_record_proto_known_vec, &tls_test_data_aes_128_cbc_sha1_hmac),
16929 		TEST_CASE_NAMED_WITH_DATA(
16930 			"Write record known vector AES-128-CBC-SHA256",
16931 			ut_setup_security, ut_teardown,
16932 			test_tls_record_proto_known_vec, &tls_test_data_aes_128_cbc_sha256_hmac),
16933 		TEST_CASE_NAMED_WITH_DATA(
16934 			"Write record known vector AES-256-CBC-SHA1",
16935 			ut_setup_security, ut_teardown,
16936 			test_tls_record_proto_known_vec, &tls_test_data_aes_256_cbc_sha1_hmac),
16937 		TEST_CASE_NAMED_WITH_DATA(
16938 			"Write record known vector AES-256-CBC-SHA256",
16939 			ut_setup_security, ut_teardown,
16940 			test_tls_record_proto_known_vec, &tls_test_data_aes_256_cbc_sha256_hmac),
16941 		TEST_CASE_NAMED_WITH_DATA(
16942 			"Write record known vector 3DES-CBC-SHA1-HMAC",
16943 			ut_setup_security, ut_teardown,
16944 			test_tls_record_proto_known_vec, &tls_test_data_3des_cbc_sha1_hmac),
16945 		TEST_CASE_NAMED_WITH_DATA(
16946 			"Write record known vector NULL-SHA1-HMAC",
16947 			ut_setup_security, ut_teardown,
16948 			test_tls_record_proto_known_vec, &tls_test_data_null_cipher_sha1_hmac),
16949 		TEST_CASE_NAMED_WITH_DATA(
16950 			"Write record known vector CHACHA20-POLY1305",
16951 			ut_setup_security, ut_teardown,
16952 			test_tls_record_proto_known_vec, &tls_test_data_chacha20_poly1305),
16953 
16954 		TEST_CASE_NAMED_WITH_DATA(
16955 			"Read record known vector AES-GCM-128 (vector 1)",
16956 			ut_setup_security, ut_teardown,
16957 			test_tls_record_proto_known_vec_read, &tls_test_data_aes_128_gcm_v1),
16958 		TEST_CASE_NAMED_WITH_DATA(
16959 			"Read record known vector AES-GCM-128 (vector 2)",
16960 			ut_setup_security, ut_teardown,
16961 			test_tls_record_proto_known_vec_read, &tls_test_data_aes_128_gcm_v2),
16962 		TEST_CASE_NAMED_WITH_DATA(
16963 			"Read record known vector AES-GCM-256",
16964 			ut_setup_security, ut_teardown,
16965 			test_tls_record_proto_known_vec_read, &tls_test_data_aes_256_gcm),
16966 		TEST_CASE_NAMED_WITH_DATA(
16967 			"Read record known vector AES-128-CBC-SHA1",
16968 			ut_setup_security, ut_teardown,
16969 			test_tls_record_proto_known_vec_read, &tls_test_data_aes_128_cbc_sha1_hmac),
16970 		TEST_CASE_NAMED_WITH_DATA(
16971 			"Read record known vector AES-128-CBC-SHA256",
16972 			ut_setup_security, ut_teardown,
16973 			test_tls_record_proto_known_vec_read,
16974 			&tls_test_data_aes_128_cbc_sha256_hmac),
16975 		TEST_CASE_NAMED_WITH_DATA(
16976 			"Read record known vector AES-256-CBC-SHA1",
16977 			ut_setup_security, ut_teardown,
16978 			test_tls_record_proto_known_vec_read, &tls_test_data_aes_256_cbc_sha1_hmac),
16979 		TEST_CASE_NAMED_WITH_DATA(
16980 			"Read record known vector AES-256-CBC-SHA256",
16981 			ut_setup_security, ut_teardown,
16982 			test_tls_record_proto_known_vec_read,
16983 			&tls_test_data_aes_256_cbc_sha256_hmac),
16984 		TEST_CASE_NAMED_WITH_DATA(
16985 			"Read record known vector 3DES-CBC-SHA1-HMAC",
16986 			ut_setup_security, ut_teardown,
16987 			test_tls_record_proto_known_vec_read, &tls_test_data_3des_cbc_sha1_hmac),
16988 		TEST_CASE_NAMED_WITH_DATA(
16989 			"Read record known vector NULL-SHA1-HMAC",
16990 			ut_setup_security, ut_teardown,
16991 			test_tls_record_proto_known_vec_read, &tls_test_data_null_cipher_sha1_hmac),
16992 		TEST_CASE_NAMED_WITH_DATA(
16993 			"Read record known vector CHACHA20-POLY1305",
16994 			ut_setup_security, ut_teardown,
16995 			test_tls_record_proto_known_vec_read, &tls_test_data_chacha20_poly1305),
16996 
16997 		TEST_CASE_NAMED_ST(
16998 			"Combined test alg list",
16999 			ut_setup_security, ut_teardown,
17000 			test_tls_record_proto_display_list),
17001 		TEST_CASE_NAMED_ST(
17002 			"Multi-segmented mode",
17003 			ut_setup_security, ut_teardown,
17004 			test_tls_record_proto_sgl),
17005 		TEST_CASES_END() /**< NULL terminate unit test array */
17006 	}
17007 };
17008 
17009 static struct unit_test_suite dtls12_record_proto_testsuite  = {
17010 	.suite_name = "DTLS 1.2 Record Protocol Unit Test Suite",
17011 	.setup = tls_record_proto_testsuite_setup,
17012 	.unit_test_cases = {
17013 		TEST_CASE_NAMED_WITH_DATA(
17014 			"Write record known vector AES-GCM-128",
17015 			ut_setup_security, ut_teardown,
17016 			test_tls_record_proto_known_vec, &dtls_test_data_aes_128_gcm),
17017 		TEST_CASE_NAMED_WITH_DATA(
17018 			"Write record known vector AES-GCM-256",
17019 			ut_setup_security, ut_teardown,
17020 			test_tls_record_proto_known_vec, &dtls_test_data_aes_256_gcm),
17021 		TEST_CASE_NAMED_WITH_DATA(
17022 			"Write record known vector AES-128-CBC-SHA1",
17023 			ut_setup_security, ut_teardown,
17024 			test_tls_record_proto_known_vec,
17025 			&dtls_test_data_aes_128_cbc_sha1_hmac),
17026 		TEST_CASE_NAMED_WITH_DATA(
17027 			"Write record known vector AES-128-CBC-SHA256",
17028 			ut_setup_security, ut_teardown,
17029 			test_tls_record_proto_known_vec,
17030 			&dtls_test_data_aes_128_cbc_sha256_hmac),
17031 		TEST_CASE_NAMED_WITH_DATA(
17032 			"Write record known vector AES-256-CBC-SHA1",
17033 			ut_setup_security, ut_teardown,
17034 			test_tls_record_proto_known_vec,
17035 			&dtls_test_data_aes_256_cbc_sha1_hmac),
17036 		TEST_CASE_NAMED_WITH_DATA(
17037 			"Write record known vector AES-256-CBC-SHA256",
17038 			ut_setup_security, ut_teardown,
17039 			test_tls_record_proto_known_vec,
17040 			&dtls_test_data_aes_256_cbc_sha256_hmac),
17041 		TEST_CASE_NAMED_WITH_DATA(
17042 			"Write record known vector 3DES-CBC-SHA1-HMAC",
17043 			ut_setup_security, ut_teardown,
17044 			test_tls_record_proto_known_vec,
17045 			&dtls_test_data_3des_cbc_sha1_hmac),
17046 		TEST_CASE_NAMED_WITH_DATA(
17047 			"Write record known vector NULL-SHA1-HMAC",
17048 			ut_setup_security, ut_teardown,
17049 			test_tls_record_proto_known_vec,
17050 			&dtls_test_data_null_cipher_sha1_hmac),
17051 		TEST_CASE_NAMED_WITH_DATA(
17052 			"Write record known vector CHACHA20-POLY1305",
17053 			ut_setup_security, ut_teardown,
17054 			test_tls_record_proto_known_vec, &dtls_test_data_chacha20_poly1305),
17055 		TEST_CASE_NAMED_WITH_DATA(
17056 			"Read record known vector AES-GCM-128",
17057 			ut_setup_security, ut_teardown,
17058 			test_tls_record_proto_known_vec_read, &dtls_test_data_aes_128_gcm),
17059 		TEST_CASE_NAMED_WITH_DATA(
17060 			"Read record known vector AES-GCM-256",
17061 			ut_setup_security, ut_teardown,
17062 			test_tls_record_proto_known_vec_read, &dtls_test_data_aes_256_gcm),
17063 		TEST_CASE_NAMED_WITH_DATA(
17064 			"Read record known vector AES-128-CBC-SHA1",
17065 			ut_setup_security, ut_teardown,
17066 			test_tls_record_proto_known_vec_read,
17067 			&dtls_test_data_aes_128_cbc_sha1_hmac),
17068 		TEST_CASE_NAMED_WITH_DATA(
17069 			"Read record known vector AES-128-CBC-SHA256",
17070 			ut_setup_security, ut_teardown,
17071 			test_tls_record_proto_known_vec_read,
17072 			&dtls_test_data_aes_128_cbc_sha256_hmac),
17073 		TEST_CASE_NAMED_WITH_DATA(
17074 			"Read record known vector AES-256-CBC-SHA1",
17075 			ut_setup_security, ut_teardown,
17076 			test_tls_record_proto_known_vec_read,
17077 			&dtls_test_data_aes_256_cbc_sha1_hmac),
17078 		TEST_CASE_NAMED_WITH_DATA(
17079 			"Read record known vector AES-256-CBC-SHA256",
17080 			ut_setup_security, ut_teardown,
17081 			test_tls_record_proto_known_vec_read,
17082 			&dtls_test_data_aes_256_cbc_sha256_hmac),
17083 		TEST_CASE_NAMED_WITH_DATA(
17084 			"Read record known vector 3DES-CBC-SHA1-HMAC",
17085 			ut_setup_security, ut_teardown,
17086 			test_tls_record_proto_known_vec_read,
17087 			&dtls_test_data_3des_cbc_sha1_hmac),
17088 		TEST_CASE_NAMED_WITH_DATA(
17089 			"Read record known vector NULL-SHA1-HMAC",
17090 			ut_setup_security, ut_teardown,
17091 			test_tls_record_proto_known_vec_read,
17092 			&dtls_test_data_null_cipher_sha1_hmac),
17093 		TEST_CASE_NAMED_WITH_DATA(
17094 			"Read record known vector CHACHA20-POLY1305",
17095 			ut_setup_security, ut_teardown,
17096 			test_tls_record_proto_known_vec_read, &dtls_test_data_chacha20_poly1305),
17097 
17098 		TEST_CASE_NAMED_ST(
17099 			"Combined test alg list",
17100 			ut_setup_security, ut_teardown,
17101 			test_tls_record_proto_display_list),
17102 		TEST_CASE_NAMED_ST(
17103 			"Multi-segmented mode",
17104 			ut_setup_security, ut_teardown,
17105 			test_tls_record_proto_sgl),
17106 		TEST_CASES_END() /**< NULL terminate unit test array */
17107 	}
17108 };
17109 
17110 #define ADD_UPLINK_TESTCASE(data)						\
17111 	TEST_CASE_NAMED_WITH_DATA(data.test_descr_uplink, ut_setup_security,	\
17112 	ut_teardown, test_docsis_proto_uplink, (const void *) &data),		\
17113 
17114 #define ADD_DOWNLINK_TESTCASE(data)						\
17115 	TEST_CASE_NAMED_WITH_DATA(data.test_descr_downlink, ut_setup_security,	\
17116 	ut_teardown, test_docsis_proto_downlink, (const void *) &data),		\
17117 
17118 static struct unit_test_suite docsis_proto_testsuite  = {
17119 	.suite_name = "DOCSIS Proto Unit Test Suite",
17120 	.setup = docsis_proto_testsuite_setup,
17121 	.unit_test_cases = {
17122 		/* Uplink */
17123 		ADD_UPLINK_TESTCASE(docsis_test_case_1)
17124 		ADD_UPLINK_TESTCASE(docsis_test_case_2)
17125 		ADD_UPLINK_TESTCASE(docsis_test_case_3)
17126 		ADD_UPLINK_TESTCASE(docsis_test_case_4)
17127 		ADD_UPLINK_TESTCASE(docsis_test_case_5)
17128 		ADD_UPLINK_TESTCASE(docsis_test_case_6)
17129 		ADD_UPLINK_TESTCASE(docsis_test_case_7)
17130 		ADD_UPLINK_TESTCASE(docsis_test_case_8)
17131 		ADD_UPLINK_TESTCASE(docsis_test_case_9)
17132 		ADD_UPLINK_TESTCASE(docsis_test_case_10)
17133 		ADD_UPLINK_TESTCASE(docsis_test_case_11)
17134 		ADD_UPLINK_TESTCASE(docsis_test_case_12)
17135 		ADD_UPLINK_TESTCASE(docsis_test_case_13)
17136 		ADD_UPLINK_TESTCASE(docsis_test_case_14)
17137 		ADD_UPLINK_TESTCASE(docsis_test_case_15)
17138 		ADD_UPLINK_TESTCASE(docsis_test_case_16)
17139 		ADD_UPLINK_TESTCASE(docsis_test_case_17)
17140 		ADD_UPLINK_TESTCASE(docsis_test_case_18)
17141 		ADD_UPLINK_TESTCASE(docsis_test_case_19)
17142 		ADD_UPLINK_TESTCASE(docsis_test_case_20)
17143 		ADD_UPLINK_TESTCASE(docsis_test_case_21)
17144 		ADD_UPLINK_TESTCASE(docsis_test_case_22)
17145 		ADD_UPLINK_TESTCASE(docsis_test_case_23)
17146 		ADD_UPLINK_TESTCASE(docsis_test_case_24)
17147 		ADD_UPLINK_TESTCASE(docsis_test_case_25)
17148 		ADD_UPLINK_TESTCASE(docsis_test_case_26)
17149 		/* Downlink */
17150 		ADD_DOWNLINK_TESTCASE(docsis_test_case_1)
17151 		ADD_DOWNLINK_TESTCASE(docsis_test_case_2)
17152 		ADD_DOWNLINK_TESTCASE(docsis_test_case_3)
17153 		ADD_DOWNLINK_TESTCASE(docsis_test_case_4)
17154 		ADD_DOWNLINK_TESTCASE(docsis_test_case_5)
17155 		ADD_DOWNLINK_TESTCASE(docsis_test_case_6)
17156 		ADD_DOWNLINK_TESTCASE(docsis_test_case_7)
17157 		ADD_DOWNLINK_TESTCASE(docsis_test_case_8)
17158 		ADD_DOWNLINK_TESTCASE(docsis_test_case_9)
17159 		ADD_DOWNLINK_TESTCASE(docsis_test_case_10)
17160 		ADD_DOWNLINK_TESTCASE(docsis_test_case_11)
17161 		ADD_DOWNLINK_TESTCASE(docsis_test_case_12)
17162 		ADD_DOWNLINK_TESTCASE(docsis_test_case_13)
17163 		ADD_DOWNLINK_TESTCASE(docsis_test_case_14)
17164 		ADD_DOWNLINK_TESTCASE(docsis_test_case_15)
17165 		ADD_DOWNLINK_TESTCASE(docsis_test_case_16)
17166 		ADD_DOWNLINK_TESTCASE(docsis_test_case_17)
17167 		ADD_DOWNLINK_TESTCASE(docsis_test_case_18)
17168 		ADD_DOWNLINK_TESTCASE(docsis_test_case_19)
17169 		ADD_DOWNLINK_TESTCASE(docsis_test_case_20)
17170 		ADD_DOWNLINK_TESTCASE(docsis_test_case_21)
17171 		ADD_DOWNLINK_TESTCASE(docsis_test_case_22)
17172 		ADD_DOWNLINK_TESTCASE(docsis_test_case_23)
17173 		ADD_DOWNLINK_TESTCASE(docsis_test_case_24)
17174 		ADD_DOWNLINK_TESTCASE(docsis_test_case_25)
17175 		ADD_DOWNLINK_TESTCASE(docsis_test_case_26)
17176 		TEST_CASES_END() /**< NULL terminate unit test array */
17177 	}
17178 };
17179 #endif
17180 
17181 static struct unit_test_suite cryptodev_gen_testsuite  = {
17182 	.suite_name = "Crypto General Unit Test Suite",
17183 	.setup = crypto_gen_testsuite_setup,
17184 	.unit_test_cases = {
17185 		TEST_CASE_ST(ut_setup, ut_teardown,
17186 				test_device_reconfigure),
17187 		TEST_CASE_ST(ut_setup, ut_teardown,
17188 				test_device_configure_invalid_dev_id),
17189 		TEST_CASE_ST(ut_setup, ut_teardown,
17190 				test_queue_pair_descriptor_setup),
17191 		TEST_CASE_ST(ut_setup, ut_teardown,
17192 				test_device_configure_invalid_queue_pair_ids),
17193 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
17194 		TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
17195 		TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
17196 		TEST_CASES_END() /**< NULL terminate unit test array */
17197 	}
17198 };
17199 
17200 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
17201 	.suite_name = "Negative HMAC SHA1 Unit Test Suite",
17202 	.setup = negative_hmac_sha1_testsuite_setup,
17203 	.unit_test_cases = {
17204 		/** Negative tests */
17205 		TEST_CASE_ST(ut_setup, ut_teardown,
17206 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
17207 		TEST_CASE_ST(ut_setup, ut_teardown,
17208 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
17209 		TEST_CASE_ST(ut_setup, ut_teardown,
17210 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
17211 		TEST_CASE_ST(ut_setup, ut_teardown,
17212 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
17213 
17214 		TEST_CASES_END() /**< NULL terminate unit test array */
17215 	}
17216 };
17217 
17218 static struct unit_test_suite cryptodev_multi_session_testsuite = {
17219 	.suite_name = "Multi Session Unit Test Suite",
17220 	.setup = multi_session_testsuite_setup,
17221 	.unit_test_cases = {
17222 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
17223 		TEST_CASE_ST(ut_setup, ut_teardown,
17224 				test_multi_session_random_usage),
17225 
17226 		TEST_CASES_END() /**< NULL terminate unit test array */
17227 	}
17228 };
17229 
17230 static struct unit_test_suite cryptodev_null_testsuite  = {
17231 	.suite_name = "NULL Test Suite",
17232 	.setup = null_testsuite_setup,
17233 	.unit_test_cases = {
17234 		TEST_CASE_ST(ut_setup, ut_teardown,
17235 			test_null_invalid_operation),
17236 		TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
17237 		TEST_CASES_END()
17238 	}
17239 };
17240 
17241 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
17242 	.suite_name = "AES CCM Authenticated Test Suite",
17243 	.setup = aes_ccm_auth_testsuite_setup,
17244 	.unit_test_cases = {
17245 		/** AES CCM Authenticated Encryption 128 bits key*/
17246 		TEST_CASE_ST(ut_setup, ut_teardown,
17247 			test_AES_CCM_authenticated_encryption_test_case_128_1),
17248 		TEST_CASE_ST(ut_setup, ut_teardown,
17249 			test_AES_CCM_authenticated_encryption_test_case_128_2),
17250 		TEST_CASE_ST(ut_setup, ut_teardown,
17251 			test_AES_CCM_authenticated_encryption_test_case_128_3),
17252 
17253 		/** AES CCM Authenticated Decryption 128 bits key*/
17254 		TEST_CASE_ST(ut_setup, ut_teardown,
17255 			test_AES_CCM_authenticated_decryption_test_case_128_1),
17256 		TEST_CASE_ST(ut_setup, ut_teardown,
17257 			test_AES_CCM_authenticated_decryption_test_case_128_2),
17258 		TEST_CASE_ST(ut_setup, ut_teardown,
17259 			test_AES_CCM_authenticated_decryption_test_case_128_3),
17260 
17261 		/** AES CCM Authenticated Encryption 192 bits key */
17262 		TEST_CASE_ST(ut_setup, ut_teardown,
17263 			test_AES_CCM_authenticated_encryption_test_case_192_1),
17264 		TEST_CASE_ST(ut_setup, ut_teardown,
17265 			test_AES_CCM_authenticated_encryption_test_case_192_2),
17266 		TEST_CASE_ST(ut_setup, ut_teardown,
17267 			test_AES_CCM_authenticated_encryption_test_case_192_3),
17268 
17269 		/** AES CCM Authenticated Decryption 192 bits key*/
17270 		TEST_CASE_ST(ut_setup, ut_teardown,
17271 			test_AES_CCM_authenticated_decryption_test_case_192_1),
17272 		TEST_CASE_ST(ut_setup, ut_teardown,
17273 			test_AES_CCM_authenticated_decryption_test_case_192_2),
17274 		TEST_CASE_ST(ut_setup, ut_teardown,
17275 			test_AES_CCM_authenticated_decryption_test_case_192_3),
17276 
17277 		/** AES CCM Authenticated Encryption 256 bits key */
17278 		TEST_CASE_ST(ut_setup, ut_teardown,
17279 			test_AES_CCM_authenticated_encryption_test_case_256_1),
17280 		TEST_CASE_ST(ut_setup, ut_teardown,
17281 			test_AES_CCM_authenticated_encryption_test_case_256_2),
17282 		TEST_CASE_ST(ut_setup, ut_teardown,
17283 			test_AES_CCM_authenticated_encryption_test_case_256_3),
17284 
17285 		/** AES CCM Authenticated Decryption 256 bits key*/
17286 		TEST_CASE_ST(ut_setup, ut_teardown,
17287 			test_AES_CCM_authenticated_decryption_test_case_256_1),
17288 		TEST_CASE_ST(ut_setup, ut_teardown,
17289 			test_AES_CCM_authenticated_decryption_test_case_256_2),
17290 		TEST_CASE_ST(ut_setup, ut_teardown,
17291 			test_AES_CCM_authenticated_decryption_test_case_256_3),
17292 		TEST_CASES_END()
17293 	}
17294 };
17295 
17296 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
17297 	.suite_name = "AES GCM Authenticated Test Suite",
17298 	.setup = aes_gcm_auth_testsuite_setup,
17299 	.unit_test_cases = {
17300 		/** AES GCM Authenticated Encryption */
17301 		TEST_CASE_ST(ut_setup, ut_teardown,
17302 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
17303 		TEST_CASE_ST(ut_setup, ut_teardown,
17304 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
17305 		TEST_CASE_ST(ut_setup, ut_teardown,
17306 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
17307 		TEST_CASE_ST(ut_setup, ut_teardown,
17308 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
17309 		TEST_CASE_ST(ut_setup, ut_teardown,
17310 			test_AES_GCM_authenticated_encryption_test_case_1),
17311 		TEST_CASE_ST(ut_setup, ut_teardown,
17312 			test_AES_GCM_authenticated_encryption_test_case_2),
17313 		TEST_CASE_ST(ut_setup, ut_teardown,
17314 			test_AES_GCM_authenticated_encryption_test_case_3),
17315 		TEST_CASE_ST(ut_setup, ut_teardown,
17316 			test_AES_GCM_authenticated_encryption_test_case_4),
17317 		TEST_CASE_ST(ut_setup, ut_teardown,
17318 			test_AES_GCM_authenticated_encryption_test_case_5),
17319 		TEST_CASE_ST(ut_setup, ut_teardown,
17320 			test_AES_GCM_authenticated_encryption_test_case_6),
17321 		TEST_CASE_ST(ut_setup, ut_teardown,
17322 			test_AES_GCM_authenticated_encryption_test_case_7),
17323 		TEST_CASE_ST(ut_setup, ut_teardown,
17324 			test_AES_GCM_authenticated_encryption_test_case_8),
17325 		TEST_CASE_ST(ut_setup, ut_teardown,
17326 			test_AES_GCM_J0_authenticated_encryption_test_case_1),
17327 
17328 		/** AES GCM Authenticated Decryption */
17329 		TEST_CASE_ST(ut_setup, ut_teardown,
17330 			test_AES_GCM_authenticated_decryption_test_case_1),
17331 		TEST_CASE_ST(ut_setup, ut_teardown,
17332 			test_AES_GCM_authenticated_decryption_test_case_2),
17333 		TEST_CASE_ST(ut_setup, ut_teardown,
17334 			test_AES_GCM_authenticated_decryption_test_case_3),
17335 		TEST_CASE_ST(ut_setup, ut_teardown,
17336 			test_AES_GCM_authenticated_decryption_test_case_4),
17337 		TEST_CASE_ST(ut_setup, ut_teardown,
17338 			test_AES_GCM_authenticated_decryption_test_case_5),
17339 		TEST_CASE_ST(ut_setup, ut_teardown,
17340 			test_AES_GCM_authenticated_decryption_test_case_6),
17341 		TEST_CASE_ST(ut_setup, ut_teardown,
17342 			test_AES_GCM_authenticated_decryption_test_case_7),
17343 		TEST_CASE_ST(ut_setup, ut_teardown,
17344 			test_AES_GCM_authenticated_decryption_test_case_8),
17345 		TEST_CASE_ST(ut_setup, ut_teardown,
17346 			test_AES_GCM_J0_authenticated_decryption_test_case_1),
17347 
17348 		/** AES GCM Authenticated Encryption 192 bits key */
17349 		TEST_CASE_ST(ut_setup, ut_teardown,
17350 			test_AES_GCM_auth_encryption_test_case_192_1),
17351 		TEST_CASE_ST(ut_setup, ut_teardown,
17352 			test_AES_GCM_auth_encryption_test_case_192_2),
17353 		TEST_CASE_ST(ut_setup, ut_teardown,
17354 			test_AES_GCM_auth_encryption_test_case_192_3),
17355 		TEST_CASE_ST(ut_setup, ut_teardown,
17356 			test_AES_GCM_auth_encryption_test_case_192_4),
17357 		TEST_CASE_ST(ut_setup, ut_teardown,
17358 			test_AES_GCM_auth_encryption_test_case_192_5),
17359 		TEST_CASE_ST(ut_setup, ut_teardown,
17360 			test_AES_GCM_auth_encryption_test_case_192_6),
17361 		TEST_CASE_ST(ut_setup, ut_teardown,
17362 			test_AES_GCM_auth_encryption_test_case_192_7),
17363 
17364 		/** AES GCM Authenticated Decryption 192 bits key */
17365 		TEST_CASE_ST(ut_setup, ut_teardown,
17366 			test_AES_GCM_auth_decryption_test_case_192_1),
17367 		TEST_CASE_ST(ut_setup, ut_teardown,
17368 			test_AES_GCM_auth_decryption_test_case_192_2),
17369 		TEST_CASE_ST(ut_setup, ut_teardown,
17370 			test_AES_GCM_auth_decryption_test_case_192_3),
17371 		TEST_CASE_ST(ut_setup, ut_teardown,
17372 			test_AES_GCM_auth_decryption_test_case_192_4),
17373 		TEST_CASE_ST(ut_setup, ut_teardown,
17374 			test_AES_GCM_auth_decryption_test_case_192_5),
17375 		TEST_CASE_ST(ut_setup, ut_teardown,
17376 			test_AES_GCM_auth_decryption_test_case_192_6),
17377 		TEST_CASE_ST(ut_setup, ut_teardown,
17378 			test_AES_GCM_auth_decryption_test_case_192_7),
17379 
17380 		/** AES GCM Authenticated Encryption 256 bits key */
17381 		TEST_CASE_ST(ut_setup, ut_teardown,
17382 			test_AES_GCM_auth_encryption_test_case_256_1),
17383 		TEST_CASE_ST(ut_setup, ut_teardown,
17384 			test_AES_GCM_auth_encryption_test_case_256_2),
17385 		TEST_CASE_ST(ut_setup, ut_teardown,
17386 			test_AES_GCM_auth_encryption_test_case_256_3),
17387 		TEST_CASE_ST(ut_setup, ut_teardown,
17388 			test_AES_GCM_auth_encryption_test_case_256_4),
17389 		TEST_CASE_ST(ut_setup, ut_teardown,
17390 			test_AES_GCM_auth_encryption_test_case_256_5),
17391 		TEST_CASE_ST(ut_setup, ut_teardown,
17392 			test_AES_GCM_auth_encryption_test_case_256_6),
17393 		TEST_CASE_ST(ut_setup, ut_teardown,
17394 			test_AES_GCM_auth_encryption_test_case_256_7),
17395 
17396 		/** AES GCM Authenticated Decryption 256 bits key */
17397 		TEST_CASE_ST(ut_setup, ut_teardown,
17398 			test_AES_GCM_auth_decryption_test_case_256_1),
17399 		TEST_CASE_ST(ut_setup, ut_teardown,
17400 			test_AES_GCM_auth_decryption_test_case_256_2),
17401 		TEST_CASE_ST(ut_setup, ut_teardown,
17402 			test_AES_GCM_auth_decryption_test_case_256_3),
17403 		TEST_CASE_ST(ut_setup, ut_teardown,
17404 			test_AES_GCM_auth_decryption_test_case_256_4),
17405 		TEST_CASE_ST(ut_setup, ut_teardown,
17406 			test_AES_GCM_auth_decryption_test_case_256_5),
17407 		TEST_CASE_ST(ut_setup, ut_teardown,
17408 			test_AES_GCM_auth_decryption_test_case_256_6),
17409 		TEST_CASE_ST(ut_setup, ut_teardown,
17410 			test_AES_GCM_auth_decryption_test_case_256_7),
17411 
17412 		/** AES GCM Authenticated Encryption big aad size */
17413 		TEST_CASE_ST(ut_setup, ut_teardown,
17414 			test_AES_GCM_auth_encryption_test_case_aad_1),
17415 		TEST_CASE_ST(ut_setup, ut_teardown,
17416 			test_AES_GCM_auth_encryption_test_case_aad_2),
17417 
17418 		/** AES GCM Authenticated Decryption big aad size */
17419 		TEST_CASE_ST(ut_setup, ut_teardown,
17420 			test_AES_GCM_auth_decryption_test_case_aad_1),
17421 		TEST_CASE_ST(ut_setup, ut_teardown,
17422 			test_AES_GCM_auth_decryption_test_case_aad_2),
17423 
17424 		/** Out of place tests */
17425 		TEST_CASE_ST(ut_setup, ut_teardown,
17426 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
17427 		TEST_CASE_ST(ut_setup, ut_teardown,
17428 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
17429 
17430 		/** Session-less tests */
17431 		TEST_CASE_ST(ut_setup, ut_teardown,
17432 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
17433 		TEST_CASE_ST(ut_setup, ut_teardown,
17434 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
17435 
17436 		TEST_CASES_END()
17437 	}
17438 };
17439 
17440 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
17441 	.suite_name = "AES GMAC Authentication Test Suite",
17442 	.setup = aes_gmac_auth_testsuite_setup,
17443 	.unit_test_cases = {
17444 		TEST_CASE_ST(ut_setup, ut_teardown,
17445 			test_AES_GMAC_authentication_test_case_1),
17446 		TEST_CASE_ST(ut_setup, ut_teardown,
17447 			test_AES_GMAC_authentication_verify_test_case_1),
17448 		TEST_CASE_ST(ut_setup, ut_teardown,
17449 			test_AES_GMAC_authentication_test_case_2),
17450 		TEST_CASE_ST(ut_setup, ut_teardown,
17451 			test_AES_GMAC_authentication_verify_test_case_2),
17452 		TEST_CASE_ST(ut_setup, ut_teardown,
17453 			test_AES_GMAC_authentication_test_case_3),
17454 		TEST_CASE_ST(ut_setup, ut_teardown,
17455 			test_AES_GMAC_authentication_verify_test_case_3),
17456 		TEST_CASE_ST(ut_setup, ut_teardown,
17457 			test_AES_GMAC_authentication_test_case_4),
17458 		TEST_CASE_ST(ut_setup, ut_teardown,
17459 			test_AES_GMAC_authentication_verify_test_case_4),
17460 		TEST_CASE_ST(ut_setup, ut_teardown,
17461 			test_AES_GMAC_authentication_SGL_40B),
17462 		TEST_CASE_ST(ut_setup, ut_teardown,
17463 			test_AES_GMAC_authentication_SGL_80B),
17464 		TEST_CASE_ST(ut_setup, ut_teardown,
17465 			test_AES_GMAC_authentication_SGL_2048B),
17466 		TEST_CASE_ST(ut_setup, ut_teardown,
17467 			test_AES_GMAC_authentication_SGL_2047B),
17468 
17469 		TEST_CASES_END()
17470 	}
17471 };
17472 
17473 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
17474 	.suite_name = "Chacha20-Poly1305 Test Suite",
17475 	.setup = chacha20_poly1305_testsuite_setup,
17476 	.unit_test_cases = {
17477 		TEST_CASE_ST(ut_setup, ut_teardown,
17478 			test_chacha20_poly1305_encrypt_test_case_rfc8439),
17479 		TEST_CASE_ST(ut_setup, ut_teardown,
17480 			test_chacha20_poly1305_decrypt_test_case_rfc8439),
17481 		TEST_CASE_ST(ut_setup, ut_teardown,
17482 			test_chacha20_poly1305_encrypt_SGL_out_of_place),
17483 		TEST_CASES_END()
17484 	}
17485 };
17486 
17487 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
17488 	.suite_name = "SNOW 3G Test Suite",
17489 	.setup = snow3g_testsuite_setup,
17490 	.unit_test_cases = {
17491 		/** SNOW 3G encrypt only (UEA2) */
17492 		TEST_CASE_ST(ut_setup, ut_teardown,
17493 			test_snow3g_encryption_test_case_1),
17494 		TEST_CASE_ST(ut_setup, ut_teardown,
17495 			test_snow3g_encryption_test_case_2),
17496 		TEST_CASE_ST(ut_setup, ut_teardown,
17497 			test_snow3g_encryption_test_case_3),
17498 		TEST_CASE_ST(ut_setup, ut_teardown,
17499 			test_snow3g_encryption_test_case_4),
17500 		TEST_CASE_ST(ut_setup, ut_teardown,
17501 			test_snow3g_encryption_test_case_5),
17502 
17503 		TEST_CASE_ST(ut_setup, ut_teardown,
17504 			test_snow3g_encryption_test_case_1_oop),
17505 		TEST_CASE_ST(ut_setup, ut_teardown,
17506 			test_snow3g_encryption_test_case_1_oop_sgl),
17507 		TEST_CASE_ST(ut_setup, ut_teardown,
17508 			test_snow3g_encryption_test_case_1_oop_lb_in_sgl_out),
17509 		TEST_CASE_ST(ut_setup, ut_teardown,
17510 			test_snow3g_encryption_test_case_1_oop_sgl_in_lb_out),
17511 		TEST_CASE_ST(ut_setup, ut_teardown,
17512 			test_snow3g_encryption_test_case_1_offset_oop),
17513 		TEST_CASE_ST(ut_setup, ut_teardown,
17514 			test_snow3g_decryption_test_case_1_oop),
17515 
17516 		/** SNOW 3G generate auth, then encrypt (UEA2) */
17517 		TEST_CASE_ST(ut_setup, ut_teardown,
17518 			test_snow3g_auth_cipher_test_case_1),
17519 		TEST_CASE_ST(ut_setup, ut_teardown,
17520 			test_snow3g_auth_cipher_test_case_2),
17521 		TEST_CASE_ST(ut_setup, ut_teardown,
17522 			test_snow3g_auth_cipher_test_case_2_oop),
17523 		TEST_CASE_ST(ut_setup, ut_teardown,
17524 			test_snow3g_auth_cipher_part_digest_enc),
17525 		TEST_CASE_ST(ut_setup, ut_teardown,
17526 			test_snow3g_auth_cipher_part_digest_enc_oop),
17527 		TEST_CASE_ST(ut_setup, ut_teardown,
17528 			test_snow3g_auth_cipher_test_case_3_sgl),
17529 		TEST_CASE_ST(ut_setup, ut_teardown,
17530 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
17531 		TEST_CASE_ST(ut_setup, ut_teardown,
17532 			test_snow3g_auth_cipher_part_digest_enc_sgl),
17533 		TEST_CASE_ST(ut_setup, ut_teardown,
17534 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
17535 		TEST_CASE_ST(ut_setup, ut_teardown,
17536 			test_snow3g_auth_cipher_total_digest_enc_1),
17537 		TEST_CASE_ST(ut_setup, ut_teardown,
17538 			test_snow3g_auth_cipher_total_digest_enc_1_oop),
17539 		TEST_CASE_ST(ut_setup, ut_teardown,
17540 			test_snow3g_auth_cipher_total_digest_enc_1_sgl),
17541 		TEST_CASE_ST(ut_setup, ut_teardown,
17542 			test_snow3g_auth_cipher_total_digest_enc_1_oop_sgl),
17543 
17544 		/** SNOW 3G decrypt (UEA2), then verify auth */
17545 		TEST_CASE_ST(ut_setup, ut_teardown,
17546 			test_snow3g_auth_cipher_verify_test_case_1),
17547 		TEST_CASE_ST(ut_setup, ut_teardown,
17548 			test_snow3g_auth_cipher_verify_test_case_2),
17549 		TEST_CASE_ST(ut_setup, ut_teardown,
17550 			test_snow3g_auth_cipher_verify_test_case_2_oop),
17551 		TEST_CASE_ST(ut_setup, ut_teardown,
17552 			test_snow3g_auth_cipher_verify_part_digest_enc),
17553 		TEST_CASE_ST(ut_setup, ut_teardown,
17554 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
17555 		TEST_CASE_ST(ut_setup, ut_teardown,
17556 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
17557 		TEST_CASE_ST(ut_setup, ut_teardown,
17558 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
17559 		TEST_CASE_ST(ut_setup, ut_teardown,
17560 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
17561 		TEST_CASE_ST(ut_setup, ut_teardown,
17562 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
17563 		TEST_CASE_ST(ut_setup, ut_teardown,
17564 			test_snow3g_auth_cipher_verify_total_digest_enc_1),
17565 		TEST_CASE_ST(ut_setup, ut_teardown,
17566 			test_snow3g_auth_cipher_verify_total_digest_enc_1_oop),
17567 		TEST_CASE_ST(ut_setup, ut_teardown,
17568 			test_snow3g_auth_cipher_verify_total_digest_enc_1_sgl),
17569 		TEST_CASE_ST(ut_setup, ut_teardown,
17570 			test_snow3g_auth_cipher_verify_total_digest_enc_1_oop_sgl),
17571 
17572 		/** SNOW 3G decrypt only (UEA2) */
17573 		TEST_CASE_ST(ut_setup, ut_teardown,
17574 			test_snow3g_decryption_test_case_1),
17575 		TEST_CASE_ST(ut_setup, ut_teardown,
17576 			test_snow3g_decryption_test_case_2),
17577 		TEST_CASE_ST(ut_setup, ut_teardown,
17578 			test_snow3g_decryption_test_case_3),
17579 		TEST_CASE_ST(ut_setup, ut_teardown,
17580 			test_snow3g_decryption_test_case_4),
17581 		TEST_CASE_ST(ut_setup, ut_teardown,
17582 			test_snow3g_decryption_test_case_5),
17583 		TEST_CASE_ST(ut_setup, ut_teardown,
17584 			test_snow3g_decryption_with_digest_test_case_1),
17585 		TEST_CASE_ST(ut_setup, ut_teardown,
17586 			test_snow3g_hash_generate_test_case_1),
17587 		TEST_CASE_ST(ut_setup, ut_teardown,
17588 			test_snow3g_hash_generate_test_case_2),
17589 		TEST_CASE_ST(ut_setup, ut_teardown,
17590 			test_snow3g_hash_generate_test_case_3),
17591 
17592 		/* Tests with buffers which length is not byte-aligned */
17593 		TEST_CASE_ST(ut_setup, ut_teardown,
17594 			test_snow3g_hash_generate_test_case_4),
17595 		TEST_CASE_ST(ut_setup, ut_teardown,
17596 			test_snow3g_hash_generate_test_case_5),
17597 		TEST_CASE_ST(ut_setup, ut_teardown,
17598 			test_snow3g_hash_generate_test_case_6),
17599 		TEST_CASE_ST(ut_setup, ut_teardown,
17600 			test_snow3g_hash_verify_test_case_1),
17601 		TEST_CASE_ST(ut_setup, ut_teardown,
17602 			test_snow3g_hash_verify_test_case_2),
17603 		TEST_CASE_ST(ut_setup, ut_teardown,
17604 			test_snow3g_hash_verify_test_case_3),
17605 
17606 		/* Tests with buffers which length is not byte-aligned */
17607 		TEST_CASE_ST(ut_setup, ut_teardown,
17608 			test_snow3g_hash_verify_test_case_4),
17609 		TEST_CASE_ST(ut_setup, ut_teardown,
17610 			test_snow3g_hash_verify_test_case_5),
17611 		TEST_CASE_ST(ut_setup, ut_teardown,
17612 			test_snow3g_hash_verify_test_case_6),
17613 		TEST_CASE_ST(ut_setup, ut_teardown,
17614 			test_snow3g_cipher_auth_test_case_1),
17615 		TEST_CASE_ST(ut_setup, ut_teardown,
17616 			test_snow3g_auth_cipher_with_digest_test_case_1),
17617 		TEST_CASES_END()
17618 	}
17619 };
17620 
17621 static struct unit_test_suite cryptodev_zuc_testsuite  = {
17622 	.suite_name = "ZUC Test Suite",
17623 	.setup = zuc_testsuite_setup,
17624 	.unit_test_cases = {
17625 		/** ZUC encrypt only (EEA3) */
17626 		TEST_CASE_ST(ut_setup, ut_teardown,
17627 			test_zuc_encryption_test_case_1),
17628 		TEST_CASE_ST(ut_setup, ut_teardown,
17629 			test_zuc_encryption_test_case_2),
17630 		TEST_CASE_ST(ut_setup, ut_teardown,
17631 			test_zuc_encryption_test_case_3),
17632 		TEST_CASE_ST(ut_setup, ut_teardown,
17633 			test_zuc_encryption_test_case_4),
17634 		TEST_CASE_ST(ut_setup, ut_teardown,
17635 			test_zuc_encryption_test_case_5),
17636 		TEST_CASE_ST(ut_setup, ut_teardown,
17637 			test_zuc_encryption_test_case_6_sgl),
17638 
17639 		/** ZUC decrypt only (EEA3) */
17640 		TEST_CASE_ST(ut_setup, ut_teardown,
17641 			test_zuc_decryption_test_case_1),
17642 		TEST_CASE_ST(ut_setup, ut_teardown,
17643 			test_zuc_decryption_test_case_2),
17644 		TEST_CASE_ST(ut_setup, ut_teardown,
17645 			test_zuc_decryption_test_case_3),
17646 		TEST_CASE_ST(ut_setup, ut_teardown,
17647 			test_zuc_decryption_test_case_4),
17648 		TEST_CASE_ST(ut_setup, ut_teardown,
17649 			test_zuc_decryption_test_case_5),
17650 		TEST_CASE_ST(ut_setup, ut_teardown,
17651 			test_zuc_decryption_test_case_6_sgl),
17652 
17653 		/** ZUC authenticate (EIA3) */
17654 		TEST_CASE_ST(ut_setup, ut_teardown,
17655 			test_zuc_hash_generate_test_case_1),
17656 		TEST_CASE_ST(ut_setup, ut_teardown,
17657 			test_zuc_hash_generate_test_case_2),
17658 		TEST_CASE_ST(ut_setup, ut_teardown,
17659 			test_zuc_hash_generate_test_case_3),
17660 		TEST_CASE_ST(ut_setup, ut_teardown,
17661 			test_zuc_hash_generate_test_case_4),
17662 		TEST_CASE_ST(ut_setup, ut_teardown,
17663 			test_zuc_hash_generate_test_case_5),
17664 		TEST_CASE_ST(ut_setup, ut_teardown,
17665 			test_zuc_hash_generate_test_case_6),
17666 		TEST_CASE_ST(ut_setup, ut_teardown,
17667 			test_zuc_hash_generate_test_case_7),
17668 		TEST_CASE_ST(ut_setup, ut_teardown,
17669 			test_zuc_hash_generate_test_case_8),
17670 
17671 		/** ZUC verify (EIA3) */
17672 		TEST_CASE_ST(ut_setup, ut_teardown,
17673 			test_zuc_hash_verify_test_case_1),
17674 		TEST_CASE_ST(ut_setup, ut_teardown,
17675 			test_zuc_hash_verify_test_case_2),
17676 		TEST_CASE_ST(ut_setup, ut_teardown,
17677 			test_zuc_hash_verify_test_case_3),
17678 		TEST_CASE_ST(ut_setup, ut_teardown,
17679 			test_zuc_hash_verify_test_case_4),
17680 		TEST_CASE_ST(ut_setup, ut_teardown,
17681 			test_zuc_hash_verify_test_case_5),
17682 		TEST_CASE_ST(ut_setup, ut_teardown,
17683 			test_zuc_hash_verify_test_case_6),
17684 		TEST_CASE_ST(ut_setup, ut_teardown,
17685 			test_zuc_hash_verify_test_case_7),
17686 		TEST_CASE_ST(ut_setup, ut_teardown,
17687 			test_zuc_hash_verify_test_case_8),
17688 
17689 		/** ZUC alg-chain (EEA3/EIA3) */
17690 		TEST_CASE_ST(ut_setup, ut_teardown,
17691 			test_zuc_cipher_auth_test_case_1),
17692 		TEST_CASE_ST(ut_setup, ut_teardown,
17693 			test_zuc_cipher_auth_test_case_2),
17694 
17695 		/** ZUC generate auth, then encrypt (EEA3) */
17696 		TEST_CASE_ST(ut_setup, ut_teardown,
17697 			test_zuc_auth_cipher_test_case_1),
17698 		TEST_CASE_ST(ut_setup, ut_teardown,
17699 			test_zuc_auth_cipher_test_case_1_oop),
17700 		TEST_CASE_ST(ut_setup, ut_teardown,
17701 			test_zuc_auth_cipher_test_case_1_sgl),
17702 		TEST_CASE_ST(ut_setup, ut_teardown,
17703 			test_zuc_auth_cipher_test_case_1_oop_sgl),
17704 		TEST_CASE_ST(ut_setup, ut_teardown,
17705 			test_zuc_auth_cipher_test_case_2),
17706 		TEST_CASE_ST(ut_setup, ut_teardown,
17707 			test_zuc_auth_cipher_test_case_2_oop),
17708 
17709 		/** ZUC decrypt (EEA3), then verify auth */
17710 		TEST_CASE_ST(ut_setup, ut_teardown,
17711 			test_zuc_auth_cipher_verify_test_case_1),
17712 		TEST_CASE_ST(ut_setup, ut_teardown,
17713 			test_zuc_auth_cipher_verify_test_case_1_oop),
17714 		TEST_CASE_ST(ut_setup, ut_teardown,
17715 			test_zuc_auth_cipher_verify_test_case_1_sgl),
17716 		TEST_CASE_ST(ut_setup, ut_teardown,
17717 			test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
17718 		TEST_CASE_ST(ut_setup, ut_teardown,
17719 			test_zuc_auth_cipher_verify_test_case_2),
17720 		TEST_CASE_ST(ut_setup, ut_teardown,
17721 			test_zuc_auth_cipher_verify_test_case_2_oop),
17722 
17723 		/** ZUC-256 encrypt only **/
17724 		TEST_CASE_ST(ut_setup, ut_teardown,
17725 			test_zuc256_encryption_test_case_1),
17726 		TEST_CASE_ST(ut_setup, ut_teardown,
17727 			test_zuc256_encryption_test_case_2),
17728 
17729 		/** ZUC-256 decrypt only **/
17730 		TEST_CASE_ST(ut_setup, ut_teardown,
17731 			test_zuc256_decryption_test_case_1),
17732 		TEST_CASE_ST(ut_setup, ut_teardown,
17733 			test_zuc256_decryption_test_case_2),
17734 
17735 		/** ZUC-256 authentication only **/
17736 		TEST_CASE_ST(ut_setup, ut_teardown,
17737 			test_zuc256_hash_generate_4b_tag_test_case_1),
17738 		TEST_CASE_ST(ut_setup, ut_teardown,
17739 			test_zuc256_hash_generate_4b_tag_test_case_2),
17740 		TEST_CASE_ST(ut_setup, ut_teardown,
17741 			test_zuc256_hash_generate_4b_tag_test_case_3),
17742 		TEST_CASE_ST(ut_setup, ut_teardown,
17743 			test_zuc256_hash_generate_8b_tag_test_case_1),
17744 		TEST_CASE_ST(ut_setup, ut_teardown,
17745 			test_zuc256_hash_generate_16b_tag_test_case_1),
17746 
17747 		/** ZUC-256 authentication verify only **/
17748 		TEST_CASE_ST(ut_setup, ut_teardown,
17749 			test_zuc256_hash_verify_4b_tag_test_case_1),
17750 		TEST_CASE_ST(ut_setup, ut_teardown,
17751 			test_zuc256_hash_verify_4b_tag_test_case_2),
17752 		TEST_CASE_ST(ut_setup, ut_teardown,
17753 			test_zuc256_hash_verify_4b_tag_test_case_3),
17754 		TEST_CASE_ST(ut_setup, ut_teardown,
17755 			test_zuc256_hash_verify_8b_tag_test_case_1),
17756 		TEST_CASE_ST(ut_setup, ut_teardown,
17757 			test_zuc256_hash_verify_16b_tag_test_case_1),
17758 
17759 		/** ZUC-256 encrypt and authenticate **/
17760 		TEST_CASE_ST(ut_setup, ut_teardown,
17761 			test_zuc256_cipher_auth_4b_tag_test_case_1),
17762 		TEST_CASE_ST(ut_setup, ut_teardown,
17763 			test_zuc256_cipher_auth_4b_tag_test_case_2),
17764 		TEST_CASE_ST(ut_setup, ut_teardown,
17765 			test_zuc256_cipher_auth_8b_tag_test_case_1),
17766 		TEST_CASE_ST(ut_setup, ut_teardown,
17767 			test_zuc256_cipher_auth_16b_tag_test_case_1),
17768 
17769 		/** ZUC-256 generate auth, then encrypt */
17770 		TEST_CASE_ST(ut_setup, ut_teardown,
17771 			test_zuc256_auth_cipher_4b_tag_test_case_1),
17772 		TEST_CASE_ST(ut_setup, ut_teardown,
17773 			test_zuc256_auth_cipher_4b_tag_test_case_2),
17774 		TEST_CASE_ST(ut_setup, ut_teardown,
17775 			test_zuc256_auth_cipher_8b_tag_test_case_1),
17776 		TEST_CASE_ST(ut_setup, ut_teardown,
17777 			test_zuc256_auth_cipher_16b_tag_test_case_1),
17778 
17779 		/** ZUC-256 decrypt, then verify auth */
17780 		TEST_CASE_ST(ut_setup, ut_teardown,
17781 			test_zuc256_auth_cipher_verify_4b_tag_test_case_1),
17782 		TEST_CASE_ST(ut_setup, ut_teardown,
17783 			test_zuc256_auth_cipher_verify_4b_tag_test_case_2),
17784 		TEST_CASE_ST(ut_setup, ut_teardown,
17785 			test_zuc256_auth_cipher_verify_8b_tag_test_case_1),
17786 		TEST_CASE_ST(ut_setup, ut_teardown,
17787 			test_zuc256_auth_cipher_verify_16b_tag_test_case_1),
17788 
17789 		TEST_CASES_END()
17790 	}
17791 };
17792 
17793 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
17794 	.suite_name = "HMAC_MD5 Authentication Test Suite",
17795 	.setup = hmac_md5_auth_testsuite_setup,
17796 	.unit_test_cases = {
17797 		TEST_CASE_ST(ut_setup, ut_teardown,
17798 			test_MD5_HMAC_generate_case_1),
17799 		TEST_CASE_ST(ut_setup, ut_teardown,
17800 			test_MD5_HMAC_verify_case_1),
17801 		TEST_CASE_ST(ut_setup, ut_teardown,
17802 			test_MD5_HMAC_generate_case_2),
17803 		TEST_CASE_ST(ut_setup, ut_teardown,
17804 			test_MD5_HMAC_verify_case_2),
17805 		TEST_CASES_END()
17806 	}
17807 };
17808 
17809 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
17810 	.suite_name = "Kasumi Test Suite",
17811 	.setup = kasumi_testsuite_setup,
17812 	.unit_test_cases = {
17813 		/** KASUMI hash only (UIA1) */
17814 		TEST_CASE_ST(ut_setup, ut_teardown,
17815 			test_kasumi_hash_generate_test_case_1),
17816 		TEST_CASE_ST(ut_setup, ut_teardown,
17817 			test_kasumi_hash_generate_test_case_2),
17818 		TEST_CASE_ST(ut_setup, ut_teardown,
17819 			test_kasumi_hash_generate_test_case_3),
17820 		TEST_CASE_ST(ut_setup, ut_teardown,
17821 			test_kasumi_hash_generate_test_case_4),
17822 		TEST_CASE_ST(ut_setup, ut_teardown,
17823 			test_kasumi_hash_generate_test_case_5),
17824 		TEST_CASE_ST(ut_setup, ut_teardown,
17825 			test_kasumi_hash_generate_test_case_6),
17826 
17827 		TEST_CASE_ST(ut_setup, ut_teardown,
17828 			test_kasumi_hash_verify_test_case_1),
17829 		TEST_CASE_ST(ut_setup, ut_teardown,
17830 			test_kasumi_hash_verify_test_case_2),
17831 		TEST_CASE_ST(ut_setup, ut_teardown,
17832 			test_kasumi_hash_verify_test_case_3),
17833 		TEST_CASE_ST(ut_setup, ut_teardown,
17834 			test_kasumi_hash_verify_test_case_4),
17835 		TEST_CASE_ST(ut_setup, ut_teardown,
17836 			test_kasumi_hash_verify_test_case_5),
17837 
17838 		/** KASUMI encrypt only (UEA1) */
17839 		TEST_CASE_ST(ut_setup, ut_teardown,
17840 			test_kasumi_encryption_test_case_1),
17841 		TEST_CASE_ST(ut_setup, ut_teardown,
17842 			test_kasumi_encryption_test_case_1_sgl),
17843 		TEST_CASE_ST(ut_setup, ut_teardown,
17844 			test_kasumi_encryption_test_case_1_oop),
17845 		TEST_CASE_ST(ut_setup, ut_teardown,
17846 			test_kasumi_encryption_test_case_1_oop_sgl),
17847 		TEST_CASE_ST(ut_setup, ut_teardown,
17848 			test_kasumi_encryption_test_case_2),
17849 		TEST_CASE_ST(ut_setup, ut_teardown,
17850 			test_kasumi_encryption_test_case_3),
17851 		TEST_CASE_ST(ut_setup, ut_teardown,
17852 			test_kasumi_encryption_test_case_4),
17853 		TEST_CASE_ST(ut_setup, ut_teardown,
17854 			test_kasumi_encryption_test_case_5),
17855 
17856 		/** KASUMI decrypt only (UEA1) */
17857 		TEST_CASE_ST(ut_setup, ut_teardown,
17858 			test_kasumi_decryption_test_case_1),
17859 		TEST_CASE_ST(ut_setup, ut_teardown,
17860 			test_kasumi_decryption_test_case_2),
17861 		TEST_CASE_ST(ut_setup, ut_teardown,
17862 			test_kasumi_decryption_test_case_3),
17863 		TEST_CASE_ST(ut_setup, ut_teardown,
17864 			test_kasumi_decryption_test_case_4),
17865 		TEST_CASE_ST(ut_setup, ut_teardown,
17866 			test_kasumi_decryption_test_case_5),
17867 		TEST_CASE_ST(ut_setup, ut_teardown,
17868 			test_kasumi_decryption_test_case_1_oop),
17869 		TEST_CASE_ST(ut_setup, ut_teardown,
17870 			test_kasumi_cipher_auth_test_case_1),
17871 
17872 		/** KASUMI generate auth, then encrypt (F8) */
17873 		TEST_CASE_ST(ut_setup, ut_teardown,
17874 			test_kasumi_auth_cipher_test_case_1),
17875 		TEST_CASE_ST(ut_setup, ut_teardown,
17876 			test_kasumi_auth_cipher_test_case_2),
17877 		TEST_CASE_ST(ut_setup, ut_teardown,
17878 			test_kasumi_auth_cipher_test_case_2_oop),
17879 		TEST_CASE_ST(ut_setup, ut_teardown,
17880 			test_kasumi_auth_cipher_test_case_2_sgl),
17881 		TEST_CASE_ST(ut_setup, ut_teardown,
17882 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
17883 
17884 		/** KASUMI decrypt (F8), then verify auth */
17885 		TEST_CASE_ST(ut_setup, ut_teardown,
17886 			test_kasumi_auth_cipher_verify_test_case_1),
17887 		TEST_CASE_ST(ut_setup, ut_teardown,
17888 			test_kasumi_auth_cipher_verify_test_case_2),
17889 		TEST_CASE_ST(ut_setup, ut_teardown,
17890 			test_kasumi_auth_cipher_verify_test_case_2_oop),
17891 		TEST_CASE_ST(ut_setup, ut_teardown,
17892 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
17893 		TEST_CASE_ST(ut_setup, ut_teardown,
17894 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
17895 
17896 		TEST_CASES_END()
17897 	}
17898 };
17899 
17900 static struct unit_test_suite cryptodev_esn_testsuite  = {
17901 	.suite_name = "ESN Test Suite",
17902 	.setup = esn_testsuite_setup,
17903 	.unit_test_cases = {
17904 		TEST_CASE_ST(ut_setup, ut_teardown,
17905 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
17906 		TEST_CASE_ST(ut_setup, ut_teardown,
17907 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
17908 		TEST_CASES_END()
17909 	}
17910 };
17911 
17912 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
17913 	.suite_name = "Negative AES GCM Test Suite",
17914 	.setup = negative_aes_gcm_testsuite_setup,
17915 	.unit_test_cases = {
17916 		TEST_CASE_ST(ut_setup, ut_teardown,
17917 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
17918 		TEST_CASE_ST(ut_setup, ut_teardown,
17919 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
17920 		TEST_CASE_ST(ut_setup, ut_teardown,
17921 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
17922 		TEST_CASE_ST(ut_setup, ut_teardown,
17923 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
17924 		TEST_CASE_ST(ut_setup, ut_teardown,
17925 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
17926 		TEST_CASE_ST(ut_setup, ut_teardown,
17927 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
17928 		TEST_CASE_ST(ut_setup, ut_teardown,
17929 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
17930 		TEST_CASE_ST(ut_setup, ut_teardown,
17931 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
17932 		TEST_CASE_ST(ut_setup, ut_teardown,
17933 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
17934 		TEST_CASE_ST(ut_setup, ut_teardown,
17935 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
17936 		TEST_CASE_ST(ut_setup, ut_teardown,
17937 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
17938 		TEST_CASE_ST(ut_setup, ut_teardown,
17939 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
17940 
17941 		TEST_CASES_END()
17942 	}
17943 };
17944 
17945 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
17946 	.suite_name = "Negative AES GMAC Test Suite",
17947 	.setup = negative_aes_gmac_testsuite_setup,
17948 	.unit_test_cases = {
17949 		TEST_CASE_ST(ut_setup, ut_teardown,
17950 			authentication_verify_AES128_GMAC_fail_data_corrupt),
17951 		TEST_CASE_ST(ut_setup, ut_teardown,
17952 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
17953 
17954 		TEST_CASES_END()
17955 	}
17956 };
17957 
17958 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
17959 	.suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
17960 	.setup = mixed_cipher_hash_testsuite_setup,
17961 	.unit_test_cases = {
17962 		/** AUTH AES CMAC + CIPHER AES CTR */
17963 		TEST_CASE_ST(ut_setup, ut_teardown,
17964 			test_aes_cmac_aes_ctr_digest_enc_test_case_1),
17965 		TEST_CASE_ST(ut_setup, ut_teardown,
17966 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
17967 		TEST_CASE_ST(ut_setup, ut_teardown,
17968 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
17969 		TEST_CASE_ST(ut_setup, ut_teardown,
17970 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
17971 		TEST_CASE_ST(ut_setup, ut_teardown,
17972 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
17973 		TEST_CASE_ST(ut_setup, ut_teardown,
17974 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
17975 		TEST_CASE_ST(ut_setup, ut_teardown,
17976 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
17977 		TEST_CASE_ST(ut_setup, ut_teardown,
17978 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
17979 		TEST_CASE_ST(ut_setup, ut_teardown,
17980 			test_aes_cmac_aes_ctr_digest_enc_test_case_2),
17981 		TEST_CASE_ST(ut_setup, ut_teardown,
17982 			test_aes_cmac_aes_ctr_digest_enc_test_case_2_oop),
17983 		TEST_CASE_ST(ut_setup, ut_teardown,
17984 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_2),
17985 		TEST_CASE_ST(ut_setup, ut_teardown,
17986 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_2_oop),
17987 
17988 		/** AUTH ZUC + CIPHER SNOW3G */
17989 		TEST_CASE_ST(ut_setup, ut_teardown,
17990 			test_auth_zuc_cipher_snow_test_case_1),
17991 		TEST_CASE_ST(ut_setup, ut_teardown,
17992 			test_verify_auth_zuc_cipher_snow_test_case_1),
17993 		TEST_CASE_ST(ut_setup, ut_teardown,
17994 			test_auth_zuc_cipher_snow_test_case_1_inplace),
17995 		TEST_CASE_ST(ut_setup, ut_teardown,
17996 			test_verify_auth_zuc_cipher_snow_test_case_1_inplace),
17997 		/** AUTH AES CMAC + CIPHER SNOW3G */
17998 		TEST_CASE_ST(ut_setup, ut_teardown,
17999 			test_auth_aes_cmac_cipher_snow_test_case_1),
18000 		TEST_CASE_ST(ut_setup, ut_teardown,
18001 			test_verify_auth_aes_cmac_cipher_snow_test_case_1),
18002 		TEST_CASE_ST(ut_setup, ut_teardown,
18003 			test_auth_aes_cmac_cipher_snow_test_case_1_inplace),
18004 		TEST_CASE_ST(ut_setup, ut_teardown,
18005 			test_verify_auth_aes_cmac_cipher_snow_test_case_1_inplace),
18006 		/** AUTH ZUC + CIPHER AES CTR */
18007 		TEST_CASE_ST(ut_setup, ut_teardown,
18008 			test_auth_zuc_cipher_aes_ctr_test_case_1),
18009 		TEST_CASE_ST(ut_setup, ut_teardown,
18010 			test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
18011 		TEST_CASE_ST(ut_setup, ut_teardown,
18012 			test_auth_zuc_cipher_aes_ctr_test_case_1_inplace),
18013 		TEST_CASE_ST(ut_setup, ut_teardown,
18014 			test_verify_auth_zuc_cipher_aes_ctr_test_case_1_inplace),
18015 		/** AUTH SNOW3G + CIPHER AES CTR */
18016 		TEST_CASE_ST(ut_setup, ut_teardown,
18017 			test_auth_snow_cipher_aes_ctr_test_case_1),
18018 		TEST_CASE_ST(ut_setup, ut_teardown,
18019 			test_verify_auth_snow_cipher_aes_ctr_test_case_1),
18020 		TEST_CASE_ST(ut_setup, ut_teardown,
18021 			test_auth_snow_cipher_aes_ctr_test_case_1_inplace),
18022 		TEST_CASE_ST(ut_setup, ut_teardown,
18023 			test_auth_snow_cipher_aes_ctr_test_case_1_inplace_sgl),
18024 		TEST_CASE_ST(ut_setup, ut_teardown,
18025 			test_verify_auth_snow_cipher_aes_ctr_test_case_1_inplace),
18026 		TEST_CASE_ST(ut_setup, ut_teardown,
18027 			test_verify_auth_snow_cipher_aes_ctr_test_case_1_inplace_sgl),
18028 		/** AUTH SNOW3G + CIPHER ZUC */
18029 		TEST_CASE_ST(ut_setup, ut_teardown,
18030 			test_auth_snow_cipher_zuc_test_case_1),
18031 		TEST_CASE_ST(ut_setup, ut_teardown,
18032 			test_verify_auth_snow_cipher_zuc_test_case_1),
18033 		TEST_CASE_ST(ut_setup, ut_teardown,
18034 			test_auth_snow_cipher_zuc_test_case_1_inplace),
18035 		TEST_CASE_ST(ut_setup, ut_teardown,
18036 			test_verify_auth_snow_cipher_zuc_test_case_1_inplace),
18037 		/** AUTH AES CMAC + CIPHER ZUC */
18038 		TEST_CASE_ST(ut_setup, ut_teardown,
18039 			test_auth_aes_cmac_cipher_zuc_test_case_1),
18040 		TEST_CASE_ST(ut_setup, ut_teardown,
18041 			test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
18042 		TEST_CASE_ST(ut_setup, ut_teardown,
18043 			test_auth_aes_cmac_cipher_zuc_test_case_1_inplace),
18044 		TEST_CASE_ST(ut_setup, ut_teardown,
18045 			test_verify_auth_aes_cmac_cipher_zuc_test_case_1_inplace),
18046 
18047 		/** AUTH NULL + CIPHER SNOW3G */
18048 		TEST_CASE_ST(ut_setup, ut_teardown,
18049 			test_auth_null_cipher_snow_test_case_1),
18050 		TEST_CASE_ST(ut_setup, ut_teardown,
18051 			test_verify_auth_null_cipher_snow_test_case_1),
18052 		/** AUTH NULL + CIPHER ZUC */
18053 		TEST_CASE_ST(ut_setup, ut_teardown,
18054 			test_auth_null_cipher_zuc_test_case_1),
18055 		TEST_CASE_ST(ut_setup, ut_teardown,
18056 			test_verify_auth_null_cipher_zuc_test_case_1),
18057 		/** AUTH SNOW3G + CIPHER NULL */
18058 		TEST_CASE_ST(ut_setup, ut_teardown,
18059 			test_auth_snow_cipher_null_test_case_1),
18060 		TEST_CASE_ST(ut_setup, ut_teardown,
18061 			test_verify_auth_snow_cipher_null_test_case_1),
18062 		/** AUTH ZUC + CIPHER NULL */
18063 		TEST_CASE_ST(ut_setup, ut_teardown,
18064 			test_auth_zuc_cipher_null_test_case_1),
18065 		TEST_CASE_ST(ut_setup, ut_teardown,
18066 			test_verify_auth_zuc_cipher_null_test_case_1),
18067 		/** AUTH NULL + CIPHER AES CTR */
18068 		TEST_CASE_ST(ut_setup, ut_teardown,
18069 			test_auth_null_cipher_aes_ctr_test_case_1),
18070 		TEST_CASE_ST(ut_setup, ut_teardown,
18071 			test_verify_auth_null_cipher_aes_ctr_test_case_1),
18072 		/** AUTH AES CMAC + CIPHER NULL */
18073 		TEST_CASE_ST(ut_setup, ut_teardown,
18074 			test_auth_aes_cmac_cipher_null_test_case_1),
18075 		TEST_CASE_ST(ut_setup, ut_teardown,
18076 			test_verify_auth_aes_cmac_cipher_null_test_case_1),
18077 		TEST_CASES_END()
18078 	}
18079 };
18080 
18081 static int
18082 run_cryptodev_testsuite(const char *pmd_name)
18083 {
18084 	uint8_t ret, j, i = 0, blk_start_idx = 0;
18085 	const enum blockcipher_test_type blk_suites[] = {
18086 		BLKCIPHER_AES_CHAIN_TYPE,
18087 		BLKCIPHER_AES_CIPHERONLY_TYPE,
18088 		BLKCIPHER_AES_DOCSIS_TYPE,
18089 		BLKCIPHER_3DES_CHAIN_TYPE,
18090 		BLKCIPHER_3DES_CIPHERONLY_TYPE,
18091 		BLKCIPHER_DES_CIPHERONLY_TYPE,
18092 		BLKCIPHER_DES_DOCSIS_TYPE,
18093 		BLKCIPHER_SM4_CHAIN_TYPE,
18094 		BLKCIPHER_SM4_CIPHERONLY_TYPE,
18095 		BLKCIPHER_AUTHONLY_TYPE};
18096 	struct unit_test_suite *static_suites[] = {
18097 		&cryptodev_multi_session_testsuite,
18098 		&cryptodev_null_testsuite,
18099 		&cryptodev_aes_ccm_auth_testsuite,
18100 		&cryptodev_aes_gcm_auth_testsuite,
18101 		&cryptodev_aes_gmac_auth_testsuite,
18102 		&cryptodev_snow3g_testsuite,
18103 		&cryptodev_chacha20_poly1305_testsuite,
18104 		&cryptodev_zuc_testsuite,
18105 		&cryptodev_hmac_md5_auth_testsuite,
18106 		&cryptodev_kasumi_testsuite,
18107 		&cryptodev_esn_testsuite,
18108 		&cryptodev_negative_aes_gcm_testsuite,
18109 		&cryptodev_negative_aes_gmac_testsuite,
18110 		&cryptodev_mixed_cipher_hash_testsuite,
18111 		&cryptodev_negative_hmac_sha1_testsuite,
18112 		&cryptodev_gen_testsuite,
18113 #ifdef RTE_LIB_SECURITY
18114 		&ipsec_proto_testsuite,
18115 		&pdcp_proto_testsuite,
18116 		&docsis_proto_testsuite,
18117 		&tls12_record_proto_testsuite,
18118 		&dtls12_record_proto_testsuite,
18119 #endif
18120 		&end_testsuite
18121 	};
18122 	static struct unit_test_suite ts = {
18123 		.suite_name = "Cryptodev Unit Test Suite",
18124 		.setup = testsuite_setup,
18125 		.teardown = testsuite_teardown,
18126 		.unit_test_cases = {TEST_CASES_END()}
18127 	};
18128 
18129 	gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
18130 
18131 	if (gbl_driver_id == -1) {
18132 		RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
18133 		return TEST_SKIPPED;
18134 	}
18135 
18136 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
18137 			(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
18138 
18139 	ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
18140 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
18141 	ret = unit_test_suite_runner(&ts);
18142 
18143 	FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
18144 	free(ts.unit_test_suites);
18145 	return ret;
18146 }
18147 
18148 static int
18149 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
18150 {
18151 	struct rte_cryptodev_info dev_info;
18152 	uint8_t i, nb_devs;
18153 	int driver_id;
18154 
18155 	driver_id = rte_cryptodev_driver_id_get(pmd_name);
18156 	if (driver_id == -1) {
18157 		RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
18158 		return TEST_SKIPPED;
18159 	}
18160 
18161 	nb_devs = rte_cryptodev_count();
18162 	if (nb_devs < 1) {
18163 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
18164 		return TEST_SKIPPED;
18165 	}
18166 
18167 	for (i = 0; i < nb_devs; i++) {
18168 		rte_cryptodev_info_get(i, &dev_info);
18169 		if (dev_info.driver_id == driver_id) {
18170 			if (!(dev_info.feature_flags & flag)) {
18171 				RTE_LOG(INFO, USER1, "%s not supported\n",
18172 						flag_name);
18173 				return TEST_SKIPPED;
18174 			}
18175 			return 0; /* found */
18176 		}
18177 	}
18178 
18179 	RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
18180 	return TEST_SKIPPED;
18181 }
18182 
18183 static int
18184 test_cryptodev_qat(void)
18185 {
18186 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
18187 }
18188 
18189 static int
18190 test_cryptodev_uadk(void)
18191 {
18192 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_UADK_PMD));
18193 }
18194 
18195 static int
18196 test_cryptodev_virtio(void)
18197 {
18198 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
18199 }
18200 
18201 static int
18202 test_cryptodev_aesni_mb(void)
18203 {
18204 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
18205 }
18206 
18207 static int
18208 test_cryptodev_cpu_aesni_mb(void)
18209 {
18210 	int32_t rc;
18211 	enum rte_security_session_action_type at = gbl_action_type;
18212 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
18213 	rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
18214 	gbl_action_type = at;
18215 	return rc;
18216 }
18217 
18218 static int
18219 test_cryptodev_chacha_poly_mb(void)
18220 {
18221 	int32_t rc;
18222 	enum rte_security_session_action_type at = gbl_action_type;
18223 	rc = run_cryptodev_testsuite(
18224 			RTE_STR(CRYPTODEV_NAME_CHACHA20_POLY1305_PMD));
18225 	gbl_action_type = at;
18226 	return rc;
18227 }
18228 
18229 static int
18230 test_cryptodev_openssl(void)
18231 {
18232 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
18233 }
18234 
18235 static int
18236 test_cryptodev_aesni_gcm(void)
18237 {
18238 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
18239 }
18240 
18241 static int
18242 test_cryptodev_cpu_aesni_gcm(void)
18243 {
18244 	int32_t rc;
18245 	enum rte_security_session_action_type at = gbl_action_type;
18246 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
18247 	rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
18248 	gbl_action_type = at;
18249 	return rc;
18250 }
18251 
18252 static int
18253 test_cryptodev_mlx5(void)
18254 {
18255 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
18256 }
18257 
18258 static int
18259 test_cryptodev_null(void)
18260 {
18261 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
18262 }
18263 
18264 static int
18265 test_cryptodev_sw_snow3g(void)
18266 {
18267 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
18268 }
18269 
18270 static int
18271 test_cryptodev_sw_kasumi(void)
18272 {
18273 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
18274 }
18275 
18276 static int
18277 test_cryptodev_sw_zuc(void)
18278 {
18279 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
18280 }
18281 
18282 static int
18283 test_cryptodev_armv8(void)
18284 {
18285 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
18286 }
18287 
18288 static int
18289 test_cryptodev_mrvl(void)
18290 {
18291 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
18292 }
18293 
18294 #ifdef RTE_CRYPTO_SCHEDULER
18295 
18296 static int
18297 test_cryptodev_scheduler(void)
18298 {
18299 	uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
18300 	const enum blockcipher_test_type blk_suites[] = {
18301 		BLKCIPHER_AES_CHAIN_TYPE,
18302 		BLKCIPHER_AES_CIPHERONLY_TYPE,
18303 		BLKCIPHER_AUTHONLY_TYPE
18304 	};
18305 	static struct unit_test_suite scheduler_multicore = {
18306 		.suite_name = "Scheduler Multicore Unit Test Suite",
18307 		.setup = scheduler_multicore_testsuite_setup,
18308 		.teardown = scheduler_mode_testsuite_teardown,
18309 		.unit_test_cases = {TEST_CASES_END()}
18310 	};
18311 	static struct unit_test_suite scheduler_round_robin = {
18312 		.suite_name = "Scheduler Round Robin Unit Test Suite",
18313 		.setup = scheduler_roundrobin_testsuite_setup,
18314 		.teardown = scheduler_mode_testsuite_teardown,
18315 		.unit_test_cases = {TEST_CASES_END()}
18316 	};
18317 	static struct unit_test_suite scheduler_failover = {
18318 		.suite_name = "Scheduler Failover Unit Test Suite",
18319 		.setup = scheduler_failover_testsuite_setup,
18320 		.teardown = scheduler_mode_testsuite_teardown,
18321 		.unit_test_cases = {TEST_CASES_END()}
18322 	};
18323 	static struct unit_test_suite scheduler_pkt_size_distr = {
18324 		.suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
18325 		.setup = scheduler_pkt_size_distr_testsuite_setup,
18326 		.teardown = scheduler_mode_testsuite_teardown,
18327 		.unit_test_cases = {TEST_CASES_END()}
18328 	};
18329 	struct unit_test_suite *sched_mode_suites[] = {
18330 		&scheduler_multicore,
18331 		&scheduler_round_robin,
18332 		&scheduler_failover,
18333 		&scheduler_pkt_size_distr
18334 	};
18335 	static struct unit_test_suite scheduler_config = {
18336 		.suite_name = "Crypto Device Scheduler Config Unit Test Suite",
18337 		.unit_test_cases = {
18338 			TEST_CASE(test_scheduler_attach_worker_op),
18339 			TEST_CASE(test_scheduler_mode_multicore_op),
18340 			TEST_CASE(test_scheduler_mode_roundrobin_op),
18341 			TEST_CASE(test_scheduler_mode_failover_op),
18342 			TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
18343 			TEST_CASE(test_scheduler_detach_worker_op),
18344 
18345 			TEST_CASES_END() /**< NULL terminate array */
18346 		}
18347 	};
18348 	struct unit_test_suite *static_suites[] = {
18349 		&scheduler_config,
18350 		&end_testsuite
18351 	};
18352 	struct unit_test_suite *sched_mode_static_suites[] = {
18353 #ifdef RTE_LIB_SECURITY
18354 		&docsis_proto_testsuite,
18355 #endif
18356 		&end_testsuite
18357 	};
18358 	static struct unit_test_suite ts = {
18359 		.suite_name = "Scheduler Unit Test Suite",
18360 		.setup = scheduler_testsuite_setup,
18361 		.teardown = testsuite_teardown,
18362 		.unit_test_cases = {TEST_CASES_END()}
18363 	};
18364 
18365 	gbl_driver_id =	rte_cryptodev_driver_id_get(
18366 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
18367 
18368 	if (gbl_driver_id == -1) {
18369 		RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
18370 		return TEST_SKIPPED;
18371 	}
18372 
18373 	if (rte_cryptodev_driver_id_get(
18374 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
18375 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
18376 		return TEST_SKIPPED;
18377 	}
18378 
18379 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
18380 		uint8_t blk_i = 0;
18381 		sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
18382 				(struct unit_test_suite *) *
18383 				(RTE_DIM(blk_suites) +
18384 				RTE_DIM(sched_mode_static_suites) + 1));
18385 		ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
18386 				blk_suites, RTE_DIM(blk_suites));
18387 		ADD_STATIC_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
18388 				sched_mode_static_suites,
18389 				RTE_DIM(sched_mode_static_suites));
18390 		sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
18391 	}
18392 
18393 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
18394 			(RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
18395 	ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
18396 			RTE_DIM(sched_mode_suites));
18397 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
18398 	ret = unit_test_suite_runner(&ts);
18399 
18400 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
18401 		FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
18402 				(*sched_mode_suites[sched_i]),
18403 				RTE_DIM(blk_suites));
18404 		free(sched_mode_suites[sched_i]->unit_test_suites);
18405 	}
18406 	free(ts.unit_test_suites);
18407 	return ret;
18408 }
18409 
18410 REGISTER_DRIVER_TEST(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
18411 
18412 #endif
18413 
18414 static int
18415 test_cryptodev_dpaa2_sec(void)
18416 {
18417 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
18418 }
18419 
18420 static int
18421 test_cryptodev_dpaa_sec(void)
18422 {
18423 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
18424 }
18425 
18426 static int
18427 test_cryptodev_ccp(void)
18428 {
18429 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
18430 }
18431 
18432 static int
18433 test_cryptodev_octeontx(void)
18434 {
18435 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
18436 }
18437 
18438 static int
18439 test_cryptodev_caam_jr(void)
18440 {
18441 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
18442 }
18443 
18444 static int
18445 test_cryptodev_nitrox(void)
18446 {
18447 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
18448 }
18449 
18450 static int
18451 test_cryptodev_bcmfs(void)
18452 {
18453 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
18454 }
18455 
18456 static int
18457 run_cryptodev_raw_testsuite(const char *pmd_name)
18458 {
18459 	int ret;
18460 
18461 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP, "RAW API");
18462 	if (ret)
18463 		return ret;
18464 
18465 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
18466 	ret = run_cryptodev_testsuite(pmd_name);
18467 	global_api_test_type = CRYPTODEV_API_TEST;
18468 
18469 	return ret;
18470 }
18471 
18472 static int
18473 test_cryptodev_qat_raw_api(void)
18474 {
18475 	return run_cryptodev_raw_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
18476 }
18477 
18478 static int
18479 test_cryptodev_cn9k(void)
18480 {
18481 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
18482 }
18483 
18484 static int
18485 test_cryptodev_cn10k(void)
18486 {
18487 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
18488 }
18489 
18490 static int
18491 test_cryptodev_cn10k_raw_api(void)
18492 {
18493 	return run_cryptodev_raw_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
18494 }
18495 
18496 static int
18497 test_cryptodev_dpaa2_sec_raw_api(void)
18498 {
18499 	return run_cryptodev_raw_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
18500 }
18501 
18502 static int
18503 test_cryptodev_dpaa_sec_raw_api(void)
18504 {
18505 	return run_cryptodev_raw_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
18506 }
18507 
18508 REGISTER_DRIVER_TEST(cryptodev_cn10k_raw_api_autotest,
18509 		test_cryptodev_cn10k_raw_api);
18510 REGISTER_DRIVER_TEST(cryptodev_dpaa2_sec_raw_api_autotest,
18511 		test_cryptodev_dpaa2_sec_raw_api);
18512 REGISTER_DRIVER_TEST(cryptodev_dpaa_sec_raw_api_autotest,
18513 		test_cryptodev_dpaa_sec_raw_api);
18514 REGISTER_DRIVER_TEST(cryptodev_qat_raw_api_autotest,
18515 		test_cryptodev_qat_raw_api);
18516 REGISTER_DRIVER_TEST(cryptodev_qat_autotest, test_cryptodev_qat);
18517 REGISTER_DRIVER_TEST(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
18518 REGISTER_DRIVER_TEST(cryptodev_cpu_aesni_mb_autotest,
18519 	test_cryptodev_cpu_aesni_mb);
18520 REGISTER_DRIVER_TEST(cryptodev_chacha_poly_mb_autotest,
18521 	test_cryptodev_chacha_poly_mb);
18522 REGISTER_DRIVER_TEST(cryptodev_openssl_autotest, test_cryptodev_openssl);
18523 REGISTER_DRIVER_TEST(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
18524 REGISTER_DRIVER_TEST(cryptodev_cpu_aesni_gcm_autotest,
18525 	test_cryptodev_cpu_aesni_gcm);
18526 REGISTER_DRIVER_TEST(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
18527 REGISTER_DRIVER_TEST(cryptodev_null_autotest, test_cryptodev_null);
18528 REGISTER_DRIVER_TEST(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
18529 REGISTER_DRIVER_TEST(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
18530 REGISTER_DRIVER_TEST(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
18531 REGISTER_DRIVER_TEST(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
18532 REGISTER_DRIVER_TEST(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
18533 REGISTER_DRIVER_TEST(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
18534 REGISTER_DRIVER_TEST(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
18535 REGISTER_DRIVER_TEST(cryptodev_ccp_autotest, test_cryptodev_ccp);
18536 REGISTER_DRIVER_TEST(cryptodev_uadk_autotest, test_cryptodev_uadk);
18537 REGISTER_DRIVER_TEST(cryptodev_virtio_autotest, test_cryptodev_virtio);
18538 REGISTER_DRIVER_TEST(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
18539 REGISTER_DRIVER_TEST(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
18540 REGISTER_DRIVER_TEST(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
18541 REGISTER_DRIVER_TEST(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
18542 REGISTER_DRIVER_TEST(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
18543 REGISTER_DRIVER_TEST(cryptodev_cn10k_autotest, test_cryptodev_cn10k);
18544