xref: /dpdk/app/test/test_cryptodev.c (revision f52b75c61b7cf75e5c9a665e465dfbace2a18f30)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2015-2020 Intel Corporation
3  * Copyright 2020 NXP
4  */
5 
6 #include <time.h>
7 
8 #include <rte_common.h>
9 #include <rte_hexdump.h>
10 #include <rte_mbuf.h>
11 #include <rte_malloc.h>
12 #include <rte_memcpy.h>
13 #include <rte_pause.h>
14 #include <rte_bus_vdev.h>
15 #include <rte_ether.h>
16 
17 #include <rte_crypto.h>
18 #include <rte_cryptodev.h>
19 #include <rte_ip.h>
20 #include <rte_string_fns.h>
21 #include <rte_tcp.h>
22 #include <rte_udp.h>
23 
24 #ifdef RTE_CRYPTO_SCHEDULER
25 #include <rte_cryptodev_scheduler.h>
26 #include <rte_cryptodev_scheduler_operations.h>
27 #endif
28 
29 #include <rte_lcore.h>
30 
31 #include "test.h"
32 #include "test_cryptodev.h"
33 
34 #include "test_cryptodev_blockcipher.h"
35 #include "test_cryptodev_aes_test_vectors.h"
36 #include "test_cryptodev_des_test_vectors.h"
37 #include "test_cryptodev_hash_test_vectors.h"
38 #include "test_cryptodev_kasumi_test_vectors.h"
39 #include "test_cryptodev_kasumi_hash_test_vectors.h"
40 #include "test_cryptodev_snow3g_test_vectors.h"
41 #include "test_cryptodev_snow3g_hash_test_vectors.h"
42 #include "test_cryptodev_zuc_test_vectors.h"
43 #include "test_cryptodev_aead_test_vectors.h"
44 #include "test_cryptodev_hmac_test_vectors.h"
45 #include "test_cryptodev_mixed_test_vectors.h"
46 #ifdef RTE_LIB_SECURITY
47 #include "test_cryptodev_security_ipsec.h"
48 #include "test_cryptodev_security_ipsec_test_vectors.h"
49 #include "test_cryptodev_security_pdcp_test_vectors.h"
50 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
51 #include "test_cryptodev_security_pdcp_test_func.h"
52 #include "test_cryptodev_security_docsis_test_vectors.h"
53 
54 #define SDAP_DISABLED	0
55 #define SDAP_ENABLED	1
56 #endif
57 
58 #define VDEV_ARGS_SIZE 100
59 #define MAX_NB_SESSIONS 4
60 
61 #define MAX_DRV_SERVICE_CTX_SIZE 256
62 
63 #define MAX_RAW_DEQUEUE_COUNT	65535
64 
65 #define IN_PLACE 0
66 #define OUT_OF_PLACE 1
67 
68 static int gbl_driver_id;
69 
70 static enum rte_security_session_action_type gbl_action_type =
71 	RTE_SECURITY_ACTION_TYPE_NONE;
72 
73 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
74 
75 struct crypto_unittest_params {
76 	struct rte_crypto_sym_xform cipher_xform;
77 	struct rte_crypto_sym_xform auth_xform;
78 	struct rte_crypto_sym_xform aead_xform;
79 #ifdef RTE_LIB_SECURITY
80 	struct rte_security_docsis_xform docsis_xform;
81 #endif
82 
83 	union {
84 		struct rte_cryptodev_sym_session *sess;
85 #ifdef RTE_LIB_SECURITY
86 		struct rte_security_session *sec_session;
87 #endif
88 	};
89 #ifdef RTE_LIB_SECURITY
90 	enum rte_security_session_action_type type;
91 #endif
92 	struct rte_crypto_op *op;
93 
94 	struct rte_mbuf *obuf, *ibuf;
95 
96 	uint8_t *digest;
97 };
98 
99 #define ALIGN_POW2_ROUNDUP(num, align) \
100 	(((num) + (align) - 1) & ~((align) - 1))
101 
102 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts)	\
103 	for (j = 0; j < num_child_ts; index++, j++)			\
104 		parent_ts.unit_test_suites[index] = child_ts[j]
105 
106 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types)	\
107 	for (j = 0; j < num_blk_types; index++, j++)				\
108 		parent_ts.unit_test_suites[index] =				\
109 				build_blockcipher_test_suite(blk_types[j])
110 
111 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types)		\
112 	for (j = index; j < index + num_blk_types; j++)				\
113 		free_blockcipher_test_suite(parent_ts.unit_test_suites[j])
114 
115 /*
116  * Forward declarations.
117  */
118 static int
119 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
120 		struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
121 		uint8_t *hmac_key);
122 
123 static int
124 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
125 		struct crypto_unittest_params *ut_params,
126 		struct crypto_testsuite_params *ts_param,
127 		const uint8_t *cipher,
128 		const uint8_t *digest,
129 		const uint8_t *iv);
130 
131 static int
132 security_proto_supported(enum rte_security_session_action_type action,
133 	enum rte_security_session_protocol proto);
134 
135 static int
136 dev_configure_and_start(uint64_t ff_disable);
137 
138 static struct rte_mbuf *
139 setup_test_string(struct rte_mempool *mpool,
140 		const char *string, size_t len, uint8_t blocksize)
141 {
142 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
143 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
144 
145 	if (m) {
146 		char *dst;
147 
148 		memset(m->buf_addr, 0, m->buf_len);
149 		dst = rte_pktmbuf_append(m, t_len);
150 		if (!dst) {
151 			rte_pktmbuf_free(m);
152 			return NULL;
153 		}
154 		if (string != NULL)
155 			rte_memcpy(dst, string, t_len);
156 		else
157 			memset(dst, 0, t_len);
158 	}
159 
160 	return m;
161 }
162 
163 /* Get number of bytes in X bits (rounding up) */
164 static uint32_t
165 ceil_byte_length(uint32_t num_bits)
166 {
167 	if (num_bits % 8)
168 		return ((num_bits >> 3) + 1);
169 	else
170 		return (num_bits >> 3);
171 }
172 
173 static void
174 post_process_raw_dp_op(void *user_data,	uint32_t index __rte_unused,
175 		uint8_t is_op_success)
176 {
177 	struct rte_crypto_op *op = user_data;
178 	op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
179 			RTE_CRYPTO_OP_STATUS_ERROR;
180 }
181 
182 static struct crypto_testsuite_params testsuite_params = { NULL };
183 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
184 static struct crypto_unittest_params unittest_params;
185 
186 void
187 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
188 		struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
189 		uint8_t len_in_bits, uint8_t cipher_iv_len)
190 {
191 	struct rte_crypto_sym_op *sop = op->sym;
192 	struct rte_crypto_op *ret_op = NULL;
193 	struct rte_crypto_vec data_vec[UINT8_MAX], dest_data_vec[UINT8_MAX];
194 	struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
195 	union rte_crypto_sym_ofs ofs;
196 	struct rte_crypto_sym_vec vec;
197 	struct rte_crypto_sgl sgl, dest_sgl;
198 	uint32_t max_len;
199 	union rte_cryptodev_session_ctx sess;
200 	uint64_t auth_end_iova;
201 	uint32_t count = 0;
202 	struct rte_crypto_raw_dp_ctx *ctx;
203 	uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
204 			auth_len = 0;
205 	int32_t n;
206 	uint32_t n_success;
207 	int ctx_service_size;
208 	int32_t status = 0;
209 	int enqueue_status, dequeue_status;
210 	struct crypto_unittest_params *ut_params = &unittest_params;
211 	int is_sgl = sop->m_src->nb_segs > 1;
212 
213 	ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
214 	if (ctx_service_size < 0) {
215 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
216 		return;
217 	}
218 
219 	ctx = malloc(ctx_service_size);
220 	if (!ctx) {
221 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
222 		return;
223 	}
224 
225 	/* Both are enums, setting crypto_sess will suit any session type */
226 	sess.crypto_sess = op->sym->session;
227 
228 	if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
229 			op->sess_type, sess, 0) < 0) {
230 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
231 		goto exit;
232 	}
233 
234 	cipher_iv.iova = 0;
235 	cipher_iv.va = NULL;
236 	aad_auth_iv.iova = 0;
237 	aad_auth_iv.va = NULL;
238 	digest.iova = 0;
239 	digest.va = NULL;
240 	sgl.vec = data_vec;
241 	vec.num = 1;
242 	vec.src_sgl = &sgl;
243 	vec.iv = &cipher_iv;
244 	vec.digest = &digest;
245 	vec.aad = &aad_auth_iv;
246 	vec.status = &status;
247 
248 	ofs.raw = 0;
249 
250 	if (is_cipher && is_auth) {
251 		cipher_offset = sop->cipher.data.offset;
252 		cipher_len = sop->cipher.data.length;
253 		auth_offset = sop->auth.data.offset;
254 		auth_len = sop->auth.data.length;
255 		max_len = RTE_MAX(cipher_offset + cipher_len,
256 				auth_offset + auth_len);
257 		if (len_in_bits) {
258 			max_len = max_len >> 3;
259 			cipher_offset = cipher_offset >> 3;
260 			auth_offset = auth_offset >> 3;
261 			cipher_len = cipher_len >> 3;
262 			auth_len = auth_len >> 3;
263 		}
264 		ofs.ofs.cipher.head = cipher_offset;
265 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
266 		ofs.ofs.auth.head = auth_offset;
267 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
268 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
269 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
270 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
271 				op, void *, IV_OFFSET + cipher_iv_len);
272 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
273 				cipher_iv_len);
274 		digest.va = (void *)sop->auth.digest.data;
275 		digest.iova = sop->auth.digest.phys_addr;
276 
277 		if (is_sgl) {
278 			uint32_t remaining_off = auth_offset + auth_len;
279 			struct rte_mbuf *sgl_buf = sop->m_src;
280 
281 			while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)
282 					&& sgl_buf->next != NULL) {
283 				remaining_off -= rte_pktmbuf_data_len(sgl_buf);
284 				sgl_buf = sgl_buf->next;
285 			}
286 
287 			auth_end_iova = (uint64_t)rte_pktmbuf_iova_offset(
288 				sgl_buf, remaining_off);
289 		} else {
290 			auth_end_iova = rte_pktmbuf_iova(op->sym->m_src) +
291 							 auth_offset + auth_len;
292 		}
293 		/* Then check if digest-encrypted conditions are met */
294 		if ((auth_offset + auth_len < cipher_offset + cipher_len) &&
295 				(digest.iova == auth_end_iova) && is_sgl)
296 			max_len = RTE_MAX(max_len, auth_offset + auth_len +
297 				ut_params->auth_xform.auth.digest_length);
298 
299 	} else if (is_cipher) {
300 		cipher_offset = sop->cipher.data.offset;
301 		cipher_len = sop->cipher.data.length;
302 		max_len = cipher_len + cipher_offset;
303 		if (len_in_bits) {
304 			max_len = max_len >> 3;
305 			cipher_offset = cipher_offset >> 3;
306 			cipher_len = cipher_len >> 3;
307 		}
308 		ofs.ofs.cipher.head = cipher_offset;
309 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
310 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
311 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
312 
313 	} else if (is_auth) {
314 		auth_offset = sop->auth.data.offset;
315 		auth_len = sop->auth.data.length;
316 		max_len = auth_len + auth_offset;
317 		if (len_in_bits) {
318 			max_len = max_len >> 3;
319 			auth_offset = auth_offset >> 3;
320 			auth_len = auth_len >> 3;
321 		}
322 		ofs.ofs.auth.head = auth_offset;
323 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
324 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
325 				op, void *, IV_OFFSET + cipher_iv_len);
326 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
327 				cipher_iv_len);
328 		digest.va = (void *)sop->auth.digest.data;
329 		digest.iova = sop->auth.digest.phys_addr;
330 
331 	} else { /* aead */
332 		cipher_offset = sop->aead.data.offset;
333 		cipher_len = sop->aead.data.length;
334 		max_len = cipher_len + cipher_offset;
335 		if (len_in_bits) {
336 			max_len = max_len >> 3;
337 			cipher_offset = cipher_offset >> 3;
338 			cipher_len = cipher_len >> 3;
339 		}
340 		ofs.ofs.cipher.head = cipher_offset;
341 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
342 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
343 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
344 		aad_auth_iv.va = (void *)sop->aead.aad.data;
345 		aad_auth_iv.iova = sop->aead.aad.phys_addr;
346 		digest.va = (void *)sop->aead.digest.data;
347 		digest.iova = sop->aead.digest.phys_addr;
348 	}
349 
350 	n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
351 			data_vec, RTE_DIM(data_vec));
352 	if (n < 0 || n > sop->m_src->nb_segs) {
353 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
354 		goto exit;
355 	}
356 
357 	sgl.num = n;
358 	/* Out of place */
359 	if (sop->m_dst != NULL) {
360 		dest_sgl.vec = dest_data_vec;
361 		vec.dest_sgl = &dest_sgl;
362 		n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
363 				dest_data_vec, RTE_DIM(dest_data_vec));
364 		if (n < 0 || n > sop->m_dst->nb_segs) {
365 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
366 			goto exit;
367 		}
368 		dest_sgl.num = n;
369 	} else
370 		vec.dest_sgl = NULL;
371 
372 	if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
373 			&enqueue_status) < 1) {
374 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
375 		goto exit;
376 	}
377 
378 	if (enqueue_status == 0) {
379 		status = rte_cryptodev_raw_enqueue_done(ctx, 1);
380 		if (status < 0) {
381 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
382 			goto exit;
383 		}
384 	} else if (enqueue_status < 0) {
385 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
386 		goto exit;
387 	}
388 
389 	n = n_success = 0;
390 	while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
391 		n = rte_cryptodev_raw_dequeue_burst(ctx,
392 			NULL, 1, post_process_raw_dp_op,
393 				(void **)&ret_op, 0, &n_success,
394 				&dequeue_status);
395 		if (dequeue_status < 0) {
396 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
397 			goto exit;
398 		}
399 		if (n == 0)
400 			rte_pause();
401 	}
402 
403 	if (n == 1 && dequeue_status == 0) {
404 		if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
405 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
406 			goto exit;
407 		}
408 	}
409 
410 	op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
411 			ret_op->status == RTE_CRYPTO_OP_STATUS_ERROR ||
412 			n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
413 					RTE_CRYPTO_OP_STATUS_SUCCESS;
414 
415 exit:
416 	free(ctx);
417 }
418 
419 static void
420 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
421 {
422 	int32_t n, st;
423 	struct rte_crypto_sym_op *sop;
424 	union rte_crypto_sym_ofs ofs;
425 	struct rte_crypto_sgl sgl;
426 	struct rte_crypto_sym_vec symvec;
427 	struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
428 	struct rte_crypto_vec vec[UINT8_MAX];
429 
430 	sop = op->sym;
431 
432 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
433 		sop->aead.data.length, vec, RTE_DIM(vec));
434 
435 	if (n < 0 || n != sop->m_src->nb_segs) {
436 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
437 		return;
438 	}
439 
440 	sgl.vec = vec;
441 	sgl.num = n;
442 	symvec.src_sgl = &sgl;
443 	symvec.iv = &iv_ptr;
444 	symvec.digest = &digest_ptr;
445 	symvec.aad = &aad_ptr;
446 	symvec.status = &st;
447 	symvec.num = 1;
448 
449 	/* for CPU crypto the IOVA address is not required */
450 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
451 	digest_ptr.va = (void *)sop->aead.digest.data;
452 	aad_ptr.va = (void *)sop->aead.aad.data;
453 
454 	ofs.raw = 0;
455 
456 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
457 		&symvec);
458 
459 	if (n != 1)
460 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
461 	else
462 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
463 }
464 
465 static void
466 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
467 {
468 	int32_t n, st;
469 	struct rte_crypto_sym_op *sop;
470 	union rte_crypto_sym_ofs ofs;
471 	struct rte_crypto_sgl sgl;
472 	struct rte_crypto_sym_vec symvec;
473 	struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
474 	struct rte_crypto_vec vec[UINT8_MAX];
475 
476 	sop = op->sym;
477 
478 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
479 		sop->auth.data.length, vec, RTE_DIM(vec));
480 
481 	if (n < 0 || n != sop->m_src->nb_segs) {
482 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
483 		return;
484 	}
485 
486 	sgl.vec = vec;
487 	sgl.num = n;
488 	symvec.src_sgl = &sgl;
489 	symvec.iv = &iv_ptr;
490 	symvec.digest = &digest_ptr;
491 	symvec.status = &st;
492 	symvec.num = 1;
493 
494 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
495 	digest_ptr.va = (void *)sop->auth.digest.data;
496 
497 	ofs.raw = 0;
498 	ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
499 	ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
500 		(sop->cipher.data.offset + sop->cipher.data.length);
501 
502 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
503 		&symvec);
504 
505 	if (n != 1)
506 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
507 	else
508 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
509 }
510 
511 static struct rte_crypto_op *
512 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
513 {
514 
515 	RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
516 
517 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
518 		RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
519 		return NULL;
520 	}
521 
522 	op = NULL;
523 
524 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
525 		rte_pause();
526 
527 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
528 		RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
529 		return NULL;
530 	}
531 
532 	return op;
533 }
534 
535 static int
536 testsuite_setup(void)
537 {
538 	struct crypto_testsuite_params *ts_params = &testsuite_params;
539 	struct rte_cryptodev_info info;
540 	uint32_t i = 0, nb_devs, dev_id;
541 	uint16_t qp_id;
542 
543 	memset(ts_params, 0, sizeof(*ts_params));
544 
545 	ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
546 	if (ts_params->mbuf_pool == NULL) {
547 		/* Not already created so create */
548 		ts_params->mbuf_pool = rte_pktmbuf_pool_create(
549 				"CRYPTO_MBUFPOOL",
550 				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
551 				rte_socket_id());
552 		if (ts_params->mbuf_pool == NULL) {
553 			RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
554 			return TEST_FAILED;
555 		}
556 	}
557 
558 	ts_params->large_mbuf_pool = rte_mempool_lookup(
559 			"CRYPTO_LARGE_MBUFPOOL");
560 	if (ts_params->large_mbuf_pool == NULL) {
561 		/* Not already created so create */
562 		ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
563 				"CRYPTO_LARGE_MBUFPOOL",
564 				1, 0, 0, UINT16_MAX,
565 				rte_socket_id());
566 		if (ts_params->large_mbuf_pool == NULL) {
567 			RTE_LOG(ERR, USER1,
568 				"Can't create CRYPTO_LARGE_MBUFPOOL\n");
569 			return TEST_FAILED;
570 		}
571 	}
572 
573 	ts_params->op_mpool = rte_crypto_op_pool_create(
574 			"MBUF_CRYPTO_SYM_OP_POOL",
575 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
576 			NUM_MBUFS, MBUF_CACHE_SIZE,
577 			DEFAULT_NUM_XFORMS *
578 			sizeof(struct rte_crypto_sym_xform) +
579 			MAXIMUM_IV_LENGTH,
580 			rte_socket_id());
581 	if (ts_params->op_mpool == NULL) {
582 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
583 		return TEST_FAILED;
584 	}
585 
586 	nb_devs = rte_cryptodev_count();
587 	if (nb_devs < 1) {
588 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
589 		return TEST_SKIPPED;
590 	}
591 
592 	if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
593 		RTE_LOG(WARNING, USER1, "No %s devices found?\n",
594 				rte_cryptodev_driver_name_get(gbl_driver_id));
595 		return TEST_SKIPPED;
596 	}
597 
598 	/* Create list of valid crypto devs */
599 	for (i = 0; i < nb_devs; i++) {
600 		rte_cryptodev_info_get(i, &info);
601 		if (info.driver_id == gbl_driver_id)
602 			ts_params->valid_devs[ts_params->valid_dev_count++] = i;
603 	}
604 
605 	if (ts_params->valid_dev_count < 1)
606 		return TEST_FAILED;
607 
608 	/* Set up all the qps on the first of the valid devices found */
609 
610 	dev_id = ts_params->valid_devs[0];
611 
612 	rte_cryptodev_info_get(dev_id, &info);
613 
614 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
615 	ts_params->conf.socket_id = SOCKET_ID_ANY;
616 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
617 
618 	unsigned int session_size =
619 		rte_cryptodev_sym_get_private_session_size(dev_id);
620 
621 #ifdef RTE_LIB_SECURITY
622 	unsigned int security_session_size = rte_security_session_get_size(
623 			rte_cryptodev_get_sec_ctx(dev_id));
624 
625 	if (session_size < security_session_size)
626 		session_size = security_session_size;
627 #endif
628 	/*
629 	 * Create mempool with maximum number of sessions.
630 	 */
631 	if (info.sym.max_nb_sessions != 0 &&
632 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
633 		RTE_LOG(ERR, USER1, "Device does not support "
634 				"at least %u sessions\n",
635 				MAX_NB_SESSIONS);
636 		return TEST_FAILED;
637 	}
638 
639 	ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
640 			"test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
641 			SOCKET_ID_ANY);
642 	TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
643 			"session mempool allocation failed");
644 
645 	ts_params->session_priv_mpool = rte_mempool_create(
646 			"test_sess_mp_priv",
647 			MAX_NB_SESSIONS,
648 			session_size,
649 			0, 0, NULL, NULL, NULL,
650 			NULL, SOCKET_ID_ANY,
651 			0);
652 	TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
653 			"session mempool allocation failed");
654 
655 
656 
657 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
658 			&ts_params->conf),
659 			"Failed to configure cryptodev %u with %u qps",
660 			dev_id, ts_params->conf.nb_queue_pairs);
661 
662 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
663 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
664 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
665 
666 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
667 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
668 			dev_id, qp_id, &ts_params->qp_conf,
669 			rte_cryptodev_socket_id(dev_id)),
670 			"Failed to setup queue pair %u on cryptodev %u",
671 			qp_id, dev_id);
672 	}
673 
674 	return TEST_SUCCESS;
675 }
676 
677 static void
678 testsuite_teardown(void)
679 {
680 	struct crypto_testsuite_params *ts_params = &testsuite_params;
681 	int res;
682 
683 	if (ts_params->mbuf_pool != NULL) {
684 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
685 		rte_mempool_avail_count(ts_params->mbuf_pool));
686 	}
687 
688 	if (ts_params->op_mpool != NULL) {
689 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
690 		rte_mempool_avail_count(ts_params->op_mpool));
691 	}
692 
693 	/* Free session mempools */
694 	if (ts_params->session_priv_mpool != NULL) {
695 		rte_mempool_free(ts_params->session_priv_mpool);
696 		ts_params->session_priv_mpool = NULL;
697 	}
698 
699 	if (ts_params->session_mpool != NULL) {
700 		rte_mempool_free(ts_params->session_mpool);
701 		ts_params->session_mpool = NULL;
702 	}
703 
704 	res = rte_cryptodev_close(ts_params->valid_devs[0]);
705 	if (res)
706 		RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
707 }
708 
709 static int
710 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
711 		const int *algs, uint16_t num_algs)
712 {
713 	uint8_t dev_id = testsuite_params.valid_devs[0];
714 	bool some_alg_supported = FALSE;
715 	uint16_t i;
716 
717 	for (i = 0; i < num_algs && !some_alg_supported; i++) {
718 		struct rte_cryptodev_sym_capability_idx alg = {
719 			type, {algs[i]}
720 		};
721 		if (rte_cryptodev_sym_capability_get(dev_id,
722 				&alg) != NULL)
723 			some_alg_supported = TRUE;
724 	}
725 	if (!some_alg_supported)
726 		return TEST_SKIPPED;
727 
728 	return 0;
729 }
730 
731 int
732 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
733 		uint16_t num_ciphers)
734 {
735 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
736 			(const int *) ciphers, num_ciphers);
737 }
738 
739 int
740 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
741 		uint16_t num_auths)
742 {
743 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
744 			(const int *) auths, num_auths);
745 }
746 
747 int
748 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
749 		uint16_t num_aeads)
750 {
751 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
752 			(const int *) aeads, num_aeads);
753 }
754 
755 static int
756 null_testsuite_setup(void)
757 {
758 	struct crypto_testsuite_params *ts_params = &testsuite_params;
759 	uint8_t dev_id = ts_params->valid_devs[0];
760 	struct rte_cryptodev_info dev_info;
761 	const enum rte_crypto_cipher_algorithm ciphers[] = {
762 		RTE_CRYPTO_CIPHER_NULL
763 	};
764 	const enum rte_crypto_auth_algorithm auths[] = {
765 		RTE_CRYPTO_AUTH_NULL
766 	};
767 
768 	rte_cryptodev_info_get(dev_id, &dev_info);
769 
770 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
771 		RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
772 				"testsuite not met\n");
773 		return TEST_SKIPPED;
774 	}
775 
776 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
777 			&& check_auth_capabilities_supported(auths,
778 			RTE_DIM(auths)) != 0) {
779 		RTE_LOG(INFO, USER1, "Capability requirements for NULL "
780 				"testsuite not met\n");
781 		return TEST_SKIPPED;
782 	}
783 
784 	return 0;
785 }
786 
787 static int
788 crypto_gen_testsuite_setup(void)
789 {
790 	struct crypto_testsuite_params *ts_params = &testsuite_params;
791 	uint8_t dev_id = ts_params->valid_devs[0];
792 	struct rte_cryptodev_info dev_info;
793 
794 	rte_cryptodev_info_get(dev_id, &dev_info);
795 
796 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
797 		RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
798 				"testsuite not met\n");
799 		return TEST_SKIPPED;
800 	}
801 
802 	return 0;
803 }
804 
805 #ifdef RTE_LIB_SECURITY
806 static int
807 ipsec_proto_testsuite_setup(void)
808 {
809 	struct crypto_testsuite_params *ts_params = &testsuite_params;
810 	struct crypto_unittest_params *ut_params = &unittest_params;
811 	struct rte_cryptodev_info dev_info;
812 	int ret = 0;
813 
814 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
815 
816 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
817 		RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto "
818 				"testsuite not met\n");
819 		return TEST_SKIPPED;
820 	}
821 
822 	/* Reconfigure to enable security */
823 	ret = dev_configure_and_start(0);
824 	if (ret != TEST_SUCCESS)
825 		return ret;
826 
827 	/* Set action type */
828 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
829 
830 	if (security_proto_supported(
831 			RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
832 			RTE_SECURITY_PROTOCOL_IPSEC) < 0) {
833 		RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto "
834 				"test not met\n");
835 		ret = TEST_SKIPPED;
836 	}
837 
838 	/*
839 	 * Stop the device. Device would be started again by individual test
840 	 * case setup routine.
841 	 */
842 	rte_cryptodev_stop(ts_params->valid_devs[0]);
843 
844 	return ret;
845 }
846 
847 static int
848 pdcp_proto_testsuite_setup(void)
849 {
850 	struct crypto_testsuite_params *ts_params = &testsuite_params;
851 	uint8_t dev_id = ts_params->valid_devs[0];
852 	struct rte_cryptodev_info dev_info;
853 	const enum rte_crypto_cipher_algorithm ciphers[] = {
854 		RTE_CRYPTO_CIPHER_NULL,
855 		RTE_CRYPTO_CIPHER_AES_CTR,
856 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
857 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
858 	};
859 	const enum rte_crypto_auth_algorithm auths[] = {
860 		RTE_CRYPTO_AUTH_NULL,
861 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
862 		RTE_CRYPTO_AUTH_AES_CMAC,
863 		RTE_CRYPTO_AUTH_ZUC_EIA3
864 	};
865 
866 	rte_cryptodev_info_get(dev_id, &dev_info);
867 
868 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
869 			!(dev_info.feature_flags &
870 			RTE_CRYPTODEV_FF_SECURITY)) {
871 		RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
872 				"testsuite not met\n");
873 		return TEST_SKIPPED;
874 	}
875 
876 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
877 			&& check_auth_capabilities_supported(auths,
878 			RTE_DIM(auths)) != 0) {
879 		RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
880 				"testsuite not met\n");
881 		return TEST_SKIPPED;
882 	}
883 
884 	return 0;
885 }
886 
887 static int
888 docsis_proto_testsuite_setup(void)
889 {
890 	struct crypto_testsuite_params *ts_params = &testsuite_params;
891 	uint8_t dev_id = ts_params->valid_devs[0];
892 	struct rte_cryptodev_info dev_info;
893 	const enum rte_crypto_cipher_algorithm ciphers[] = {
894 		RTE_CRYPTO_CIPHER_AES_DOCSISBPI
895 	};
896 
897 	rte_cryptodev_info_get(dev_id, &dev_info);
898 
899 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
900 			!(dev_info.feature_flags &
901 			RTE_CRYPTODEV_FF_SECURITY)) {
902 		RTE_LOG(INFO, USER1, "Feature flag requirements for DOCSIS "
903 				"Proto testsuite not met\n");
904 		return TEST_SKIPPED;
905 	}
906 
907 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
908 		RTE_LOG(INFO, USER1, "Capability requirements for DOCSIS Proto "
909 				"testsuite not met\n");
910 		return TEST_SKIPPED;
911 	}
912 
913 	return 0;
914 }
915 #endif
916 
917 static int
918 aes_ccm_auth_testsuite_setup(void)
919 {
920 	struct crypto_testsuite_params *ts_params = &testsuite_params;
921 	uint8_t dev_id = ts_params->valid_devs[0];
922 	struct rte_cryptodev_info dev_info;
923 	const enum rte_crypto_aead_algorithm aeads[] = {
924 		RTE_CRYPTO_AEAD_AES_CCM
925 	};
926 
927 	rte_cryptodev_info_get(dev_id, &dev_info);
928 
929 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
930 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
931 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
932 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
933 				"testsuite not met\n");
934 		return TEST_SKIPPED;
935 	}
936 
937 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
938 		RTE_LOG(INFO, USER1, "Capability requirements for AES CCM "
939 				"testsuite not met\n");
940 		return TEST_SKIPPED;
941 	}
942 
943 	return 0;
944 }
945 
946 static int
947 aes_gcm_auth_testsuite_setup(void)
948 {
949 	struct crypto_testsuite_params *ts_params = &testsuite_params;
950 	uint8_t dev_id = ts_params->valid_devs[0];
951 	struct rte_cryptodev_info dev_info;
952 	const enum rte_crypto_aead_algorithm aeads[] = {
953 		RTE_CRYPTO_AEAD_AES_GCM
954 	};
955 
956 	rte_cryptodev_info_get(dev_id, &dev_info);
957 
958 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
959 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
960 				"testsuite not met\n");
961 		return TEST_SKIPPED;
962 	}
963 
964 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
965 		RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
966 				"testsuite not met\n");
967 		return TEST_SKIPPED;
968 	}
969 
970 	return 0;
971 }
972 
973 static int
974 aes_gmac_auth_testsuite_setup(void)
975 {
976 	struct crypto_testsuite_params *ts_params = &testsuite_params;
977 	uint8_t dev_id = ts_params->valid_devs[0];
978 	struct rte_cryptodev_info dev_info;
979 	const enum rte_crypto_auth_algorithm auths[] = {
980 		RTE_CRYPTO_AUTH_AES_GMAC
981 	};
982 
983 	rte_cryptodev_info_get(dev_id, &dev_info);
984 
985 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
986 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
987 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
988 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
989 				"testsuite not met\n");
990 		return TEST_SKIPPED;
991 	}
992 
993 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
994 		RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
995 				"testsuite not met\n");
996 		return TEST_SKIPPED;
997 	}
998 
999 	return 0;
1000 }
1001 
1002 static int
1003 chacha20_poly1305_testsuite_setup(void)
1004 {
1005 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1006 	uint8_t dev_id = ts_params->valid_devs[0];
1007 	struct rte_cryptodev_info dev_info;
1008 	const enum rte_crypto_aead_algorithm aeads[] = {
1009 		RTE_CRYPTO_AEAD_CHACHA20_POLY1305
1010 	};
1011 
1012 	rte_cryptodev_info_get(dev_id, &dev_info);
1013 
1014 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1015 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1016 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1017 		RTE_LOG(INFO, USER1, "Feature flag requirements for "
1018 				"Chacha20-Poly1305 testsuite not met\n");
1019 		return TEST_SKIPPED;
1020 	}
1021 
1022 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1023 		RTE_LOG(INFO, USER1, "Capability requirements for "
1024 				"Chacha20-Poly1305 testsuite not met\n");
1025 		return TEST_SKIPPED;
1026 	}
1027 
1028 	return 0;
1029 }
1030 
1031 static int
1032 snow3g_testsuite_setup(void)
1033 {
1034 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1035 	uint8_t dev_id = ts_params->valid_devs[0];
1036 	struct rte_cryptodev_info dev_info;
1037 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1038 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1039 
1040 	};
1041 	const enum rte_crypto_auth_algorithm auths[] = {
1042 		RTE_CRYPTO_AUTH_SNOW3G_UIA2
1043 	};
1044 
1045 	rte_cryptodev_info_get(dev_id, &dev_info);
1046 
1047 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1048 		RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
1049 				"testsuite not met\n");
1050 		return TEST_SKIPPED;
1051 	}
1052 
1053 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1054 			&& check_auth_capabilities_supported(auths,
1055 			RTE_DIM(auths)) != 0) {
1056 		RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
1057 				"testsuite not met\n");
1058 		return TEST_SKIPPED;
1059 	}
1060 
1061 	return 0;
1062 }
1063 
1064 static int
1065 zuc_testsuite_setup(void)
1066 {
1067 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1068 	uint8_t dev_id = ts_params->valid_devs[0];
1069 	struct rte_cryptodev_info dev_info;
1070 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1071 		RTE_CRYPTO_CIPHER_ZUC_EEA3
1072 	};
1073 	const enum rte_crypto_auth_algorithm auths[] = {
1074 		RTE_CRYPTO_AUTH_ZUC_EIA3
1075 	};
1076 
1077 	rte_cryptodev_info_get(dev_id, &dev_info);
1078 
1079 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1080 		RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
1081 				"testsuite not met\n");
1082 		return TEST_SKIPPED;
1083 	}
1084 
1085 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1086 			&& check_auth_capabilities_supported(auths,
1087 			RTE_DIM(auths)) != 0) {
1088 		RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
1089 				"testsuite not met\n");
1090 		return TEST_SKIPPED;
1091 	}
1092 
1093 	return 0;
1094 }
1095 
1096 static int
1097 hmac_md5_auth_testsuite_setup(void)
1098 {
1099 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1100 	uint8_t dev_id = ts_params->valid_devs[0];
1101 	struct rte_cryptodev_info dev_info;
1102 	const enum rte_crypto_auth_algorithm auths[] = {
1103 		RTE_CRYPTO_AUTH_MD5_HMAC
1104 	};
1105 
1106 	rte_cryptodev_info_get(dev_id, &dev_info);
1107 
1108 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1109 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1110 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1111 		RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1112 				"Auth testsuite not met\n");
1113 		return TEST_SKIPPED;
1114 	}
1115 
1116 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1117 		RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1118 				"testsuite not met\n");
1119 		return TEST_SKIPPED;
1120 	}
1121 
1122 	return 0;
1123 }
1124 
1125 static int
1126 kasumi_testsuite_setup(void)
1127 {
1128 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1129 	uint8_t dev_id = ts_params->valid_devs[0];
1130 	struct rte_cryptodev_info dev_info;
1131 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1132 		RTE_CRYPTO_CIPHER_KASUMI_F8
1133 	};
1134 	const enum rte_crypto_auth_algorithm auths[] = {
1135 		RTE_CRYPTO_AUTH_KASUMI_F9
1136 	};
1137 
1138 	rte_cryptodev_info_get(dev_id, &dev_info);
1139 
1140 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1141 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1142 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1143 		RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1144 				"testsuite not met\n");
1145 		return TEST_SKIPPED;
1146 	}
1147 
1148 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1149 			&& check_auth_capabilities_supported(auths,
1150 			RTE_DIM(auths)) != 0) {
1151 		RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1152 				"testsuite not met\n");
1153 		return TEST_SKIPPED;
1154 	}
1155 
1156 	return 0;
1157 }
1158 
1159 static int
1160 negative_aes_gcm_testsuite_setup(void)
1161 {
1162 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1163 	uint8_t dev_id = ts_params->valid_devs[0];
1164 	struct rte_cryptodev_info dev_info;
1165 	const enum rte_crypto_aead_algorithm aeads[] = {
1166 		RTE_CRYPTO_AEAD_AES_GCM
1167 	};
1168 
1169 	rte_cryptodev_info_get(dev_id, &dev_info);
1170 
1171 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1172 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1173 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1174 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1175 				"AES GCM testsuite not met\n");
1176 		return TEST_SKIPPED;
1177 	}
1178 
1179 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1180 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1181 				"AES GCM testsuite not met\n");
1182 		return TEST_SKIPPED;
1183 	}
1184 
1185 	return 0;
1186 }
1187 
1188 static int
1189 negative_aes_gmac_testsuite_setup(void)
1190 {
1191 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1192 	uint8_t dev_id = ts_params->valid_devs[0];
1193 	struct rte_cryptodev_info dev_info;
1194 	const enum rte_crypto_auth_algorithm auths[] = {
1195 		RTE_CRYPTO_AUTH_AES_GMAC
1196 	};
1197 
1198 	rte_cryptodev_info_get(dev_id, &dev_info);
1199 
1200 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1201 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1202 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1203 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1204 				"AES GMAC testsuite not met\n");
1205 		return TEST_SKIPPED;
1206 	}
1207 
1208 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1209 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1210 				"AES GMAC testsuite not met\n");
1211 		return TEST_SKIPPED;
1212 	}
1213 
1214 	return 0;
1215 }
1216 
1217 static int
1218 mixed_cipher_hash_testsuite_setup(void)
1219 {
1220 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1221 	uint8_t dev_id = ts_params->valid_devs[0];
1222 	struct rte_cryptodev_info dev_info;
1223 	uint64_t feat_flags;
1224 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1225 		RTE_CRYPTO_CIPHER_NULL,
1226 		RTE_CRYPTO_CIPHER_AES_CTR,
1227 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
1228 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1229 	};
1230 	const enum rte_crypto_auth_algorithm auths[] = {
1231 		RTE_CRYPTO_AUTH_NULL,
1232 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1233 		RTE_CRYPTO_AUTH_AES_CMAC,
1234 		RTE_CRYPTO_AUTH_ZUC_EIA3
1235 	};
1236 
1237 	rte_cryptodev_info_get(dev_id, &dev_info);
1238 	feat_flags = dev_info.feature_flags;
1239 
1240 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1241 			(global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1242 		RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1243 				"Cipher Hash testsuite not met\n");
1244 		return TEST_SKIPPED;
1245 	}
1246 
1247 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1248 			&& check_auth_capabilities_supported(auths,
1249 			RTE_DIM(auths)) != 0) {
1250 		RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1251 				"Cipher Hash testsuite not met\n");
1252 		return TEST_SKIPPED;
1253 	}
1254 
1255 	return 0;
1256 }
1257 
1258 static int
1259 esn_testsuite_setup(void)
1260 {
1261 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1262 	uint8_t dev_id = ts_params->valid_devs[0];
1263 	struct rte_cryptodev_info dev_info;
1264 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1265 		RTE_CRYPTO_CIPHER_AES_CBC
1266 	};
1267 	const enum rte_crypto_auth_algorithm auths[] = {
1268 		RTE_CRYPTO_AUTH_SHA1_HMAC
1269 	};
1270 
1271 	rte_cryptodev_info_get(dev_id, &dev_info);
1272 
1273 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1274 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1275 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1276 		RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1277 				"testsuite not met\n");
1278 		return TEST_SKIPPED;
1279 	}
1280 
1281 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1282 			&& check_auth_capabilities_supported(auths,
1283 			RTE_DIM(auths)) != 0) {
1284 		RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1285 				"testsuite not met\n");
1286 		return TEST_SKIPPED;
1287 	}
1288 
1289 	return 0;
1290 }
1291 
1292 static int
1293 multi_session_testsuite_setup(void)
1294 {
1295 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1296 	uint8_t dev_id = ts_params->valid_devs[0];
1297 	struct rte_cryptodev_info dev_info;
1298 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1299 		RTE_CRYPTO_CIPHER_AES_CBC
1300 	};
1301 	const enum rte_crypto_auth_algorithm auths[] = {
1302 		RTE_CRYPTO_AUTH_SHA512_HMAC
1303 	};
1304 
1305 	rte_cryptodev_info_get(dev_id, &dev_info);
1306 
1307 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1308 		RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1309 				"Session testsuite not met\n");
1310 		return TEST_SKIPPED;
1311 	}
1312 
1313 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1314 			&& check_auth_capabilities_supported(auths,
1315 			RTE_DIM(auths)) != 0) {
1316 		RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1317 				"Session testsuite not met\n");
1318 		return TEST_SKIPPED;
1319 	}
1320 
1321 	return 0;
1322 }
1323 
1324 static int
1325 negative_hmac_sha1_testsuite_setup(void)
1326 {
1327 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1328 	uint8_t dev_id = ts_params->valid_devs[0];
1329 	struct rte_cryptodev_info dev_info;
1330 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1331 		RTE_CRYPTO_CIPHER_AES_CBC
1332 	};
1333 	const enum rte_crypto_auth_algorithm auths[] = {
1334 		RTE_CRYPTO_AUTH_SHA1_HMAC
1335 	};
1336 
1337 	rte_cryptodev_info_get(dev_id, &dev_info);
1338 
1339 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1340 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1341 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1342 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1343 				"HMAC SHA1 testsuite not met\n");
1344 		return TEST_SKIPPED;
1345 	}
1346 
1347 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1348 			&& check_auth_capabilities_supported(auths,
1349 			RTE_DIM(auths)) != 0) {
1350 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1351 				"HMAC SHA1 testsuite not met\n");
1352 		return TEST_SKIPPED;
1353 	}
1354 
1355 	return 0;
1356 }
1357 
1358 static int
1359 dev_configure_and_start(uint64_t ff_disable)
1360 {
1361 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1362 	struct crypto_unittest_params *ut_params = &unittest_params;
1363 
1364 	uint16_t qp_id;
1365 
1366 	/* Clear unit test parameters before running test */
1367 	memset(ut_params, 0, sizeof(*ut_params));
1368 
1369 	/* Reconfigure device to default parameters */
1370 	ts_params->conf.socket_id = SOCKET_ID_ANY;
1371 	ts_params->conf.ff_disable = ff_disable;
1372 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1373 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
1374 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
1375 
1376 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1377 			&ts_params->conf),
1378 			"Failed to configure cryptodev %u",
1379 			ts_params->valid_devs[0]);
1380 
1381 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1382 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1383 			ts_params->valid_devs[0], qp_id,
1384 			&ts_params->qp_conf,
1385 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1386 			"Failed to setup queue pair %u on cryptodev %u",
1387 			qp_id, ts_params->valid_devs[0]);
1388 	}
1389 
1390 
1391 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1392 
1393 	/* Start the device */
1394 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1395 			"Failed to start cryptodev %u",
1396 			ts_params->valid_devs[0]);
1397 
1398 	return TEST_SUCCESS;
1399 }
1400 
1401 int
1402 ut_setup(void)
1403 {
1404 	/* Configure and start the device with security feature disabled */
1405 	return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1406 }
1407 
1408 static int
1409 ut_setup_security(void)
1410 {
1411 	/* Configure and start the device with no features disabled */
1412 	return dev_configure_and_start(0);
1413 }
1414 
1415 void
1416 ut_teardown(void)
1417 {
1418 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1419 	struct crypto_unittest_params *ut_params = &unittest_params;
1420 	struct rte_cryptodev_stats stats;
1421 
1422 	/* free crypto session structure */
1423 #ifdef RTE_LIB_SECURITY
1424 	if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1425 		if (ut_params->sec_session) {
1426 			rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1427 						(ts_params->valid_devs[0]),
1428 						ut_params->sec_session);
1429 			ut_params->sec_session = NULL;
1430 		}
1431 	} else
1432 #endif
1433 	{
1434 		if (ut_params->sess) {
1435 			rte_cryptodev_sym_session_clear(
1436 					ts_params->valid_devs[0],
1437 					ut_params->sess);
1438 			rte_cryptodev_sym_session_free(ut_params->sess);
1439 			ut_params->sess = NULL;
1440 		}
1441 	}
1442 
1443 	/* free crypto operation structure */
1444 	if (ut_params->op)
1445 		rte_crypto_op_free(ut_params->op);
1446 
1447 	/*
1448 	 * free mbuf - both obuf and ibuf are usually the same,
1449 	 * so check if they point at the same address is necessary,
1450 	 * to avoid freeing the mbuf twice.
1451 	 */
1452 	if (ut_params->obuf) {
1453 		rte_pktmbuf_free(ut_params->obuf);
1454 		if (ut_params->ibuf == ut_params->obuf)
1455 			ut_params->ibuf = 0;
1456 		ut_params->obuf = 0;
1457 	}
1458 	if (ut_params->ibuf) {
1459 		rte_pktmbuf_free(ut_params->ibuf);
1460 		ut_params->ibuf = 0;
1461 	}
1462 
1463 	if (ts_params->mbuf_pool != NULL)
1464 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1465 			rte_mempool_avail_count(ts_params->mbuf_pool));
1466 
1467 	rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
1468 
1469 	/* Stop the device */
1470 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1471 }
1472 
1473 static int
1474 test_device_configure_invalid_dev_id(void)
1475 {
1476 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1477 	uint16_t dev_id, num_devs = 0;
1478 
1479 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1480 			"Need at least %d devices for test", 1);
1481 
1482 	/* valid dev_id values */
1483 	dev_id = ts_params->valid_devs[0];
1484 
1485 	/* Stop the device in case it's started so it can be configured */
1486 	rte_cryptodev_stop(dev_id);
1487 
1488 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1489 			"Failed test for rte_cryptodev_configure: "
1490 			"invalid dev_num %u", dev_id);
1491 
1492 	/* invalid dev_id values */
1493 	dev_id = num_devs;
1494 
1495 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1496 			"Failed test for rte_cryptodev_configure: "
1497 			"invalid dev_num %u", dev_id);
1498 
1499 	dev_id = 0xff;
1500 
1501 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1502 			"Failed test for rte_cryptodev_configure:"
1503 			"invalid dev_num %u", dev_id);
1504 
1505 	return TEST_SUCCESS;
1506 }
1507 
1508 static int
1509 test_device_configure_invalid_queue_pair_ids(void)
1510 {
1511 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1512 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1513 
1514 	/* Stop the device in case it's started so it can be configured */
1515 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1516 
1517 	/* valid - max value queue pairs */
1518 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1519 
1520 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1521 			&ts_params->conf),
1522 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1523 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1524 
1525 	/* valid - one queue pairs */
1526 	ts_params->conf.nb_queue_pairs = 1;
1527 
1528 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1529 			&ts_params->conf),
1530 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1531 			ts_params->valid_devs[0],
1532 			ts_params->conf.nb_queue_pairs);
1533 
1534 
1535 	/* invalid - zero queue pairs */
1536 	ts_params->conf.nb_queue_pairs = 0;
1537 
1538 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1539 			&ts_params->conf),
1540 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1541 			" invalid qps: %u",
1542 			ts_params->valid_devs[0],
1543 			ts_params->conf.nb_queue_pairs);
1544 
1545 
1546 	/* invalid - max value supported by field queue pairs */
1547 	ts_params->conf.nb_queue_pairs = UINT16_MAX;
1548 
1549 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1550 			&ts_params->conf),
1551 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1552 			" invalid qps: %u",
1553 			ts_params->valid_devs[0],
1554 			ts_params->conf.nb_queue_pairs);
1555 
1556 
1557 	/* invalid - max value + 1 queue pairs */
1558 	ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1559 
1560 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1561 			&ts_params->conf),
1562 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1563 			" invalid qps: %u",
1564 			ts_params->valid_devs[0],
1565 			ts_params->conf.nb_queue_pairs);
1566 
1567 	/* revert to original testsuite value */
1568 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1569 
1570 	return TEST_SUCCESS;
1571 }
1572 
1573 static int
1574 test_queue_pair_descriptor_setup(void)
1575 {
1576 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1577 	struct rte_cryptodev_qp_conf qp_conf = {
1578 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
1579 	};
1580 	uint16_t qp_id;
1581 
1582 	/* Stop the device in case it's started so it can be configured */
1583 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1584 
1585 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1586 			&ts_params->conf),
1587 			"Failed to configure cryptodev %u",
1588 			ts_params->valid_devs[0]);
1589 
1590 	/*
1591 	 * Test various ring sizes on this device. memzones can't be
1592 	 * freed so are re-used if ring is released and re-created.
1593 	 */
1594 	qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1595 	qp_conf.mp_session = ts_params->session_mpool;
1596 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
1597 
1598 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1599 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1600 				ts_params->valid_devs[0], qp_id, &qp_conf,
1601 				rte_cryptodev_socket_id(
1602 						ts_params->valid_devs[0])),
1603 				"Failed test for "
1604 				"rte_cryptodev_queue_pair_setup: num_inflights "
1605 				"%u on qp %u on cryptodev %u",
1606 				qp_conf.nb_descriptors, qp_id,
1607 				ts_params->valid_devs[0]);
1608 	}
1609 
1610 	qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1611 
1612 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1613 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1614 				ts_params->valid_devs[0], qp_id, &qp_conf,
1615 				rte_cryptodev_socket_id(
1616 						ts_params->valid_devs[0])),
1617 				"Failed test for"
1618 				" rte_cryptodev_queue_pair_setup: num_inflights"
1619 				" %u on qp %u on cryptodev %u",
1620 				qp_conf.nb_descriptors, qp_id,
1621 				ts_params->valid_devs[0]);
1622 	}
1623 
1624 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1625 
1626 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1627 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1628 				ts_params->valid_devs[0], qp_id, &qp_conf,
1629 				rte_cryptodev_socket_id(
1630 						ts_params->valid_devs[0])),
1631 				"Failed test for "
1632 				"rte_cryptodev_queue_pair_setup: num_inflights"
1633 				" %u on qp %u on cryptodev %u",
1634 				qp_conf.nb_descriptors, qp_id,
1635 				ts_params->valid_devs[0]);
1636 	}
1637 
1638 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1639 
1640 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1641 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1642 				ts_params->valid_devs[0], qp_id, &qp_conf,
1643 				rte_cryptodev_socket_id(
1644 						ts_params->valid_devs[0])),
1645 				"Failed test for"
1646 				" rte_cryptodev_queue_pair_setup:"
1647 				"num_inflights %u on qp %u on cryptodev %u",
1648 				qp_conf.nb_descriptors, qp_id,
1649 				ts_params->valid_devs[0]);
1650 	}
1651 
1652 	/* test invalid queue pair id */
1653 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;	/*valid */
1654 
1655 	qp_id = ts_params->conf.nb_queue_pairs;		/*invalid */
1656 
1657 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1658 			ts_params->valid_devs[0],
1659 			qp_id, &qp_conf,
1660 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1661 			"Failed test for rte_cryptodev_queue_pair_setup:"
1662 			"invalid qp %u on cryptodev %u",
1663 			qp_id, ts_params->valid_devs[0]);
1664 
1665 	qp_id = 0xffff; /*invalid*/
1666 
1667 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1668 			ts_params->valid_devs[0],
1669 			qp_id, &qp_conf,
1670 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1671 			"Failed test for rte_cryptodev_queue_pair_setup:"
1672 			"invalid qp %u on cryptodev %u",
1673 			qp_id, ts_params->valid_devs[0]);
1674 
1675 	return TEST_SUCCESS;
1676 }
1677 
1678 /* ***** Plaintext data for tests ***** */
1679 
1680 const char catch_22_quote_1[] =
1681 		"There was only one catch and that was Catch-22, which "
1682 		"specified that a concern for one's safety in the face of "
1683 		"dangers that were real and immediate was the process of a "
1684 		"rational mind. Orr was crazy and could be grounded. All he "
1685 		"had to do was ask; and as soon as he did, he would no longer "
1686 		"be crazy and would have to fly more missions. Orr would be "
1687 		"crazy to fly more missions and sane if he didn't, but if he "
1688 		"was sane he had to fly them. If he flew them he was crazy "
1689 		"and didn't have to; but if he didn't want to he was sane and "
1690 		"had to. Yossarian was moved very deeply by the absolute "
1691 		"simplicity of this clause of Catch-22 and let out a "
1692 		"respectful whistle. \"That's some catch, that Catch-22\", he "
1693 		"observed. \"It's the best there is,\" Doc Daneeka agreed.";
1694 
1695 const char catch_22_quote[] =
1696 		"What a lousy earth! He wondered how many people were "
1697 		"destitute that same night even in his own prosperous country, "
1698 		"how many homes were shanties, how many husbands were drunk "
1699 		"and wives socked, and how many children were bullied, abused, "
1700 		"or abandoned. How many families hungered for food they could "
1701 		"not afford to buy? How many hearts were broken? How many "
1702 		"suicides would take place that same night, how many people "
1703 		"would go insane? How many cockroaches and landlords would "
1704 		"triumph? How many winners were losers, successes failures, "
1705 		"and rich men poor men? How many wise guys were stupid? How "
1706 		"many happy endings were unhappy endings? How many honest men "
1707 		"were liars, brave men cowards, loyal men traitors, how many "
1708 		"sainted men were corrupt, how many people in positions of "
1709 		"trust had sold their souls to bodyguards, how many had never "
1710 		"had souls? How many straight-and-narrow paths were crooked "
1711 		"paths? How many best families were worst families and how "
1712 		"many good people were bad people? When you added them all up "
1713 		"and then subtracted, you might be left with only the children, "
1714 		"and perhaps with Albert Einstein and an old violinist or "
1715 		"sculptor somewhere.";
1716 
1717 #define QUOTE_480_BYTES		(480)
1718 #define QUOTE_512_BYTES		(512)
1719 #define QUOTE_768_BYTES		(768)
1720 #define QUOTE_1024_BYTES	(1024)
1721 
1722 
1723 
1724 /* ***** SHA1 Hash Tests ***** */
1725 
1726 #define HMAC_KEY_LENGTH_SHA1	(DIGEST_BYTE_LENGTH_SHA1)
1727 
1728 static uint8_t hmac_sha1_key[] = {
1729 	0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1730 	0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1731 	0xDE, 0xF4, 0xDE, 0xAD };
1732 
1733 /* ***** SHA224 Hash Tests ***** */
1734 
1735 #define HMAC_KEY_LENGTH_SHA224	(DIGEST_BYTE_LENGTH_SHA224)
1736 
1737 
1738 /* ***** AES-CBC Cipher Tests ***** */
1739 
1740 #define CIPHER_KEY_LENGTH_AES_CBC	(16)
1741 #define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
1742 
1743 static uint8_t aes_cbc_key[] = {
1744 	0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1745 	0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1746 
1747 static uint8_t aes_cbc_iv[] = {
1748 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1749 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1750 
1751 
1752 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1753 
1754 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1755 	0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1756 	0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1757 	0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1758 	0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1759 	0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1760 	0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1761 	0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1762 	0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1763 	0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1764 	0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1765 	0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1766 	0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1767 	0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1768 	0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1769 	0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1770 	0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1771 	0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1772 	0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1773 	0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1774 	0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1775 	0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1776 	0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1777 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1778 	0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1779 	0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1780 	0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1781 	0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1782 	0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1783 	0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1784 	0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1785 	0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1786 	0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1787 	0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1788 	0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1789 	0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1790 	0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1791 	0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1792 	0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1793 	0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1794 	0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1795 	0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1796 	0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1797 	0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1798 	0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1799 	0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1800 	0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1801 	0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1802 	0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1803 	0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1804 	0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1805 	0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1806 	0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1807 	0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1808 	0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1809 	0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1810 	0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1811 	0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1812 	0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1813 	0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1814 	0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1815 	0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1816 	0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1817 	0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1818 	0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1819 };
1820 
1821 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1822 	0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1823 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1824 	0x18, 0x8c, 0x1d, 0x32
1825 };
1826 
1827 
1828 /* Multisession Vector context Test */
1829 /*Begin Session 0 */
1830 static uint8_t ms_aes_cbc_key0[] = {
1831 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1832 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1833 };
1834 
1835 static uint8_t ms_aes_cbc_iv0[] = {
1836 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1837 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1838 };
1839 
1840 static const uint8_t ms_aes_cbc_cipher0[] = {
1841 		0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1842 		0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1843 		0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1844 		0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1845 		0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1846 		0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1847 		0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1848 		0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1849 		0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1850 		0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1851 		0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1852 		0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1853 		0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1854 		0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1855 		0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1856 		0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1857 		0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1858 		0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1859 		0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1860 		0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1861 		0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1862 		0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1863 		0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1864 		0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1865 		0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1866 		0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1867 		0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1868 		0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1869 		0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1870 		0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1871 		0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1872 		0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1873 		0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1874 		0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1875 		0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1876 		0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1877 		0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1878 		0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1879 		0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1880 		0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1881 		0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1882 		0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1883 		0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1884 		0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1885 		0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1886 		0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1887 		0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1888 		0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1889 		0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1890 		0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1891 		0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1892 		0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1893 		0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1894 		0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1895 		0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1896 		0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1897 		0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1898 		0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1899 		0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1900 		0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1901 		0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1902 		0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1903 		0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1904 		0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1905 };
1906 
1907 
1908 static  uint8_t ms_hmac_key0[] = {
1909 		0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1910 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1911 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1912 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1913 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1914 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1915 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1916 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1917 };
1918 
1919 static const uint8_t ms_hmac_digest0[] = {
1920 		0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1921 		0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1922 		0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1923 		0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1924 		0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1925 		0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1926 		0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1927 		0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1928 		};
1929 
1930 /* End Session 0 */
1931 /* Begin session 1 */
1932 
1933 static  uint8_t ms_aes_cbc_key1[] = {
1934 		0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1935 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1936 };
1937 
1938 static  uint8_t ms_aes_cbc_iv1[] = {
1939 	0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1940 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1941 };
1942 
1943 static const uint8_t ms_aes_cbc_cipher1[] = {
1944 		0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1945 		0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1946 		0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1947 		0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1948 		0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1949 		0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1950 		0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1951 		0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1952 		0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1953 		0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1954 		0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1955 		0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1956 		0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1957 		0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1958 		0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1959 		0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1960 		0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1961 		0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1962 		0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1963 		0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1964 		0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1965 		0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1966 		0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1967 		0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1968 		0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1969 		0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1970 		0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1971 		0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1972 		0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1973 		0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1974 		0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1975 		0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1976 		0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1977 		0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1978 		0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1979 		0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1980 		0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1981 		0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1982 		0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1983 		0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1984 		0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1985 		0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1986 		0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1987 		0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1988 		0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1989 		0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1990 		0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1991 		0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1992 		0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1993 		0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1994 		0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1995 		0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1996 		0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1997 		0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1998 		0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1999 		0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
2000 		0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
2001 		0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
2002 		0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
2003 		0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
2004 		0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
2005 		0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
2006 		0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
2007 		0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
2008 
2009 };
2010 
2011 static uint8_t ms_hmac_key1[] = {
2012 		0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2013 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2014 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2015 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2016 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2017 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2018 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2019 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2020 };
2021 
2022 static const uint8_t ms_hmac_digest1[] = {
2023 		0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
2024 		0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
2025 		0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
2026 		0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
2027 		0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
2028 		0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
2029 		0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
2030 		0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
2031 };
2032 /* End Session 1  */
2033 /* Begin Session 2 */
2034 static  uint8_t ms_aes_cbc_key2[] = {
2035 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2036 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2037 };
2038 
2039 static  uint8_t ms_aes_cbc_iv2[] = {
2040 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2041 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2042 };
2043 
2044 static const uint8_t ms_aes_cbc_cipher2[] = {
2045 		0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
2046 		0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
2047 		0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
2048 		0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
2049 		0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
2050 		0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
2051 		0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
2052 		0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
2053 		0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
2054 		0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
2055 		0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
2056 		0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
2057 		0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
2058 		0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
2059 		0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
2060 		0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
2061 		0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
2062 		0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
2063 		0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
2064 		0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
2065 		0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
2066 		0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
2067 		0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
2068 		0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
2069 		0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
2070 		0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
2071 		0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
2072 		0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
2073 		0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
2074 		0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
2075 		0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
2076 		0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
2077 		0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
2078 		0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
2079 		0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
2080 		0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
2081 		0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
2082 		0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
2083 		0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
2084 		0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
2085 		0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
2086 		0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
2087 		0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
2088 		0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
2089 		0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
2090 		0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
2091 		0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2092 		0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2093 		0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2094 		0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2095 		0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2096 		0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2097 		0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2098 		0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2099 		0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2100 		0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2101 		0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2102 		0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2103 		0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2104 		0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2105 		0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2106 		0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2107 		0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2108 		0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2109 };
2110 
2111 static  uint8_t ms_hmac_key2[] = {
2112 		0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2113 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2114 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2115 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2116 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2117 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2118 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2119 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2120 };
2121 
2122 static const uint8_t ms_hmac_digest2[] = {
2123 		0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2124 		0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2125 		0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2126 		0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2127 		0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2128 		0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2129 		0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2130 		0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2131 };
2132 
2133 /* End Session 2 */
2134 
2135 
2136 static int
2137 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2138 {
2139 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2140 	struct crypto_unittest_params *ut_params = &unittest_params;
2141 
2142 	/* Verify the capabilities */
2143 	struct rte_cryptodev_sym_capability_idx cap_idx;
2144 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2145 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2146 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2147 			&cap_idx) == NULL)
2148 		return TEST_SKIPPED;
2149 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2150 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2151 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2152 			&cap_idx) == NULL)
2153 		return TEST_SKIPPED;
2154 
2155 	/* Generate test mbuf data and space for digest */
2156 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2157 			catch_22_quote,	QUOTE_512_BYTES, 0);
2158 
2159 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2160 			DIGEST_BYTE_LENGTH_SHA1);
2161 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2162 
2163 	/* Setup Cipher Parameters */
2164 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2165 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2166 
2167 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2168 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2169 	ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2170 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2171 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2172 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2173 
2174 	/* Setup HMAC Parameters */
2175 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2176 
2177 	ut_params->auth_xform.next = NULL;
2178 
2179 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2180 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2181 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2182 	ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2183 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2184 
2185 	ut_params->sess = rte_cryptodev_sym_session_create(
2186 			ts_params->session_mpool);
2187 
2188 	/* Create crypto session*/
2189 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
2190 			ut_params->sess, &ut_params->cipher_xform,
2191 			ts_params->session_priv_mpool);
2192 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2193 
2194 	/* Generate crypto op data structure */
2195 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2196 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2197 	TEST_ASSERT_NOT_NULL(ut_params->op,
2198 			"Failed to allocate symmetric crypto operation struct");
2199 
2200 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2201 
2202 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2203 
2204 	/* set crypto operation source mbuf */
2205 	sym_op->m_src = ut_params->ibuf;
2206 
2207 	/* Set crypto operation authentication parameters */
2208 	sym_op->auth.digest.data = ut_params->digest;
2209 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2210 			ut_params->ibuf, QUOTE_512_BYTES);
2211 
2212 	sym_op->auth.data.offset = 0;
2213 	sym_op->auth.data.length = QUOTE_512_BYTES;
2214 
2215 	/* Copy IV at the end of the crypto operation */
2216 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2217 			aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2218 
2219 	/* Set crypto operation cipher parameters */
2220 	sym_op->cipher.data.offset = 0;
2221 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2222 
2223 	/* Process crypto operation */
2224 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2225 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2226 			ut_params->op);
2227 	else
2228 		TEST_ASSERT_NOT_NULL(
2229 			process_crypto_request(ts_params->valid_devs[0],
2230 				ut_params->op),
2231 				"failed to process sym crypto op");
2232 
2233 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2234 			"crypto op processing failed");
2235 
2236 	/* Validate obuf */
2237 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2238 			uint8_t *);
2239 
2240 	TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2241 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2242 			QUOTE_512_BYTES,
2243 			"ciphertext data not as expected");
2244 
2245 	uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2246 
2247 	TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2248 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2249 			gbl_driver_id == rte_cryptodev_driver_id_get(
2250 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2251 					TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2252 					DIGEST_BYTE_LENGTH_SHA1,
2253 			"Generated digest data not as expected");
2254 
2255 	return TEST_SUCCESS;
2256 }
2257 
2258 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2259 
2260 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
2261 
2262 static uint8_t hmac_sha512_key[] = {
2263 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2264 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2265 	0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2266 	0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2267 	0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2268 	0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2269 	0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2270 	0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2271 
2272 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2273 	0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2274 	0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2275 	0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2276 	0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2277 	0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2278 	0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2279 	0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2280 	0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2281 
2282 
2283 
2284 static int
2285 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2286 		struct crypto_unittest_params *ut_params,
2287 		uint8_t *cipher_key,
2288 		uint8_t *hmac_key);
2289 
2290 static int
2291 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2292 		struct crypto_unittest_params *ut_params,
2293 		struct crypto_testsuite_params *ts_params,
2294 		const uint8_t *cipher,
2295 		const uint8_t *digest,
2296 		const uint8_t *iv);
2297 
2298 
2299 static int
2300 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2301 		struct crypto_unittest_params *ut_params,
2302 		uint8_t *cipher_key,
2303 		uint8_t *hmac_key)
2304 {
2305 
2306 	/* Setup Cipher Parameters */
2307 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2308 	ut_params->cipher_xform.next = NULL;
2309 
2310 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2311 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2312 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2313 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2314 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2315 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2316 
2317 	/* Setup HMAC Parameters */
2318 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2319 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2320 
2321 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2322 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2323 	ut_params->auth_xform.auth.key.data = hmac_key;
2324 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2325 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2326 
2327 	return TEST_SUCCESS;
2328 }
2329 
2330 
2331 static int
2332 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2333 		struct crypto_unittest_params *ut_params,
2334 		struct crypto_testsuite_params *ts_params,
2335 		const uint8_t *cipher,
2336 		const uint8_t *digest,
2337 		const uint8_t *iv)
2338 {
2339 	/* Generate test mbuf data and digest */
2340 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2341 			(const char *)
2342 			cipher,
2343 			QUOTE_512_BYTES, 0);
2344 
2345 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2346 			DIGEST_BYTE_LENGTH_SHA512);
2347 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2348 
2349 	rte_memcpy(ut_params->digest,
2350 			digest,
2351 			DIGEST_BYTE_LENGTH_SHA512);
2352 
2353 	/* Generate Crypto op data structure */
2354 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2355 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2356 	TEST_ASSERT_NOT_NULL(ut_params->op,
2357 			"Failed to allocate symmetric crypto operation struct");
2358 
2359 	rte_crypto_op_attach_sym_session(ut_params->op, sess);
2360 
2361 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2362 
2363 	/* set crypto operation source mbuf */
2364 	sym_op->m_src = ut_params->ibuf;
2365 
2366 	sym_op->auth.digest.data = ut_params->digest;
2367 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2368 			ut_params->ibuf, QUOTE_512_BYTES);
2369 
2370 	sym_op->auth.data.offset = 0;
2371 	sym_op->auth.data.length = QUOTE_512_BYTES;
2372 
2373 	/* Copy IV at the end of the crypto operation */
2374 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2375 			iv, CIPHER_IV_LENGTH_AES_CBC);
2376 
2377 	sym_op->cipher.data.offset = 0;
2378 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2379 
2380 	/* Process crypto operation */
2381 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2382 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2383 			ut_params->op);
2384 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2385 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2386 				ut_params->op, 1, 1, 0, 0);
2387 	else
2388 		TEST_ASSERT_NOT_NULL(
2389 				process_crypto_request(ts_params->valid_devs[0],
2390 					ut_params->op),
2391 					"failed to process sym crypto op");
2392 
2393 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2394 			"crypto op processing failed");
2395 
2396 	ut_params->obuf = ut_params->op->sym->m_src;
2397 
2398 	/* Validate obuf */
2399 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2400 			rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2401 			catch_22_quote,
2402 			QUOTE_512_BYTES,
2403 			"Plaintext data not as expected");
2404 
2405 	/* Validate obuf */
2406 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2407 			"Digest verification failed");
2408 
2409 	return TEST_SUCCESS;
2410 }
2411 
2412 /* ***** SNOW 3G Tests ***** */
2413 static int
2414 create_wireless_algo_hash_session(uint8_t dev_id,
2415 	const uint8_t *key, const uint8_t key_len,
2416 	const uint8_t iv_len, const uint8_t auth_len,
2417 	enum rte_crypto_auth_operation op,
2418 	enum rte_crypto_auth_algorithm algo)
2419 {
2420 	uint8_t hash_key[key_len];
2421 	int status;
2422 
2423 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2424 	struct crypto_unittest_params *ut_params = &unittest_params;
2425 
2426 	memcpy(hash_key, key, key_len);
2427 
2428 	debug_hexdump(stdout, "key:", key, key_len);
2429 
2430 	/* Setup Authentication Parameters */
2431 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2432 	ut_params->auth_xform.next = NULL;
2433 
2434 	ut_params->auth_xform.auth.op = op;
2435 	ut_params->auth_xform.auth.algo = algo;
2436 	ut_params->auth_xform.auth.key.length = key_len;
2437 	ut_params->auth_xform.auth.key.data = hash_key;
2438 	ut_params->auth_xform.auth.digest_length = auth_len;
2439 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2440 	ut_params->auth_xform.auth.iv.length = iv_len;
2441 	ut_params->sess = rte_cryptodev_sym_session_create(
2442 			ts_params->session_mpool);
2443 
2444 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2445 			&ut_params->auth_xform,
2446 			ts_params->session_priv_mpool);
2447 	if (status == -ENOTSUP)
2448 		return TEST_SKIPPED;
2449 
2450 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2451 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2452 	return 0;
2453 }
2454 
2455 static int
2456 create_wireless_algo_cipher_session(uint8_t dev_id,
2457 			enum rte_crypto_cipher_operation op,
2458 			enum rte_crypto_cipher_algorithm algo,
2459 			const uint8_t *key, const uint8_t key_len,
2460 			uint8_t iv_len)
2461 {
2462 	uint8_t cipher_key[key_len];
2463 	int status;
2464 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2465 	struct crypto_unittest_params *ut_params = &unittest_params;
2466 
2467 	memcpy(cipher_key, key, key_len);
2468 
2469 	/* Setup Cipher Parameters */
2470 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2471 	ut_params->cipher_xform.next = NULL;
2472 
2473 	ut_params->cipher_xform.cipher.algo = algo;
2474 	ut_params->cipher_xform.cipher.op = op;
2475 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2476 	ut_params->cipher_xform.cipher.key.length = key_len;
2477 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2478 	ut_params->cipher_xform.cipher.iv.length = iv_len;
2479 
2480 	debug_hexdump(stdout, "key:", key, key_len);
2481 
2482 	/* Create Crypto session */
2483 	ut_params->sess = rte_cryptodev_sym_session_create(
2484 			ts_params->session_mpool);
2485 
2486 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2487 			&ut_params->cipher_xform,
2488 			ts_params->session_priv_mpool);
2489 	if (status == -ENOTSUP)
2490 		return TEST_SKIPPED;
2491 
2492 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2493 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2494 	return 0;
2495 }
2496 
2497 static int
2498 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2499 			unsigned int cipher_len,
2500 			unsigned int cipher_offset)
2501 {
2502 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2503 	struct crypto_unittest_params *ut_params = &unittest_params;
2504 
2505 	/* Generate Crypto op data structure */
2506 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2507 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2508 	TEST_ASSERT_NOT_NULL(ut_params->op,
2509 				"Failed to allocate pktmbuf offload");
2510 
2511 	/* Set crypto operation data parameters */
2512 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2513 
2514 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2515 
2516 	/* set crypto operation source mbuf */
2517 	sym_op->m_src = ut_params->ibuf;
2518 
2519 	/* iv */
2520 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2521 			iv, iv_len);
2522 	sym_op->cipher.data.length = cipher_len;
2523 	sym_op->cipher.data.offset = cipher_offset;
2524 	return 0;
2525 }
2526 
2527 static int
2528 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2529 			unsigned int cipher_len,
2530 			unsigned int cipher_offset)
2531 {
2532 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2533 	struct crypto_unittest_params *ut_params = &unittest_params;
2534 
2535 	/* Generate Crypto op data structure */
2536 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2537 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2538 	TEST_ASSERT_NOT_NULL(ut_params->op,
2539 				"Failed to allocate pktmbuf offload");
2540 
2541 	/* Set crypto operation data parameters */
2542 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2543 
2544 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2545 
2546 	/* set crypto operation source mbuf */
2547 	sym_op->m_src = ut_params->ibuf;
2548 	sym_op->m_dst = ut_params->obuf;
2549 
2550 	/* iv */
2551 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2552 			iv, iv_len);
2553 	sym_op->cipher.data.length = cipher_len;
2554 	sym_op->cipher.data.offset = cipher_offset;
2555 	return 0;
2556 }
2557 
2558 static int
2559 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2560 		enum rte_crypto_cipher_operation cipher_op,
2561 		enum rte_crypto_auth_operation auth_op,
2562 		enum rte_crypto_auth_algorithm auth_algo,
2563 		enum rte_crypto_cipher_algorithm cipher_algo,
2564 		const uint8_t *key, uint8_t key_len,
2565 		uint8_t auth_iv_len, uint8_t auth_len,
2566 		uint8_t cipher_iv_len)
2567 
2568 {
2569 	uint8_t cipher_auth_key[key_len];
2570 	int status;
2571 
2572 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2573 	struct crypto_unittest_params *ut_params = &unittest_params;
2574 
2575 	memcpy(cipher_auth_key, key, key_len);
2576 
2577 	/* Setup Authentication Parameters */
2578 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2579 	ut_params->auth_xform.next = NULL;
2580 
2581 	ut_params->auth_xform.auth.op = auth_op;
2582 	ut_params->auth_xform.auth.algo = auth_algo;
2583 	ut_params->auth_xform.auth.key.length = key_len;
2584 	/* Hash key = cipher key */
2585 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2586 	ut_params->auth_xform.auth.digest_length = auth_len;
2587 	/* Auth IV will be after cipher IV */
2588 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2589 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2590 
2591 	/* Setup Cipher Parameters */
2592 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2593 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2594 
2595 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2596 	ut_params->cipher_xform.cipher.op = cipher_op;
2597 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2598 	ut_params->cipher_xform.cipher.key.length = key_len;
2599 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2600 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2601 
2602 	debug_hexdump(stdout, "key:", key, key_len);
2603 
2604 	/* Create Crypto session*/
2605 	ut_params->sess = rte_cryptodev_sym_session_create(
2606 			ts_params->session_mpool);
2607 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2608 
2609 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2610 			&ut_params->cipher_xform,
2611 			ts_params->session_priv_mpool);
2612 	if (status == -ENOTSUP)
2613 		return TEST_SKIPPED;
2614 
2615 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2616 	return 0;
2617 }
2618 
2619 static int
2620 create_wireless_cipher_auth_session(uint8_t dev_id,
2621 		enum rte_crypto_cipher_operation cipher_op,
2622 		enum rte_crypto_auth_operation auth_op,
2623 		enum rte_crypto_auth_algorithm auth_algo,
2624 		enum rte_crypto_cipher_algorithm cipher_algo,
2625 		const struct wireless_test_data *tdata)
2626 {
2627 	const uint8_t key_len = tdata->key.len;
2628 	uint8_t cipher_auth_key[key_len];
2629 	int status;
2630 
2631 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2632 	struct crypto_unittest_params *ut_params = &unittest_params;
2633 	const uint8_t *key = tdata->key.data;
2634 	const uint8_t auth_len = tdata->digest.len;
2635 	uint8_t cipher_iv_len = tdata->cipher_iv.len;
2636 	uint8_t auth_iv_len = tdata->auth_iv.len;
2637 
2638 	memcpy(cipher_auth_key, key, key_len);
2639 
2640 	/* Setup Authentication Parameters */
2641 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2642 	ut_params->auth_xform.next = NULL;
2643 
2644 	ut_params->auth_xform.auth.op = auth_op;
2645 	ut_params->auth_xform.auth.algo = auth_algo;
2646 	ut_params->auth_xform.auth.key.length = key_len;
2647 	/* Hash key = cipher key */
2648 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2649 	ut_params->auth_xform.auth.digest_length = auth_len;
2650 	/* Auth IV will be after cipher IV */
2651 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2652 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2653 
2654 	/* Setup Cipher Parameters */
2655 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2656 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2657 
2658 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2659 	ut_params->cipher_xform.cipher.op = cipher_op;
2660 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2661 	ut_params->cipher_xform.cipher.key.length = key_len;
2662 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2663 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2664 
2665 
2666 	debug_hexdump(stdout, "key:", key, key_len);
2667 
2668 	/* Create Crypto session*/
2669 	ut_params->sess = rte_cryptodev_sym_session_create(
2670 			ts_params->session_mpool);
2671 
2672 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2673 			&ut_params->cipher_xform,
2674 			ts_params->session_priv_mpool);
2675 	if (status == -ENOTSUP)
2676 		return TEST_SKIPPED;
2677 
2678 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2679 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2680 	return 0;
2681 }
2682 
2683 static int
2684 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2685 		const struct wireless_test_data *tdata)
2686 {
2687 	return create_wireless_cipher_auth_session(dev_id,
2688 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2689 		RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2690 		RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2691 }
2692 
2693 static int
2694 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2695 		enum rte_crypto_cipher_operation cipher_op,
2696 		enum rte_crypto_auth_operation auth_op,
2697 		enum rte_crypto_auth_algorithm auth_algo,
2698 		enum rte_crypto_cipher_algorithm cipher_algo,
2699 		const uint8_t *key, const uint8_t key_len,
2700 		uint8_t auth_iv_len, uint8_t auth_len,
2701 		uint8_t cipher_iv_len)
2702 {
2703 	uint8_t auth_cipher_key[key_len];
2704 	int status;
2705 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2706 	struct crypto_unittest_params *ut_params = &unittest_params;
2707 
2708 	memcpy(auth_cipher_key, key, key_len);
2709 
2710 	/* Setup Authentication Parameters */
2711 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2712 	ut_params->auth_xform.auth.op = auth_op;
2713 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2714 	ut_params->auth_xform.auth.algo = auth_algo;
2715 	ut_params->auth_xform.auth.key.length = key_len;
2716 	ut_params->auth_xform.auth.key.data = auth_cipher_key;
2717 	ut_params->auth_xform.auth.digest_length = auth_len;
2718 	/* Auth IV will be after cipher IV */
2719 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2720 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2721 
2722 	/* Setup Cipher Parameters */
2723 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2724 	ut_params->cipher_xform.next = NULL;
2725 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2726 	ut_params->cipher_xform.cipher.op = cipher_op;
2727 	ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2728 	ut_params->cipher_xform.cipher.key.length = key_len;
2729 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2730 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2731 
2732 	debug_hexdump(stdout, "key:", key, key_len);
2733 
2734 	/* Create Crypto session*/
2735 	ut_params->sess = rte_cryptodev_sym_session_create(
2736 			ts_params->session_mpool);
2737 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2738 
2739 	if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2740 		ut_params->auth_xform.next = NULL;
2741 		ut_params->cipher_xform.next = &ut_params->auth_xform;
2742 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2743 				&ut_params->cipher_xform,
2744 				ts_params->session_priv_mpool);
2745 
2746 	} else
2747 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2748 				&ut_params->auth_xform,
2749 				ts_params->session_priv_mpool);
2750 
2751 	if (status == -ENOTSUP)
2752 		return TEST_SKIPPED;
2753 
2754 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2755 
2756 	return 0;
2757 }
2758 
2759 static int
2760 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2761 		unsigned int auth_tag_len,
2762 		const uint8_t *iv, unsigned int iv_len,
2763 		unsigned int data_pad_len,
2764 		enum rte_crypto_auth_operation op,
2765 		unsigned int auth_len, unsigned int auth_offset)
2766 {
2767 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2768 
2769 	struct crypto_unittest_params *ut_params = &unittest_params;
2770 
2771 	/* Generate Crypto op data structure */
2772 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2773 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2774 	TEST_ASSERT_NOT_NULL(ut_params->op,
2775 		"Failed to allocate pktmbuf offload");
2776 
2777 	/* Set crypto operation data parameters */
2778 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2779 
2780 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2781 
2782 	/* set crypto operation source mbuf */
2783 	sym_op->m_src = ut_params->ibuf;
2784 
2785 	/* iv */
2786 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2787 			iv, iv_len);
2788 	/* digest */
2789 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2790 					ut_params->ibuf, auth_tag_len);
2791 
2792 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2793 				"no room to append auth tag");
2794 	ut_params->digest = sym_op->auth.digest.data;
2795 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2796 			ut_params->ibuf, data_pad_len);
2797 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2798 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2799 	else
2800 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2801 
2802 	debug_hexdump(stdout, "digest:",
2803 		sym_op->auth.digest.data,
2804 		auth_tag_len);
2805 
2806 	sym_op->auth.data.length = auth_len;
2807 	sym_op->auth.data.offset = auth_offset;
2808 
2809 	return 0;
2810 }
2811 
2812 static int
2813 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2814 	enum rte_crypto_auth_operation op)
2815 {
2816 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2817 	struct crypto_unittest_params *ut_params = &unittest_params;
2818 
2819 	const uint8_t *auth_tag = tdata->digest.data;
2820 	const unsigned int auth_tag_len = tdata->digest.len;
2821 	unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2822 	unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2823 
2824 	const uint8_t *cipher_iv = tdata->cipher_iv.data;
2825 	const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2826 	const uint8_t *auth_iv = tdata->auth_iv.data;
2827 	const uint8_t auth_iv_len = tdata->auth_iv.len;
2828 	const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2829 	const unsigned int auth_len = tdata->validAuthLenInBits.len;
2830 
2831 	/* Generate Crypto op data structure */
2832 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2833 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2834 	TEST_ASSERT_NOT_NULL(ut_params->op,
2835 			"Failed to allocate pktmbuf offload");
2836 	/* Set crypto operation data parameters */
2837 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2838 
2839 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2840 
2841 	/* set crypto operation source mbuf */
2842 	sym_op->m_src = ut_params->ibuf;
2843 
2844 	/* digest */
2845 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2846 			ut_params->ibuf, auth_tag_len);
2847 
2848 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2849 			"no room to append auth tag");
2850 	ut_params->digest = sym_op->auth.digest.data;
2851 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2852 			ut_params->ibuf, data_pad_len);
2853 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2854 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2855 	else
2856 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2857 
2858 	debug_hexdump(stdout, "digest:",
2859 		sym_op->auth.digest.data,
2860 		auth_tag_len);
2861 
2862 	/* Copy cipher and auth IVs at the end of the crypto operation */
2863 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2864 						IV_OFFSET);
2865 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2866 	iv_ptr += cipher_iv_len;
2867 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2868 
2869 	sym_op->cipher.data.length = cipher_len;
2870 	sym_op->cipher.data.offset = 0;
2871 	sym_op->auth.data.length = auth_len;
2872 	sym_op->auth.data.offset = 0;
2873 
2874 	return 0;
2875 }
2876 
2877 static int
2878 create_zuc_cipher_hash_generate_operation(
2879 		const struct wireless_test_data *tdata)
2880 {
2881 	return create_wireless_cipher_hash_operation(tdata,
2882 		RTE_CRYPTO_AUTH_OP_GENERATE);
2883 }
2884 
2885 static int
2886 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2887 		const unsigned auth_tag_len,
2888 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2889 		unsigned data_pad_len,
2890 		enum rte_crypto_auth_operation op,
2891 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2892 		const unsigned cipher_len, const unsigned cipher_offset,
2893 		const unsigned auth_len, const unsigned auth_offset)
2894 {
2895 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2896 	struct crypto_unittest_params *ut_params = &unittest_params;
2897 
2898 	enum rte_crypto_cipher_algorithm cipher_algo =
2899 			ut_params->cipher_xform.cipher.algo;
2900 	enum rte_crypto_auth_algorithm auth_algo =
2901 			ut_params->auth_xform.auth.algo;
2902 
2903 	/* Generate Crypto op data structure */
2904 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2905 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2906 	TEST_ASSERT_NOT_NULL(ut_params->op,
2907 			"Failed to allocate pktmbuf offload");
2908 	/* Set crypto operation data parameters */
2909 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2910 
2911 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2912 
2913 	/* set crypto operation source mbuf */
2914 	sym_op->m_src = ut_params->ibuf;
2915 
2916 	/* digest */
2917 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2918 			ut_params->ibuf, auth_tag_len);
2919 
2920 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2921 			"no room to append auth tag");
2922 	ut_params->digest = sym_op->auth.digest.data;
2923 
2924 	if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2925 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2926 				ut_params->ibuf, data_pad_len);
2927 	} else {
2928 		struct rte_mbuf *m = ut_params->ibuf;
2929 		unsigned int offset = data_pad_len;
2930 
2931 		while (offset > m->data_len && m->next != NULL) {
2932 			offset -= m->data_len;
2933 			m = m->next;
2934 		}
2935 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2936 			m, offset);
2937 	}
2938 
2939 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2940 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2941 	else
2942 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2943 
2944 	debug_hexdump(stdout, "digest:",
2945 		sym_op->auth.digest.data,
2946 		auth_tag_len);
2947 
2948 	/* Copy cipher and auth IVs at the end of the crypto operation */
2949 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2950 						IV_OFFSET);
2951 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2952 	iv_ptr += cipher_iv_len;
2953 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2954 
2955 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2956 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2957 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2958 		sym_op->cipher.data.length = cipher_len;
2959 		sym_op->cipher.data.offset = cipher_offset;
2960 	} else {
2961 		sym_op->cipher.data.length = cipher_len >> 3;
2962 		sym_op->cipher.data.offset = cipher_offset >> 3;
2963 	}
2964 
2965 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2966 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2967 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2968 		sym_op->auth.data.length = auth_len;
2969 		sym_op->auth.data.offset = auth_offset;
2970 	} else {
2971 		sym_op->auth.data.length = auth_len >> 3;
2972 		sym_op->auth.data.offset = auth_offset >> 3;
2973 	}
2974 
2975 	return 0;
2976 }
2977 
2978 static int
2979 create_wireless_algo_auth_cipher_operation(
2980 		const uint8_t *auth_tag, unsigned int auth_tag_len,
2981 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2982 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2983 		unsigned int data_pad_len,
2984 		unsigned int cipher_len, unsigned int cipher_offset,
2985 		unsigned int auth_len, unsigned int auth_offset,
2986 		uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2987 {
2988 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2989 	struct crypto_unittest_params *ut_params = &unittest_params;
2990 
2991 	enum rte_crypto_cipher_algorithm cipher_algo =
2992 			ut_params->cipher_xform.cipher.algo;
2993 	enum rte_crypto_auth_algorithm auth_algo =
2994 			ut_params->auth_xform.auth.algo;
2995 
2996 	/* Generate Crypto op data structure */
2997 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2998 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2999 	TEST_ASSERT_NOT_NULL(ut_params->op,
3000 			"Failed to allocate pktmbuf offload");
3001 
3002 	/* Set crypto operation data parameters */
3003 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
3004 
3005 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
3006 
3007 	/* set crypto operation mbufs */
3008 	sym_op->m_src = ut_params->ibuf;
3009 	if (op_mode == OUT_OF_PLACE)
3010 		sym_op->m_dst = ut_params->obuf;
3011 
3012 	/* digest */
3013 	if (!do_sgl) {
3014 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
3015 			(op_mode == IN_PLACE ?
3016 				ut_params->ibuf : ut_params->obuf),
3017 			uint8_t *, data_pad_len);
3018 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
3019 			(op_mode == IN_PLACE ?
3020 				ut_params->ibuf : ut_params->obuf),
3021 			data_pad_len);
3022 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
3023 	} else {
3024 		uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
3025 		struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
3026 				sym_op->m_src : sym_op->m_dst);
3027 		while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
3028 			remaining_off -= rte_pktmbuf_data_len(sgl_buf);
3029 			sgl_buf = sgl_buf->next;
3030 		}
3031 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
3032 				uint8_t *, remaining_off);
3033 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
3034 				remaining_off);
3035 		memset(sym_op->auth.digest.data, 0, remaining_off);
3036 		while (sgl_buf->next != NULL) {
3037 			memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
3038 				0, rte_pktmbuf_data_len(sgl_buf));
3039 			sgl_buf = sgl_buf->next;
3040 		}
3041 	}
3042 
3043 	/* Copy digest for the verification */
3044 	if (verify)
3045 		memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
3046 
3047 	/* Copy cipher and auth IVs at the end of the crypto operation */
3048 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
3049 			ut_params->op, uint8_t *, IV_OFFSET);
3050 
3051 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3052 	iv_ptr += cipher_iv_len;
3053 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3054 
3055 	/* Only copy over the offset data needed from src to dst in OOP,
3056 	 * if the auth and cipher offsets are not aligned
3057 	 */
3058 	if (op_mode == OUT_OF_PLACE) {
3059 		if (cipher_offset > auth_offset)
3060 			rte_memcpy(
3061 				rte_pktmbuf_mtod_offset(
3062 					sym_op->m_dst,
3063 					uint8_t *, auth_offset >> 3),
3064 				rte_pktmbuf_mtod_offset(
3065 					sym_op->m_src,
3066 					uint8_t *, auth_offset >> 3),
3067 				((cipher_offset >> 3) - (auth_offset >> 3)));
3068 	}
3069 
3070 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3071 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3072 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3073 		sym_op->cipher.data.length = cipher_len;
3074 		sym_op->cipher.data.offset = cipher_offset;
3075 	} else {
3076 		sym_op->cipher.data.length = cipher_len >> 3;
3077 		sym_op->cipher.data.offset = cipher_offset >> 3;
3078 	}
3079 
3080 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3081 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3082 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3083 		sym_op->auth.data.length = auth_len;
3084 		sym_op->auth.data.offset = auth_offset;
3085 	} else {
3086 		sym_op->auth.data.length = auth_len >> 3;
3087 		sym_op->auth.data.offset = auth_offset >> 3;
3088 	}
3089 
3090 	return 0;
3091 }
3092 
3093 static int
3094 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
3095 {
3096 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3097 	struct crypto_unittest_params *ut_params = &unittest_params;
3098 
3099 	int retval;
3100 	unsigned plaintext_pad_len;
3101 	unsigned plaintext_len;
3102 	uint8_t *plaintext;
3103 	struct rte_cryptodev_info dev_info;
3104 
3105 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3106 	uint64_t feat_flags = dev_info.feature_flags;
3107 
3108 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3109 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3110 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3111 		return TEST_SKIPPED;
3112 	}
3113 
3114 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3115 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3116 		printf("Device doesn't support RAW data-path APIs.\n");
3117 		return TEST_SKIPPED;
3118 	}
3119 
3120 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3121 		return TEST_SKIPPED;
3122 
3123 	/* Verify the capabilities */
3124 	struct rte_cryptodev_sym_capability_idx cap_idx;
3125 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3126 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3127 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3128 			&cap_idx) == NULL)
3129 		return TEST_SKIPPED;
3130 
3131 	/* Create SNOW 3G session */
3132 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3133 			tdata->key.data, tdata->key.len,
3134 			tdata->auth_iv.len, tdata->digest.len,
3135 			RTE_CRYPTO_AUTH_OP_GENERATE,
3136 			RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3137 	if (retval < 0)
3138 		return retval;
3139 
3140 	/* alloc mbuf and set payload */
3141 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3142 
3143 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3144 	rte_pktmbuf_tailroom(ut_params->ibuf));
3145 
3146 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3147 	/* Append data which is padded to a multiple of */
3148 	/* the algorithms block size */
3149 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3150 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3151 				plaintext_pad_len);
3152 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3153 
3154 	/* Create SNOW 3G operation */
3155 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3156 			tdata->auth_iv.data, tdata->auth_iv.len,
3157 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3158 			tdata->validAuthLenInBits.len,
3159 			0);
3160 	if (retval < 0)
3161 		return retval;
3162 
3163 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3164 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3165 				ut_params->op, 0, 1, 1, 0);
3166 	else
3167 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3168 				ut_params->op);
3169 	ut_params->obuf = ut_params->op->sym->m_src;
3170 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3171 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3172 			+ plaintext_pad_len;
3173 
3174 	/* Validate obuf */
3175 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3176 	ut_params->digest,
3177 	tdata->digest.data,
3178 	DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3179 	"SNOW 3G Generated auth tag not as expected");
3180 
3181 	return 0;
3182 }
3183 
3184 static int
3185 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3186 {
3187 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3188 	struct crypto_unittest_params *ut_params = &unittest_params;
3189 
3190 	int retval;
3191 	unsigned plaintext_pad_len;
3192 	unsigned plaintext_len;
3193 	uint8_t *plaintext;
3194 	struct rte_cryptodev_info dev_info;
3195 
3196 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3197 	uint64_t feat_flags = dev_info.feature_flags;
3198 
3199 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3200 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3201 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3202 		return TEST_SKIPPED;
3203 	}
3204 
3205 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3206 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3207 		printf("Device doesn't support RAW data-path APIs.\n");
3208 		return TEST_SKIPPED;
3209 	}
3210 
3211 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3212 		return TEST_SKIPPED;
3213 
3214 	/* Verify the capabilities */
3215 	struct rte_cryptodev_sym_capability_idx cap_idx;
3216 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3217 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3218 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3219 			&cap_idx) == NULL)
3220 		return TEST_SKIPPED;
3221 
3222 	/* Create SNOW 3G session */
3223 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3224 				tdata->key.data, tdata->key.len,
3225 				tdata->auth_iv.len, tdata->digest.len,
3226 				RTE_CRYPTO_AUTH_OP_VERIFY,
3227 				RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3228 	if (retval < 0)
3229 		return retval;
3230 	/* alloc mbuf and set payload */
3231 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3232 
3233 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3234 	rte_pktmbuf_tailroom(ut_params->ibuf));
3235 
3236 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3237 	/* Append data which is padded to a multiple of */
3238 	/* the algorithms block size */
3239 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3240 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3241 				plaintext_pad_len);
3242 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3243 
3244 	/* Create SNOW 3G operation */
3245 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3246 			tdata->digest.len,
3247 			tdata->auth_iv.data, tdata->auth_iv.len,
3248 			plaintext_pad_len,
3249 			RTE_CRYPTO_AUTH_OP_VERIFY,
3250 			tdata->validAuthLenInBits.len,
3251 			0);
3252 	if (retval < 0)
3253 		return retval;
3254 
3255 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3256 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3257 				ut_params->op, 0, 1, 1, 0);
3258 	else
3259 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3260 				ut_params->op);
3261 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3262 	ut_params->obuf = ut_params->op->sym->m_src;
3263 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3264 				+ plaintext_pad_len;
3265 
3266 	/* Validate obuf */
3267 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3268 		return 0;
3269 	else
3270 		return -1;
3271 
3272 	return 0;
3273 }
3274 
3275 static int
3276 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3277 {
3278 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3279 	struct crypto_unittest_params *ut_params = &unittest_params;
3280 
3281 	int retval;
3282 	unsigned plaintext_pad_len;
3283 	unsigned plaintext_len;
3284 	uint8_t *plaintext;
3285 	struct rte_cryptodev_info dev_info;
3286 
3287 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3288 	uint64_t feat_flags = dev_info.feature_flags;
3289 
3290 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3291 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3292 		printf("Device doesn't support RAW data-path APIs.\n");
3293 		return TEST_SKIPPED;
3294 	}
3295 
3296 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3297 		return TEST_SKIPPED;
3298 
3299 	/* Verify the capabilities */
3300 	struct rte_cryptodev_sym_capability_idx cap_idx;
3301 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3302 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3303 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3304 			&cap_idx) == NULL)
3305 		return TEST_SKIPPED;
3306 
3307 	/* Create KASUMI session */
3308 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3309 			tdata->key.data, tdata->key.len,
3310 			0, tdata->digest.len,
3311 			RTE_CRYPTO_AUTH_OP_GENERATE,
3312 			RTE_CRYPTO_AUTH_KASUMI_F9);
3313 	if (retval < 0)
3314 		return retval;
3315 
3316 	/* alloc mbuf and set payload */
3317 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3318 
3319 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3320 	rte_pktmbuf_tailroom(ut_params->ibuf));
3321 
3322 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3323 	/* Append data which is padded to a multiple of */
3324 	/* the algorithms block size */
3325 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3326 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3327 				plaintext_pad_len);
3328 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3329 
3330 	/* Create KASUMI operation */
3331 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3332 			NULL, 0,
3333 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3334 			tdata->plaintext.len,
3335 			0);
3336 	if (retval < 0)
3337 		return retval;
3338 
3339 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3340 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3341 			ut_params->op);
3342 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3343 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3344 				ut_params->op, 0, 1, 1, 0);
3345 	else
3346 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3347 			ut_params->op);
3348 
3349 	ut_params->obuf = ut_params->op->sym->m_src;
3350 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3351 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3352 			+ plaintext_pad_len;
3353 
3354 	/* Validate obuf */
3355 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3356 	ut_params->digest,
3357 	tdata->digest.data,
3358 	DIGEST_BYTE_LENGTH_KASUMI_F9,
3359 	"KASUMI Generated auth tag not as expected");
3360 
3361 	return 0;
3362 }
3363 
3364 static int
3365 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3366 {
3367 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3368 	struct crypto_unittest_params *ut_params = &unittest_params;
3369 
3370 	int retval;
3371 	unsigned plaintext_pad_len;
3372 	unsigned plaintext_len;
3373 	uint8_t *plaintext;
3374 	struct rte_cryptodev_info dev_info;
3375 
3376 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3377 	uint64_t feat_flags = dev_info.feature_flags;
3378 
3379 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3380 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3381 		printf("Device doesn't support RAW data-path APIs.\n");
3382 		return TEST_SKIPPED;
3383 	}
3384 
3385 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3386 		return TEST_SKIPPED;
3387 
3388 	/* Verify the capabilities */
3389 	struct rte_cryptodev_sym_capability_idx cap_idx;
3390 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3391 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3392 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3393 			&cap_idx) == NULL)
3394 		return TEST_SKIPPED;
3395 
3396 	/* Create KASUMI session */
3397 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3398 				tdata->key.data, tdata->key.len,
3399 				0, tdata->digest.len,
3400 				RTE_CRYPTO_AUTH_OP_VERIFY,
3401 				RTE_CRYPTO_AUTH_KASUMI_F9);
3402 	if (retval < 0)
3403 		return retval;
3404 	/* alloc mbuf and set payload */
3405 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3406 
3407 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3408 	rte_pktmbuf_tailroom(ut_params->ibuf));
3409 
3410 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3411 	/* Append data which is padded to a multiple */
3412 	/* of the algorithms block size */
3413 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3414 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3415 				plaintext_pad_len);
3416 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3417 
3418 	/* Create KASUMI operation */
3419 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3420 			tdata->digest.len,
3421 			NULL, 0,
3422 			plaintext_pad_len,
3423 			RTE_CRYPTO_AUTH_OP_VERIFY,
3424 			tdata->plaintext.len,
3425 			0);
3426 	if (retval < 0)
3427 		return retval;
3428 
3429 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3430 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3431 				ut_params->op, 0, 1, 1, 0);
3432 	else
3433 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3434 				ut_params->op);
3435 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3436 	ut_params->obuf = ut_params->op->sym->m_src;
3437 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3438 				+ plaintext_pad_len;
3439 
3440 	/* Validate obuf */
3441 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3442 		return 0;
3443 	else
3444 		return -1;
3445 
3446 	return 0;
3447 }
3448 
3449 static int
3450 test_snow3g_hash_generate_test_case_1(void)
3451 {
3452 	return test_snow3g_authentication(&snow3g_hash_test_case_1);
3453 }
3454 
3455 static int
3456 test_snow3g_hash_generate_test_case_2(void)
3457 {
3458 	return test_snow3g_authentication(&snow3g_hash_test_case_2);
3459 }
3460 
3461 static int
3462 test_snow3g_hash_generate_test_case_3(void)
3463 {
3464 	return test_snow3g_authentication(&snow3g_hash_test_case_3);
3465 }
3466 
3467 static int
3468 test_snow3g_hash_generate_test_case_4(void)
3469 {
3470 	return test_snow3g_authentication(&snow3g_hash_test_case_4);
3471 }
3472 
3473 static int
3474 test_snow3g_hash_generate_test_case_5(void)
3475 {
3476 	return test_snow3g_authentication(&snow3g_hash_test_case_5);
3477 }
3478 
3479 static int
3480 test_snow3g_hash_generate_test_case_6(void)
3481 {
3482 	return test_snow3g_authentication(&snow3g_hash_test_case_6);
3483 }
3484 
3485 static int
3486 test_snow3g_hash_verify_test_case_1(void)
3487 {
3488 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3489 
3490 }
3491 
3492 static int
3493 test_snow3g_hash_verify_test_case_2(void)
3494 {
3495 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3496 }
3497 
3498 static int
3499 test_snow3g_hash_verify_test_case_3(void)
3500 {
3501 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3502 }
3503 
3504 static int
3505 test_snow3g_hash_verify_test_case_4(void)
3506 {
3507 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3508 }
3509 
3510 static int
3511 test_snow3g_hash_verify_test_case_5(void)
3512 {
3513 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3514 }
3515 
3516 static int
3517 test_snow3g_hash_verify_test_case_6(void)
3518 {
3519 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3520 }
3521 
3522 static int
3523 test_kasumi_hash_generate_test_case_1(void)
3524 {
3525 	return test_kasumi_authentication(&kasumi_hash_test_case_1);
3526 }
3527 
3528 static int
3529 test_kasumi_hash_generate_test_case_2(void)
3530 {
3531 	return test_kasumi_authentication(&kasumi_hash_test_case_2);
3532 }
3533 
3534 static int
3535 test_kasumi_hash_generate_test_case_3(void)
3536 {
3537 	return test_kasumi_authentication(&kasumi_hash_test_case_3);
3538 }
3539 
3540 static int
3541 test_kasumi_hash_generate_test_case_4(void)
3542 {
3543 	return test_kasumi_authentication(&kasumi_hash_test_case_4);
3544 }
3545 
3546 static int
3547 test_kasumi_hash_generate_test_case_5(void)
3548 {
3549 	return test_kasumi_authentication(&kasumi_hash_test_case_5);
3550 }
3551 
3552 static int
3553 test_kasumi_hash_generate_test_case_6(void)
3554 {
3555 	return test_kasumi_authentication(&kasumi_hash_test_case_6);
3556 }
3557 
3558 static int
3559 test_kasumi_hash_verify_test_case_1(void)
3560 {
3561 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3562 }
3563 
3564 static int
3565 test_kasumi_hash_verify_test_case_2(void)
3566 {
3567 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3568 }
3569 
3570 static int
3571 test_kasumi_hash_verify_test_case_3(void)
3572 {
3573 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3574 }
3575 
3576 static int
3577 test_kasumi_hash_verify_test_case_4(void)
3578 {
3579 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3580 }
3581 
3582 static int
3583 test_kasumi_hash_verify_test_case_5(void)
3584 {
3585 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3586 }
3587 
3588 static int
3589 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3590 {
3591 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3592 	struct crypto_unittest_params *ut_params = &unittest_params;
3593 
3594 	int retval;
3595 	uint8_t *plaintext, *ciphertext;
3596 	unsigned plaintext_pad_len;
3597 	unsigned plaintext_len;
3598 	struct rte_cryptodev_info dev_info;
3599 
3600 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3601 	uint64_t feat_flags = dev_info.feature_flags;
3602 
3603 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3604 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3605 		printf("Device doesn't support RAW data-path APIs.\n");
3606 		return TEST_SKIPPED;
3607 	}
3608 
3609 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3610 		return TEST_SKIPPED;
3611 
3612 	/* Verify the capabilities */
3613 	struct rte_cryptodev_sym_capability_idx cap_idx;
3614 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3615 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3616 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3617 			&cap_idx) == NULL)
3618 		return TEST_SKIPPED;
3619 
3620 	/* Create KASUMI session */
3621 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3622 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3623 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3624 					tdata->key.data, tdata->key.len,
3625 					tdata->cipher_iv.len);
3626 	if (retval < 0)
3627 		return retval;
3628 
3629 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3630 
3631 	/* Clear mbuf payload */
3632 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3633 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3634 
3635 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3636 	/* Append data which is padded to a multiple */
3637 	/* of the algorithms block size */
3638 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3639 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3640 				plaintext_pad_len);
3641 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3642 
3643 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3644 
3645 	/* Create KASUMI operation */
3646 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3647 				tdata->cipher_iv.len,
3648 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3649 				tdata->validCipherOffsetInBits.len);
3650 	if (retval < 0)
3651 		return retval;
3652 
3653 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3654 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3655 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3656 	else
3657 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3658 				ut_params->op);
3659 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3660 
3661 	ut_params->obuf = ut_params->op->sym->m_dst;
3662 	if (ut_params->obuf)
3663 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3664 	else
3665 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3666 
3667 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3668 
3669 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3670 				(tdata->validCipherOffsetInBits.len >> 3);
3671 	/* Validate obuf */
3672 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3673 		ciphertext,
3674 		reference_ciphertext,
3675 		tdata->validCipherLenInBits.len,
3676 		"KASUMI Ciphertext data not as expected");
3677 	return 0;
3678 }
3679 
3680 static int
3681 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3682 {
3683 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3684 	struct crypto_unittest_params *ut_params = &unittest_params;
3685 
3686 	int retval;
3687 
3688 	unsigned int plaintext_pad_len;
3689 	unsigned int plaintext_len;
3690 
3691 	uint8_t buffer[10000];
3692 	const uint8_t *ciphertext;
3693 
3694 	struct rte_cryptodev_info dev_info;
3695 
3696 	/* Verify the capabilities */
3697 	struct rte_cryptodev_sym_capability_idx cap_idx;
3698 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3699 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3700 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3701 			&cap_idx) == NULL)
3702 		return TEST_SKIPPED;
3703 
3704 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3705 
3706 	uint64_t feat_flags = dev_info.feature_flags;
3707 
3708 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3709 		printf("Device doesn't support in-place scatter-gather. "
3710 				"Test Skipped.\n");
3711 		return TEST_SKIPPED;
3712 	}
3713 
3714 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3715 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3716 		printf("Device doesn't support RAW data-path APIs.\n");
3717 		return TEST_SKIPPED;
3718 	}
3719 
3720 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3721 		return TEST_SKIPPED;
3722 
3723 	/* Create KASUMI session */
3724 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3725 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3726 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3727 					tdata->key.data, tdata->key.len,
3728 					tdata->cipher_iv.len);
3729 	if (retval < 0)
3730 		return retval;
3731 
3732 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3733 
3734 
3735 	/* Append data which is padded to a multiple */
3736 	/* of the algorithms block size */
3737 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3738 
3739 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3740 			plaintext_pad_len, 10, 0);
3741 
3742 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3743 
3744 	/* Create KASUMI operation */
3745 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3746 				tdata->cipher_iv.len,
3747 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3748 				tdata->validCipherOffsetInBits.len);
3749 	if (retval < 0)
3750 		return retval;
3751 
3752 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3753 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3754 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3755 	else
3756 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3757 						ut_params->op);
3758 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3759 
3760 	ut_params->obuf = ut_params->op->sym->m_dst;
3761 
3762 	if (ut_params->obuf)
3763 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3764 				plaintext_len, buffer);
3765 	else
3766 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3767 				tdata->validCipherOffsetInBits.len >> 3,
3768 				plaintext_len, buffer);
3769 
3770 	/* Validate obuf */
3771 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3772 
3773 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3774 				(tdata->validCipherOffsetInBits.len >> 3);
3775 	/* Validate obuf */
3776 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3777 		ciphertext,
3778 		reference_ciphertext,
3779 		tdata->validCipherLenInBits.len,
3780 		"KASUMI Ciphertext data not as expected");
3781 	return 0;
3782 }
3783 
3784 static int
3785 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3786 {
3787 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3788 	struct crypto_unittest_params *ut_params = &unittest_params;
3789 
3790 	int retval;
3791 	uint8_t *plaintext, *ciphertext;
3792 	unsigned plaintext_pad_len;
3793 	unsigned plaintext_len;
3794 
3795 	/* Verify the capabilities */
3796 	struct rte_cryptodev_sym_capability_idx cap_idx;
3797 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3798 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3799 	/* Data-path service does not support OOP */
3800 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3801 			&cap_idx) == NULL)
3802 		return TEST_SKIPPED;
3803 
3804 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3805 		return TEST_SKIPPED;
3806 
3807 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3808 		return TEST_SKIPPED;
3809 
3810 	/* Create KASUMI session */
3811 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3812 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3813 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3814 					tdata->key.data, tdata->key.len,
3815 					tdata->cipher_iv.len);
3816 	if (retval < 0)
3817 		return retval;
3818 
3819 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3820 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3821 
3822 	/* Clear mbuf payload */
3823 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3824 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3825 
3826 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3827 	/* Append data which is padded to a multiple */
3828 	/* of the algorithms block size */
3829 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3830 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3831 				plaintext_pad_len);
3832 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3833 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3834 
3835 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3836 
3837 	/* Create KASUMI operation */
3838 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3839 				tdata->cipher_iv.len,
3840 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3841 				tdata->validCipherOffsetInBits.len);
3842 	if (retval < 0)
3843 		return retval;
3844 
3845 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3846 						ut_params->op);
3847 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3848 
3849 	ut_params->obuf = ut_params->op->sym->m_dst;
3850 	if (ut_params->obuf)
3851 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3852 	else
3853 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3854 
3855 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3856 
3857 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3858 				(tdata->validCipherOffsetInBits.len >> 3);
3859 	/* Validate obuf */
3860 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3861 		ciphertext,
3862 		reference_ciphertext,
3863 		tdata->validCipherLenInBits.len,
3864 		"KASUMI Ciphertext data not as expected");
3865 	return 0;
3866 }
3867 
3868 static int
3869 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3870 {
3871 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3872 	struct crypto_unittest_params *ut_params = &unittest_params;
3873 
3874 	int retval;
3875 	unsigned int plaintext_pad_len;
3876 	unsigned int plaintext_len;
3877 
3878 	const uint8_t *ciphertext;
3879 	uint8_t buffer[2048];
3880 
3881 	struct rte_cryptodev_info dev_info;
3882 
3883 	/* Verify the capabilities */
3884 	struct rte_cryptodev_sym_capability_idx cap_idx;
3885 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3886 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3887 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3888 			&cap_idx) == NULL)
3889 		return TEST_SKIPPED;
3890 
3891 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3892 		return TEST_SKIPPED;
3893 
3894 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3895 		return TEST_SKIPPED;
3896 
3897 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3898 
3899 	uint64_t feat_flags = dev_info.feature_flags;
3900 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3901 		printf("Device doesn't support out-of-place scatter-gather "
3902 				"in both input and output mbufs. "
3903 				"Test Skipped.\n");
3904 		return TEST_SKIPPED;
3905 	}
3906 
3907 	/* Create KASUMI session */
3908 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3909 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3910 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3911 					tdata->key.data, tdata->key.len,
3912 					tdata->cipher_iv.len);
3913 	if (retval < 0)
3914 		return retval;
3915 
3916 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3917 	/* Append data which is padded to a multiple */
3918 	/* of the algorithms block size */
3919 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3920 
3921 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3922 			plaintext_pad_len, 10, 0);
3923 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3924 			plaintext_pad_len, 3, 0);
3925 
3926 	/* Append data which is padded to a multiple */
3927 	/* of the algorithms block size */
3928 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3929 
3930 	/* Create KASUMI operation */
3931 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3932 				tdata->cipher_iv.len,
3933 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3934 				tdata->validCipherOffsetInBits.len);
3935 	if (retval < 0)
3936 		return retval;
3937 
3938 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3939 						ut_params->op);
3940 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3941 
3942 	ut_params->obuf = ut_params->op->sym->m_dst;
3943 	if (ut_params->obuf)
3944 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3945 				plaintext_pad_len, buffer);
3946 	else
3947 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3948 				tdata->validCipherOffsetInBits.len >> 3,
3949 				plaintext_pad_len, buffer);
3950 
3951 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3952 				(tdata->validCipherOffsetInBits.len >> 3);
3953 	/* Validate obuf */
3954 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3955 		ciphertext,
3956 		reference_ciphertext,
3957 		tdata->validCipherLenInBits.len,
3958 		"KASUMI Ciphertext data not as expected");
3959 	return 0;
3960 }
3961 
3962 
3963 static int
3964 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3965 {
3966 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3967 	struct crypto_unittest_params *ut_params = &unittest_params;
3968 
3969 	int retval;
3970 	uint8_t *ciphertext, *plaintext;
3971 	unsigned ciphertext_pad_len;
3972 	unsigned ciphertext_len;
3973 
3974 	/* Verify the capabilities */
3975 	struct rte_cryptodev_sym_capability_idx cap_idx;
3976 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3977 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3978 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3979 			&cap_idx) == NULL)
3980 		return TEST_SKIPPED;
3981 
3982 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3983 		return TEST_SKIPPED;
3984 
3985 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3986 		return TEST_SKIPPED;
3987 
3988 	/* Create KASUMI session */
3989 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3990 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3991 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3992 					tdata->key.data, tdata->key.len,
3993 					tdata->cipher_iv.len);
3994 	if (retval < 0)
3995 		return retval;
3996 
3997 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3998 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3999 
4000 	/* Clear mbuf payload */
4001 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4002 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4003 
4004 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4005 	/* Append data which is padded to a multiple */
4006 	/* of the algorithms block size */
4007 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4008 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4009 				ciphertext_pad_len);
4010 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4011 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4012 
4013 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4014 
4015 	/* Create KASUMI operation */
4016 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4017 				tdata->cipher_iv.len,
4018 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4019 				tdata->validCipherOffsetInBits.len);
4020 	if (retval < 0)
4021 		return retval;
4022 
4023 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4024 						ut_params->op);
4025 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4026 
4027 	ut_params->obuf = ut_params->op->sym->m_dst;
4028 	if (ut_params->obuf)
4029 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4030 	else
4031 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4032 
4033 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4034 
4035 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4036 				(tdata->validCipherOffsetInBits.len >> 3);
4037 	/* Validate obuf */
4038 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4039 		plaintext,
4040 		reference_plaintext,
4041 		tdata->validCipherLenInBits.len,
4042 		"KASUMI Plaintext data not as expected");
4043 	return 0;
4044 }
4045 
4046 static int
4047 test_kasumi_decryption(const struct kasumi_test_data *tdata)
4048 {
4049 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4050 	struct crypto_unittest_params *ut_params = &unittest_params;
4051 
4052 	int retval;
4053 	uint8_t *ciphertext, *plaintext;
4054 	unsigned ciphertext_pad_len;
4055 	unsigned ciphertext_len;
4056 	struct rte_cryptodev_info dev_info;
4057 
4058 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4059 	uint64_t feat_flags = dev_info.feature_flags;
4060 
4061 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4062 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4063 		printf("Device doesn't support RAW data-path APIs.\n");
4064 		return TEST_SKIPPED;
4065 	}
4066 
4067 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4068 		return TEST_SKIPPED;
4069 
4070 	/* Verify the capabilities */
4071 	struct rte_cryptodev_sym_capability_idx cap_idx;
4072 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4073 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4074 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4075 			&cap_idx) == NULL)
4076 		return TEST_SKIPPED;
4077 
4078 	/* Create KASUMI session */
4079 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4080 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4081 					RTE_CRYPTO_CIPHER_KASUMI_F8,
4082 					tdata->key.data, tdata->key.len,
4083 					tdata->cipher_iv.len);
4084 	if (retval < 0)
4085 		return retval;
4086 
4087 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4088 
4089 	/* Clear mbuf payload */
4090 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4091 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4092 
4093 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4094 	/* Append data which is padded to a multiple */
4095 	/* of the algorithms block size */
4096 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4097 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4098 				ciphertext_pad_len);
4099 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4100 
4101 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4102 
4103 	/* Create KASUMI operation */
4104 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4105 			tdata->cipher_iv.len,
4106 			RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4107 			tdata->validCipherOffsetInBits.len);
4108 	if (retval < 0)
4109 		return retval;
4110 
4111 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4112 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4113 				ut_params->op, 1, 0, 1, 0);
4114 	else
4115 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4116 						ut_params->op);
4117 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4118 
4119 	ut_params->obuf = ut_params->op->sym->m_dst;
4120 	if (ut_params->obuf)
4121 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4122 	else
4123 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4124 
4125 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4126 
4127 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4128 				(tdata->validCipherOffsetInBits.len >> 3);
4129 	/* Validate obuf */
4130 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4131 		plaintext,
4132 		reference_plaintext,
4133 		tdata->validCipherLenInBits.len,
4134 		"KASUMI Plaintext data not as expected");
4135 	return 0;
4136 }
4137 
4138 static int
4139 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4140 {
4141 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4142 	struct crypto_unittest_params *ut_params = &unittest_params;
4143 
4144 	int retval;
4145 	uint8_t *plaintext, *ciphertext;
4146 	unsigned plaintext_pad_len;
4147 	unsigned plaintext_len;
4148 	struct rte_cryptodev_info dev_info;
4149 
4150 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4151 	uint64_t feat_flags = dev_info.feature_flags;
4152 
4153 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4154 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4155 		printf("Device doesn't support RAW data-path APIs.\n");
4156 		return TEST_SKIPPED;
4157 	}
4158 
4159 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4160 		return TEST_SKIPPED;
4161 
4162 	/* Verify the capabilities */
4163 	struct rte_cryptodev_sym_capability_idx cap_idx;
4164 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4165 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4166 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4167 			&cap_idx) == NULL)
4168 		return TEST_SKIPPED;
4169 
4170 	/* Create SNOW 3G session */
4171 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4172 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4173 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4174 					tdata->key.data, tdata->key.len,
4175 					tdata->cipher_iv.len);
4176 	if (retval < 0)
4177 		return retval;
4178 
4179 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4180 
4181 	/* Clear mbuf payload */
4182 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4183 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4184 
4185 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4186 	/* Append data which is padded to a multiple of */
4187 	/* the algorithms block size */
4188 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4189 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4190 				plaintext_pad_len);
4191 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4192 
4193 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4194 
4195 	/* Create SNOW 3G operation */
4196 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4197 					tdata->cipher_iv.len,
4198 					tdata->validCipherLenInBits.len,
4199 					0);
4200 	if (retval < 0)
4201 		return retval;
4202 
4203 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4204 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4205 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4206 	else
4207 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4208 						ut_params->op);
4209 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4210 
4211 	ut_params->obuf = ut_params->op->sym->m_dst;
4212 	if (ut_params->obuf)
4213 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4214 	else
4215 		ciphertext = plaintext;
4216 
4217 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4218 
4219 	/* Validate obuf */
4220 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4221 		ciphertext,
4222 		tdata->ciphertext.data,
4223 		tdata->validDataLenInBits.len,
4224 		"SNOW 3G Ciphertext data not as expected");
4225 	return 0;
4226 }
4227 
4228 
4229 static int
4230 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4231 {
4232 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4233 	struct crypto_unittest_params *ut_params = &unittest_params;
4234 	uint8_t *plaintext, *ciphertext;
4235 
4236 	int retval;
4237 	unsigned plaintext_pad_len;
4238 	unsigned plaintext_len;
4239 	struct rte_cryptodev_info dev_info;
4240 
4241 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4242 	uint64_t feat_flags = dev_info.feature_flags;
4243 
4244 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4245 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4246 		printf("Device does not support RAW data-path APIs.\n");
4247 		return -ENOTSUP;
4248 	}
4249 
4250 	/* Verify the capabilities */
4251 	struct rte_cryptodev_sym_capability_idx cap_idx;
4252 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4253 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4254 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4255 			&cap_idx) == NULL)
4256 		return TEST_SKIPPED;
4257 
4258 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4259 		return TEST_SKIPPED;
4260 
4261 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4262 		return TEST_SKIPPED;
4263 
4264 	/* Create SNOW 3G session */
4265 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4266 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4267 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4268 					tdata->key.data, tdata->key.len,
4269 					tdata->cipher_iv.len);
4270 	if (retval < 0)
4271 		return retval;
4272 
4273 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4274 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4275 
4276 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4277 			"Failed to allocate input buffer in mempool");
4278 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4279 			"Failed to allocate output buffer in mempool");
4280 
4281 	/* Clear mbuf payload */
4282 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4283 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4284 
4285 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4286 	/* Append data which is padded to a multiple of */
4287 	/* the algorithms block size */
4288 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4289 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4290 				plaintext_pad_len);
4291 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4292 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4293 
4294 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4295 
4296 	/* Create SNOW 3G operation */
4297 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4298 					tdata->cipher_iv.len,
4299 					tdata->validCipherLenInBits.len,
4300 					0);
4301 	if (retval < 0)
4302 		return retval;
4303 
4304 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4305 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4306 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4307 	else
4308 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4309 						ut_params->op);
4310 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4311 
4312 	ut_params->obuf = ut_params->op->sym->m_dst;
4313 	if (ut_params->obuf)
4314 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4315 	else
4316 		ciphertext = plaintext;
4317 
4318 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4319 
4320 	/* Validate obuf */
4321 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4322 		ciphertext,
4323 		tdata->ciphertext.data,
4324 		tdata->validDataLenInBits.len,
4325 		"SNOW 3G Ciphertext data not as expected");
4326 	return 0;
4327 }
4328 
4329 static int
4330 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4331 {
4332 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4333 	struct crypto_unittest_params *ut_params = &unittest_params;
4334 
4335 	int retval;
4336 	unsigned int plaintext_pad_len;
4337 	unsigned int plaintext_len;
4338 	uint8_t buffer[10000];
4339 	const uint8_t *ciphertext;
4340 
4341 	struct rte_cryptodev_info dev_info;
4342 
4343 	/* Verify the capabilities */
4344 	struct rte_cryptodev_sym_capability_idx cap_idx;
4345 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4346 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4347 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4348 			&cap_idx) == NULL)
4349 		return TEST_SKIPPED;
4350 
4351 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4352 		return TEST_SKIPPED;
4353 
4354 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4355 		return TEST_SKIPPED;
4356 
4357 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4358 
4359 	uint64_t feat_flags = dev_info.feature_flags;
4360 
4361 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4362 		printf("Device doesn't support out-of-place scatter-gather "
4363 				"in both input and output mbufs. "
4364 				"Test Skipped.\n");
4365 		return TEST_SKIPPED;
4366 	}
4367 
4368 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4369 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4370 		printf("Device does not support RAW data-path APIs.\n");
4371 		return -ENOTSUP;
4372 	}
4373 
4374 	/* Create SNOW 3G session */
4375 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4376 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4377 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4378 					tdata->key.data, tdata->key.len,
4379 					tdata->cipher_iv.len);
4380 	if (retval < 0)
4381 		return retval;
4382 
4383 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4384 	/* Append data which is padded to a multiple of */
4385 	/* the algorithms block size */
4386 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4387 
4388 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4389 			plaintext_pad_len, 10, 0);
4390 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4391 			plaintext_pad_len, 3, 0);
4392 
4393 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4394 			"Failed to allocate input buffer in mempool");
4395 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4396 			"Failed to allocate output buffer in mempool");
4397 
4398 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4399 
4400 	/* Create SNOW 3G operation */
4401 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4402 					tdata->cipher_iv.len,
4403 					tdata->validCipherLenInBits.len,
4404 					0);
4405 	if (retval < 0)
4406 		return retval;
4407 
4408 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4409 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4410 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4411 	else
4412 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4413 						ut_params->op);
4414 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4415 
4416 	ut_params->obuf = ut_params->op->sym->m_dst;
4417 	if (ut_params->obuf)
4418 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4419 				plaintext_len, buffer);
4420 	else
4421 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4422 				plaintext_len, buffer);
4423 
4424 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4425 
4426 	/* Validate obuf */
4427 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4428 		ciphertext,
4429 		tdata->ciphertext.data,
4430 		tdata->validDataLenInBits.len,
4431 		"SNOW 3G Ciphertext data not as expected");
4432 
4433 	return 0;
4434 }
4435 
4436 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4437 static void
4438 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4439 {
4440 	uint8_t curr_byte, prev_byte;
4441 	uint32_t length_in_bytes = ceil_byte_length(length + offset);
4442 	uint8_t lower_byte_mask = (1 << offset) - 1;
4443 	unsigned i;
4444 
4445 	prev_byte = buffer[0];
4446 	buffer[0] >>= offset;
4447 
4448 	for (i = 1; i < length_in_bytes; i++) {
4449 		curr_byte = buffer[i];
4450 		buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4451 				(curr_byte >> offset);
4452 		prev_byte = curr_byte;
4453 	}
4454 }
4455 
4456 static int
4457 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4458 {
4459 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4460 	struct crypto_unittest_params *ut_params = &unittest_params;
4461 	uint8_t *plaintext, *ciphertext;
4462 	int retval;
4463 	uint32_t plaintext_len;
4464 	uint32_t plaintext_pad_len;
4465 	uint8_t extra_offset = 4;
4466 	uint8_t *expected_ciphertext_shifted;
4467 	struct rte_cryptodev_info dev_info;
4468 
4469 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4470 	uint64_t feat_flags = dev_info.feature_flags;
4471 
4472 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4473 			((tdata->validDataLenInBits.len % 8) != 0)) {
4474 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4475 		return TEST_SKIPPED;
4476 	}
4477 
4478 	/* Verify the capabilities */
4479 	struct rte_cryptodev_sym_capability_idx cap_idx;
4480 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4481 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4482 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4483 			&cap_idx) == NULL)
4484 		return TEST_SKIPPED;
4485 
4486 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4487 		return TEST_SKIPPED;
4488 
4489 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4490 		return TEST_SKIPPED;
4491 
4492 	/* Create SNOW 3G session */
4493 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4494 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4495 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4496 					tdata->key.data, tdata->key.len,
4497 					tdata->cipher_iv.len);
4498 	if (retval < 0)
4499 		return retval;
4500 
4501 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4502 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4503 
4504 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4505 			"Failed to allocate input buffer in mempool");
4506 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4507 			"Failed to allocate output buffer in mempool");
4508 
4509 	/* Clear mbuf payload */
4510 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4511 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4512 
4513 	plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4514 	/*
4515 	 * Append data which is padded to a
4516 	 * multiple of the algorithms block size
4517 	 */
4518 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4519 
4520 	plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4521 						plaintext_pad_len);
4522 
4523 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4524 
4525 	memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4526 	buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4527 
4528 #ifdef RTE_APP_TEST_DEBUG
4529 	rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4530 #endif
4531 	/* Create SNOW 3G operation */
4532 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4533 					tdata->cipher_iv.len,
4534 					tdata->validCipherLenInBits.len,
4535 					extra_offset);
4536 	if (retval < 0)
4537 		return retval;
4538 
4539 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4540 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4541 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4542 	else
4543 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4544 						ut_params->op);
4545 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4546 
4547 	ut_params->obuf = ut_params->op->sym->m_dst;
4548 	if (ut_params->obuf)
4549 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4550 	else
4551 		ciphertext = plaintext;
4552 
4553 #ifdef RTE_APP_TEST_DEBUG
4554 	rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4555 #endif
4556 
4557 	expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4558 
4559 	TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4560 			"failed to reserve memory for ciphertext shifted\n");
4561 
4562 	memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4563 			ceil_byte_length(tdata->ciphertext.len));
4564 	buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4565 			extra_offset);
4566 	/* Validate obuf */
4567 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4568 		ciphertext,
4569 		expected_ciphertext_shifted,
4570 		tdata->validDataLenInBits.len,
4571 		extra_offset,
4572 		"SNOW 3G Ciphertext data not as expected");
4573 	return 0;
4574 }
4575 
4576 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4577 {
4578 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4579 	struct crypto_unittest_params *ut_params = &unittest_params;
4580 
4581 	int retval;
4582 
4583 	uint8_t *plaintext, *ciphertext;
4584 	unsigned ciphertext_pad_len;
4585 	unsigned ciphertext_len;
4586 	struct rte_cryptodev_info dev_info;
4587 
4588 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4589 	uint64_t feat_flags = dev_info.feature_flags;
4590 
4591 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4592 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4593 		printf("Device doesn't support RAW data-path APIs.\n");
4594 		return TEST_SKIPPED;
4595 	}
4596 
4597 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4598 		return TEST_SKIPPED;
4599 
4600 	/* Verify the capabilities */
4601 	struct rte_cryptodev_sym_capability_idx cap_idx;
4602 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4603 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4604 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4605 			&cap_idx) == NULL)
4606 		return TEST_SKIPPED;
4607 
4608 	/* Create SNOW 3G session */
4609 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4610 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4611 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4612 					tdata->key.data, tdata->key.len,
4613 					tdata->cipher_iv.len);
4614 	if (retval < 0)
4615 		return retval;
4616 
4617 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4618 
4619 	/* Clear mbuf payload */
4620 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4621 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4622 
4623 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4624 	/* Append data which is padded to a multiple of */
4625 	/* the algorithms block size */
4626 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4627 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4628 				ciphertext_pad_len);
4629 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4630 
4631 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4632 
4633 	/* Create SNOW 3G operation */
4634 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4635 					tdata->cipher_iv.len,
4636 					tdata->validCipherLenInBits.len,
4637 					tdata->cipher.offset_bits);
4638 	if (retval < 0)
4639 		return retval;
4640 
4641 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4642 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4643 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4644 	else
4645 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4646 						ut_params->op);
4647 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4648 	ut_params->obuf = ut_params->op->sym->m_dst;
4649 	if (ut_params->obuf)
4650 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4651 	else
4652 		plaintext = ciphertext;
4653 
4654 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4655 
4656 	/* Validate obuf */
4657 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4658 				tdata->plaintext.data,
4659 				tdata->validDataLenInBits.len,
4660 				"SNOW 3G Plaintext data not as expected");
4661 	return 0;
4662 }
4663 
4664 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4665 {
4666 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4667 	struct crypto_unittest_params *ut_params = &unittest_params;
4668 
4669 	int retval;
4670 
4671 	uint8_t *plaintext, *ciphertext;
4672 	unsigned ciphertext_pad_len;
4673 	unsigned ciphertext_len;
4674 	struct rte_cryptodev_info dev_info;
4675 
4676 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4677 	uint64_t feat_flags = dev_info.feature_flags;
4678 
4679 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4680 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4681 		printf("Device does not support RAW data-path APIs.\n");
4682 		return -ENOTSUP;
4683 	}
4684 	/* Verify the capabilities */
4685 	struct rte_cryptodev_sym_capability_idx cap_idx;
4686 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4687 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4688 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4689 			&cap_idx) == NULL)
4690 		return TEST_SKIPPED;
4691 
4692 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4693 		return TEST_SKIPPED;
4694 
4695 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4696 		return TEST_SKIPPED;
4697 
4698 	/* Create SNOW 3G session */
4699 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4700 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4701 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4702 					tdata->key.data, tdata->key.len,
4703 					tdata->cipher_iv.len);
4704 	if (retval < 0)
4705 		return retval;
4706 
4707 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4708 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4709 
4710 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4711 			"Failed to allocate input buffer");
4712 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4713 			"Failed to allocate output buffer");
4714 
4715 	/* Clear mbuf payload */
4716 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4717 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4718 
4719 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4720 		       rte_pktmbuf_tailroom(ut_params->obuf));
4721 
4722 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4723 	/* Append data which is padded to a multiple of */
4724 	/* the algorithms block size */
4725 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4726 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4727 				ciphertext_pad_len);
4728 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4729 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4730 
4731 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4732 
4733 	/* Create SNOW 3G operation */
4734 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4735 					tdata->cipher_iv.len,
4736 					tdata->validCipherLenInBits.len,
4737 					0);
4738 	if (retval < 0)
4739 		return retval;
4740 
4741 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4742 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4743 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4744 	else
4745 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4746 						ut_params->op);
4747 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4748 	ut_params->obuf = ut_params->op->sym->m_dst;
4749 	if (ut_params->obuf)
4750 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4751 	else
4752 		plaintext = ciphertext;
4753 
4754 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4755 
4756 	/* Validate obuf */
4757 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4758 				tdata->plaintext.data,
4759 				tdata->validDataLenInBits.len,
4760 				"SNOW 3G Plaintext data not as expected");
4761 	return 0;
4762 }
4763 
4764 static int
4765 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4766 {
4767 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4768 	struct crypto_unittest_params *ut_params = &unittest_params;
4769 
4770 	int retval;
4771 
4772 	uint8_t *plaintext, *ciphertext;
4773 	unsigned int plaintext_pad_len;
4774 	unsigned int plaintext_len;
4775 
4776 	struct rte_cryptodev_info dev_info;
4777 	struct rte_cryptodev_sym_capability_idx cap_idx;
4778 
4779 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4780 	uint64_t feat_flags = dev_info.feature_flags;
4781 
4782 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4783 			((tdata->validAuthLenInBits.len % 8 != 0) ||
4784 			(tdata->validDataLenInBits.len % 8 != 0))) {
4785 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4786 		return TEST_SKIPPED;
4787 	}
4788 
4789 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4790 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4791 		printf("Device doesn't support RAW data-path APIs.\n");
4792 		return TEST_SKIPPED;
4793 	}
4794 
4795 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4796 		return TEST_SKIPPED;
4797 
4798 	/* Check if device supports ZUC EEA3 */
4799 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4800 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4801 
4802 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4803 			&cap_idx) == NULL)
4804 		return TEST_SKIPPED;
4805 
4806 	/* Check if device supports ZUC EIA3 */
4807 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4808 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4809 
4810 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4811 			&cap_idx) == NULL)
4812 		return TEST_SKIPPED;
4813 
4814 	/* Create ZUC session */
4815 	retval = create_zuc_cipher_auth_encrypt_generate_session(
4816 			ts_params->valid_devs[0],
4817 			tdata);
4818 	if (retval != 0)
4819 		return retval;
4820 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4821 
4822 	/* clear mbuf payload */
4823 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4824 			rte_pktmbuf_tailroom(ut_params->ibuf));
4825 
4826 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4827 	/* Append data which is padded to a multiple of */
4828 	/* the algorithms block size */
4829 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4830 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4831 				plaintext_pad_len);
4832 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4833 
4834 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4835 
4836 	/* Create ZUC operation */
4837 	retval = create_zuc_cipher_hash_generate_operation(tdata);
4838 	if (retval < 0)
4839 		return retval;
4840 
4841 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4842 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4843 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4844 	else
4845 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4846 			ut_params->op);
4847 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4848 	ut_params->obuf = ut_params->op->sym->m_src;
4849 	if (ut_params->obuf)
4850 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4851 	else
4852 		ciphertext = plaintext;
4853 
4854 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4855 	/* Validate obuf */
4856 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4857 			ciphertext,
4858 			tdata->ciphertext.data,
4859 			tdata->validDataLenInBits.len,
4860 			"ZUC Ciphertext data not as expected");
4861 
4862 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4863 	    + plaintext_pad_len;
4864 
4865 	/* Validate obuf */
4866 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4867 			ut_params->digest,
4868 			tdata->digest.data,
4869 			4,
4870 			"ZUC Generated auth tag not as expected");
4871 	return 0;
4872 }
4873 
4874 static int
4875 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4876 {
4877 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4878 	struct crypto_unittest_params *ut_params = &unittest_params;
4879 
4880 	int retval;
4881 
4882 	uint8_t *plaintext, *ciphertext;
4883 	unsigned plaintext_pad_len;
4884 	unsigned plaintext_len;
4885 	struct rte_cryptodev_info dev_info;
4886 
4887 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4888 	uint64_t feat_flags = dev_info.feature_flags;
4889 
4890 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4891 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4892 		printf("Device doesn't support RAW data-path APIs.\n");
4893 		return TEST_SKIPPED;
4894 	}
4895 
4896 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4897 		return TEST_SKIPPED;
4898 
4899 	/* Verify the capabilities */
4900 	struct rte_cryptodev_sym_capability_idx cap_idx;
4901 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4902 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4903 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4904 			&cap_idx) == NULL)
4905 		return TEST_SKIPPED;
4906 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4907 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4908 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4909 			&cap_idx) == NULL)
4910 		return TEST_SKIPPED;
4911 
4912 	/* Create SNOW 3G session */
4913 	retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4914 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4915 			RTE_CRYPTO_AUTH_OP_GENERATE,
4916 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4917 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4918 			tdata->key.data, tdata->key.len,
4919 			tdata->auth_iv.len, tdata->digest.len,
4920 			tdata->cipher_iv.len);
4921 	if (retval != 0)
4922 		return retval;
4923 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4924 
4925 	/* clear mbuf payload */
4926 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4927 			rte_pktmbuf_tailroom(ut_params->ibuf));
4928 
4929 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4930 	/* Append data which is padded to a multiple of */
4931 	/* the algorithms block size */
4932 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4933 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4934 				plaintext_pad_len);
4935 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4936 
4937 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4938 
4939 	/* Create SNOW 3G operation */
4940 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4941 			tdata->digest.len, tdata->auth_iv.data,
4942 			tdata->auth_iv.len,
4943 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4944 			tdata->cipher_iv.data, tdata->cipher_iv.len,
4945 			tdata->validCipherLenInBits.len,
4946 			0,
4947 			tdata->validAuthLenInBits.len,
4948 			0
4949 			);
4950 	if (retval < 0)
4951 		return retval;
4952 
4953 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4954 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4955 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4956 	else
4957 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4958 			ut_params->op);
4959 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4960 	ut_params->obuf = ut_params->op->sym->m_src;
4961 	if (ut_params->obuf)
4962 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4963 	else
4964 		ciphertext = plaintext;
4965 
4966 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4967 	/* Validate obuf */
4968 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4969 			ciphertext,
4970 			tdata->ciphertext.data,
4971 			tdata->validDataLenInBits.len,
4972 			"SNOW 3G Ciphertext data not as expected");
4973 
4974 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4975 	    + plaintext_pad_len;
4976 
4977 	/* Validate obuf */
4978 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4979 			ut_params->digest,
4980 			tdata->digest.data,
4981 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4982 			"SNOW 3G Generated auth tag not as expected");
4983 	return 0;
4984 }
4985 
4986 static int
4987 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4988 	uint8_t op_mode, uint8_t verify)
4989 {
4990 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4991 	struct crypto_unittest_params *ut_params = &unittest_params;
4992 
4993 	int retval;
4994 
4995 	uint8_t *plaintext = NULL, *ciphertext = NULL;
4996 	unsigned int plaintext_pad_len;
4997 	unsigned int plaintext_len;
4998 	unsigned int ciphertext_pad_len;
4999 	unsigned int ciphertext_len;
5000 
5001 	struct rte_cryptodev_info dev_info;
5002 
5003 	/* Verify the capabilities */
5004 	struct rte_cryptodev_sym_capability_idx cap_idx;
5005 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5006 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5007 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5008 			&cap_idx) == NULL)
5009 		return TEST_SKIPPED;
5010 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5011 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5012 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5013 			&cap_idx) == NULL)
5014 		return TEST_SKIPPED;
5015 
5016 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5017 		return TEST_SKIPPED;
5018 
5019 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5020 
5021 	uint64_t feat_flags = dev_info.feature_flags;
5022 
5023 	if (op_mode == OUT_OF_PLACE) {
5024 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5025 			printf("Device doesn't support digest encrypted.\n");
5026 			return TEST_SKIPPED;
5027 		}
5028 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5029 			return TEST_SKIPPED;
5030 	}
5031 
5032 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5033 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5034 		printf("Device doesn't support RAW data-path APIs.\n");
5035 		return TEST_SKIPPED;
5036 	}
5037 
5038 	/* Create SNOW 3G session */
5039 	retval = create_wireless_algo_auth_cipher_session(
5040 			ts_params->valid_devs[0],
5041 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5042 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5043 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5044 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5045 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5046 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5047 			tdata->key.data, tdata->key.len,
5048 			tdata->auth_iv.len, tdata->digest.len,
5049 			tdata->cipher_iv.len);
5050 	if (retval != 0)
5051 		return retval;
5052 
5053 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5054 	if (op_mode == OUT_OF_PLACE)
5055 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5056 
5057 	/* clear mbuf payload */
5058 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5059 		rte_pktmbuf_tailroom(ut_params->ibuf));
5060 	if (op_mode == OUT_OF_PLACE)
5061 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5062 			rte_pktmbuf_tailroom(ut_params->obuf));
5063 
5064 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5065 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5066 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5067 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5068 
5069 	if (verify) {
5070 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5071 					ciphertext_pad_len);
5072 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5073 		if (op_mode == OUT_OF_PLACE)
5074 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5075 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5076 			ciphertext_len);
5077 	} else {
5078 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5079 					plaintext_pad_len);
5080 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5081 		if (op_mode == OUT_OF_PLACE)
5082 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5083 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5084 	}
5085 
5086 	/* Create SNOW 3G operation */
5087 	retval = create_wireless_algo_auth_cipher_operation(
5088 		tdata->digest.data, tdata->digest.len,
5089 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5090 		tdata->auth_iv.data, tdata->auth_iv.len,
5091 		(tdata->digest.offset_bytes == 0 ?
5092 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5093 			: tdata->digest.offset_bytes),
5094 		tdata->validCipherLenInBits.len,
5095 		tdata->cipher.offset_bits,
5096 		tdata->validAuthLenInBits.len,
5097 		tdata->auth.offset_bits,
5098 		op_mode, 0, verify);
5099 
5100 	if (retval < 0)
5101 		return retval;
5102 
5103 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5104 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5105 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5106 	else
5107 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5108 			ut_params->op);
5109 
5110 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5111 
5112 	ut_params->obuf = (op_mode == IN_PLACE ?
5113 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5114 
5115 	if (verify) {
5116 		if (ut_params->obuf)
5117 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5118 							uint8_t *);
5119 		else
5120 			plaintext = ciphertext +
5121 				(tdata->cipher.offset_bits >> 3);
5122 
5123 		debug_hexdump(stdout, "plaintext:", plaintext,
5124 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5125 		debug_hexdump(stdout, "plaintext expected:",
5126 			tdata->plaintext.data,
5127 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5128 	} else {
5129 		if (ut_params->obuf)
5130 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5131 							uint8_t *);
5132 		else
5133 			ciphertext = plaintext;
5134 
5135 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5136 			ciphertext_len);
5137 		debug_hexdump(stdout, "ciphertext expected:",
5138 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5139 
5140 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5141 			+ (tdata->digest.offset_bytes == 0 ?
5142 		plaintext_pad_len : tdata->digest.offset_bytes);
5143 
5144 		debug_hexdump(stdout, "digest:", ut_params->digest,
5145 			tdata->digest.len);
5146 		debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5147 				tdata->digest.len);
5148 	}
5149 
5150 	/* Validate obuf */
5151 	if (verify) {
5152 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5153 			plaintext,
5154 			tdata->plaintext.data,
5155 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5156 			 (tdata->digest.len << 3)),
5157 			tdata->cipher.offset_bits,
5158 			"SNOW 3G Plaintext data not as expected");
5159 	} else {
5160 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5161 			ciphertext,
5162 			tdata->ciphertext.data,
5163 			(tdata->validDataLenInBits.len -
5164 			 tdata->cipher.offset_bits),
5165 			tdata->cipher.offset_bits,
5166 			"SNOW 3G Ciphertext data not as expected");
5167 
5168 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5169 			ut_params->digest,
5170 			tdata->digest.data,
5171 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5172 			"SNOW 3G Generated auth tag not as expected");
5173 	}
5174 	return 0;
5175 }
5176 
5177 static int
5178 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5179 	uint8_t op_mode, uint8_t verify)
5180 {
5181 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5182 	struct crypto_unittest_params *ut_params = &unittest_params;
5183 
5184 	int retval;
5185 
5186 	const uint8_t *plaintext = NULL;
5187 	const uint8_t *ciphertext = NULL;
5188 	const uint8_t *digest = NULL;
5189 	unsigned int plaintext_pad_len;
5190 	unsigned int plaintext_len;
5191 	unsigned int ciphertext_pad_len;
5192 	unsigned int ciphertext_len;
5193 	uint8_t buffer[10000];
5194 	uint8_t digest_buffer[10000];
5195 
5196 	struct rte_cryptodev_info dev_info;
5197 
5198 	/* Verify the capabilities */
5199 	struct rte_cryptodev_sym_capability_idx cap_idx;
5200 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5201 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5202 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5203 			&cap_idx) == NULL)
5204 		return TEST_SKIPPED;
5205 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5206 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5207 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5208 			&cap_idx) == NULL)
5209 		return TEST_SKIPPED;
5210 
5211 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5212 		return TEST_SKIPPED;
5213 
5214 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5215 
5216 	uint64_t feat_flags = dev_info.feature_flags;
5217 
5218 	if (op_mode == IN_PLACE) {
5219 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5220 			printf("Device doesn't support in-place scatter-gather "
5221 					"in both input and output mbufs.\n");
5222 			return TEST_SKIPPED;
5223 		}
5224 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5225 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5226 			printf("Device doesn't support RAW data-path APIs.\n");
5227 			return TEST_SKIPPED;
5228 		}
5229 	} else {
5230 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5231 			return TEST_SKIPPED;
5232 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5233 			printf("Device doesn't support out-of-place scatter-gather "
5234 					"in both input and output mbufs.\n");
5235 			return TEST_SKIPPED;
5236 		}
5237 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5238 			printf("Device doesn't support digest encrypted.\n");
5239 			return TEST_SKIPPED;
5240 		}
5241 	}
5242 
5243 	/* Create SNOW 3G session */
5244 	retval = create_wireless_algo_auth_cipher_session(
5245 			ts_params->valid_devs[0],
5246 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5247 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5248 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5249 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5250 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5251 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5252 			tdata->key.data, tdata->key.len,
5253 			tdata->auth_iv.len, tdata->digest.len,
5254 			tdata->cipher_iv.len);
5255 
5256 	if (retval != 0)
5257 		return retval;
5258 
5259 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5260 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5261 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5262 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5263 
5264 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5265 			plaintext_pad_len, 15, 0);
5266 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5267 			"Failed to allocate input buffer in mempool");
5268 
5269 	if (op_mode == OUT_OF_PLACE) {
5270 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5271 				plaintext_pad_len, 15, 0);
5272 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5273 				"Failed to allocate output buffer in mempool");
5274 	}
5275 
5276 	if (verify) {
5277 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5278 			tdata->ciphertext.data);
5279 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5280 					ciphertext_len, buffer);
5281 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5282 			ciphertext_len);
5283 	} else {
5284 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5285 			tdata->plaintext.data);
5286 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5287 					plaintext_len, buffer);
5288 		debug_hexdump(stdout, "plaintext:", plaintext,
5289 			plaintext_len);
5290 	}
5291 	memset(buffer, 0, sizeof(buffer));
5292 
5293 	/* Create SNOW 3G operation */
5294 	retval = create_wireless_algo_auth_cipher_operation(
5295 		tdata->digest.data, tdata->digest.len,
5296 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5297 		tdata->auth_iv.data, tdata->auth_iv.len,
5298 		(tdata->digest.offset_bytes == 0 ?
5299 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5300 			: tdata->digest.offset_bytes),
5301 		tdata->validCipherLenInBits.len,
5302 		tdata->cipher.offset_bits,
5303 		tdata->validAuthLenInBits.len,
5304 		tdata->auth.offset_bits,
5305 		op_mode, 1, verify);
5306 
5307 	if (retval < 0)
5308 		return retval;
5309 
5310 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5311 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5312 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5313 	else
5314 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5315 			ut_params->op);
5316 
5317 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5318 
5319 	ut_params->obuf = (op_mode == IN_PLACE ?
5320 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5321 
5322 	if (verify) {
5323 		if (ut_params->obuf)
5324 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5325 					plaintext_len, buffer);
5326 		else
5327 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5328 					plaintext_len, buffer);
5329 
5330 		debug_hexdump(stdout, "plaintext:", plaintext,
5331 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5332 		debug_hexdump(stdout, "plaintext expected:",
5333 			tdata->plaintext.data,
5334 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5335 	} else {
5336 		if (ut_params->obuf)
5337 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5338 					ciphertext_len, buffer);
5339 		else
5340 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5341 					ciphertext_len, buffer);
5342 
5343 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5344 			ciphertext_len);
5345 		debug_hexdump(stdout, "ciphertext expected:",
5346 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5347 
5348 		if (ut_params->obuf)
5349 			digest = rte_pktmbuf_read(ut_params->obuf,
5350 				(tdata->digest.offset_bytes == 0 ?
5351 				plaintext_pad_len : tdata->digest.offset_bytes),
5352 				tdata->digest.len, digest_buffer);
5353 		else
5354 			digest = rte_pktmbuf_read(ut_params->ibuf,
5355 				(tdata->digest.offset_bytes == 0 ?
5356 				plaintext_pad_len : tdata->digest.offset_bytes),
5357 				tdata->digest.len, digest_buffer);
5358 
5359 		debug_hexdump(stdout, "digest:", digest,
5360 			tdata->digest.len);
5361 		debug_hexdump(stdout, "digest expected:",
5362 			tdata->digest.data, tdata->digest.len);
5363 	}
5364 
5365 	/* Validate obuf */
5366 	if (verify) {
5367 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5368 			plaintext,
5369 			tdata->plaintext.data,
5370 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5371 			 (tdata->digest.len << 3)),
5372 			tdata->cipher.offset_bits,
5373 			"SNOW 3G Plaintext data not as expected");
5374 	} else {
5375 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5376 			ciphertext,
5377 			tdata->ciphertext.data,
5378 			(tdata->validDataLenInBits.len -
5379 			 tdata->cipher.offset_bits),
5380 			tdata->cipher.offset_bits,
5381 			"SNOW 3G Ciphertext data not as expected");
5382 
5383 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5384 			digest,
5385 			tdata->digest.data,
5386 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5387 			"SNOW 3G Generated auth tag not as expected");
5388 	}
5389 	return 0;
5390 }
5391 
5392 static int
5393 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5394 	uint8_t op_mode, uint8_t verify)
5395 {
5396 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5397 	struct crypto_unittest_params *ut_params = &unittest_params;
5398 
5399 	int retval;
5400 
5401 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5402 	unsigned int plaintext_pad_len;
5403 	unsigned int plaintext_len;
5404 	unsigned int ciphertext_pad_len;
5405 	unsigned int ciphertext_len;
5406 
5407 	struct rte_cryptodev_info dev_info;
5408 
5409 	/* Verify the capabilities */
5410 	struct rte_cryptodev_sym_capability_idx cap_idx;
5411 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5412 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5413 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5414 			&cap_idx) == NULL)
5415 		return TEST_SKIPPED;
5416 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5417 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5418 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5419 			&cap_idx) == NULL)
5420 		return TEST_SKIPPED;
5421 
5422 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5423 
5424 	uint64_t feat_flags = dev_info.feature_flags;
5425 
5426 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5427 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5428 		printf("Device doesn't support RAW data-path APIs.\n");
5429 		return TEST_SKIPPED;
5430 	}
5431 
5432 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5433 		return TEST_SKIPPED;
5434 
5435 	if (op_mode == OUT_OF_PLACE) {
5436 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5437 			return TEST_SKIPPED;
5438 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5439 			printf("Device doesn't support digest encrypted.\n");
5440 			return TEST_SKIPPED;
5441 		}
5442 	}
5443 
5444 	/* Create KASUMI session */
5445 	retval = create_wireless_algo_auth_cipher_session(
5446 			ts_params->valid_devs[0],
5447 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5448 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5449 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5450 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5451 			RTE_CRYPTO_AUTH_KASUMI_F9,
5452 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5453 			tdata->key.data, tdata->key.len,
5454 			0, tdata->digest.len,
5455 			tdata->cipher_iv.len);
5456 
5457 	if (retval != 0)
5458 		return retval;
5459 
5460 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5461 	if (op_mode == OUT_OF_PLACE)
5462 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5463 
5464 	/* clear mbuf payload */
5465 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5466 		rte_pktmbuf_tailroom(ut_params->ibuf));
5467 	if (op_mode == OUT_OF_PLACE)
5468 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5469 			rte_pktmbuf_tailroom(ut_params->obuf));
5470 
5471 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5472 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5473 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5474 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5475 
5476 	if (verify) {
5477 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5478 					ciphertext_pad_len);
5479 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5480 		if (op_mode == OUT_OF_PLACE)
5481 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5482 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5483 			ciphertext_len);
5484 	} else {
5485 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5486 					plaintext_pad_len);
5487 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5488 		if (op_mode == OUT_OF_PLACE)
5489 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5490 		debug_hexdump(stdout, "plaintext:", plaintext,
5491 			plaintext_len);
5492 	}
5493 
5494 	/* Create KASUMI operation */
5495 	retval = create_wireless_algo_auth_cipher_operation(
5496 		tdata->digest.data, tdata->digest.len,
5497 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5498 		NULL, 0,
5499 		(tdata->digest.offset_bytes == 0 ?
5500 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5501 			: tdata->digest.offset_bytes),
5502 		tdata->validCipherLenInBits.len,
5503 		tdata->validCipherOffsetInBits.len,
5504 		tdata->validAuthLenInBits.len,
5505 		0,
5506 		op_mode, 0, verify);
5507 
5508 	if (retval < 0)
5509 		return retval;
5510 
5511 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5512 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5513 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5514 	else
5515 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5516 			ut_params->op);
5517 
5518 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5519 
5520 	ut_params->obuf = (op_mode == IN_PLACE ?
5521 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5522 
5523 
5524 	if (verify) {
5525 		if (ut_params->obuf)
5526 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5527 							uint8_t *);
5528 		else
5529 			plaintext = ciphertext;
5530 
5531 		debug_hexdump(stdout, "plaintext:", plaintext,
5532 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5533 		debug_hexdump(stdout, "plaintext expected:",
5534 			tdata->plaintext.data,
5535 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5536 	} else {
5537 		if (ut_params->obuf)
5538 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5539 							uint8_t *);
5540 		else
5541 			ciphertext = plaintext;
5542 
5543 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5544 			ciphertext_len);
5545 		debug_hexdump(stdout, "ciphertext expected:",
5546 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5547 
5548 		ut_params->digest = rte_pktmbuf_mtod(
5549 			ut_params->obuf, uint8_t *) +
5550 			(tdata->digest.offset_bytes == 0 ?
5551 			plaintext_pad_len : tdata->digest.offset_bytes);
5552 
5553 		debug_hexdump(stdout, "digest:", ut_params->digest,
5554 			tdata->digest.len);
5555 		debug_hexdump(stdout, "digest expected:",
5556 			tdata->digest.data, tdata->digest.len);
5557 	}
5558 
5559 	/* Validate obuf */
5560 	if (verify) {
5561 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5562 			plaintext,
5563 			tdata->plaintext.data,
5564 			tdata->plaintext.len >> 3,
5565 			"KASUMI Plaintext data not as expected");
5566 	} else {
5567 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5568 			ciphertext,
5569 			tdata->ciphertext.data,
5570 			tdata->ciphertext.len >> 3,
5571 			"KASUMI Ciphertext data not as expected");
5572 
5573 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5574 			ut_params->digest,
5575 			tdata->digest.data,
5576 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5577 			"KASUMI Generated auth tag not as expected");
5578 	}
5579 	return 0;
5580 }
5581 
5582 static int
5583 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5584 	uint8_t op_mode, uint8_t verify)
5585 {
5586 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5587 	struct crypto_unittest_params *ut_params = &unittest_params;
5588 
5589 	int retval;
5590 
5591 	const uint8_t *plaintext = NULL;
5592 	const uint8_t *ciphertext = NULL;
5593 	const uint8_t *digest = NULL;
5594 	unsigned int plaintext_pad_len;
5595 	unsigned int plaintext_len;
5596 	unsigned int ciphertext_pad_len;
5597 	unsigned int ciphertext_len;
5598 	uint8_t buffer[10000];
5599 	uint8_t digest_buffer[10000];
5600 
5601 	struct rte_cryptodev_info dev_info;
5602 
5603 	/* Verify the capabilities */
5604 	struct rte_cryptodev_sym_capability_idx cap_idx;
5605 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5606 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5607 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5608 			&cap_idx) == NULL)
5609 		return TEST_SKIPPED;
5610 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5611 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5612 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5613 			&cap_idx) == NULL)
5614 		return TEST_SKIPPED;
5615 
5616 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5617 		return TEST_SKIPPED;
5618 
5619 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5620 
5621 	uint64_t feat_flags = dev_info.feature_flags;
5622 
5623 	if (op_mode == IN_PLACE) {
5624 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5625 			printf("Device doesn't support in-place scatter-gather "
5626 					"in both input and output mbufs.\n");
5627 			return TEST_SKIPPED;
5628 		}
5629 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5630 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5631 			printf("Device doesn't support RAW data-path APIs.\n");
5632 			return TEST_SKIPPED;
5633 		}
5634 	} else {
5635 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5636 			return TEST_SKIPPED;
5637 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5638 			printf("Device doesn't support out-of-place scatter-gather "
5639 					"in both input and output mbufs.\n");
5640 			return TEST_SKIPPED;
5641 		}
5642 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5643 			printf("Device doesn't support digest encrypted.\n");
5644 			return TEST_SKIPPED;
5645 		}
5646 	}
5647 
5648 	/* Create KASUMI session */
5649 	retval = create_wireless_algo_auth_cipher_session(
5650 			ts_params->valid_devs[0],
5651 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5652 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5653 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5654 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5655 			RTE_CRYPTO_AUTH_KASUMI_F9,
5656 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5657 			tdata->key.data, tdata->key.len,
5658 			0, tdata->digest.len,
5659 			tdata->cipher_iv.len);
5660 
5661 	if (retval != 0)
5662 		return retval;
5663 
5664 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5665 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5666 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5667 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5668 
5669 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5670 			plaintext_pad_len, 15, 0);
5671 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5672 			"Failed to allocate input buffer in mempool");
5673 
5674 	if (op_mode == OUT_OF_PLACE) {
5675 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5676 				plaintext_pad_len, 15, 0);
5677 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5678 				"Failed to allocate output buffer in mempool");
5679 	}
5680 
5681 	if (verify) {
5682 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5683 			tdata->ciphertext.data);
5684 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5685 					ciphertext_len, buffer);
5686 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5687 			ciphertext_len);
5688 	} else {
5689 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5690 			tdata->plaintext.data);
5691 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5692 					plaintext_len, buffer);
5693 		debug_hexdump(stdout, "plaintext:", plaintext,
5694 			plaintext_len);
5695 	}
5696 	memset(buffer, 0, sizeof(buffer));
5697 
5698 	/* Create KASUMI operation */
5699 	retval = create_wireless_algo_auth_cipher_operation(
5700 		tdata->digest.data, tdata->digest.len,
5701 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5702 		NULL, 0,
5703 		(tdata->digest.offset_bytes == 0 ?
5704 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5705 			: tdata->digest.offset_bytes),
5706 		tdata->validCipherLenInBits.len,
5707 		tdata->validCipherOffsetInBits.len,
5708 		tdata->validAuthLenInBits.len,
5709 		0,
5710 		op_mode, 1, verify);
5711 
5712 	if (retval < 0)
5713 		return retval;
5714 
5715 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5716 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5717 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5718 	else
5719 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5720 			ut_params->op);
5721 
5722 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5723 
5724 	ut_params->obuf = (op_mode == IN_PLACE ?
5725 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5726 
5727 	if (verify) {
5728 		if (ut_params->obuf)
5729 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5730 					plaintext_len, buffer);
5731 		else
5732 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5733 					plaintext_len, buffer);
5734 
5735 		debug_hexdump(stdout, "plaintext:", plaintext,
5736 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5737 		debug_hexdump(stdout, "plaintext expected:",
5738 			tdata->plaintext.data,
5739 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5740 	} else {
5741 		if (ut_params->obuf)
5742 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5743 					ciphertext_len, buffer);
5744 		else
5745 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5746 					ciphertext_len, buffer);
5747 
5748 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5749 			ciphertext_len);
5750 		debug_hexdump(stdout, "ciphertext expected:",
5751 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5752 
5753 		if (ut_params->obuf)
5754 			digest = rte_pktmbuf_read(ut_params->obuf,
5755 				(tdata->digest.offset_bytes == 0 ?
5756 				plaintext_pad_len : tdata->digest.offset_bytes),
5757 				tdata->digest.len, digest_buffer);
5758 		else
5759 			digest = rte_pktmbuf_read(ut_params->ibuf,
5760 				(tdata->digest.offset_bytes == 0 ?
5761 				plaintext_pad_len : tdata->digest.offset_bytes),
5762 				tdata->digest.len, digest_buffer);
5763 
5764 		debug_hexdump(stdout, "digest:", digest,
5765 			tdata->digest.len);
5766 		debug_hexdump(stdout, "digest expected:",
5767 			tdata->digest.data, tdata->digest.len);
5768 	}
5769 
5770 	/* Validate obuf */
5771 	if (verify) {
5772 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5773 			plaintext,
5774 			tdata->plaintext.data,
5775 			tdata->plaintext.len >> 3,
5776 			"KASUMI Plaintext data not as expected");
5777 	} else {
5778 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5779 			ciphertext,
5780 			tdata->ciphertext.data,
5781 			tdata->validDataLenInBits.len,
5782 			"KASUMI Ciphertext data not as expected");
5783 
5784 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5785 			digest,
5786 			tdata->digest.data,
5787 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5788 			"KASUMI Generated auth tag not as expected");
5789 	}
5790 	return 0;
5791 }
5792 
5793 static int
5794 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5795 {
5796 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5797 	struct crypto_unittest_params *ut_params = &unittest_params;
5798 
5799 	int retval;
5800 
5801 	uint8_t *plaintext, *ciphertext;
5802 	unsigned plaintext_pad_len;
5803 	unsigned plaintext_len;
5804 	struct rte_cryptodev_info dev_info;
5805 
5806 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5807 	uint64_t feat_flags = dev_info.feature_flags;
5808 
5809 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5810 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5811 		printf("Device doesn't support RAW data-path APIs.\n");
5812 		return TEST_SKIPPED;
5813 	}
5814 
5815 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5816 		return TEST_SKIPPED;
5817 
5818 	/* Verify the capabilities */
5819 	struct rte_cryptodev_sym_capability_idx cap_idx;
5820 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5821 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5822 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5823 			&cap_idx) == NULL)
5824 		return TEST_SKIPPED;
5825 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5826 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5827 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5828 			&cap_idx) == NULL)
5829 		return TEST_SKIPPED;
5830 
5831 	/* Create KASUMI session */
5832 	retval = create_wireless_algo_cipher_auth_session(
5833 			ts_params->valid_devs[0],
5834 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5835 			RTE_CRYPTO_AUTH_OP_GENERATE,
5836 			RTE_CRYPTO_AUTH_KASUMI_F9,
5837 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5838 			tdata->key.data, tdata->key.len,
5839 			0, tdata->digest.len,
5840 			tdata->cipher_iv.len);
5841 	if (retval != 0)
5842 		return retval;
5843 
5844 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5845 
5846 	/* clear mbuf payload */
5847 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5848 			rte_pktmbuf_tailroom(ut_params->ibuf));
5849 
5850 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5851 	/* Append data which is padded to a multiple of */
5852 	/* the algorithms block size */
5853 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5854 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5855 				plaintext_pad_len);
5856 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5857 
5858 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5859 
5860 	/* Create KASUMI operation */
5861 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5862 				tdata->digest.len, NULL, 0,
5863 				plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5864 				tdata->cipher_iv.data, tdata->cipher_iv.len,
5865 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5866 				tdata->validCipherOffsetInBits.len,
5867 				tdata->validAuthLenInBits.len,
5868 				0
5869 				);
5870 	if (retval < 0)
5871 		return retval;
5872 
5873 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5874 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5875 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5876 	else
5877 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5878 			ut_params->op);
5879 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5880 
5881 	if (ut_params->op->sym->m_dst)
5882 		ut_params->obuf = ut_params->op->sym->m_dst;
5883 	else
5884 		ut_params->obuf = ut_params->op->sym->m_src;
5885 
5886 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5887 				tdata->validCipherOffsetInBits.len >> 3);
5888 
5889 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5890 			+ plaintext_pad_len;
5891 
5892 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5893 				(tdata->validCipherOffsetInBits.len >> 3);
5894 	/* Validate obuf */
5895 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5896 		ciphertext,
5897 		reference_ciphertext,
5898 		tdata->validCipherLenInBits.len,
5899 		"KASUMI Ciphertext data not as expected");
5900 
5901 	/* Validate obuf */
5902 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5903 		ut_params->digest,
5904 		tdata->digest.data,
5905 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5906 		"KASUMI Generated auth tag not as expected");
5907 	return 0;
5908 }
5909 
5910 static int
5911 check_cipher_capability(const struct crypto_testsuite_params *ts_params,
5912 			const enum rte_crypto_cipher_algorithm cipher_algo,
5913 			const uint16_t key_size, const uint16_t iv_size)
5914 {
5915 	struct rte_cryptodev_sym_capability_idx cap_idx;
5916 	const struct rte_cryptodev_symmetric_capability *cap;
5917 
5918 	/* Check if device supports the algorithm */
5919 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5920 	cap_idx.algo.cipher = cipher_algo;
5921 
5922 	cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5923 			&cap_idx);
5924 
5925 	if (cap == NULL)
5926 		return -1;
5927 
5928 	/* Check if device supports key size and IV size */
5929 	if (rte_cryptodev_sym_capability_check_cipher(cap, key_size,
5930 			iv_size) < 0) {
5931 		return -1;
5932 	}
5933 
5934 	return 0;
5935 }
5936 
5937 static int
5938 check_auth_capability(const struct crypto_testsuite_params *ts_params,
5939 			const enum rte_crypto_auth_algorithm auth_algo,
5940 			const uint16_t key_size, const uint16_t iv_size,
5941 			const uint16_t tag_size)
5942 {
5943 	struct rte_cryptodev_sym_capability_idx cap_idx;
5944 	const struct rte_cryptodev_symmetric_capability *cap;
5945 
5946 	/* Check if device supports the algorithm */
5947 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5948 	cap_idx.algo.auth = auth_algo;
5949 
5950 	cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5951 			&cap_idx);
5952 
5953 	if (cap == NULL)
5954 		return -1;
5955 
5956 	/* Check if device supports key size and IV size */
5957 	if (rte_cryptodev_sym_capability_check_auth(cap, key_size,
5958 			tag_size, iv_size) < 0) {
5959 		return -1;
5960 	}
5961 
5962 	return 0;
5963 }
5964 
5965 static int
5966 test_zuc_encryption(const struct wireless_test_data *tdata)
5967 {
5968 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5969 	struct crypto_unittest_params *ut_params = &unittest_params;
5970 
5971 	int retval;
5972 	uint8_t *plaintext, *ciphertext;
5973 	unsigned plaintext_pad_len;
5974 	unsigned plaintext_len;
5975 	struct rte_cryptodev_info dev_info;
5976 
5977 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5978 	uint64_t feat_flags = dev_info.feature_flags;
5979 
5980 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5981 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5982 		printf("Device doesn't support RAW data-path APIs.\n");
5983 		return TEST_SKIPPED;
5984 	}
5985 
5986 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5987 		return TEST_SKIPPED;
5988 
5989 	/* Check if device supports ZUC EEA3 */
5990 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
5991 			tdata->key.len, tdata->cipher_iv.len) < 0)
5992 		return TEST_SKIPPED;
5993 
5994 	/* Create ZUC session */
5995 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5996 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5997 					RTE_CRYPTO_CIPHER_ZUC_EEA3,
5998 					tdata->key.data, tdata->key.len,
5999 					tdata->cipher_iv.len);
6000 	if (retval != 0)
6001 		return retval;
6002 
6003 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6004 
6005 	/* Clear mbuf payload */
6006 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6007 	       rte_pktmbuf_tailroom(ut_params->ibuf));
6008 
6009 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6010 	/* Append data which is padded to a multiple */
6011 	/* of the algorithms block size */
6012 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6013 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6014 				plaintext_pad_len);
6015 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6016 
6017 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6018 
6019 	/* Create ZUC operation */
6020 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6021 					tdata->cipher_iv.len,
6022 					tdata->plaintext.len,
6023 					0);
6024 	if (retval < 0)
6025 		return retval;
6026 
6027 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6028 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6029 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6030 	else
6031 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6032 						ut_params->op);
6033 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6034 
6035 	ut_params->obuf = ut_params->op->sym->m_dst;
6036 	if (ut_params->obuf)
6037 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
6038 	else
6039 		ciphertext = plaintext;
6040 
6041 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6042 
6043 	/* Validate obuf */
6044 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6045 		ciphertext,
6046 		tdata->ciphertext.data,
6047 		tdata->validCipherLenInBits.len,
6048 		"ZUC Ciphertext data not as expected");
6049 	return 0;
6050 }
6051 
6052 static int
6053 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
6054 {
6055 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6056 	struct crypto_unittest_params *ut_params = &unittest_params;
6057 
6058 	int retval;
6059 
6060 	unsigned int plaintext_pad_len;
6061 	unsigned int plaintext_len;
6062 	const uint8_t *ciphertext;
6063 	uint8_t ciphertext_buffer[2048];
6064 	struct rte_cryptodev_info dev_info;
6065 
6066 	/* Check if device supports ZUC EEA3 */
6067 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6068 			tdata->key.len, tdata->cipher_iv.len) < 0)
6069 		return TEST_SKIPPED;
6070 
6071 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6072 		return TEST_SKIPPED;
6073 
6074 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6075 
6076 	uint64_t feat_flags = dev_info.feature_flags;
6077 
6078 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6079 		printf("Device doesn't support in-place scatter-gather. "
6080 				"Test Skipped.\n");
6081 		return TEST_SKIPPED;
6082 	}
6083 
6084 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6085 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6086 		printf("Device doesn't support RAW data-path APIs.\n");
6087 		return TEST_SKIPPED;
6088 	}
6089 
6090 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6091 
6092 	/* Append data which is padded to a multiple */
6093 	/* of the algorithms block size */
6094 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6095 
6096 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6097 			plaintext_pad_len, 10, 0);
6098 
6099 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6100 			tdata->plaintext.data);
6101 
6102 	/* Create ZUC session */
6103 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6104 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6105 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6106 			tdata->key.data, tdata->key.len,
6107 			tdata->cipher_iv.len);
6108 	if (retval < 0)
6109 		return retval;
6110 
6111 	/* Clear mbuf payload */
6112 
6113 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
6114 
6115 	/* Create ZUC operation */
6116 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6117 			tdata->cipher_iv.len, tdata->plaintext.len,
6118 			0);
6119 	if (retval < 0)
6120 		return retval;
6121 
6122 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6123 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6124 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6125 	else
6126 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6127 						ut_params->op);
6128 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6129 
6130 	ut_params->obuf = ut_params->op->sym->m_dst;
6131 	if (ut_params->obuf)
6132 		ciphertext = rte_pktmbuf_read(ut_params->obuf,
6133 			0, plaintext_len, ciphertext_buffer);
6134 	else
6135 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
6136 			0, plaintext_len, ciphertext_buffer);
6137 
6138 	/* Validate obuf */
6139 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6140 
6141 	/* Validate obuf */
6142 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6143 		ciphertext,
6144 		tdata->ciphertext.data,
6145 		tdata->validCipherLenInBits.len,
6146 		"ZUC Ciphertext data not as expected");
6147 
6148 	return 0;
6149 }
6150 
6151 static int
6152 test_zuc_authentication(const struct wireless_test_data *tdata)
6153 {
6154 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6155 	struct crypto_unittest_params *ut_params = &unittest_params;
6156 
6157 	int retval;
6158 	unsigned plaintext_pad_len;
6159 	unsigned plaintext_len;
6160 	uint8_t *plaintext;
6161 
6162 	struct rte_cryptodev_info dev_info;
6163 
6164 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6165 	uint64_t feat_flags = dev_info.feature_flags;
6166 
6167 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
6168 			(tdata->validAuthLenInBits.len % 8 != 0)) {
6169 		printf("Device doesn't support NON-Byte Aligned Data.\n");
6170 		return TEST_SKIPPED;
6171 	}
6172 
6173 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6174 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6175 		printf("Device doesn't support RAW data-path APIs.\n");
6176 		return TEST_SKIPPED;
6177 	}
6178 
6179 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6180 		return TEST_SKIPPED;
6181 
6182 	/* Check if device supports ZUC EIA3 */
6183 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6184 			tdata->key.len, tdata->auth_iv.len,
6185 			tdata->digest.len) < 0)
6186 		return TEST_SKIPPED;
6187 
6188 	/* Create ZUC session */
6189 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6190 			tdata->key.data, tdata->key.len,
6191 			tdata->auth_iv.len, tdata->digest.len,
6192 			RTE_CRYPTO_AUTH_OP_GENERATE,
6193 			RTE_CRYPTO_AUTH_ZUC_EIA3);
6194 	if (retval != 0)
6195 		return retval;
6196 
6197 	/* alloc mbuf and set payload */
6198 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6199 
6200 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6201 	rte_pktmbuf_tailroom(ut_params->ibuf));
6202 
6203 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6204 	/* Append data which is padded to a multiple of */
6205 	/* the algorithms block size */
6206 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6207 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6208 				plaintext_pad_len);
6209 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6210 
6211 	/* Create ZUC operation */
6212 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6213 			tdata->auth_iv.data, tdata->auth_iv.len,
6214 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6215 			tdata->validAuthLenInBits.len,
6216 			0);
6217 	if (retval < 0)
6218 		return retval;
6219 
6220 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6221 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6222 				ut_params->op, 0, 1, 1, 0);
6223 	else
6224 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6225 				ut_params->op);
6226 	ut_params->obuf = ut_params->op->sym->m_src;
6227 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6228 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6229 			+ plaintext_pad_len;
6230 
6231 	/* Validate obuf */
6232 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
6233 	ut_params->digest,
6234 	tdata->digest.data,
6235 	tdata->digest.len,
6236 	"ZUC Generated auth tag not as expected");
6237 
6238 	return 0;
6239 }
6240 
6241 static int
6242 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6243 	uint8_t op_mode, uint8_t verify)
6244 {
6245 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6246 	struct crypto_unittest_params *ut_params = &unittest_params;
6247 
6248 	int retval;
6249 
6250 	uint8_t *plaintext = NULL, *ciphertext = NULL;
6251 	unsigned int plaintext_pad_len;
6252 	unsigned int plaintext_len;
6253 	unsigned int ciphertext_pad_len;
6254 	unsigned int ciphertext_len;
6255 
6256 	struct rte_cryptodev_info dev_info;
6257 
6258 	/* Check if device supports ZUC EEA3 */
6259 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6260 			tdata->key.len, tdata->cipher_iv.len) < 0)
6261 		return TEST_SKIPPED;
6262 
6263 	/* Check if device supports ZUC EIA3 */
6264 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6265 			tdata->key.len, tdata->auth_iv.len,
6266 			tdata->digest.len) < 0)
6267 		return TEST_SKIPPED;
6268 
6269 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6270 
6271 	uint64_t feat_flags = dev_info.feature_flags;
6272 
6273 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6274 		printf("Device doesn't support digest encrypted.\n");
6275 		return TEST_SKIPPED;
6276 	}
6277 	if (op_mode == IN_PLACE) {
6278 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6279 			printf("Device doesn't support in-place scatter-gather "
6280 					"in both input and output mbufs.\n");
6281 			return TEST_SKIPPED;
6282 		}
6283 
6284 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6285 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6286 			printf("Device doesn't support RAW data-path APIs.\n");
6287 			return TEST_SKIPPED;
6288 		}
6289 	} else {
6290 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6291 			return TEST_SKIPPED;
6292 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6293 			printf("Device doesn't support out-of-place scatter-gather "
6294 					"in both input and output mbufs.\n");
6295 			return TEST_SKIPPED;
6296 		}
6297 	}
6298 
6299 	/* Create ZUC session */
6300 	retval = create_wireless_algo_auth_cipher_session(
6301 			ts_params->valid_devs[0],
6302 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6303 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6304 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6305 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6306 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6307 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6308 			tdata->key.data, tdata->key.len,
6309 			tdata->auth_iv.len, tdata->digest.len,
6310 			tdata->cipher_iv.len);
6311 
6312 	if (retval != 0)
6313 		return retval;
6314 
6315 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6316 	if (op_mode == OUT_OF_PLACE)
6317 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6318 
6319 	/* clear mbuf payload */
6320 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6321 		rte_pktmbuf_tailroom(ut_params->ibuf));
6322 	if (op_mode == OUT_OF_PLACE)
6323 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6324 			rte_pktmbuf_tailroom(ut_params->obuf));
6325 
6326 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6327 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6328 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6329 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6330 
6331 	if (verify) {
6332 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6333 					ciphertext_pad_len);
6334 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6335 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6336 			ciphertext_len);
6337 	} else {
6338 		/* make sure enough space to cover partial digest verify case */
6339 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6340 					ciphertext_pad_len);
6341 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6342 		debug_hexdump(stdout, "plaintext:", plaintext,
6343 			plaintext_len);
6344 	}
6345 
6346 	if (op_mode == OUT_OF_PLACE)
6347 		rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6348 
6349 	/* Create ZUC operation */
6350 	retval = create_wireless_algo_auth_cipher_operation(
6351 		tdata->digest.data, tdata->digest.len,
6352 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6353 		tdata->auth_iv.data, tdata->auth_iv.len,
6354 		(tdata->digest.offset_bytes == 0 ?
6355 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6356 			: tdata->digest.offset_bytes),
6357 		tdata->validCipherLenInBits.len,
6358 		tdata->validCipherOffsetInBits.len,
6359 		tdata->validAuthLenInBits.len,
6360 		0,
6361 		op_mode, 0, verify);
6362 
6363 	if (retval < 0)
6364 		return retval;
6365 
6366 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6367 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6368 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6369 	else
6370 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6371 			ut_params->op);
6372 
6373 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6374 
6375 	ut_params->obuf = (op_mode == IN_PLACE ?
6376 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6377 
6378 
6379 	if (verify) {
6380 		if (ut_params->obuf)
6381 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6382 							uint8_t *);
6383 		else
6384 			plaintext = ciphertext;
6385 
6386 		debug_hexdump(stdout, "plaintext:", plaintext,
6387 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6388 		debug_hexdump(stdout, "plaintext expected:",
6389 			tdata->plaintext.data,
6390 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6391 	} else {
6392 		if (ut_params->obuf)
6393 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6394 							uint8_t *);
6395 		else
6396 			ciphertext = plaintext;
6397 
6398 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6399 			ciphertext_len);
6400 		debug_hexdump(stdout, "ciphertext expected:",
6401 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6402 
6403 		ut_params->digest = rte_pktmbuf_mtod(
6404 			ut_params->obuf, uint8_t *) +
6405 			(tdata->digest.offset_bytes == 0 ?
6406 			plaintext_pad_len : tdata->digest.offset_bytes);
6407 
6408 		debug_hexdump(stdout, "digest:", ut_params->digest,
6409 			tdata->digest.len);
6410 		debug_hexdump(stdout, "digest expected:",
6411 			tdata->digest.data, tdata->digest.len);
6412 	}
6413 
6414 	/* Validate obuf */
6415 	if (verify) {
6416 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6417 			plaintext,
6418 			tdata->plaintext.data,
6419 			tdata->plaintext.len >> 3,
6420 			"ZUC Plaintext data not as expected");
6421 	} else {
6422 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6423 			ciphertext,
6424 			tdata->ciphertext.data,
6425 			tdata->ciphertext.len >> 3,
6426 			"ZUC Ciphertext data not as expected");
6427 
6428 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6429 			ut_params->digest,
6430 			tdata->digest.data,
6431 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6432 			"ZUC Generated auth tag not as expected");
6433 	}
6434 	return 0;
6435 }
6436 
6437 static int
6438 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6439 	uint8_t op_mode, uint8_t verify)
6440 {
6441 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6442 	struct crypto_unittest_params *ut_params = &unittest_params;
6443 
6444 	int retval;
6445 
6446 	const uint8_t *plaintext = NULL;
6447 	const uint8_t *ciphertext = NULL;
6448 	const uint8_t *digest = NULL;
6449 	unsigned int plaintext_pad_len;
6450 	unsigned int plaintext_len;
6451 	unsigned int ciphertext_pad_len;
6452 	unsigned int ciphertext_len;
6453 	uint8_t buffer[10000];
6454 	uint8_t digest_buffer[10000];
6455 
6456 	struct rte_cryptodev_info dev_info;
6457 
6458 	/* Check if device supports ZUC EEA3 */
6459 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6460 			tdata->key.len, tdata->cipher_iv.len) < 0)
6461 		return TEST_SKIPPED;
6462 
6463 	/* Check if device supports ZUC EIA3 */
6464 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6465 			tdata->key.len, tdata->auth_iv.len,
6466 			tdata->digest.len) < 0)
6467 		return TEST_SKIPPED;
6468 
6469 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6470 
6471 	uint64_t feat_flags = dev_info.feature_flags;
6472 
6473 	if (op_mode == IN_PLACE) {
6474 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6475 			printf("Device doesn't support in-place scatter-gather "
6476 					"in both input and output mbufs.\n");
6477 			return TEST_SKIPPED;
6478 		}
6479 
6480 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6481 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6482 			printf("Device doesn't support RAW data-path APIs.\n");
6483 			return TEST_SKIPPED;
6484 		}
6485 	} else {
6486 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6487 			return TEST_SKIPPED;
6488 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6489 			printf("Device doesn't support out-of-place scatter-gather "
6490 					"in both input and output mbufs.\n");
6491 			return TEST_SKIPPED;
6492 		}
6493 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6494 			printf("Device doesn't support digest encrypted.\n");
6495 			return TEST_SKIPPED;
6496 		}
6497 	}
6498 
6499 	/* Create ZUC session */
6500 	retval = create_wireless_algo_auth_cipher_session(
6501 			ts_params->valid_devs[0],
6502 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6503 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6504 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6505 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6506 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6507 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6508 			tdata->key.data, tdata->key.len,
6509 			tdata->auth_iv.len, tdata->digest.len,
6510 			tdata->cipher_iv.len);
6511 
6512 	if (retval != 0)
6513 		return retval;
6514 
6515 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6516 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6517 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6518 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6519 
6520 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6521 			plaintext_pad_len, 15, 0);
6522 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6523 			"Failed to allocate input buffer in mempool");
6524 
6525 	if (op_mode == OUT_OF_PLACE) {
6526 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6527 				plaintext_pad_len, 15, 0);
6528 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
6529 				"Failed to allocate output buffer in mempool");
6530 	}
6531 
6532 	if (verify) {
6533 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6534 			tdata->ciphertext.data);
6535 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6536 					ciphertext_len, buffer);
6537 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6538 			ciphertext_len);
6539 	} else {
6540 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6541 			tdata->plaintext.data);
6542 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6543 					plaintext_len, buffer);
6544 		debug_hexdump(stdout, "plaintext:", plaintext,
6545 			plaintext_len);
6546 	}
6547 	memset(buffer, 0, sizeof(buffer));
6548 
6549 	/* Create ZUC operation */
6550 	retval = create_wireless_algo_auth_cipher_operation(
6551 		tdata->digest.data, tdata->digest.len,
6552 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6553 		NULL, 0,
6554 		(tdata->digest.offset_bytes == 0 ?
6555 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6556 			: tdata->digest.offset_bytes),
6557 		tdata->validCipherLenInBits.len,
6558 		tdata->validCipherOffsetInBits.len,
6559 		tdata->validAuthLenInBits.len,
6560 		0,
6561 		op_mode, 1, verify);
6562 
6563 	if (retval < 0)
6564 		return retval;
6565 
6566 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6567 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6568 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6569 	else
6570 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6571 			ut_params->op);
6572 
6573 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6574 
6575 	ut_params->obuf = (op_mode == IN_PLACE ?
6576 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6577 
6578 	if (verify) {
6579 		if (ut_params->obuf)
6580 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6581 					plaintext_len, buffer);
6582 		else
6583 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6584 					plaintext_len, buffer);
6585 
6586 		debug_hexdump(stdout, "plaintext:", plaintext,
6587 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6588 		debug_hexdump(stdout, "plaintext expected:",
6589 			tdata->plaintext.data,
6590 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6591 	} else {
6592 		if (ut_params->obuf)
6593 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6594 					ciphertext_len, buffer);
6595 		else
6596 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6597 					ciphertext_len, buffer);
6598 
6599 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6600 			ciphertext_len);
6601 		debug_hexdump(stdout, "ciphertext expected:",
6602 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6603 
6604 		if (ut_params->obuf)
6605 			digest = rte_pktmbuf_read(ut_params->obuf,
6606 				(tdata->digest.offset_bytes == 0 ?
6607 				plaintext_pad_len : tdata->digest.offset_bytes),
6608 				tdata->digest.len, digest_buffer);
6609 		else
6610 			digest = rte_pktmbuf_read(ut_params->ibuf,
6611 				(tdata->digest.offset_bytes == 0 ?
6612 				plaintext_pad_len : tdata->digest.offset_bytes),
6613 				tdata->digest.len, digest_buffer);
6614 
6615 		debug_hexdump(stdout, "digest:", digest,
6616 			tdata->digest.len);
6617 		debug_hexdump(stdout, "digest expected:",
6618 			tdata->digest.data, tdata->digest.len);
6619 	}
6620 
6621 	/* Validate obuf */
6622 	if (verify) {
6623 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6624 			plaintext,
6625 			tdata->plaintext.data,
6626 			tdata->plaintext.len >> 3,
6627 			"ZUC Plaintext data not as expected");
6628 	} else {
6629 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6630 			ciphertext,
6631 			tdata->ciphertext.data,
6632 			tdata->validDataLenInBits.len,
6633 			"ZUC Ciphertext data not as expected");
6634 
6635 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6636 			digest,
6637 			tdata->digest.data,
6638 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6639 			"ZUC Generated auth tag not as expected");
6640 	}
6641 	return 0;
6642 }
6643 
6644 static int
6645 test_kasumi_encryption_test_case_1(void)
6646 {
6647 	return test_kasumi_encryption(&kasumi_test_case_1);
6648 }
6649 
6650 static int
6651 test_kasumi_encryption_test_case_1_sgl(void)
6652 {
6653 	return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6654 }
6655 
6656 static int
6657 test_kasumi_encryption_test_case_1_oop(void)
6658 {
6659 	return test_kasumi_encryption_oop(&kasumi_test_case_1);
6660 }
6661 
6662 static int
6663 test_kasumi_encryption_test_case_1_oop_sgl(void)
6664 {
6665 	return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6666 }
6667 
6668 static int
6669 test_kasumi_encryption_test_case_2(void)
6670 {
6671 	return test_kasumi_encryption(&kasumi_test_case_2);
6672 }
6673 
6674 static int
6675 test_kasumi_encryption_test_case_3(void)
6676 {
6677 	return test_kasumi_encryption(&kasumi_test_case_3);
6678 }
6679 
6680 static int
6681 test_kasumi_encryption_test_case_4(void)
6682 {
6683 	return test_kasumi_encryption(&kasumi_test_case_4);
6684 }
6685 
6686 static int
6687 test_kasumi_encryption_test_case_5(void)
6688 {
6689 	return test_kasumi_encryption(&kasumi_test_case_5);
6690 }
6691 
6692 static int
6693 test_kasumi_decryption_test_case_1(void)
6694 {
6695 	return test_kasumi_decryption(&kasumi_test_case_1);
6696 }
6697 
6698 static int
6699 test_kasumi_decryption_test_case_1_oop(void)
6700 {
6701 	return test_kasumi_decryption_oop(&kasumi_test_case_1);
6702 }
6703 
6704 static int
6705 test_kasumi_decryption_test_case_2(void)
6706 {
6707 	return test_kasumi_decryption(&kasumi_test_case_2);
6708 }
6709 
6710 static int
6711 test_kasumi_decryption_test_case_3(void)
6712 {
6713 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6714 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6715 		return TEST_SKIPPED;
6716 	return test_kasumi_decryption(&kasumi_test_case_3);
6717 }
6718 
6719 static int
6720 test_kasumi_decryption_test_case_4(void)
6721 {
6722 	return test_kasumi_decryption(&kasumi_test_case_4);
6723 }
6724 
6725 static int
6726 test_kasumi_decryption_test_case_5(void)
6727 {
6728 	return test_kasumi_decryption(&kasumi_test_case_5);
6729 }
6730 static int
6731 test_snow3g_encryption_test_case_1(void)
6732 {
6733 	return test_snow3g_encryption(&snow3g_test_case_1);
6734 }
6735 
6736 static int
6737 test_snow3g_encryption_test_case_1_oop(void)
6738 {
6739 	return test_snow3g_encryption_oop(&snow3g_test_case_1);
6740 }
6741 
6742 static int
6743 test_snow3g_encryption_test_case_1_oop_sgl(void)
6744 {
6745 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6746 }
6747 
6748 
6749 static int
6750 test_snow3g_encryption_test_case_1_offset_oop(void)
6751 {
6752 	return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6753 }
6754 
6755 static int
6756 test_snow3g_encryption_test_case_2(void)
6757 {
6758 	return test_snow3g_encryption(&snow3g_test_case_2);
6759 }
6760 
6761 static int
6762 test_snow3g_encryption_test_case_3(void)
6763 {
6764 	return test_snow3g_encryption(&snow3g_test_case_3);
6765 }
6766 
6767 static int
6768 test_snow3g_encryption_test_case_4(void)
6769 {
6770 	return test_snow3g_encryption(&snow3g_test_case_4);
6771 }
6772 
6773 static int
6774 test_snow3g_encryption_test_case_5(void)
6775 {
6776 	return test_snow3g_encryption(&snow3g_test_case_5);
6777 }
6778 
6779 static int
6780 test_snow3g_decryption_test_case_1(void)
6781 {
6782 	return test_snow3g_decryption(&snow3g_test_case_1);
6783 }
6784 
6785 static int
6786 test_snow3g_decryption_test_case_1_oop(void)
6787 {
6788 	return test_snow3g_decryption_oop(&snow3g_test_case_1);
6789 }
6790 
6791 static int
6792 test_snow3g_decryption_test_case_2(void)
6793 {
6794 	return test_snow3g_decryption(&snow3g_test_case_2);
6795 }
6796 
6797 static int
6798 test_snow3g_decryption_test_case_3(void)
6799 {
6800 	return test_snow3g_decryption(&snow3g_test_case_3);
6801 }
6802 
6803 static int
6804 test_snow3g_decryption_test_case_4(void)
6805 {
6806 	return test_snow3g_decryption(&snow3g_test_case_4);
6807 }
6808 
6809 static int
6810 test_snow3g_decryption_test_case_5(void)
6811 {
6812 	return test_snow3g_decryption(&snow3g_test_case_5);
6813 }
6814 
6815 /*
6816  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6817  * Pattern digest from snow3g_test_data must be allocated as
6818  * 4 last bytes in plaintext.
6819  */
6820 static void
6821 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6822 		struct snow3g_hash_test_data *output)
6823 {
6824 	if ((pattern != NULL) && (output != NULL)) {
6825 		output->key.len = pattern->key.len;
6826 
6827 		memcpy(output->key.data,
6828 		pattern->key.data, pattern->key.len);
6829 
6830 		output->auth_iv.len = pattern->auth_iv.len;
6831 
6832 		memcpy(output->auth_iv.data,
6833 		pattern->auth_iv.data, pattern->auth_iv.len);
6834 
6835 		output->plaintext.len = pattern->plaintext.len;
6836 
6837 		memcpy(output->plaintext.data,
6838 		pattern->plaintext.data, pattern->plaintext.len >> 3);
6839 
6840 		output->digest.len = pattern->digest.len;
6841 
6842 		memcpy(output->digest.data,
6843 		&pattern->plaintext.data[pattern->digest.offset_bytes],
6844 		pattern->digest.len);
6845 
6846 		output->validAuthLenInBits.len =
6847 		pattern->validAuthLenInBits.len;
6848 	}
6849 }
6850 
6851 /*
6852  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6853  */
6854 static int
6855 test_snow3g_decryption_with_digest_test_case_1(void)
6856 {
6857 	struct snow3g_hash_test_data snow3g_hash_data;
6858 	struct rte_cryptodev_info dev_info;
6859 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6860 
6861 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6862 	uint64_t feat_flags = dev_info.feature_flags;
6863 
6864 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6865 		printf("Device doesn't support encrypted digest operations.\n");
6866 		return TEST_SKIPPED;
6867 	}
6868 
6869 	/*
6870 	 * Function prepare data for hash veryfication test case.
6871 	 * Digest is allocated in 4 last bytes in plaintext, pattern.
6872 	 */
6873 	snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6874 
6875 	return test_snow3g_decryption(&snow3g_test_case_7) &
6876 			test_snow3g_authentication_verify(&snow3g_hash_data);
6877 }
6878 
6879 static int
6880 test_snow3g_cipher_auth_test_case_1(void)
6881 {
6882 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
6883 }
6884 
6885 static int
6886 test_snow3g_auth_cipher_test_case_1(void)
6887 {
6888 	return test_snow3g_auth_cipher(
6889 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6890 }
6891 
6892 static int
6893 test_snow3g_auth_cipher_test_case_2(void)
6894 {
6895 	return test_snow3g_auth_cipher(
6896 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6897 }
6898 
6899 static int
6900 test_snow3g_auth_cipher_test_case_2_oop(void)
6901 {
6902 	return test_snow3g_auth_cipher(
6903 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6904 }
6905 
6906 static int
6907 test_snow3g_auth_cipher_part_digest_enc(void)
6908 {
6909 	return test_snow3g_auth_cipher(
6910 		&snow3g_auth_cipher_partial_digest_encryption,
6911 			IN_PLACE, 0);
6912 }
6913 
6914 static int
6915 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6916 {
6917 	return test_snow3g_auth_cipher(
6918 		&snow3g_auth_cipher_partial_digest_encryption,
6919 			OUT_OF_PLACE, 0);
6920 }
6921 
6922 static int
6923 test_snow3g_auth_cipher_test_case_3_sgl(void)
6924 {
6925 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6926 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6927 		return TEST_SKIPPED;
6928 	return test_snow3g_auth_cipher_sgl(
6929 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6930 }
6931 
6932 static int
6933 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6934 {
6935 	return test_snow3g_auth_cipher_sgl(
6936 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6937 }
6938 
6939 static int
6940 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6941 {
6942 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6943 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6944 		return TEST_SKIPPED;
6945 	return test_snow3g_auth_cipher_sgl(
6946 		&snow3g_auth_cipher_partial_digest_encryption,
6947 			IN_PLACE, 0);
6948 }
6949 
6950 static int
6951 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6952 {
6953 	return test_snow3g_auth_cipher_sgl(
6954 		&snow3g_auth_cipher_partial_digest_encryption,
6955 			OUT_OF_PLACE, 0);
6956 }
6957 
6958 static int
6959 test_snow3g_auth_cipher_verify_test_case_1(void)
6960 {
6961 	return test_snow3g_auth_cipher(
6962 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6963 }
6964 
6965 static int
6966 test_snow3g_auth_cipher_verify_test_case_2(void)
6967 {
6968 	return test_snow3g_auth_cipher(
6969 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6970 }
6971 
6972 static int
6973 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6974 {
6975 	return test_snow3g_auth_cipher(
6976 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6977 }
6978 
6979 static int
6980 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6981 {
6982 	return test_snow3g_auth_cipher(
6983 		&snow3g_auth_cipher_partial_digest_encryption,
6984 			IN_PLACE, 1);
6985 }
6986 
6987 static int
6988 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6989 {
6990 	return test_snow3g_auth_cipher(
6991 		&snow3g_auth_cipher_partial_digest_encryption,
6992 			OUT_OF_PLACE, 1);
6993 }
6994 
6995 static int
6996 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6997 {
6998 	return test_snow3g_auth_cipher_sgl(
6999 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
7000 }
7001 
7002 static int
7003 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
7004 {
7005 	return test_snow3g_auth_cipher_sgl(
7006 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
7007 }
7008 
7009 static int
7010 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
7011 {
7012 	return test_snow3g_auth_cipher_sgl(
7013 		&snow3g_auth_cipher_partial_digest_encryption,
7014 			IN_PLACE, 1);
7015 }
7016 
7017 static int
7018 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
7019 {
7020 	return test_snow3g_auth_cipher_sgl(
7021 		&snow3g_auth_cipher_partial_digest_encryption,
7022 			OUT_OF_PLACE, 1);
7023 }
7024 
7025 static int
7026 test_snow3g_auth_cipher_with_digest_test_case_1(void)
7027 {
7028 	return test_snow3g_auth_cipher(
7029 		&snow3g_test_case_7, IN_PLACE, 0);
7030 }
7031 
7032 static int
7033 test_kasumi_auth_cipher_test_case_1(void)
7034 {
7035 	return test_kasumi_auth_cipher(
7036 		&kasumi_test_case_3, IN_PLACE, 0);
7037 }
7038 
7039 static int
7040 test_kasumi_auth_cipher_test_case_2(void)
7041 {
7042 	return test_kasumi_auth_cipher(
7043 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7044 }
7045 
7046 static int
7047 test_kasumi_auth_cipher_test_case_2_oop(void)
7048 {
7049 	return test_kasumi_auth_cipher(
7050 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7051 }
7052 
7053 static int
7054 test_kasumi_auth_cipher_test_case_2_sgl(void)
7055 {
7056 	return test_kasumi_auth_cipher_sgl(
7057 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7058 }
7059 
7060 static int
7061 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
7062 {
7063 	return test_kasumi_auth_cipher_sgl(
7064 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7065 }
7066 
7067 static int
7068 test_kasumi_auth_cipher_verify_test_case_1(void)
7069 {
7070 	return test_kasumi_auth_cipher(
7071 		&kasumi_test_case_3, IN_PLACE, 1);
7072 }
7073 
7074 static int
7075 test_kasumi_auth_cipher_verify_test_case_2(void)
7076 {
7077 	return test_kasumi_auth_cipher(
7078 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7079 }
7080 
7081 static int
7082 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
7083 {
7084 	return test_kasumi_auth_cipher(
7085 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7086 }
7087 
7088 static int
7089 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
7090 {
7091 	return test_kasumi_auth_cipher_sgl(
7092 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7093 }
7094 
7095 static int
7096 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
7097 {
7098 	return test_kasumi_auth_cipher_sgl(
7099 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7100 }
7101 
7102 static int
7103 test_kasumi_cipher_auth_test_case_1(void)
7104 {
7105 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
7106 }
7107 
7108 static int
7109 test_zuc_encryption_test_case_1(void)
7110 {
7111 	return test_zuc_encryption(&zuc_test_case_cipher_193b);
7112 }
7113 
7114 static int
7115 test_zuc_encryption_test_case_2(void)
7116 {
7117 	return test_zuc_encryption(&zuc_test_case_cipher_800b);
7118 }
7119 
7120 static int
7121 test_zuc_encryption_test_case_3(void)
7122 {
7123 	return test_zuc_encryption(&zuc_test_case_cipher_1570b);
7124 }
7125 
7126 static int
7127 test_zuc_encryption_test_case_4(void)
7128 {
7129 	return test_zuc_encryption(&zuc_test_case_cipher_2798b);
7130 }
7131 
7132 static int
7133 test_zuc_encryption_test_case_5(void)
7134 {
7135 	return test_zuc_encryption(&zuc_test_case_cipher_4019b);
7136 }
7137 
7138 static int
7139 test_zuc_encryption_test_case_6_sgl(void)
7140 {
7141 	return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
7142 }
7143 
7144 static int
7145 test_zuc_hash_generate_test_case_1(void)
7146 {
7147 	return test_zuc_authentication(&zuc_test_case_auth_1b);
7148 }
7149 
7150 static int
7151 test_zuc_hash_generate_test_case_2(void)
7152 {
7153 	return test_zuc_authentication(&zuc_test_case_auth_90b);
7154 }
7155 
7156 static int
7157 test_zuc_hash_generate_test_case_3(void)
7158 {
7159 	return test_zuc_authentication(&zuc_test_case_auth_577b);
7160 }
7161 
7162 static int
7163 test_zuc_hash_generate_test_case_4(void)
7164 {
7165 	return test_zuc_authentication(&zuc_test_case_auth_2079b);
7166 }
7167 
7168 static int
7169 test_zuc_hash_generate_test_case_5(void)
7170 {
7171 	return test_zuc_authentication(&zuc_test_auth_5670b);
7172 }
7173 
7174 static int
7175 test_zuc_hash_generate_test_case_6(void)
7176 {
7177 	return test_zuc_authentication(&zuc_test_case_auth_128b);
7178 }
7179 
7180 static int
7181 test_zuc_hash_generate_test_case_7(void)
7182 {
7183 	return test_zuc_authentication(&zuc_test_case_auth_2080b);
7184 }
7185 
7186 static int
7187 test_zuc_hash_generate_test_case_8(void)
7188 {
7189 	return test_zuc_authentication(&zuc_test_case_auth_584b);
7190 }
7191 
7192 static int
7193 test_zuc_hash_generate_test_case_9(void)
7194 {
7195 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_32b);
7196 }
7197 
7198 static int
7199 test_zuc_hash_generate_test_case_10(void)
7200 {
7201 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_64b);
7202 }
7203 
7204 static int
7205 test_zuc_hash_generate_test_case_11(void)
7206 {
7207 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_128b);
7208 }
7209 
7210 static int
7211 test_zuc_cipher_auth_test_case_1(void)
7212 {
7213 	return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7214 }
7215 
7216 static int
7217 test_zuc_cipher_auth_test_case_2(void)
7218 {
7219 	return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7220 }
7221 
7222 static int
7223 test_zuc_auth_cipher_test_case_1(void)
7224 {
7225 	return test_zuc_auth_cipher(
7226 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7227 }
7228 
7229 static int
7230 test_zuc_auth_cipher_test_case_1_oop(void)
7231 {
7232 	return test_zuc_auth_cipher(
7233 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7234 }
7235 
7236 static int
7237 test_zuc_auth_cipher_test_case_1_sgl(void)
7238 {
7239 	return test_zuc_auth_cipher_sgl(
7240 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7241 }
7242 
7243 static int
7244 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7245 {
7246 	return test_zuc_auth_cipher_sgl(
7247 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7248 }
7249 
7250 static int
7251 test_zuc_auth_cipher_verify_test_case_1(void)
7252 {
7253 	return test_zuc_auth_cipher(
7254 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7255 }
7256 
7257 static int
7258 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7259 {
7260 	return test_zuc_auth_cipher(
7261 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7262 }
7263 
7264 static int
7265 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7266 {
7267 	return test_zuc_auth_cipher_sgl(
7268 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7269 }
7270 
7271 static int
7272 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7273 {
7274 	return test_zuc_auth_cipher_sgl(
7275 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7276 }
7277 
7278 static int
7279 test_zuc256_encryption_test_case_1(void)
7280 {
7281 	return test_zuc_encryption(&zuc256_test_case_cipher_1);
7282 }
7283 
7284 static int
7285 test_zuc256_encryption_test_case_2(void)
7286 {
7287 	return test_zuc_encryption(&zuc256_test_case_cipher_2);
7288 }
7289 
7290 static int
7291 test_zuc256_authentication_test_case_1(void)
7292 {
7293 	return test_zuc_authentication(&zuc256_test_case_auth_1);
7294 }
7295 
7296 static int
7297 test_zuc256_authentication_test_case_2(void)
7298 {
7299 	return test_zuc_authentication(&zuc256_test_case_auth_2);
7300 }
7301 
7302 static int
7303 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7304 {
7305 	uint8_t dev_id = testsuite_params.valid_devs[0];
7306 
7307 	struct rte_cryptodev_sym_capability_idx cap_idx;
7308 
7309 	/* Check if device supports particular cipher algorithm */
7310 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7311 	cap_idx.algo.cipher = tdata->cipher_algo;
7312 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7313 		return TEST_SKIPPED;
7314 
7315 	/* Check if device supports particular hash algorithm */
7316 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7317 	cap_idx.algo.auth = tdata->auth_algo;
7318 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7319 		return TEST_SKIPPED;
7320 
7321 	return 0;
7322 }
7323 
7324 static int
7325 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7326 	uint8_t op_mode, uint8_t verify)
7327 {
7328 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7329 	struct crypto_unittest_params *ut_params = &unittest_params;
7330 
7331 	int retval;
7332 
7333 	uint8_t *plaintext = NULL, *ciphertext = NULL;
7334 	unsigned int plaintext_pad_len;
7335 	unsigned int plaintext_len;
7336 	unsigned int ciphertext_pad_len;
7337 	unsigned int ciphertext_len;
7338 
7339 	struct rte_cryptodev_info dev_info;
7340 	struct rte_crypto_op *op;
7341 
7342 	/* Check if device supports particular algorithms separately */
7343 	if (test_mixed_check_if_unsupported(tdata))
7344 		return TEST_SKIPPED;
7345 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7346 		return TEST_SKIPPED;
7347 
7348 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7349 
7350 	uint64_t feat_flags = dev_info.feature_flags;
7351 
7352 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7353 		printf("Device doesn't support digest encrypted.\n");
7354 		return TEST_SKIPPED;
7355 	}
7356 
7357 	/* Create the session */
7358 	if (verify)
7359 		retval = create_wireless_algo_cipher_auth_session(
7360 				ts_params->valid_devs[0],
7361 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7362 				RTE_CRYPTO_AUTH_OP_VERIFY,
7363 				tdata->auth_algo,
7364 				tdata->cipher_algo,
7365 				tdata->auth_key.data, tdata->auth_key.len,
7366 				tdata->auth_iv.len, tdata->digest_enc.len,
7367 				tdata->cipher_iv.len);
7368 	else
7369 		retval = create_wireless_algo_auth_cipher_session(
7370 				ts_params->valid_devs[0],
7371 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7372 				RTE_CRYPTO_AUTH_OP_GENERATE,
7373 				tdata->auth_algo,
7374 				tdata->cipher_algo,
7375 				tdata->auth_key.data, tdata->auth_key.len,
7376 				tdata->auth_iv.len, tdata->digest_enc.len,
7377 				tdata->cipher_iv.len);
7378 	if (retval != 0)
7379 		return retval;
7380 
7381 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7382 	if (op_mode == OUT_OF_PLACE)
7383 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7384 
7385 	/* clear mbuf payload */
7386 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7387 		rte_pktmbuf_tailroom(ut_params->ibuf));
7388 	if (op_mode == OUT_OF_PLACE) {
7389 
7390 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7391 				rte_pktmbuf_tailroom(ut_params->obuf));
7392 	}
7393 
7394 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7395 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7396 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7397 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7398 
7399 	if (verify) {
7400 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7401 				ciphertext_pad_len);
7402 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7403 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7404 				ciphertext_len);
7405 	} else {
7406 		/* make sure enough space to cover partial digest verify case */
7407 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7408 				ciphertext_pad_len);
7409 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7410 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7411 	}
7412 
7413 	if (op_mode == OUT_OF_PLACE)
7414 		rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7415 
7416 	/* Create the operation */
7417 	retval = create_wireless_algo_auth_cipher_operation(
7418 			tdata->digest_enc.data, tdata->digest_enc.len,
7419 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7420 			tdata->auth_iv.data, tdata->auth_iv.len,
7421 			(tdata->digest_enc.offset == 0 ?
7422 				plaintext_pad_len
7423 				: tdata->digest_enc.offset),
7424 			tdata->validCipherLen.len_bits,
7425 			tdata->cipher.offset_bits,
7426 			tdata->validAuthLen.len_bits,
7427 			tdata->auth.offset_bits,
7428 			op_mode, 0, verify);
7429 
7430 	if (retval < 0)
7431 		return retval;
7432 
7433 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7434 
7435 	/* Check if the op failed because the device doesn't */
7436 	/* support this particular combination of algorithms */
7437 	if (op == NULL && ut_params->op->status ==
7438 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7439 		printf("Device doesn't support this mixed combination. "
7440 				"Test Skipped.\n");
7441 		return TEST_SKIPPED;
7442 	}
7443 	ut_params->op = op;
7444 
7445 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7446 
7447 	ut_params->obuf = (op_mode == IN_PLACE ?
7448 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7449 
7450 	if (verify) {
7451 		if (ut_params->obuf)
7452 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7453 							uint8_t *);
7454 		else
7455 			plaintext = ciphertext +
7456 					(tdata->cipher.offset_bits >> 3);
7457 
7458 		debug_hexdump(stdout, "plaintext:", plaintext,
7459 				tdata->plaintext.len_bits >> 3);
7460 		debug_hexdump(stdout, "plaintext expected:",
7461 				tdata->plaintext.data,
7462 				tdata->plaintext.len_bits >> 3);
7463 	} else {
7464 		if (ut_params->obuf)
7465 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7466 					uint8_t *);
7467 		else
7468 			ciphertext = plaintext;
7469 
7470 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7471 				ciphertext_len);
7472 		debug_hexdump(stdout, "ciphertext expected:",
7473 				tdata->ciphertext.data,
7474 				tdata->ciphertext.len_bits >> 3);
7475 
7476 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7477 				+ (tdata->digest_enc.offset == 0 ?
7478 		plaintext_pad_len : tdata->digest_enc.offset);
7479 
7480 		debug_hexdump(stdout, "digest:", ut_params->digest,
7481 				tdata->digest_enc.len);
7482 		debug_hexdump(stdout, "digest expected:",
7483 				tdata->digest_enc.data,
7484 				tdata->digest_enc.len);
7485 	}
7486 
7487 	if (!verify) {
7488 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7489 				ut_params->digest,
7490 				tdata->digest_enc.data,
7491 				tdata->digest_enc.len,
7492 				"Generated auth tag not as expected");
7493 	}
7494 
7495 	if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
7496 		if (verify) {
7497 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7498 					plaintext,
7499 					tdata->plaintext.data,
7500 					tdata->plaintext.len_bits >> 3,
7501 					"Plaintext data not as expected");
7502 		} else {
7503 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7504 					ciphertext,
7505 					tdata->ciphertext.data,
7506 					tdata->validDataLen.len_bits,
7507 					"Ciphertext data not as expected");
7508 		}
7509 	}
7510 
7511 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7512 			"crypto op processing failed");
7513 
7514 	return 0;
7515 }
7516 
7517 static int
7518 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7519 	uint8_t op_mode, uint8_t verify)
7520 {
7521 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7522 	struct crypto_unittest_params *ut_params = &unittest_params;
7523 
7524 	int retval;
7525 
7526 	const uint8_t *plaintext = NULL;
7527 	const uint8_t *ciphertext = NULL;
7528 	const uint8_t *digest = NULL;
7529 	unsigned int plaintext_pad_len;
7530 	unsigned int plaintext_len;
7531 	unsigned int ciphertext_pad_len;
7532 	unsigned int ciphertext_len;
7533 	uint8_t buffer[10000];
7534 	uint8_t digest_buffer[10000];
7535 
7536 	struct rte_cryptodev_info dev_info;
7537 	struct rte_crypto_op *op;
7538 
7539 	/* Check if device supports particular algorithms */
7540 	if (test_mixed_check_if_unsupported(tdata))
7541 		return TEST_SKIPPED;
7542 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7543 		return TEST_SKIPPED;
7544 
7545 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7546 
7547 	uint64_t feat_flags = dev_info.feature_flags;
7548 
7549 	if (op_mode == IN_PLACE) {
7550 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7551 			printf("Device doesn't support in-place scatter-gather "
7552 					"in both input and output mbufs.\n");
7553 			return TEST_SKIPPED;
7554 		}
7555 	} else {
7556 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7557 			printf("Device doesn't support out-of-place scatter-gather "
7558 					"in both input and output mbufs.\n");
7559 			return TEST_SKIPPED;
7560 		}
7561 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7562 			printf("Device doesn't support digest encrypted.\n");
7563 			return TEST_SKIPPED;
7564 		}
7565 	}
7566 
7567 	/* Create the session */
7568 	if (verify)
7569 		retval = create_wireless_algo_cipher_auth_session(
7570 				ts_params->valid_devs[0],
7571 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7572 				RTE_CRYPTO_AUTH_OP_VERIFY,
7573 				tdata->auth_algo,
7574 				tdata->cipher_algo,
7575 				tdata->auth_key.data, tdata->auth_key.len,
7576 				tdata->auth_iv.len, tdata->digest_enc.len,
7577 				tdata->cipher_iv.len);
7578 	else
7579 		retval = create_wireless_algo_auth_cipher_session(
7580 				ts_params->valid_devs[0],
7581 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7582 				RTE_CRYPTO_AUTH_OP_GENERATE,
7583 				tdata->auth_algo,
7584 				tdata->cipher_algo,
7585 				tdata->auth_key.data, tdata->auth_key.len,
7586 				tdata->auth_iv.len, tdata->digest_enc.len,
7587 				tdata->cipher_iv.len);
7588 	if (retval != 0)
7589 		return retval;
7590 
7591 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7592 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7593 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7594 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7595 
7596 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7597 			ciphertext_pad_len, 15, 0);
7598 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7599 			"Failed to allocate input buffer in mempool");
7600 
7601 	if (op_mode == OUT_OF_PLACE) {
7602 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7603 				plaintext_pad_len, 15, 0);
7604 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
7605 				"Failed to allocate output buffer in mempool");
7606 	}
7607 
7608 	if (verify) {
7609 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7610 			tdata->ciphertext.data);
7611 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7612 					ciphertext_len, buffer);
7613 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7614 			ciphertext_len);
7615 	} else {
7616 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7617 			tdata->plaintext.data);
7618 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7619 					plaintext_len, buffer);
7620 		debug_hexdump(stdout, "plaintext:", plaintext,
7621 			plaintext_len);
7622 	}
7623 	memset(buffer, 0, sizeof(buffer));
7624 
7625 	/* Create the operation */
7626 	retval = create_wireless_algo_auth_cipher_operation(
7627 			tdata->digest_enc.data, tdata->digest_enc.len,
7628 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7629 			tdata->auth_iv.data, tdata->auth_iv.len,
7630 			(tdata->digest_enc.offset == 0 ?
7631 				plaintext_pad_len
7632 				: tdata->digest_enc.offset),
7633 			tdata->validCipherLen.len_bits,
7634 			tdata->cipher.offset_bits,
7635 			tdata->validAuthLen.len_bits,
7636 			tdata->auth.offset_bits,
7637 			op_mode, 1, verify);
7638 
7639 	if (retval < 0)
7640 		return retval;
7641 
7642 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7643 
7644 	/* Check if the op failed because the device doesn't */
7645 	/* support this particular combination of algorithms */
7646 	if (op == NULL && ut_params->op->status ==
7647 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7648 		printf("Device doesn't support this mixed combination. "
7649 				"Test Skipped.\n");
7650 		return TEST_SKIPPED;
7651 	}
7652 	ut_params->op = op;
7653 
7654 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7655 
7656 	ut_params->obuf = (op_mode == IN_PLACE ?
7657 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7658 
7659 	if (verify) {
7660 		if (ut_params->obuf)
7661 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7662 					plaintext_len, buffer);
7663 		else
7664 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7665 					plaintext_len, buffer);
7666 
7667 		debug_hexdump(stdout, "plaintext:", plaintext,
7668 				(tdata->plaintext.len_bits >> 3) -
7669 				tdata->digest_enc.len);
7670 		debug_hexdump(stdout, "plaintext expected:",
7671 				tdata->plaintext.data,
7672 				(tdata->plaintext.len_bits >> 3) -
7673 				tdata->digest_enc.len);
7674 	} else {
7675 		if (ut_params->obuf)
7676 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7677 					ciphertext_len, buffer);
7678 		else
7679 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7680 					ciphertext_len, buffer);
7681 
7682 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7683 			ciphertext_len);
7684 		debug_hexdump(stdout, "ciphertext expected:",
7685 			tdata->ciphertext.data,
7686 			tdata->ciphertext.len_bits >> 3);
7687 
7688 		if (ut_params->obuf)
7689 			digest = rte_pktmbuf_read(ut_params->obuf,
7690 					(tdata->digest_enc.offset == 0 ?
7691 						plaintext_pad_len :
7692 						tdata->digest_enc.offset),
7693 					tdata->digest_enc.len, digest_buffer);
7694 		else
7695 			digest = rte_pktmbuf_read(ut_params->ibuf,
7696 					(tdata->digest_enc.offset == 0 ?
7697 						plaintext_pad_len :
7698 						tdata->digest_enc.offset),
7699 					tdata->digest_enc.len, digest_buffer);
7700 
7701 		debug_hexdump(stdout, "digest:", digest,
7702 				tdata->digest_enc.len);
7703 		debug_hexdump(stdout, "digest expected:",
7704 				tdata->digest_enc.data, tdata->digest_enc.len);
7705 	}
7706 
7707 	if (!verify) {
7708 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7709 				digest,
7710 				tdata->digest_enc.data,
7711 				tdata->digest_enc.len,
7712 				"Generated auth tag not as expected");
7713 	}
7714 
7715 	if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
7716 		if (verify) {
7717 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7718 					plaintext,
7719 					tdata->plaintext.data,
7720 					tdata->plaintext.len_bits >> 3,
7721 					"Plaintext data not as expected");
7722 		} else {
7723 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7724 					ciphertext,
7725 					tdata->ciphertext.data,
7726 					tdata->validDataLen.len_bits,
7727 					"Ciphertext data not as expected");
7728 		}
7729 	}
7730 
7731 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7732 			"crypto op processing failed");
7733 
7734 	return 0;
7735 }
7736 
7737 /** AUTH AES CMAC + CIPHER AES CTR */
7738 
7739 static int
7740 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7741 {
7742 	return test_mixed_auth_cipher(
7743 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7744 }
7745 
7746 static int
7747 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7748 {
7749 	return test_mixed_auth_cipher(
7750 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7751 }
7752 
7753 static int
7754 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7755 {
7756 	return test_mixed_auth_cipher_sgl(
7757 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7758 }
7759 
7760 static int
7761 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7762 {
7763 	return test_mixed_auth_cipher_sgl(
7764 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7765 }
7766 
7767 static int
7768 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7769 {
7770 	return test_mixed_auth_cipher(
7771 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7772 }
7773 
7774 static int
7775 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7776 {
7777 	return test_mixed_auth_cipher(
7778 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7779 }
7780 
7781 static int
7782 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7783 {
7784 	return test_mixed_auth_cipher_sgl(
7785 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7786 }
7787 
7788 static int
7789 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7790 {
7791 	return test_mixed_auth_cipher_sgl(
7792 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7793 }
7794 
7795 /** MIXED AUTH + CIPHER */
7796 
7797 static int
7798 test_auth_zuc_cipher_snow_test_case_1(void)
7799 {
7800 	return test_mixed_auth_cipher(
7801 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7802 }
7803 
7804 static int
7805 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7806 {
7807 	return test_mixed_auth_cipher(
7808 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7809 }
7810 
7811 static int
7812 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7813 {
7814 	return test_mixed_auth_cipher(
7815 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7816 }
7817 
7818 static int
7819 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7820 {
7821 	return test_mixed_auth_cipher(
7822 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7823 }
7824 
7825 static int
7826 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7827 {
7828 	return test_mixed_auth_cipher(
7829 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7830 }
7831 
7832 static int
7833 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7834 {
7835 	return test_mixed_auth_cipher(
7836 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7837 }
7838 
7839 static int
7840 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7841 {
7842 	return test_mixed_auth_cipher(
7843 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7844 }
7845 
7846 static int
7847 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7848 {
7849 	return test_mixed_auth_cipher(
7850 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7851 }
7852 
7853 static int
7854 test_auth_snow_cipher_zuc_test_case_1(void)
7855 {
7856 	return test_mixed_auth_cipher(
7857 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7858 }
7859 
7860 static int
7861 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7862 {
7863 	return test_mixed_auth_cipher(
7864 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7865 }
7866 
7867 static int
7868 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7869 {
7870 	return test_mixed_auth_cipher(
7871 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7872 }
7873 
7874 static int
7875 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7876 {
7877 	return test_mixed_auth_cipher(
7878 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7879 }
7880 
7881 static int
7882 test_auth_null_cipher_snow_test_case_1(void)
7883 {
7884 	return test_mixed_auth_cipher(
7885 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7886 }
7887 
7888 static int
7889 test_verify_auth_null_cipher_snow_test_case_1(void)
7890 {
7891 	return test_mixed_auth_cipher(
7892 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7893 }
7894 
7895 static int
7896 test_auth_null_cipher_zuc_test_case_1(void)
7897 {
7898 	return test_mixed_auth_cipher(
7899 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7900 }
7901 
7902 static int
7903 test_verify_auth_null_cipher_zuc_test_case_1(void)
7904 {
7905 	return test_mixed_auth_cipher(
7906 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7907 }
7908 
7909 static int
7910 test_auth_snow_cipher_null_test_case_1(void)
7911 {
7912 	return test_mixed_auth_cipher(
7913 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7914 }
7915 
7916 static int
7917 test_verify_auth_snow_cipher_null_test_case_1(void)
7918 {
7919 	return test_mixed_auth_cipher(
7920 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7921 }
7922 
7923 static int
7924 test_auth_zuc_cipher_null_test_case_1(void)
7925 {
7926 	return test_mixed_auth_cipher(
7927 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7928 }
7929 
7930 static int
7931 test_verify_auth_zuc_cipher_null_test_case_1(void)
7932 {
7933 	return test_mixed_auth_cipher(
7934 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7935 }
7936 
7937 static int
7938 test_auth_null_cipher_aes_ctr_test_case_1(void)
7939 {
7940 	return test_mixed_auth_cipher(
7941 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7942 }
7943 
7944 static int
7945 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7946 {
7947 	return test_mixed_auth_cipher(
7948 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7949 }
7950 
7951 static int
7952 test_auth_aes_cmac_cipher_null_test_case_1(void)
7953 {
7954 	return test_mixed_auth_cipher(
7955 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7956 }
7957 
7958 static int
7959 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7960 {
7961 	return test_mixed_auth_cipher(
7962 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7963 }
7964 
7965 /* ***** AEAD algorithm Tests ***** */
7966 
7967 static int
7968 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7969 		enum rte_crypto_aead_operation op,
7970 		const uint8_t *key, const uint8_t key_len,
7971 		const uint16_t aad_len, const uint8_t auth_len,
7972 		uint8_t iv_len)
7973 {
7974 	uint8_t aead_key[key_len];
7975 
7976 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7977 	struct crypto_unittest_params *ut_params = &unittest_params;
7978 
7979 	memcpy(aead_key, key, key_len);
7980 
7981 	/* Setup AEAD Parameters */
7982 	ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7983 	ut_params->aead_xform.next = NULL;
7984 	ut_params->aead_xform.aead.algo = algo;
7985 	ut_params->aead_xform.aead.op = op;
7986 	ut_params->aead_xform.aead.key.data = aead_key;
7987 	ut_params->aead_xform.aead.key.length = key_len;
7988 	ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7989 	ut_params->aead_xform.aead.iv.length = iv_len;
7990 	ut_params->aead_xform.aead.digest_length = auth_len;
7991 	ut_params->aead_xform.aead.aad_length = aad_len;
7992 
7993 	debug_hexdump(stdout, "key:", key, key_len);
7994 
7995 	/* Create Crypto session*/
7996 	ut_params->sess = rte_cryptodev_sym_session_create(
7997 			ts_params->session_mpool);
7998 
7999 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
8000 			&ut_params->aead_xform,
8001 			ts_params->session_priv_mpool);
8002 
8003 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
8004 
8005 	return 0;
8006 }
8007 
8008 static int
8009 create_aead_xform(struct rte_crypto_op *op,
8010 		enum rte_crypto_aead_algorithm algo,
8011 		enum rte_crypto_aead_operation aead_op,
8012 		uint8_t *key, const uint8_t key_len,
8013 		const uint8_t aad_len, const uint8_t auth_len,
8014 		uint8_t iv_len)
8015 {
8016 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
8017 			"failed to allocate space for crypto transform");
8018 
8019 	struct rte_crypto_sym_op *sym_op = op->sym;
8020 
8021 	/* Setup AEAD Parameters */
8022 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
8023 	sym_op->xform->next = NULL;
8024 	sym_op->xform->aead.algo = algo;
8025 	sym_op->xform->aead.op = aead_op;
8026 	sym_op->xform->aead.key.data = key;
8027 	sym_op->xform->aead.key.length = key_len;
8028 	sym_op->xform->aead.iv.offset = IV_OFFSET;
8029 	sym_op->xform->aead.iv.length = iv_len;
8030 	sym_op->xform->aead.digest_length = auth_len;
8031 	sym_op->xform->aead.aad_length = aad_len;
8032 
8033 	debug_hexdump(stdout, "key:", key, key_len);
8034 
8035 	return 0;
8036 }
8037 
8038 static int
8039 create_aead_operation(enum rte_crypto_aead_operation op,
8040 		const struct aead_test_data *tdata)
8041 {
8042 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8043 	struct crypto_unittest_params *ut_params = &unittest_params;
8044 
8045 	uint8_t *plaintext, *ciphertext;
8046 	unsigned int aad_pad_len, plaintext_pad_len;
8047 
8048 	/* Generate Crypto op data structure */
8049 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8050 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8051 	TEST_ASSERT_NOT_NULL(ut_params->op,
8052 			"Failed to allocate symmetric crypto operation struct");
8053 
8054 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
8055 
8056 	/* Append aad data */
8057 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
8058 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
8059 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8060 				aad_pad_len);
8061 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8062 				"no room to append aad");
8063 
8064 		sym_op->aead.aad.phys_addr =
8065 				rte_pktmbuf_iova(ut_params->ibuf);
8066 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
8067 		memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
8068 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8069 			tdata->aad.len);
8070 
8071 		/* Append IV at the end of the crypto operation*/
8072 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8073 				uint8_t *, IV_OFFSET);
8074 
8075 		/* Copy IV 1 byte after the IV pointer, according to the API */
8076 		rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
8077 		debug_hexdump(stdout, "iv:", iv_ptr,
8078 			tdata->iv.len);
8079 	} else {
8080 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
8081 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8082 				aad_pad_len);
8083 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8084 				"no room to append aad");
8085 
8086 		sym_op->aead.aad.phys_addr =
8087 				rte_pktmbuf_iova(ut_params->ibuf);
8088 		memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
8089 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8090 			tdata->aad.len);
8091 
8092 		/* Append IV at the end of the crypto operation*/
8093 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8094 				uint8_t *, IV_OFFSET);
8095 
8096 		if (tdata->iv.len == 0) {
8097 			rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
8098 			debug_hexdump(stdout, "iv:", iv_ptr,
8099 				AES_GCM_J0_LENGTH);
8100 		} else {
8101 			rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
8102 			debug_hexdump(stdout, "iv:", iv_ptr,
8103 				tdata->iv.len);
8104 		}
8105 	}
8106 
8107 	/* Append plaintext/ciphertext */
8108 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8109 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8110 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8111 				plaintext_pad_len);
8112 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
8113 
8114 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
8115 		debug_hexdump(stdout, "plaintext:", plaintext,
8116 				tdata->plaintext.len);
8117 
8118 		if (ut_params->obuf) {
8119 			ciphertext = (uint8_t *)rte_pktmbuf_append(
8120 					ut_params->obuf,
8121 					plaintext_pad_len + aad_pad_len);
8122 			TEST_ASSERT_NOT_NULL(ciphertext,
8123 					"no room to append ciphertext");
8124 
8125 			memset(ciphertext + aad_pad_len, 0,
8126 					tdata->ciphertext.len);
8127 		}
8128 	} else {
8129 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
8130 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8131 				plaintext_pad_len);
8132 		TEST_ASSERT_NOT_NULL(ciphertext,
8133 				"no room to append ciphertext");
8134 
8135 		memcpy(ciphertext, tdata->ciphertext.data,
8136 				tdata->ciphertext.len);
8137 		debug_hexdump(stdout, "ciphertext:", ciphertext,
8138 				tdata->ciphertext.len);
8139 
8140 		if (ut_params->obuf) {
8141 			plaintext = (uint8_t *)rte_pktmbuf_append(
8142 					ut_params->obuf,
8143 					plaintext_pad_len + aad_pad_len);
8144 			TEST_ASSERT_NOT_NULL(plaintext,
8145 					"no room to append plaintext");
8146 
8147 			memset(plaintext + aad_pad_len, 0,
8148 					tdata->plaintext.len);
8149 		}
8150 	}
8151 
8152 	/* Append digest data */
8153 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8154 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8155 				ut_params->obuf ? ut_params->obuf :
8156 						ut_params->ibuf,
8157 						tdata->auth_tag.len);
8158 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8159 				"no room to append digest");
8160 		memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
8161 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8162 				ut_params->obuf ? ut_params->obuf :
8163 						ut_params->ibuf,
8164 						plaintext_pad_len +
8165 						aad_pad_len);
8166 	} else {
8167 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8168 				ut_params->ibuf, tdata->auth_tag.len);
8169 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8170 				"no room to append digest");
8171 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8172 				ut_params->ibuf,
8173 				plaintext_pad_len + aad_pad_len);
8174 
8175 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
8176 			tdata->auth_tag.len);
8177 		debug_hexdump(stdout, "digest:",
8178 			sym_op->aead.digest.data,
8179 			tdata->auth_tag.len);
8180 	}
8181 
8182 	sym_op->aead.data.length = tdata->plaintext.len;
8183 	sym_op->aead.data.offset = aad_pad_len;
8184 
8185 	return 0;
8186 }
8187 
8188 static int
8189 test_authenticated_encryption(const struct aead_test_data *tdata)
8190 {
8191 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8192 	struct crypto_unittest_params *ut_params = &unittest_params;
8193 
8194 	int retval;
8195 	uint8_t *ciphertext, *auth_tag;
8196 	uint16_t plaintext_pad_len;
8197 	uint32_t i;
8198 	struct rte_cryptodev_info dev_info;
8199 
8200 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8201 	uint64_t feat_flags = dev_info.feature_flags;
8202 
8203 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8204 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8205 		printf("Device doesn't support RAW data-path APIs.\n");
8206 		return TEST_SKIPPED;
8207 	}
8208 
8209 	/* Verify the capabilities */
8210 	struct rte_cryptodev_sym_capability_idx cap_idx;
8211 	const struct rte_cryptodev_symmetric_capability *capability;
8212 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8213 	cap_idx.algo.aead = tdata->algo;
8214 	capability = rte_cryptodev_sym_capability_get(
8215 			ts_params->valid_devs[0], &cap_idx);
8216 	if (capability == NULL)
8217 		return TEST_SKIPPED;
8218 	if (rte_cryptodev_sym_capability_check_aead(
8219 			capability, tdata->key.len, tdata->auth_tag.len,
8220 			tdata->aad.len, tdata->iv.len))
8221 		return TEST_SKIPPED;
8222 
8223 	/* Create AEAD session */
8224 	retval = create_aead_session(ts_params->valid_devs[0],
8225 			tdata->algo,
8226 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
8227 			tdata->key.data, tdata->key.len,
8228 			tdata->aad.len, tdata->auth_tag.len,
8229 			tdata->iv.len);
8230 	if (retval < 0)
8231 		return retval;
8232 
8233 	if (tdata->aad.len > MBUF_SIZE) {
8234 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8235 		/* Populate full size of add data */
8236 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8237 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8238 	} else
8239 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8240 
8241 	/* clear mbuf payload */
8242 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8243 			rte_pktmbuf_tailroom(ut_params->ibuf));
8244 
8245 	/* Create AEAD operation */
8246 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8247 	if (retval < 0)
8248 		return retval;
8249 
8250 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8251 
8252 	ut_params->op->sym->m_src = ut_params->ibuf;
8253 
8254 	/* Process crypto operation */
8255 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8256 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8257 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8258 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8259 				ut_params->op, 0, 0, 0, 0);
8260 	else
8261 		TEST_ASSERT_NOT_NULL(
8262 			process_crypto_request(ts_params->valid_devs[0],
8263 			ut_params->op), "failed to process sym crypto op");
8264 
8265 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8266 			"crypto op processing failed");
8267 
8268 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8269 
8270 	if (ut_params->op->sym->m_dst) {
8271 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8272 				uint8_t *);
8273 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8274 				uint8_t *, plaintext_pad_len);
8275 	} else {
8276 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8277 				uint8_t *,
8278 				ut_params->op->sym->cipher.data.offset);
8279 		auth_tag = ciphertext + plaintext_pad_len;
8280 	}
8281 
8282 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8283 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8284 
8285 	/* Validate obuf */
8286 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8287 			ciphertext,
8288 			tdata->ciphertext.data,
8289 			tdata->ciphertext.len,
8290 			"Ciphertext data not as expected");
8291 
8292 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8293 			auth_tag,
8294 			tdata->auth_tag.data,
8295 			tdata->auth_tag.len,
8296 			"Generated auth tag not as expected");
8297 
8298 	return 0;
8299 
8300 }
8301 
8302 #ifdef RTE_LIB_SECURITY
8303 static int
8304 security_proto_supported(enum rte_security_session_action_type action,
8305 	enum rte_security_session_protocol proto)
8306 {
8307 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8308 
8309 	const struct rte_security_capability *capabilities;
8310 	const struct rte_security_capability *capability;
8311 	uint16_t i = 0;
8312 
8313 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8314 				rte_cryptodev_get_sec_ctx(
8315 				ts_params->valid_devs[0]);
8316 
8317 
8318 	capabilities = rte_security_capabilities_get(ctx);
8319 
8320 	if (capabilities == NULL)
8321 		return -ENOTSUP;
8322 
8323 	while ((capability = &capabilities[i++])->action !=
8324 			RTE_SECURITY_ACTION_TYPE_NONE) {
8325 		if (capability->action == action &&
8326 				capability->protocol == proto)
8327 			return 0;
8328 	}
8329 
8330 	return -ENOTSUP;
8331 }
8332 
8333 /* Basic algorithm run function for async inplace mode.
8334  * Creates a session from input parameters and runs one operation
8335  * on input_vec. Checks the output of the crypto operation against
8336  * output_vec.
8337  */
8338 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8339 			   enum rte_crypto_auth_operation opa,
8340 			   const uint8_t *input_vec, unsigned int input_vec_len,
8341 			   const uint8_t *output_vec,
8342 			   unsigned int output_vec_len,
8343 			   enum rte_crypto_cipher_algorithm cipher_alg,
8344 			   const uint8_t *cipher_key, uint32_t cipher_key_len,
8345 			   enum rte_crypto_auth_algorithm auth_alg,
8346 			   const uint8_t *auth_key, uint32_t auth_key_len,
8347 			   uint8_t bearer, enum rte_security_pdcp_domain domain,
8348 			   uint8_t packet_direction, uint8_t sn_size,
8349 			   uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8350 {
8351 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8352 	struct crypto_unittest_params *ut_params = &unittest_params;
8353 	uint8_t *plaintext;
8354 	int ret = TEST_SUCCESS;
8355 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8356 				rte_cryptodev_get_sec_ctx(
8357 				ts_params->valid_devs[0]);
8358 
8359 	/* Verify the capabilities */
8360 	struct rte_security_capability_idx sec_cap_idx;
8361 
8362 	sec_cap_idx.action = ut_params->type;
8363 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8364 	sec_cap_idx.pdcp.domain = domain;
8365 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8366 		return TEST_SKIPPED;
8367 
8368 	/* Generate test mbuf data */
8369 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8370 
8371 	/* clear mbuf payload */
8372 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8373 			rte_pktmbuf_tailroom(ut_params->ibuf));
8374 
8375 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8376 						  input_vec_len);
8377 	memcpy(plaintext, input_vec, input_vec_len);
8378 
8379 	/* Out of place support */
8380 	if (oop) {
8381 		/*
8382 		 * For out-op-place we need to alloc another mbuf
8383 		 */
8384 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8385 		rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8386 	}
8387 
8388 	/* Setup Cipher Parameters */
8389 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8390 	ut_params->cipher_xform.cipher.algo = cipher_alg;
8391 	ut_params->cipher_xform.cipher.op = opc;
8392 	ut_params->cipher_xform.cipher.key.data = cipher_key;
8393 	ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8394 	ut_params->cipher_xform.cipher.iv.length =
8395 				packet_direction ? 4 : 0;
8396 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8397 
8398 	/* Setup HMAC Parameters if ICV header is required */
8399 	if (auth_alg != 0) {
8400 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8401 		ut_params->auth_xform.next = NULL;
8402 		ut_params->auth_xform.auth.algo = auth_alg;
8403 		ut_params->auth_xform.auth.op = opa;
8404 		ut_params->auth_xform.auth.key.data = auth_key;
8405 		ut_params->auth_xform.auth.key.length = auth_key_len;
8406 
8407 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8408 	} else {
8409 		ut_params->cipher_xform.next = NULL;
8410 	}
8411 
8412 	struct rte_security_session_conf sess_conf = {
8413 		.action_type = ut_params->type,
8414 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8415 		{.pdcp = {
8416 			.bearer = bearer,
8417 			.domain = domain,
8418 			.pkt_dir = packet_direction,
8419 			.sn_size = sn_size,
8420 			.hfn = packet_direction ? 0 : hfn,
8421 			/**
8422 			 * hfn can be set as pdcp_test_hfn[i]
8423 			 * if hfn_ovrd is not set. Here, PDCP
8424 			 * packet direction is just used to
8425 			 * run half of the cases with session
8426 			 * HFN and other half with per packet
8427 			 * HFN.
8428 			 */
8429 			.hfn_threshold = hfn_threshold,
8430 			.hfn_ovrd = packet_direction ? 1 : 0,
8431 			.sdap_enabled = sdap,
8432 		} },
8433 		.crypto_xform = &ut_params->cipher_xform
8434 	};
8435 
8436 	/* Create security session */
8437 	ut_params->sec_session = rte_security_session_create(ctx,
8438 				&sess_conf, ts_params->session_mpool,
8439 				ts_params->session_priv_mpool);
8440 
8441 	if (!ut_params->sec_session) {
8442 		printf("TestCase %s()-%d line %d failed %s: ",
8443 			__func__, i, __LINE__, "Failed to allocate session");
8444 		ret = TEST_FAILED;
8445 		goto on_err;
8446 	}
8447 
8448 	/* Generate crypto op data structure */
8449 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8450 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8451 	if (!ut_params->op) {
8452 		printf("TestCase %s()-%d line %d failed %s: ",
8453 			__func__, i, __LINE__,
8454 			"Failed to allocate symmetric crypto operation struct");
8455 		ret = TEST_FAILED;
8456 		goto on_err;
8457 	}
8458 
8459 	uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8460 					uint32_t *, IV_OFFSET);
8461 	*per_pkt_hfn = packet_direction ? hfn : 0;
8462 
8463 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8464 
8465 	/* set crypto operation source mbuf */
8466 	ut_params->op->sym->m_src = ut_params->ibuf;
8467 	if (oop)
8468 		ut_params->op->sym->m_dst = ut_params->obuf;
8469 
8470 	/* Process crypto operation */
8471 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8472 		== NULL) {
8473 		printf("TestCase %s()-%d line %d failed %s: ",
8474 			__func__, i, __LINE__,
8475 			"failed to process sym crypto op");
8476 		ret = TEST_FAILED;
8477 		goto on_err;
8478 	}
8479 
8480 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8481 		printf("TestCase %s()-%d line %d failed %s: ",
8482 			__func__, i, __LINE__, "crypto op processing failed");
8483 		ret = TEST_FAILED;
8484 		goto on_err;
8485 	}
8486 
8487 	/* Validate obuf */
8488 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8489 			uint8_t *);
8490 	if (oop) {
8491 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8492 				uint8_t *);
8493 	}
8494 
8495 	if (memcmp(ciphertext, output_vec, output_vec_len)) {
8496 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8497 		rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8498 		rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8499 		ret = TEST_FAILED;
8500 		goto on_err;
8501 	}
8502 
8503 on_err:
8504 	rte_crypto_op_free(ut_params->op);
8505 	ut_params->op = NULL;
8506 
8507 	if (ut_params->sec_session)
8508 		rte_security_session_destroy(ctx, ut_params->sec_session);
8509 	ut_params->sec_session = NULL;
8510 
8511 	rte_pktmbuf_free(ut_params->ibuf);
8512 	ut_params->ibuf = NULL;
8513 	if (oop) {
8514 		rte_pktmbuf_free(ut_params->obuf);
8515 		ut_params->obuf = NULL;
8516 	}
8517 
8518 	return ret;
8519 }
8520 
8521 static int
8522 test_pdcp_proto_SGL(int i, int oop,
8523 	enum rte_crypto_cipher_operation opc,
8524 	enum rte_crypto_auth_operation opa,
8525 	uint8_t *input_vec,
8526 	unsigned int input_vec_len,
8527 	uint8_t *output_vec,
8528 	unsigned int output_vec_len,
8529 	uint32_t fragsz,
8530 	uint32_t fragsz_oop)
8531 {
8532 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8533 	struct crypto_unittest_params *ut_params = &unittest_params;
8534 	uint8_t *plaintext;
8535 	struct rte_mbuf *buf, *buf_oop = NULL;
8536 	int ret = TEST_SUCCESS;
8537 	int to_trn = 0;
8538 	int to_trn_tbl[16];
8539 	int segs = 1;
8540 	unsigned int trn_data = 0;
8541 	struct rte_cryptodev_info dev_info;
8542 	uint64_t feat_flags;
8543 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8544 				rte_cryptodev_get_sec_ctx(
8545 				ts_params->valid_devs[0]);
8546 	struct rte_mbuf *temp_mbuf;
8547 
8548 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8549 	feat_flags = dev_info.feature_flags;
8550 
8551 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8552 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8553 		printf("Device does not support RAW data-path APIs.\n");
8554 		return -ENOTSUP;
8555 	}
8556 	/* Verify the capabilities */
8557 	struct rte_security_capability_idx sec_cap_idx;
8558 
8559 	sec_cap_idx.action = ut_params->type;
8560 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8561 	sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8562 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8563 		return TEST_SKIPPED;
8564 
8565 	if (fragsz > input_vec_len)
8566 		fragsz = input_vec_len;
8567 
8568 	uint16_t plaintext_len = fragsz;
8569 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8570 
8571 	if (fragsz_oop > output_vec_len)
8572 		frag_size_oop = output_vec_len;
8573 
8574 	int ecx = 0;
8575 	if (input_vec_len % fragsz != 0) {
8576 		if (input_vec_len / fragsz + 1 > 16)
8577 			return 1;
8578 	} else if (input_vec_len / fragsz > 16)
8579 		return 1;
8580 
8581 	/* Out of place support */
8582 	if (oop) {
8583 		/*
8584 		 * For out-op-place we need to alloc another mbuf
8585 		 */
8586 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8587 		rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8588 		buf_oop = ut_params->obuf;
8589 	}
8590 
8591 	/* Generate test mbuf data */
8592 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8593 
8594 	/* clear mbuf payload */
8595 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8596 			rte_pktmbuf_tailroom(ut_params->ibuf));
8597 
8598 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8599 						  plaintext_len);
8600 	memcpy(plaintext, input_vec, plaintext_len);
8601 	trn_data += plaintext_len;
8602 
8603 	buf = ut_params->ibuf;
8604 
8605 	/*
8606 	 * Loop until no more fragments
8607 	 */
8608 
8609 	while (trn_data < input_vec_len) {
8610 		++segs;
8611 		to_trn = (input_vec_len - trn_data < fragsz) ?
8612 				(input_vec_len - trn_data) : fragsz;
8613 
8614 		to_trn_tbl[ecx++] = to_trn;
8615 
8616 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8617 		buf = buf->next;
8618 
8619 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8620 				rte_pktmbuf_tailroom(buf));
8621 
8622 		/* OOP */
8623 		if (oop && !fragsz_oop) {
8624 			buf_oop->next =
8625 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
8626 			buf_oop = buf_oop->next;
8627 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8628 					0, rte_pktmbuf_tailroom(buf_oop));
8629 			rte_pktmbuf_append(buf_oop, to_trn);
8630 		}
8631 
8632 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8633 				to_trn);
8634 
8635 		memcpy(plaintext, input_vec + trn_data, to_trn);
8636 		trn_data += to_trn;
8637 	}
8638 
8639 	ut_params->ibuf->nb_segs = segs;
8640 
8641 	segs = 1;
8642 	if (fragsz_oop && oop) {
8643 		to_trn = 0;
8644 		ecx = 0;
8645 
8646 		trn_data = frag_size_oop;
8647 		while (trn_data < output_vec_len) {
8648 			++segs;
8649 			to_trn =
8650 				(output_vec_len - trn_data <
8651 						frag_size_oop) ?
8652 				(output_vec_len - trn_data) :
8653 						frag_size_oop;
8654 
8655 			to_trn_tbl[ecx++] = to_trn;
8656 
8657 			buf_oop->next =
8658 				rte_pktmbuf_alloc(ts_params->mbuf_pool);
8659 			buf_oop = buf_oop->next;
8660 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8661 					0, rte_pktmbuf_tailroom(buf_oop));
8662 			rte_pktmbuf_append(buf_oop, to_trn);
8663 
8664 			trn_data += to_trn;
8665 		}
8666 		ut_params->obuf->nb_segs = segs;
8667 	}
8668 
8669 	/* Setup Cipher Parameters */
8670 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8671 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8672 	ut_params->cipher_xform.cipher.op = opc;
8673 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8674 	ut_params->cipher_xform.cipher.key.length =
8675 					pdcp_test_params[i].cipher_key_len;
8676 	ut_params->cipher_xform.cipher.iv.length = 0;
8677 
8678 	/* Setup HMAC Parameters if ICV header is required */
8679 	if (pdcp_test_params[i].auth_alg != 0) {
8680 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8681 		ut_params->auth_xform.next = NULL;
8682 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8683 		ut_params->auth_xform.auth.op = opa;
8684 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8685 		ut_params->auth_xform.auth.key.length =
8686 					pdcp_test_params[i].auth_key_len;
8687 
8688 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8689 	} else {
8690 		ut_params->cipher_xform.next = NULL;
8691 	}
8692 
8693 	struct rte_security_session_conf sess_conf = {
8694 		.action_type = ut_params->type,
8695 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8696 		{.pdcp = {
8697 			.bearer = pdcp_test_bearer[i],
8698 			.domain = pdcp_test_params[i].domain,
8699 			.pkt_dir = pdcp_test_packet_direction[i],
8700 			.sn_size = pdcp_test_data_sn_size[i],
8701 			.hfn = pdcp_test_hfn[i],
8702 			.hfn_threshold = pdcp_test_hfn_threshold[i],
8703 			.hfn_ovrd = 0,
8704 		} },
8705 		.crypto_xform = &ut_params->cipher_xform
8706 	};
8707 
8708 	/* Create security session */
8709 	ut_params->sec_session = rte_security_session_create(ctx,
8710 				&sess_conf, ts_params->session_mpool,
8711 				ts_params->session_priv_mpool);
8712 
8713 	if (!ut_params->sec_session) {
8714 		printf("TestCase %s()-%d line %d failed %s: ",
8715 			__func__, i, __LINE__, "Failed to allocate session");
8716 		ret = TEST_FAILED;
8717 		goto on_err;
8718 	}
8719 
8720 	/* Generate crypto op data structure */
8721 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8722 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8723 	if (!ut_params->op) {
8724 		printf("TestCase %s()-%d line %d failed %s: ",
8725 			__func__, i, __LINE__,
8726 			"Failed to allocate symmetric crypto operation struct");
8727 		ret = TEST_FAILED;
8728 		goto on_err;
8729 	}
8730 
8731 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8732 
8733 	/* set crypto operation source mbuf */
8734 	ut_params->op->sym->m_src = ut_params->ibuf;
8735 	if (oop)
8736 		ut_params->op->sym->m_dst = ut_params->obuf;
8737 
8738 	/* Process crypto operation */
8739 	temp_mbuf = ut_params->op->sym->m_src;
8740 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
8741 		/* filling lengths */
8742 		while (temp_mbuf) {
8743 			ut_params->op->sym->cipher.data.length
8744 				+= temp_mbuf->pkt_len;
8745 			ut_params->op->sym->auth.data.length
8746 				+= temp_mbuf->pkt_len;
8747 			temp_mbuf = temp_mbuf->next;
8748 		}
8749 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8750 			ut_params->op, 1, 1, 0, 0);
8751 	} else {
8752 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
8753 							ut_params->op);
8754 	}
8755 	if (ut_params->op == NULL) {
8756 		printf("TestCase %s()-%d line %d failed %s: ",
8757 			__func__, i, __LINE__,
8758 			"failed to process sym crypto op");
8759 		ret = TEST_FAILED;
8760 		goto on_err;
8761 	}
8762 
8763 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8764 		printf("TestCase %s()-%d line %d failed %s: ",
8765 			__func__, i, __LINE__, "crypto op processing failed");
8766 		ret = TEST_FAILED;
8767 		goto on_err;
8768 	}
8769 
8770 	/* Validate obuf */
8771 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8772 			uint8_t *);
8773 	if (oop) {
8774 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8775 				uint8_t *);
8776 	}
8777 	if (fragsz_oop)
8778 		fragsz = frag_size_oop;
8779 	if (memcmp(ciphertext, output_vec, fragsz)) {
8780 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8781 		rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8782 		rte_hexdump(stdout, "reference", output_vec, fragsz);
8783 		ret = TEST_FAILED;
8784 		goto on_err;
8785 	}
8786 
8787 	buf = ut_params->op->sym->m_src->next;
8788 	if (oop)
8789 		buf = ut_params->op->sym->m_dst->next;
8790 
8791 	unsigned int off = fragsz;
8792 
8793 	ecx = 0;
8794 	while (buf) {
8795 		ciphertext = rte_pktmbuf_mtod(buf,
8796 				uint8_t *);
8797 		if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8798 			printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8799 			rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8800 			rte_hexdump(stdout, "reference", output_vec + off,
8801 					to_trn_tbl[ecx]);
8802 			ret = TEST_FAILED;
8803 			goto on_err;
8804 		}
8805 		off += to_trn_tbl[ecx++];
8806 		buf = buf->next;
8807 	}
8808 on_err:
8809 	rte_crypto_op_free(ut_params->op);
8810 	ut_params->op = NULL;
8811 
8812 	if (ut_params->sec_session)
8813 		rte_security_session_destroy(ctx, ut_params->sec_session);
8814 	ut_params->sec_session = NULL;
8815 
8816 	rte_pktmbuf_free(ut_params->ibuf);
8817 	ut_params->ibuf = NULL;
8818 	if (oop) {
8819 		rte_pktmbuf_free(ut_params->obuf);
8820 		ut_params->obuf = NULL;
8821 	}
8822 
8823 	return ret;
8824 }
8825 
8826 int
8827 test_pdcp_proto_cplane_encap(int i)
8828 {
8829 	return test_pdcp_proto(
8830 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8831 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8832 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8833 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8834 		pdcp_test_params[i].cipher_key_len,
8835 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8836 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8837 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8838 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8839 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8840 }
8841 
8842 int
8843 test_pdcp_proto_uplane_encap(int i)
8844 {
8845 	return test_pdcp_proto(
8846 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8847 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8848 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8849 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8850 		pdcp_test_params[i].cipher_key_len,
8851 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8852 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8853 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8854 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8855 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8856 }
8857 
8858 int
8859 test_pdcp_proto_uplane_encap_with_int(int i)
8860 {
8861 	return test_pdcp_proto(
8862 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8863 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8864 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8865 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8866 		pdcp_test_params[i].cipher_key_len,
8867 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8868 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8869 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8870 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8871 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8872 }
8873 
8874 int
8875 test_pdcp_proto_cplane_decap(int i)
8876 {
8877 	return test_pdcp_proto(
8878 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8879 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8880 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8881 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8882 		pdcp_test_params[i].cipher_key_len,
8883 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8884 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8885 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8886 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8887 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8888 }
8889 
8890 int
8891 test_pdcp_proto_uplane_decap(int i)
8892 {
8893 	return test_pdcp_proto(
8894 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8895 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8896 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8897 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8898 		pdcp_test_params[i].cipher_key_len,
8899 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8900 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8901 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8902 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8903 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8904 }
8905 
8906 int
8907 test_pdcp_proto_uplane_decap_with_int(int i)
8908 {
8909 	return test_pdcp_proto(
8910 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8911 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8912 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8913 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8914 		pdcp_test_params[i].cipher_key_len,
8915 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8916 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8917 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8918 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8919 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8920 }
8921 
8922 static int
8923 test_PDCP_PROTO_SGL_in_place_32B(void)
8924 {
8925 	/* i can be used for running any PDCP case
8926 	 * In this case it is uplane 12-bit AES-SNOW DL encap
8927 	 */
8928 	int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8929 	return test_pdcp_proto_SGL(i, IN_PLACE,
8930 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8931 			RTE_CRYPTO_AUTH_OP_GENERATE,
8932 			pdcp_test_data_in[i],
8933 			pdcp_test_data_in_len[i],
8934 			pdcp_test_data_out[i],
8935 			pdcp_test_data_in_len[i]+4,
8936 			32, 0);
8937 }
8938 static int
8939 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8940 {
8941 	/* i can be used for running any PDCP case
8942 	 * In this case it is uplane 18-bit NULL-NULL DL encap
8943 	 */
8944 	int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8945 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8946 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8947 			RTE_CRYPTO_AUTH_OP_GENERATE,
8948 			pdcp_test_data_in[i],
8949 			pdcp_test_data_in_len[i],
8950 			pdcp_test_data_out[i],
8951 			pdcp_test_data_in_len[i]+4,
8952 			32, 128);
8953 }
8954 static int
8955 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8956 {
8957 	/* i can be used for running any PDCP case
8958 	 * In this case it is uplane 18-bit AES DL encap
8959 	 */
8960 	int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8961 			+ DOWNLINK;
8962 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8963 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8964 			RTE_CRYPTO_AUTH_OP_GENERATE,
8965 			pdcp_test_data_in[i],
8966 			pdcp_test_data_in_len[i],
8967 			pdcp_test_data_out[i],
8968 			pdcp_test_data_in_len[i],
8969 			32, 40);
8970 }
8971 static int
8972 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8973 {
8974 	/* i can be used for running any PDCP case
8975 	 * In this case it is cplane 12-bit AES-ZUC DL encap
8976 	 */
8977 	int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8978 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8979 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8980 			RTE_CRYPTO_AUTH_OP_GENERATE,
8981 			pdcp_test_data_in[i],
8982 			pdcp_test_data_in_len[i],
8983 			pdcp_test_data_out[i],
8984 			pdcp_test_data_in_len[i]+4,
8985 			128, 32);
8986 }
8987 
8988 static int
8989 test_PDCP_SDAP_PROTO_encap_all(void)
8990 {
8991 	int i = 0, size = 0;
8992 	int err, all_err = TEST_SUCCESS;
8993 	const struct pdcp_sdap_test *cur_test;
8994 
8995 	size = RTE_DIM(list_pdcp_sdap_tests);
8996 
8997 	for (i = 0; i < size; i++) {
8998 		cur_test = &list_pdcp_sdap_tests[i];
8999 		err = test_pdcp_proto(
9000 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9001 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9002 			cur_test->in_len, cur_test->data_out,
9003 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9004 			cur_test->param.cipher_alg, cur_test->cipher_key,
9005 			cur_test->param.cipher_key_len,
9006 			cur_test->param.auth_alg,
9007 			cur_test->auth_key, cur_test->param.auth_key_len,
9008 			cur_test->bearer, cur_test->param.domain,
9009 			cur_test->packet_direction, cur_test->sn_size,
9010 			cur_test->hfn,
9011 			cur_test->hfn_threshold, SDAP_ENABLED);
9012 		if (err) {
9013 			printf("\t%d) %s: Encapsulation failed\n",
9014 					cur_test->test_idx,
9015 					cur_test->param.name);
9016 			err = TEST_FAILED;
9017 		} else {
9018 			printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
9019 					cur_test->param.name);
9020 			err = TEST_SUCCESS;
9021 		}
9022 		all_err += err;
9023 	}
9024 
9025 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9026 
9027 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9028 }
9029 
9030 static int
9031 test_PDCP_PROTO_short_mac(void)
9032 {
9033 	int i = 0, size = 0;
9034 	int err, all_err = TEST_SUCCESS;
9035 	const struct pdcp_short_mac_test *cur_test;
9036 
9037 	size = RTE_DIM(list_pdcp_smac_tests);
9038 
9039 	for (i = 0; i < size; i++) {
9040 		cur_test = &list_pdcp_smac_tests[i];
9041 		err = test_pdcp_proto(
9042 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9043 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9044 			cur_test->in_len, cur_test->data_out,
9045 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9046 			RTE_CRYPTO_CIPHER_NULL, NULL,
9047 			0, cur_test->param.auth_alg,
9048 			cur_test->auth_key, cur_test->param.auth_key_len,
9049 			0, cur_test->param.domain, 0, 0,
9050 			0, 0, 0);
9051 		if (err) {
9052 			printf("\t%d) %s: Short MAC test failed\n",
9053 					cur_test->test_idx,
9054 					cur_test->param.name);
9055 			err = TEST_FAILED;
9056 		} else {
9057 			printf("\t%d) %s: Short MAC test PASS\n",
9058 					cur_test->test_idx,
9059 					cur_test->param.name);
9060 			rte_hexdump(stdout, "MAC I",
9061 				    cur_test->data_out + cur_test->in_len + 2,
9062 				    2);
9063 			err = TEST_SUCCESS;
9064 		}
9065 		all_err += err;
9066 	}
9067 
9068 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9069 
9070 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9071 
9072 }
9073 
9074 static int
9075 test_PDCP_SDAP_PROTO_decap_all(void)
9076 {
9077 	int i = 0, size = 0;
9078 	int err, all_err = TEST_SUCCESS;
9079 	const struct pdcp_sdap_test *cur_test;
9080 
9081 	size = RTE_DIM(list_pdcp_sdap_tests);
9082 
9083 	for (i = 0; i < size; i++) {
9084 		cur_test = &list_pdcp_sdap_tests[i];
9085 		err = test_pdcp_proto(
9086 			i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
9087 			RTE_CRYPTO_AUTH_OP_VERIFY,
9088 			cur_test->data_out,
9089 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9090 			cur_test->data_in, cur_test->in_len,
9091 			cur_test->param.cipher_alg,
9092 			cur_test->cipher_key, cur_test->param.cipher_key_len,
9093 			cur_test->param.auth_alg, cur_test->auth_key,
9094 			cur_test->param.auth_key_len, cur_test->bearer,
9095 			cur_test->param.domain, cur_test->packet_direction,
9096 			cur_test->sn_size, cur_test->hfn,
9097 			cur_test->hfn_threshold, SDAP_ENABLED);
9098 		if (err) {
9099 			printf("\t%d) %s: Decapsulation failed\n",
9100 					cur_test->test_idx,
9101 					cur_test->param.name);
9102 			err = TEST_FAILED;
9103 		} else {
9104 			printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
9105 					cur_test->param.name);
9106 			err = TEST_SUCCESS;
9107 		}
9108 		all_err += err;
9109 	}
9110 
9111 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9112 
9113 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9114 }
9115 
9116 static int
9117 test_ipsec_proto_process(const struct ipsec_test_data td[],
9118 			 struct ipsec_test_data res_d[],
9119 			 int nb_td,
9120 			 bool silent,
9121 			 const struct ipsec_test_flags *flags)
9122 {
9123 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9124 	struct crypto_unittest_params *ut_params = &unittest_params;
9125 	struct rte_security_capability_idx sec_cap_idx;
9126 	const struct rte_security_capability *sec_cap;
9127 	struct rte_security_ipsec_xform ipsec_xform;
9128 	uint8_t dev_id = ts_params->valid_devs[0];
9129 	enum rte_security_ipsec_sa_direction dir;
9130 	struct ipsec_test_data *res_d_tmp = NULL;
9131 	uint32_t src = RTE_IPV4(192, 168, 1, 0);
9132 	uint32_t dst = RTE_IPV4(192, 168, 1, 1);
9133 	int salt_len, i, ret = TEST_SUCCESS;
9134 	struct rte_security_ctx *ctx;
9135 	uint8_t *input_text;
9136 	uint32_t verify;
9137 
9138 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9139 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9140 
9141 	/* Use first test data to create session */
9142 
9143 	/* Copy IPsec xform */
9144 	memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform));
9145 
9146 	dir = ipsec_xform.direction;
9147 	verify = flags->tunnel_hdr_verify;
9148 
9149 	if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) {
9150 		if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR)
9151 			src += 1;
9152 		else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR)
9153 			dst += 1;
9154 	}
9155 
9156 	memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src, sizeof(src));
9157 	memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst, sizeof(dst));
9158 
9159 	ctx = rte_cryptodev_get_sec_ctx(dev_id);
9160 
9161 	sec_cap_idx.action = ut_params->type;
9162 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
9163 	sec_cap_idx.ipsec.proto = ipsec_xform.proto;
9164 	sec_cap_idx.ipsec.mode = ipsec_xform.mode;
9165 	sec_cap_idx.ipsec.direction = ipsec_xform.direction;
9166 
9167 	if (flags->udp_encap)
9168 		ipsec_xform.options.udp_encap = 1;
9169 
9170 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9171 	if (sec_cap == NULL)
9172 		return TEST_SKIPPED;
9173 
9174 	/* Copy cipher session parameters */
9175 	if (td[0].aead) {
9176 		memcpy(&ut_params->aead_xform, &td[0].xform.aead,
9177 		       sizeof(ut_params->aead_xform));
9178 		ut_params->aead_xform.aead.key.data = td[0].key.data;
9179 		ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
9180 
9181 		/* Verify crypto capabilities */
9182 		if (test_ipsec_crypto_caps_aead_verify(
9183 				sec_cap,
9184 				&ut_params->aead_xform) != 0) {
9185 			if (!silent)
9186 				RTE_LOG(INFO, USER1,
9187 					"Crypto capabilities not supported\n");
9188 			return TEST_SKIPPED;
9189 		}
9190 	} else {
9191 		/* Only AEAD supported now */
9192 		return TEST_SKIPPED;
9193 	}
9194 
9195 	if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
9196 		return TEST_SKIPPED;
9197 
9198 	salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
9199 	memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
9200 
9201 	struct rte_security_session_conf sess_conf = {
9202 		.action_type = ut_params->type,
9203 		.protocol = RTE_SECURITY_PROTOCOL_IPSEC,
9204 		.ipsec = ipsec_xform,
9205 		.crypto_xform = &ut_params->aead_xform,
9206 	};
9207 
9208 	/* Create security session */
9209 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9210 					ts_params->session_mpool,
9211 					ts_params->session_priv_mpool);
9212 
9213 	if (ut_params->sec_session == NULL)
9214 		return TEST_SKIPPED;
9215 
9216 	for (i = 0; i < nb_td; i++) {
9217 		/* Setup source mbuf payload */
9218 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9219 		memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9220 				rte_pktmbuf_tailroom(ut_params->ibuf));
9221 
9222 		input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9223 				td[i].input_text.len);
9224 
9225 		memcpy(input_text, td[i].input_text.data,
9226 		       td[i].input_text.len);
9227 
9228 		/* Generate crypto op data structure */
9229 		ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9230 					RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9231 		if (!ut_params->op) {
9232 			printf("TestCase %s line %d: %s\n",
9233 				__func__, __LINE__,
9234 				"failed to allocate crypto op");
9235 			ret = TEST_FAILED;
9236 			goto crypto_op_free;
9237 		}
9238 
9239 		/* Attach session to operation */
9240 		rte_security_attach_session(ut_params->op,
9241 					    ut_params->sec_session);
9242 
9243 		/* Set crypto operation mbufs */
9244 		ut_params->op->sym->m_src = ut_params->ibuf;
9245 		ut_params->op->sym->m_dst = NULL;
9246 
9247 		/* Copy IV in crypto operation when IV generation is disabled */
9248 		if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
9249 		    ipsec_xform.options.iv_gen_disable == 1) {
9250 			uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
9251 								uint8_t *,
9252 								IV_OFFSET);
9253 			int len;
9254 
9255 			if (td[i].aead)
9256 				len = td[i].xform.aead.aead.iv.length;
9257 			else
9258 				len = td[i].xform.chain.cipher.cipher.iv.length;
9259 
9260 			memcpy(iv, td[i].iv.data, len);
9261 		}
9262 
9263 		/* Process crypto operation */
9264 		process_crypto_request(dev_id, ut_params->op);
9265 
9266 		ret = test_ipsec_status_check(ut_params->op, flags, dir, i + 1);
9267 		if (ret != TEST_SUCCESS)
9268 			goto crypto_op_free;
9269 
9270 		if (res_d != NULL)
9271 			res_d_tmp = &res_d[i];
9272 
9273 		ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
9274 					      res_d_tmp, silent, flags);
9275 		if (ret != TEST_SUCCESS)
9276 			goto crypto_op_free;
9277 
9278 		rte_crypto_op_free(ut_params->op);
9279 		ut_params->op = NULL;
9280 
9281 		rte_pktmbuf_free(ut_params->ibuf);
9282 		ut_params->ibuf = NULL;
9283 	}
9284 
9285 crypto_op_free:
9286 	rte_crypto_op_free(ut_params->op);
9287 	ut_params->op = NULL;
9288 
9289 	rte_pktmbuf_free(ut_params->ibuf);
9290 	ut_params->ibuf = NULL;
9291 
9292 	if (ut_params->sec_session)
9293 		rte_security_session_destroy(ctx, ut_params->sec_session);
9294 	ut_params->sec_session = NULL;
9295 
9296 	return ret;
9297 }
9298 
9299 static int
9300 test_ipsec_proto_known_vec(const void *test_data)
9301 {
9302 	struct ipsec_test_data td_outb;
9303 	struct ipsec_test_flags flags;
9304 
9305 	memset(&flags, 0, sizeof(flags));
9306 
9307 	memcpy(&td_outb, test_data, sizeof(td_outb));
9308 
9309 	/* Disable IV gen to be able to test with known vectors */
9310 	td_outb.ipsec_xform.options.iv_gen_disable = 1;
9311 
9312 	return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9313 }
9314 
9315 static int
9316 test_ipsec_proto_known_vec_inb(const void *td_outb)
9317 {
9318 	struct ipsec_test_flags flags;
9319 	struct ipsec_test_data td_inb;
9320 
9321 	memset(&flags, 0, sizeof(flags));
9322 
9323 	test_ipsec_td_in_from_out(td_outb, &td_inb);
9324 
9325 	return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
9326 }
9327 
9328 static int
9329 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
9330 {
9331 	struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9332 	struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9333 	unsigned int i, nb_pkts = 1, pass_cnt = 0;
9334 	int ret;
9335 
9336 	if (flags->iv_gen ||
9337 	    flags->sa_expiry_pkts_soft ||
9338 	    flags->sa_expiry_pkts_hard)
9339 		nb_pkts = IPSEC_TEST_PACKETS_MAX;
9340 
9341 	for (i = 0; i < RTE_DIM(aead_list); i++) {
9342 		test_ipsec_td_prepare(&aead_list[i],
9343 				      NULL,
9344 				      flags,
9345 				      td_outb,
9346 				      nb_pkts);
9347 
9348 		ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9349 					       flags);
9350 		if (ret == TEST_SKIPPED)
9351 			continue;
9352 
9353 		if (ret == TEST_FAILED)
9354 			return TEST_FAILED;
9355 
9356 		test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9357 
9358 		ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9359 					       flags);
9360 		if (ret == TEST_SKIPPED)
9361 			continue;
9362 
9363 		if (ret == TEST_FAILED)
9364 			return TEST_FAILED;
9365 
9366 		if (flags->display_alg)
9367 			test_ipsec_display_alg(&aead_list[i], NULL);
9368 
9369 		pass_cnt++;
9370 	}
9371 
9372 	if (pass_cnt > 0)
9373 		return TEST_SUCCESS;
9374 	else
9375 		return TEST_SKIPPED;
9376 }
9377 
9378 static int
9379 test_ipsec_proto_display_list(const void *data __rte_unused)
9380 {
9381 	struct ipsec_test_flags flags;
9382 
9383 	memset(&flags, 0, sizeof(flags));
9384 
9385 	flags.display_alg = true;
9386 
9387 	return test_ipsec_proto_all(&flags);
9388 }
9389 
9390 static int
9391 test_ipsec_proto_iv_gen(const void *data __rte_unused)
9392 {
9393 	struct ipsec_test_flags flags;
9394 
9395 	memset(&flags, 0, sizeof(flags));
9396 
9397 	flags.iv_gen = true;
9398 
9399 	return test_ipsec_proto_all(&flags);
9400 }
9401 
9402 static int
9403 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused)
9404 {
9405 	struct ipsec_test_flags flags;
9406 
9407 	memset(&flags, 0, sizeof(flags));
9408 
9409 	flags.sa_expiry_pkts_soft = true;
9410 
9411 	return test_ipsec_proto_all(&flags);
9412 }
9413 
9414 static int
9415 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused)
9416 {
9417 	struct ipsec_test_flags flags;
9418 
9419 	memset(&flags, 0, sizeof(flags));
9420 
9421 	flags.sa_expiry_pkts_hard = true;
9422 
9423 	return test_ipsec_proto_all(&flags);
9424 }
9425 
9426 static int
9427 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused)
9428 {
9429 	struct ipsec_test_flags flags;
9430 
9431 	memset(&flags, 0, sizeof(flags));
9432 
9433 	flags.icv_corrupt = true;
9434 
9435 	return test_ipsec_proto_all(&flags);
9436 }
9437 
9438 static int
9439 test_ipsec_proto_udp_encap(const void *data __rte_unused)
9440 {
9441 	struct ipsec_test_flags flags;
9442 
9443 	memset(&flags, 0, sizeof(flags));
9444 
9445 	flags.udp_encap = true;
9446 
9447 	return test_ipsec_proto_all(&flags);
9448 }
9449 
9450 static int
9451 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused)
9452 {
9453 	struct ipsec_test_flags flags;
9454 
9455 	memset(&flags, 0, sizeof(flags));
9456 
9457 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
9458 
9459 	return test_ipsec_proto_all(&flags);
9460 }
9461 
9462 static int
9463 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
9464 {
9465 	struct ipsec_test_flags flags;
9466 
9467 	memset(&flags, 0, sizeof(flags));
9468 
9469 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
9470 
9471 	return test_ipsec_proto_all(&flags);
9472 }
9473 
9474 static int
9475 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused)
9476 {
9477 	struct ipsec_test_flags flags;
9478 
9479 	memset(&flags, 0, sizeof(flags));
9480 
9481 	flags.udp_encap = true;
9482 	flags.udp_ports_verify = true;
9483 
9484 	return test_ipsec_proto_all(&flags);
9485 }
9486 
9487 static int
9488 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused)
9489 {
9490 	struct ipsec_test_flags flags;
9491 
9492 	memset(&flags, 0, sizeof(flags));
9493 
9494 	flags.ip_csum = true;
9495 
9496 	return test_ipsec_proto_all(&flags);
9497 }
9498 
9499 static int
9500 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused)
9501 {
9502 	struct ipsec_test_flags flags;
9503 
9504 	memset(&flags, 0, sizeof(flags));
9505 
9506 	flags.l4_csum = true;
9507 
9508 	return test_ipsec_proto_all(&flags);
9509 }
9510 
9511 static int
9512 test_PDCP_PROTO_all(void)
9513 {
9514 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9515 	struct crypto_unittest_params *ut_params = &unittest_params;
9516 	struct rte_cryptodev_info dev_info;
9517 	int status;
9518 
9519 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9520 	uint64_t feat_flags = dev_info.feature_flags;
9521 
9522 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9523 		return TEST_SKIPPED;
9524 
9525 	/* Set action type */
9526 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9527 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9528 		gbl_action_type;
9529 
9530 	if (security_proto_supported(ut_params->type,
9531 			RTE_SECURITY_PROTOCOL_PDCP) < 0)
9532 		return TEST_SKIPPED;
9533 
9534 	status = test_PDCP_PROTO_cplane_encap_all();
9535 	status += test_PDCP_PROTO_cplane_decap_all();
9536 	status += test_PDCP_PROTO_uplane_encap_all();
9537 	status += test_PDCP_PROTO_uplane_decap_all();
9538 	status += test_PDCP_PROTO_SGL_in_place_32B();
9539 	status += test_PDCP_PROTO_SGL_oop_32B_128B();
9540 	status += test_PDCP_PROTO_SGL_oop_32B_40B();
9541 	status += test_PDCP_PROTO_SGL_oop_128B_32B();
9542 	status += test_PDCP_SDAP_PROTO_encap_all();
9543 	status += test_PDCP_SDAP_PROTO_decap_all();
9544 	status += test_PDCP_PROTO_short_mac();
9545 
9546 	if (status)
9547 		return TEST_FAILED;
9548 	else
9549 		return TEST_SUCCESS;
9550 }
9551 
9552 static int
9553 test_docsis_proto_uplink(const void *data)
9554 {
9555 	const struct docsis_test_data *d_td = data;
9556 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9557 	struct crypto_unittest_params *ut_params = &unittest_params;
9558 	uint8_t *plaintext = NULL;
9559 	uint8_t *ciphertext = NULL;
9560 	uint8_t *iv_ptr;
9561 	int32_t cipher_len, crc_len;
9562 	uint32_t crc_data_len;
9563 	int ret = TEST_SUCCESS;
9564 
9565 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9566 					rte_cryptodev_get_sec_ctx(
9567 						ts_params->valid_devs[0]);
9568 
9569 	/* Verify the capabilities */
9570 	struct rte_security_capability_idx sec_cap_idx;
9571 	const struct rte_security_capability *sec_cap;
9572 	const struct rte_cryptodev_capabilities *crypto_cap;
9573 	const struct rte_cryptodev_symmetric_capability *sym_cap;
9574 	int j = 0;
9575 
9576 	/* Set action type */
9577 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9578 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9579 		gbl_action_type;
9580 
9581 	if (security_proto_supported(ut_params->type,
9582 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
9583 		return TEST_SKIPPED;
9584 
9585 	sec_cap_idx.action = ut_params->type;
9586 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9587 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
9588 
9589 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9590 	if (sec_cap == NULL)
9591 		return TEST_SKIPPED;
9592 
9593 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9594 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9595 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9596 				crypto_cap->sym.xform_type ==
9597 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
9598 				crypto_cap->sym.cipher.algo ==
9599 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9600 			sym_cap = &crypto_cap->sym;
9601 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9602 						d_td->key.len,
9603 						d_td->iv.len) == 0)
9604 				break;
9605 		}
9606 	}
9607 
9608 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9609 		return TEST_SKIPPED;
9610 
9611 	/* Setup source mbuf payload */
9612 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9613 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9614 			rte_pktmbuf_tailroom(ut_params->ibuf));
9615 
9616 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9617 			d_td->ciphertext.len);
9618 
9619 	memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
9620 
9621 	/* Setup cipher session parameters */
9622 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9623 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9624 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
9625 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9626 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9627 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9628 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9629 	ut_params->cipher_xform.next = NULL;
9630 
9631 	/* Setup DOCSIS session parameters */
9632 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
9633 
9634 	struct rte_security_session_conf sess_conf = {
9635 		.action_type = ut_params->type,
9636 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9637 		.docsis = ut_params->docsis_xform,
9638 		.crypto_xform = &ut_params->cipher_xform,
9639 	};
9640 
9641 	/* Create security session */
9642 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9643 					ts_params->session_mpool,
9644 					ts_params->session_priv_mpool);
9645 
9646 	if (!ut_params->sec_session) {
9647 		printf("Test function %s line %u: failed to allocate session\n",
9648 			__func__, __LINE__);
9649 		ret = TEST_FAILED;
9650 		goto on_err;
9651 	}
9652 
9653 	/* Generate crypto op data structure */
9654 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9655 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9656 	if (!ut_params->op) {
9657 		printf("Test function %s line %u: failed to allocate symmetric "
9658 			"crypto operation\n", __func__, __LINE__);
9659 		ret = TEST_FAILED;
9660 		goto on_err;
9661 	}
9662 
9663 	/* Setup CRC operation parameters */
9664 	crc_len = d_td->ciphertext.no_crc == false ?
9665 			(d_td->ciphertext.len -
9666 				d_td->ciphertext.crc_offset -
9667 				RTE_ETHER_CRC_LEN) :
9668 			0;
9669 	crc_len = crc_len > 0 ? crc_len : 0;
9670 	crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
9671 	ut_params->op->sym->auth.data.length = crc_len;
9672 	ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
9673 
9674 	/* Setup cipher operation parameters */
9675 	cipher_len = d_td->ciphertext.no_cipher == false ?
9676 			(d_td->ciphertext.len -
9677 				d_td->ciphertext.cipher_offset) :
9678 			0;
9679 	cipher_len = cipher_len > 0 ? cipher_len : 0;
9680 	ut_params->op->sym->cipher.data.length = cipher_len;
9681 	ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
9682 
9683 	/* Setup cipher IV */
9684 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9685 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9686 
9687 	/* Attach session to operation */
9688 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
9689 
9690 	/* Set crypto operation mbufs */
9691 	ut_params->op->sym->m_src = ut_params->ibuf;
9692 	ut_params->op->sym->m_dst = NULL;
9693 
9694 	/* Process crypto operation */
9695 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9696 			NULL) {
9697 		printf("Test function %s line %u: failed to process security "
9698 			"crypto op\n", __func__, __LINE__);
9699 		ret = TEST_FAILED;
9700 		goto on_err;
9701 	}
9702 
9703 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9704 		printf("Test function %s line %u: failed to process crypto op\n",
9705 			__func__, __LINE__);
9706 		ret = TEST_FAILED;
9707 		goto on_err;
9708 	}
9709 
9710 	/* Validate plaintext */
9711 	plaintext = ciphertext;
9712 
9713 	if (memcmp(plaintext, d_td->plaintext.data,
9714 			d_td->plaintext.len - crc_data_len)) {
9715 		printf("Test function %s line %u: plaintext not as expected\n",
9716 			__func__, __LINE__);
9717 		rte_hexdump(stdout, "expected", d_td->plaintext.data,
9718 				d_td->plaintext.len);
9719 		rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
9720 		ret = TEST_FAILED;
9721 		goto on_err;
9722 	}
9723 
9724 on_err:
9725 	rte_crypto_op_free(ut_params->op);
9726 	ut_params->op = NULL;
9727 
9728 	if (ut_params->sec_session)
9729 		rte_security_session_destroy(ctx, ut_params->sec_session);
9730 	ut_params->sec_session = NULL;
9731 
9732 	rte_pktmbuf_free(ut_params->ibuf);
9733 	ut_params->ibuf = NULL;
9734 
9735 	return ret;
9736 }
9737 
9738 static int
9739 test_docsis_proto_downlink(const void *data)
9740 {
9741 	const struct docsis_test_data *d_td = data;
9742 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9743 	struct crypto_unittest_params *ut_params = &unittest_params;
9744 	uint8_t *plaintext = NULL;
9745 	uint8_t *ciphertext = NULL;
9746 	uint8_t *iv_ptr;
9747 	int32_t cipher_len, crc_len;
9748 	int ret = TEST_SUCCESS;
9749 
9750 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9751 					rte_cryptodev_get_sec_ctx(
9752 						ts_params->valid_devs[0]);
9753 
9754 	/* Verify the capabilities */
9755 	struct rte_security_capability_idx sec_cap_idx;
9756 	const struct rte_security_capability *sec_cap;
9757 	const struct rte_cryptodev_capabilities *crypto_cap;
9758 	const struct rte_cryptodev_symmetric_capability *sym_cap;
9759 	int j = 0;
9760 
9761 	/* Set action type */
9762 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9763 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9764 		gbl_action_type;
9765 
9766 	if (security_proto_supported(ut_params->type,
9767 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
9768 		return TEST_SKIPPED;
9769 
9770 	sec_cap_idx.action = ut_params->type;
9771 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9772 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9773 
9774 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9775 	if (sec_cap == NULL)
9776 		return TEST_SKIPPED;
9777 
9778 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9779 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9780 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9781 				crypto_cap->sym.xform_type ==
9782 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
9783 				crypto_cap->sym.cipher.algo ==
9784 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9785 			sym_cap = &crypto_cap->sym;
9786 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9787 						d_td->key.len,
9788 						d_td->iv.len) == 0)
9789 				break;
9790 		}
9791 	}
9792 
9793 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9794 		return TEST_SKIPPED;
9795 
9796 	/* Setup source mbuf payload */
9797 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9798 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9799 			rte_pktmbuf_tailroom(ut_params->ibuf));
9800 
9801 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9802 			d_td->plaintext.len);
9803 
9804 	memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
9805 
9806 	/* Setup cipher session parameters */
9807 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9808 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9809 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9810 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9811 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9812 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9813 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9814 	ut_params->cipher_xform.next = NULL;
9815 
9816 	/* Setup DOCSIS session parameters */
9817 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9818 
9819 	struct rte_security_session_conf sess_conf = {
9820 		.action_type = ut_params->type,
9821 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9822 		.docsis = ut_params->docsis_xform,
9823 		.crypto_xform = &ut_params->cipher_xform,
9824 	};
9825 
9826 	/* Create security session */
9827 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9828 					ts_params->session_mpool,
9829 					ts_params->session_priv_mpool);
9830 
9831 	if (!ut_params->sec_session) {
9832 		printf("Test function %s line %u: failed to allocate session\n",
9833 			__func__, __LINE__);
9834 		ret = TEST_FAILED;
9835 		goto on_err;
9836 	}
9837 
9838 	/* Generate crypto op data structure */
9839 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9840 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9841 	if (!ut_params->op) {
9842 		printf("Test function %s line %u: failed to allocate symmetric "
9843 			"crypto operation\n", __func__, __LINE__);
9844 		ret = TEST_FAILED;
9845 		goto on_err;
9846 	}
9847 
9848 	/* Setup CRC operation parameters */
9849 	crc_len = d_td->plaintext.no_crc == false ?
9850 			(d_td->plaintext.len -
9851 				d_td->plaintext.crc_offset -
9852 				RTE_ETHER_CRC_LEN) :
9853 			0;
9854 	crc_len = crc_len > 0 ? crc_len : 0;
9855 	ut_params->op->sym->auth.data.length = crc_len;
9856 	ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
9857 
9858 	/* Setup cipher operation parameters */
9859 	cipher_len = d_td->plaintext.no_cipher == false ?
9860 			(d_td->plaintext.len -
9861 				d_td->plaintext.cipher_offset) :
9862 			0;
9863 	cipher_len = cipher_len > 0 ? cipher_len : 0;
9864 	ut_params->op->sym->cipher.data.length = cipher_len;
9865 	ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
9866 
9867 	/* Setup cipher IV */
9868 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9869 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9870 
9871 	/* Attach session to operation */
9872 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
9873 
9874 	/* Set crypto operation mbufs */
9875 	ut_params->op->sym->m_src = ut_params->ibuf;
9876 	ut_params->op->sym->m_dst = NULL;
9877 
9878 	/* Process crypto operation */
9879 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9880 			NULL) {
9881 		printf("Test function %s line %u: failed to process crypto op\n",
9882 			__func__, __LINE__);
9883 		ret = TEST_FAILED;
9884 		goto on_err;
9885 	}
9886 
9887 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9888 		printf("Test function %s line %u: crypto op processing failed\n",
9889 			__func__, __LINE__);
9890 		ret = TEST_FAILED;
9891 		goto on_err;
9892 	}
9893 
9894 	/* Validate ciphertext */
9895 	ciphertext = plaintext;
9896 
9897 	if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
9898 		printf("Test function %s line %u: plaintext not as expected\n",
9899 			__func__, __LINE__);
9900 		rte_hexdump(stdout, "expected", d_td->ciphertext.data,
9901 				d_td->ciphertext.len);
9902 		rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
9903 		ret = TEST_FAILED;
9904 		goto on_err;
9905 	}
9906 
9907 on_err:
9908 	rte_crypto_op_free(ut_params->op);
9909 	ut_params->op = NULL;
9910 
9911 	if (ut_params->sec_session)
9912 		rte_security_session_destroy(ctx, ut_params->sec_session);
9913 	ut_params->sec_session = NULL;
9914 
9915 	rte_pktmbuf_free(ut_params->ibuf);
9916 	ut_params->ibuf = NULL;
9917 
9918 	return ret;
9919 }
9920 #endif
9921 
9922 static int
9923 test_AES_GCM_authenticated_encryption_test_case_1(void)
9924 {
9925 	return test_authenticated_encryption(&gcm_test_case_1);
9926 }
9927 
9928 static int
9929 test_AES_GCM_authenticated_encryption_test_case_2(void)
9930 {
9931 	return test_authenticated_encryption(&gcm_test_case_2);
9932 }
9933 
9934 static int
9935 test_AES_GCM_authenticated_encryption_test_case_3(void)
9936 {
9937 	return test_authenticated_encryption(&gcm_test_case_3);
9938 }
9939 
9940 static int
9941 test_AES_GCM_authenticated_encryption_test_case_4(void)
9942 {
9943 	return test_authenticated_encryption(&gcm_test_case_4);
9944 }
9945 
9946 static int
9947 test_AES_GCM_authenticated_encryption_test_case_5(void)
9948 {
9949 	return test_authenticated_encryption(&gcm_test_case_5);
9950 }
9951 
9952 static int
9953 test_AES_GCM_authenticated_encryption_test_case_6(void)
9954 {
9955 	return test_authenticated_encryption(&gcm_test_case_6);
9956 }
9957 
9958 static int
9959 test_AES_GCM_authenticated_encryption_test_case_7(void)
9960 {
9961 	return test_authenticated_encryption(&gcm_test_case_7);
9962 }
9963 
9964 static int
9965 test_AES_GCM_authenticated_encryption_test_case_8(void)
9966 {
9967 	return test_authenticated_encryption(&gcm_test_case_8);
9968 }
9969 
9970 static int
9971 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
9972 {
9973 	return test_authenticated_encryption(&gcm_J0_test_case_1);
9974 }
9975 
9976 static int
9977 test_AES_GCM_auth_encryption_test_case_192_1(void)
9978 {
9979 	return test_authenticated_encryption(&gcm_test_case_192_1);
9980 }
9981 
9982 static int
9983 test_AES_GCM_auth_encryption_test_case_192_2(void)
9984 {
9985 	return test_authenticated_encryption(&gcm_test_case_192_2);
9986 }
9987 
9988 static int
9989 test_AES_GCM_auth_encryption_test_case_192_3(void)
9990 {
9991 	return test_authenticated_encryption(&gcm_test_case_192_3);
9992 }
9993 
9994 static int
9995 test_AES_GCM_auth_encryption_test_case_192_4(void)
9996 {
9997 	return test_authenticated_encryption(&gcm_test_case_192_4);
9998 }
9999 
10000 static int
10001 test_AES_GCM_auth_encryption_test_case_192_5(void)
10002 {
10003 	return test_authenticated_encryption(&gcm_test_case_192_5);
10004 }
10005 
10006 static int
10007 test_AES_GCM_auth_encryption_test_case_192_6(void)
10008 {
10009 	return test_authenticated_encryption(&gcm_test_case_192_6);
10010 }
10011 
10012 static int
10013 test_AES_GCM_auth_encryption_test_case_192_7(void)
10014 {
10015 	return test_authenticated_encryption(&gcm_test_case_192_7);
10016 }
10017 
10018 static int
10019 test_AES_GCM_auth_encryption_test_case_256_1(void)
10020 {
10021 	return test_authenticated_encryption(&gcm_test_case_256_1);
10022 }
10023 
10024 static int
10025 test_AES_GCM_auth_encryption_test_case_256_2(void)
10026 {
10027 	return test_authenticated_encryption(&gcm_test_case_256_2);
10028 }
10029 
10030 static int
10031 test_AES_GCM_auth_encryption_test_case_256_3(void)
10032 {
10033 	return test_authenticated_encryption(&gcm_test_case_256_3);
10034 }
10035 
10036 static int
10037 test_AES_GCM_auth_encryption_test_case_256_4(void)
10038 {
10039 	return test_authenticated_encryption(&gcm_test_case_256_4);
10040 }
10041 
10042 static int
10043 test_AES_GCM_auth_encryption_test_case_256_5(void)
10044 {
10045 	return test_authenticated_encryption(&gcm_test_case_256_5);
10046 }
10047 
10048 static int
10049 test_AES_GCM_auth_encryption_test_case_256_6(void)
10050 {
10051 	return test_authenticated_encryption(&gcm_test_case_256_6);
10052 }
10053 
10054 static int
10055 test_AES_GCM_auth_encryption_test_case_256_7(void)
10056 {
10057 	return test_authenticated_encryption(&gcm_test_case_256_7);
10058 }
10059 
10060 static int
10061 test_AES_GCM_auth_encryption_test_case_aad_1(void)
10062 {
10063 	return test_authenticated_encryption(&gcm_test_case_aad_1);
10064 }
10065 
10066 static int
10067 test_AES_GCM_auth_encryption_test_case_aad_2(void)
10068 {
10069 	return test_authenticated_encryption(&gcm_test_case_aad_2);
10070 }
10071 
10072 static int
10073 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
10074 {
10075 	struct aead_test_data tdata;
10076 	int res;
10077 
10078 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10079 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10080 	tdata.iv.data[0] += 1;
10081 	res = test_authenticated_encryption(&tdata);
10082 	if (res == TEST_SKIPPED)
10083 		return res;
10084 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10085 	return TEST_SUCCESS;
10086 }
10087 
10088 static int
10089 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
10090 {
10091 	struct aead_test_data tdata;
10092 	int res;
10093 
10094 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10095 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10096 	tdata.plaintext.data[0] += 1;
10097 	res = test_authenticated_encryption(&tdata);
10098 	if (res == TEST_SKIPPED)
10099 		return res;
10100 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10101 	return TEST_SUCCESS;
10102 }
10103 
10104 static int
10105 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
10106 {
10107 	struct aead_test_data tdata;
10108 	int res;
10109 
10110 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10111 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10112 	tdata.ciphertext.data[0] += 1;
10113 	res = test_authenticated_encryption(&tdata);
10114 	if (res == TEST_SKIPPED)
10115 		return res;
10116 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10117 	return TEST_SUCCESS;
10118 }
10119 
10120 static int
10121 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
10122 {
10123 	struct aead_test_data tdata;
10124 	int res;
10125 
10126 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10127 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10128 	tdata.aad.len += 1;
10129 	res = test_authenticated_encryption(&tdata);
10130 	if (res == TEST_SKIPPED)
10131 		return res;
10132 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10133 	return TEST_SUCCESS;
10134 }
10135 
10136 static int
10137 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
10138 {
10139 	struct aead_test_data tdata;
10140 	uint8_t aad[gcm_test_case_7.aad.len];
10141 	int res;
10142 
10143 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10144 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10145 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10146 	aad[0] += 1;
10147 	tdata.aad.data = aad;
10148 	res = test_authenticated_encryption(&tdata);
10149 	if (res == TEST_SKIPPED)
10150 		return res;
10151 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10152 	return TEST_SUCCESS;
10153 }
10154 
10155 static int
10156 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
10157 {
10158 	struct aead_test_data tdata;
10159 	int res;
10160 
10161 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10162 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10163 	tdata.auth_tag.data[0] += 1;
10164 	res = test_authenticated_encryption(&tdata);
10165 	if (res == TEST_SKIPPED)
10166 		return res;
10167 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10168 	return TEST_SUCCESS;
10169 }
10170 
10171 static int
10172 test_authenticated_decryption(const struct aead_test_data *tdata)
10173 {
10174 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10175 	struct crypto_unittest_params *ut_params = &unittest_params;
10176 
10177 	int retval;
10178 	uint8_t *plaintext;
10179 	uint32_t i;
10180 	struct rte_cryptodev_info dev_info;
10181 
10182 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10183 	uint64_t feat_flags = dev_info.feature_flags;
10184 
10185 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10186 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10187 		printf("Device doesn't support RAW data-path APIs.\n");
10188 		return TEST_SKIPPED;
10189 	}
10190 
10191 	/* Verify the capabilities */
10192 	struct rte_cryptodev_sym_capability_idx cap_idx;
10193 	const struct rte_cryptodev_symmetric_capability *capability;
10194 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10195 	cap_idx.algo.aead = tdata->algo;
10196 	capability = rte_cryptodev_sym_capability_get(
10197 			ts_params->valid_devs[0], &cap_idx);
10198 	if (capability == NULL)
10199 		return TEST_SKIPPED;
10200 	if (rte_cryptodev_sym_capability_check_aead(
10201 			capability, tdata->key.len, tdata->auth_tag.len,
10202 			tdata->aad.len, tdata->iv.len))
10203 		return TEST_SKIPPED;
10204 
10205 	/* Create AEAD session */
10206 	retval = create_aead_session(ts_params->valid_devs[0],
10207 			tdata->algo,
10208 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10209 			tdata->key.data, tdata->key.len,
10210 			tdata->aad.len, tdata->auth_tag.len,
10211 			tdata->iv.len);
10212 	if (retval < 0)
10213 		return retval;
10214 
10215 	/* alloc mbuf and set payload */
10216 	if (tdata->aad.len > MBUF_SIZE) {
10217 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10218 		/* Populate full size of add data */
10219 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
10220 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
10221 	} else
10222 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10223 
10224 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10225 			rte_pktmbuf_tailroom(ut_params->ibuf));
10226 
10227 	/* Create AEAD operation */
10228 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10229 	if (retval < 0)
10230 		return retval;
10231 
10232 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10233 
10234 	ut_params->op->sym->m_src = ut_params->ibuf;
10235 
10236 	/* Process crypto operation */
10237 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10238 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
10239 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10240 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10241 				ut_params->op, 0, 0, 0, 0);
10242 	else
10243 		TEST_ASSERT_NOT_NULL(
10244 			process_crypto_request(ts_params->valid_devs[0],
10245 			ut_params->op), "failed to process sym crypto op");
10246 
10247 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10248 			"crypto op processing failed");
10249 
10250 	if (ut_params->op->sym->m_dst)
10251 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
10252 				uint8_t *);
10253 	else
10254 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
10255 				uint8_t *,
10256 				ut_params->op->sym->cipher.data.offset);
10257 
10258 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10259 
10260 	/* Validate obuf */
10261 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10262 			plaintext,
10263 			tdata->plaintext.data,
10264 			tdata->plaintext.len,
10265 			"Plaintext data not as expected");
10266 
10267 	TEST_ASSERT_EQUAL(ut_params->op->status,
10268 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10269 			"Authentication failed");
10270 
10271 	return 0;
10272 }
10273 
10274 static int
10275 test_AES_GCM_authenticated_decryption_test_case_1(void)
10276 {
10277 	return test_authenticated_decryption(&gcm_test_case_1);
10278 }
10279 
10280 static int
10281 test_AES_GCM_authenticated_decryption_test_case_2(void)
10282 {
10283 	return test_authenticated_decryption(&gcm_test_case_2);
10284 }
10285 
10286 static int
10287 test_AES_GCM_authenticated_decryption_test_case_3(void)
10288 {
10289 	return test_authenticated_decryption(&gcm_test_case_3);
10290 }
10291 
10292 static int
10293 test_AES_GCM_authenticated_decryption_test_case_4(void)
10294 {
10295 	return test_authenticated_decryption(&gcm_test_case_4);
10296 }
10297 
10298 static int
10299 test_AES_GCM_authenticated_decryption_test_case_5(void)
10300 {
10301 	return test_authenticated_decryption(&gcm_test_case_5);
10302 }
10303 
10304 static int
10305 test_AES_GCM_authenticated_decryption_test_case_6(void)
10306 {
10307 	return test_authenticated_decryption(&gcm_test_case_6);
10308 }
10309 
10310 static int
10311 test_AES_GCM_authenticated_decryption_test_case_7(void)
10312 {
10313 	return test_authenticated_decryption(&gcm_test_case_7);
10314 }
10315 
10316 static int
10317 test_AES_GCM_authenticated_decryption_test_case_8(void)
10318 {
10319 	return test_authenticated_decryption(&gcm_test_case_8);
10320 }
10321 
10322 static int
10323 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
10324 {
10325 	return test_authenticated_decryption(&gcm_J0_test_case_1);
10326 }
10327 
10328 static int
10329 test_AES_GCM_auth_decryption_test_case_192_1(void)
10330 {
10331 	return test_authenticated_decryption(&gcm_test_case_192_1);
10332 }
10333 
10334 static int
10335 test_AES_GCM_auth_decryption_test_case_192_2(void)
10336 {
10337 	return test_authenticated_decryption(&gcm_test_case_192_2);
10338 }
10339 
10340 static int
10341 test_AES_GCM_auth_decryption_test_case_192_3(void)
10342 {
10343 	return test_authenticated_decryption(&gcm_test_case_192_3);
10344 }
10345 
10346 static int
10347 test_AES_GCM_auth_decryption_test_case_192_4(void)
10348 {
10349 	return test_authenticated_decryption(&gcm_test_case_192_4);
10350 }
10351 
10352 static int
10353 test_AES_GCM_auth_decryption_test_case_192_5(void)
10354 {
10355 	return test_authenticated_decryption(&gcm_test_case_192_5);
10356 }
10357 
10358 static int
10359 test_AES_GCM_auth_decryption_test_case_192_6(void)
10360 {
10361 	return test_authenticated_decryption(&gcm_test_case_192_6);
10362 }
10363 
10364 static int
10365 test_AES_GCM_auth_decryption_test_case_192_7(void)
10366 {
10367 	return test_authenticated_decryption(&gcm_test_case_192_7);
10368 }
10369 
10370 static int
10371 test_AES_GCM_auth_decryption_test_case_256_1(void)
10372 {
10373 	return test_authenticated_decryption(&gcm_test_case_256_1);
10374 }
10375 
10376 static int
10377 test_AES_GCM_auth_decryption_test_case_256_2(void)
10378 {
10379 	return test_authenticated_decryption(&gcm_test_case_256_2);
10380 }
10381 
10382 static int
10383 test_AES_GCM_auth_decryption_test_case_256_3(void)
10384 {
10385 	return test_authenticated_decryption(&gcm_test_case_256_3);
10386 }
10387 
10388 static int
10389 test_AES_GCM_auth_decryption_test_case_256_4(void)
10390 {
10391 	return test_authenticated_decryption(&gcm_test_case_256_4);
10392 }
10393 
10394 static int
10395 test_AES_GCM_auth_decryption_test_case_256_5(void)
10396 {
10397 	return test_authenticated_decryption(&gcm_test_case_256_5);
10398 }
10399 
10400 static int
10401 test_AES_GCM_auth_decryption_test_case_256_6(void)
10402 {
10403 	return test_authenticated_decryption(&gcm_test_case_256_6);
10404 }
10405 
10406 static int
10407 test_AES_GCM_auth_decryption_test_case_256_7(void)
10408 {
10409 	return test_authenticated_decryption(&gcm_test_case_256_7);
10410 }
10411 
10412 static int
10413 test_AES_GCM_auth_decryption_test_case_aad_1(void)
10414 {
10415 	return test_authenticated_decryption(&gcm_test_case_aad_1);
10416 }
10417 
10418 static int
10419 test_AES_GCM_auth_decryption_test_case_aad_2(void)
10420 {
10421 	return test_authenticated_decryption(&gcm_test_case_aad_2);
10422 }
10423 
10424 static int
10425 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
10426 {
10427 	struct aead_test_data tdata;
10428 	int res;
10429 
10430 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10431 	tdata.iv.data[0] += 1;
10432 	res = test_authenticated_decryption(&tdata);
10433 	if (res == TEST_SKIPPED)
10434 		return res;
10435 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10436 	return TEST_SUCCESS;
10437 }
10438 
10439 static int
10440 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
10441 {
10442 	struct aead_test_data tdata;
10443 	int res;
10444 
10445 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10446 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10447 	tdata.plaintext.data[0] += 1;
10448 	res = test_authenticated_decryption(&tdata);
10449 	if (res == TEST_SKIPPED)
10450 		return res;
10451 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10452 	return TEST_SUCCESS;
10453 }
10454 
10455 static int
10456 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
10457 {
10458 	struct aead_test_data tdata;
10459 	int res;
10460 
10461 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10462 	tdata.ciphertext.data[0] += 1;
10463 	res = test_authenticated_decryption(&tdata);
10464 	if (res == TEST_SKIPPED)
10465 		return res;
10466 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10467 	return TEST_SUCCESS;
10468 }
10469 
10470 static int
10471 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
10472 {
10473 	struct aead_test_data tdata;
10474 	int res;
10475 
10476 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10477 	tdata.aad.len += 1;
10478 	res = test_authenticated_decryption(&tdata);
10479 	if (res == TEST_SKIPPED)
10480 		return res;
10481 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10482 	return TEST_SUCCESS;
10483 }
10484 
10485 static int
10486 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
10487 {
10488 	struct aead_test_data tdata;
10489 	uint8_t aad[gcm_test_case_7.aad.len];
10490 	int res;
10491 
10492 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10493 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10494 	aad[0] += 1;
10495 	tdata.aad.data = aad;
10496 	res = test_authenticated_decryption(&tdata);
10497 	if (res == TEST_SKIPPED)
10498 		return res;
10499 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10500 	return TEST_SUCCESS;
10501 }
10502 
10503 static int
10504 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
10505 {
10506 	struct aead_test_data tdata;
10507 	int res;
10508 
10509 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10510 	tdata.auth_tag.data[0] += 1;
10511 	res = test_authenticated_decryption(&tdata);
10512 	if (res == TEST_SKIPPED)
10513 		return res;
10514 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
10515 	return TEST_SUCCESS;
10516 }
10517 
10518 static int
10519 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
10520 {
10521 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10522 	struct crypto_unittest_params *ut_params = &unittest_params;
10523 
10524 	int retval;
10525 	uint8_t *ciphertext, *auth_tag;
10526 	uint16_t plaintext_pad_len;
10527 	struct rte_cryptodev_info dev_info;
10528 
10529 	/* Verify the capabilities */
10530 	struct rte_cryptodev_sym_capability_idx cap_idx;
10531 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10532 	cap_idx.algo.aead = tdata->algo;
10533 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10534 			&cap_idx) == NULL)
10535 		return TEST_SKIPPED;
10536 
10537 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10538 	uint64_t feat_flags = dev_info.feature_flags;
10539 
10540 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10541 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)))
10542 		return TEST_SKIPPED;
10543 
10544 	/* not supported with CPU crypto */
10545 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10546 		return TEST_SKIPPED;
10547 
10548 	/* Create AEAD session */
10549 	retval = create_aead_session(ts_params->valid_devs[0],
10550 			tdata->algo,
10551 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
10552 			tdata->key.data, tdata->key.len,
10553 			tdata->aad.len, tdata->auth_tag.len,
10554 			tdata->iv.len);
10555 	if (retval < 0)
10556 		return retval;
10557 
10558 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10559 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10560 
10561 	/* clear mbuf payload */
10562 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10563 			rte_pktmbuf_tailroom(ut_params->ibuf));
10564 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10565 			rte_pktmbuf_tailroom(ut_params->obuf));
10566 
10567 	/* Create AEAD operation */
10568 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10569 	if (retval < 0)
10570 		return retval;
10571 
10572 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10573 
10574 	ut_params->op->sym->m_src = ut_params->ibuf;
10575 	ut_params->op->sym->m_dst = ut_params->obuf;
10576 
10577 	/* Process crypto operation */
10578 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10579 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10580 			ut_params->op, 0, 0, 0, 0);
10581 	else
10582 		TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10583 			ut_params->op), "failed to process sym crypto op");
10584 
10585 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10586 			"crypto op processing failed");
10587 
10588 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10589 
10590 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10591 			ut_params->op->sym->cipher.data.offset);
10592 	auth_tag = ciphertext + plaintext_pad_len;
10593 
10594 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10595 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10596 
10597 	/* Validate obuf */
10598 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10599 			ciphertext,
10600 			tdata->ciphertext.data,
10601 			tdata->ciphertext.len,
10602 			"Ciphertext data not as expected");
10603 
10604 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10605 			auth_tag,
10606 			tdata->auth_tag.data,
10607 			tdata->auth_tag.len,
10608 			"Generated auth tag not as expected");
10609 
10610 	return 0;
10611 
10612 }
10613 
10614 static int
10615 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
10616 {
10617 	return test_authenticated_encryption_oop(&gcm_test_case_5);
10618 }
10619 
10620 static int
10621 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
10622 {
10623 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10624 	struct crypto_unittest_params *ut_params = &unittest_params;
10625 
10626 	int retval;
10627 	uint8_t *plaintext;
10628 	struct rte_cryptodev_info dev_info;
10629 
10630 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10631 	uint64_t feat_flags = dev_info.feature_flags;
10632 
10633 	/* Verify the capabilities */
10634 	struct rte_cryptodev_sym_capability_idx cap_idx;
10635 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10636 	cap_idx.algo.aead = tdata->algo;
10637 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10638 			&cap_idx) == NULL)
10639 		return TEST_SKIPPED;
10640 
10641 	/* not supported with CPU crypto and raw data-path APIs*/
10642 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
10643 			global_api_test_type == CRYPTODEV_RAW_API_TEST)
10644 		return TEST_SKIPPED;
10645 
10646 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10647 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10648 		printf("Device does not support RAW data-path APIs.\n");
10649 		return TEST_SKIPPED;
10650 	}
10651 
10652 	/* Create AEAD session */
10653 	retval = create_aead_session(ts_params->valid_devs[0],
10654 			tdata->algo,
10655 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10656 			tdata->key.data, tdata->key.len,
10657 			tdata->aad.len, tdata->auth_tag.len,
10658 			tdata->iv.len);
10659 	if (retval < 0)
10660 		return retval;
10661 
10662 	/* alloc mbuf and set payload */
10663 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10664 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10665 
10666 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10667 			rte_pktmbuf_tailroom(ut_params->ibuf));
10668 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10669 			rte_pktmbuf_tailroom(ut_params->obuf));
10670 
10671 	/* Create AEAD operation */
10672 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10673 	if (retval < 0)
10674 		return retval;
10675 
10676 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10677 
10678 	ut_params->op->sym->m_src = ut_params->ibuf;
10679 	ut_params->op->sym->m_dst = ut_params->obuf;
10680 
10681 	/* Process crypto operation */
10682 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10683 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10684 				ut_params->op, 0, 0, 0, 0);
10685 	else
10686 		TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10687 			ut_params->op), "failed to process sym crypto op");
10688 
10689 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10690 			"crypto op processing failed");
10691 
10692 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10693 			ut_params->op->sym->cipher.data.offset);
10694 
10695 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10696 
10697 	/* Validate obuf */
10698 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10699 			plaintext,
10700 			tdata->plaintext.data,
10701 			tdata->plaintext.len,
10702 			"Plaintext data not as expected");
10703 
10704 	TEST_ASSERT_EQUAL(ut_params->op->status,
10705 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10706 			"Authentication failed");
10707 	return 0;
10708 }
10709 
10710 static int
10711 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
10712 {
10713 	return test_authenticated_decryption_oop(&gcm_test_case_5);
10714 }
10715 
10716 static int
10717 test_authenticated_encryption_sessionless(
10718 		const struct aead_test_data *tdata)
10719 {
10720 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10721 	struct crypto_unittest_params *ut_params = &unittest_params;
10722 
10723 	int retval;
10724 	uint8_t *ciphertext, *auth_tag;
10725 	uint16_t plaintext_pad_len;
10726 	uint8_t key[tdata->key.len + 1];
10727 	struct rte_cryptodev_info dev_info;
10728 
10729 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10730 	uint64_t feat_flags = dev_info.feature_flags;
10731 
10732 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10733 		printf("Device doesn't support Sessionless ops.\n");
10734 		return TEST_SKIPPED;
10735 	}
10736 
10737 	/* not supported with CPU crypto */
10738 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10739 		return TEST_SKIPPED;
10740 
10741 	/* Verify the capabilities */
10742 	struct rte_cryptodev_sym_capability_idx cap_idx;
10743 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10744 	cap_idx.algo.aead = tdata->algo;
10745 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10746 			&cap_idx) == NULL)
10747 		return TEST_SKIPPED;
10748 
10749 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10750 
10751 	/* clear mbuf payload */
10752 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10753 			rte_pktmbuf_tailroom(ut_params->ibuf));
10754 
10755 	/* Create AEAD operation */
10756 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10757 	if (retval < 0)
10758 		return retval;
10759 
10760 	/* Create GCM xform */
10761 	memcpy(key, tdata->key.data, tdata->key.len);
10762 	retval = create_aead_xform(ut_params->op,
10763 			tdata->algo,
10764 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
10765 			key, tdata->key.len,
10766 			tdata->aad.len, tdata->auth_tag.len,
10767 			tdata->iv.len);
10768 	if (retval < 0)
10769 		return retval;
10770 
10771 	ut_params->op->sym->m_src = ut_params->ibuf;
10772 
10773 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10774 			RTE_CRYPTO_OP_SESSIONLESS,
10775 			"crypto op session type not sessionless");
10776 
10777 	/* Process crypto operation */
10778 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10779 			ut_params->op), "failed to process sym crypto op");
10780 
10781 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10782 
10783 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10784 			"crypto op status not success");
10785 
10786 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10787 
10788 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10789 			ut_params->op->sym->cipher.data.offset);
10790 	auth_tag = ciphertext + plaintext_pad_len;
10791 
10792 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10793 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10794 
10795 	/* Validate obuf */
10796 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10797 			ciphertext,
10798 			tdata->ciphertext.data,
10799 			tdata->ciphertext.len,
10800 			"Ciphertext data not as expected");
10801 
10802 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10803 			auth_tag,
10804 			tdata->auth_tag.data,
10805 			tdata->auth_tag.len,
10806 			"Generated auth tag not as expected");
10807 
10808 	return 0;
10809 
10810 }
10811 
10812 static int
10813 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
10814 {
10815 	return test_authenticated_encryption_sessionless(
10816 			&gcm_test_case_5);
10817 }
10818 
10819 static int
10820 test_authenticated_decryption_sessionless(
10821 		const struct aead_test_data *tdata)
10822 {
10823 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10824 	struct crypto_unittest_params *ut_params = &unittest_params;
10825 
10826 	int retval;
10827 	uint8_t *plaintext;
10828 	uint8_t key[tdata->key.len + 1];
10829 	struct rte_cryptodev_info dev_info;
10830 
10831 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10832 	uint64_t feat_flags = dev_info.feature_flags;
10833 
10834 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10835 		printf("Device doesn't support Sessionless ops.\n");
10836 		return TEST_SKIPPED;
10837 	}
10838 
10839 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10840 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10841 		printf("Device doesn't support RAW data-path APIs.\n");
10842 		return TEST_SKIPPED;
10843 	}
10844 
10845 	/* not supported with CPU crypto */
10846 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10847 		return TEST_SKIPPED;
10848 
10849 	/* Verify the capabilities */
10850 	struct rte_cryptodev_sym_capability_idx cap_idx;
10851 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10852 	cap_idx.algo.aead = tdata->algo;
10853 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10854 			&cap_idx) == NULL)
10855 		return TEST_SKIPPED;
10856 
10857 	/* alloc mbuf and set payload */
10858 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10859 
10860 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10861 			rte_pktmbuf_tailroom(ut_params->ibuf));
10862 
10863 	/* Create AEAD operation */
10864 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10865 	if (retval < 0)
10866 		return retval;
10867 
10868 	/* Create AEAD xform */
10869 	memcpy(key, tdata->key.data, tdata->key.len);
10870 	retval = create_aead_xform(ut_params->op,
10871 			tdata->algo,
10872 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10873 			key, tdata->key.len,
10874 			tdata->aad.len, tdata->auth_tag.len,
10875 			tdata->iv.len);
10876 	if (retval < 0)
10877 		return retval;
10878 
10879 	ut_params->op->sym->m_src = ut_params->ibuf;
10880 
10881 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10882 			RTE_CRYPTO_OP_SESSIONLESS,
10883 			"crypto op session type not sessionless");
10884 
10885 	/* Process crypto operation */
10886 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10887 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10888 				ut_params->op, 0, 0, 0, 0);
10889 	else
10890 		TEST_ASSERT_NOT_NULL(process_crypto_request(
10891 			ts_params->valid_devs[0], ut_params->op),
10892 				"failed to process sym crypto op");
10893 
10894 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10895 
10896 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10897 			"crypto op status not success");
10898 
10899 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10900 			ut_params->op->sym->cipher.data.offset);
10901 
10902 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10903 
10904 	/* Validate obuf */
10905 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10906 			plaintext,
10907 			tdata->plaintext.data,
10908 			tdata->plaintext.len,
10909 			"Plaintext data not as expected");
10910 
10911 	TEST_ASSERT_EQUAL(ut_params->op->status,
10912 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10913 			"Authentication failed");
10914 	return 0;
10915 }
10916 
10917 static int
10918 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
10919 {
10920 	return test_authenticated_decryption_sessionless(
10921 			&gcm_test_case_5);
10922 }
10923 
10924 static int
10925 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
10926 {
10927 	return test_authenticated_encryption(&ccm_test_case_128_1);
10928 }
10929 
10930 static int
10931 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
10932 {
10933 	return test_authenticated_encryption(&ccm_test_case_128_2);
10934 }
10935 
10936 static int
10937 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
10938 {
10939 	return test_authenticated_encryption(&ccm_test_case_128_3);
10940 }
10941 
10942 static int
10943 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
10944 {
10945 	return test_authenticated_decryption(&ccm_test_case_128_1);
10946 }
10947 
10948 static int
10949 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
10950 {
10951 	return test_authenticated_decryption(&ccm_test_case_128_2);
10952 }
10953 
10954 static int
10955 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
10956 {
10957 	return test_authenticated_decryption(&ccm_test_case_128_3);
10958 }
10959 
10960 static int
10961 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
10962 {
10963 	return test_authenticated_encryption(&ccm_test_case_192_1);
10964 }
10965 
10966 static int
10967 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
10968 {
10969 	return test_authenticated_encryption(&ccm_test_case_192_2);
10970 }
10971 
10972 static int
10973 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
10974 {
10975 	return test_authenticated_encryption(&ccm_test_case_192_3);
10976 }
10977 
10978 static int
10979 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
10980 {
10981 	return test_authenticated_decryption(&ccm_test_case_192_1);
10982 }
10983 
10984 static int
10985 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
10986 {
10987 	return test_authenticated_decryption(&ccm_test_case_192_2);
10988 }
10989 
10990 static int
10991 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
10992 {
10993 	return test_authenticated_decryption(&ccm_test_case_192_3);
10994 }
10995 
10996 static int
10997 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
10998 {
10999 	return test_authenticated_encryption(&ccm_test_case_256_1);
11000 }
11001 
11002 static int
11003 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
11004 {
11005 	return test_authenticated_encryption(&ccm_test_case_256_2);
11006 }
11007 
11008 static int
11009 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
11010 {
11011 	return test_authenticated_encryption(&ccm_test_case_256_3);
11012 }
11013 
11014 static int
11015 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
11016 {
11017 	return test_authenticated_decryption(&ccm_test_case_256_1);
11018 }
11019 
11020 static int
11021 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
11022 {
11023 	return test_authenticated_decryption(&ccm_test_case_256_2);
11024 }
11025 
11026 static int
11027 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
11028 {
11029 	return test_authenticated_decryption(&ccm_test_case_256_3);
11030 }
11031 
11032 static int
11033 test_stats(void)
11034 {
11035 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11036 	struct rte_cryptodev_stats stats;
11037 
11038 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11039 		return TEST_SKIPPED;
11040 
11041 	/* Verify the capabilities */
11042 	struct rte_cryptodev_sym_capability_idx cap_idx;
11043 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11044 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
11045 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11046 			&cap_idx) == NULL)
11047 		return TEST_SKIPPED;
11048 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11049 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11050 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11051 			&cap_idx) == NULL)
11052 		return TEST_SKIPPED;
11053 
11054 	if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
11055 			== -ENOTSUP)
11056 		return TEST_SKIPPED;
11057 
11058 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11059 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
11060 			&stats) == -ENODEV),
11061 		"rte_cryptodev_stats_get invalid dev failed");
11062 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
11063 		"rte_cryptodev_stats_get invalid Param failed");
11064 
11065 	/* Test expected values */
11066 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
11067 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11068 			&stats),
11069 		"rte_cryptodev_stats_get failed");
11070 	TEST_ASSERT((stats.enqueued_count == 1),
11071 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11072 	TEST_ASSERT((stats.dequeued_count == 1),
11073 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11074 	TEST_ASSERT((stats.enqueue_err_count == 0),
11075 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11076 	TEST_ASSERT((stats.dequeue_err_count == 0),
11077 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11078 
11079 	/* invalid device but should ignore and not reset device stats*/
11080 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
11081 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11082 			&stats),
11083 		"rte_cryptodev_stats_get failed");
11084 	TEST_ASSERT((stats.enqueued_count == 1),
11085 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11086 
11087 	/* check that a valid reset clears stats */
11088 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11089 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11090 			&stats),
11091 					  "rte_cryptodev_stats_get failed");
11092 	TEST_ASSERT((stats.enqueued_count == 0),
11093 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11094 	TEST_ASSERT((stats.dequeued_count == 0),
11095 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11096 
11097 	return TEST_SUCCESS;
11098 }
11099 
11100 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
11101 				   struct crypto_unittest_params *ut_params,
11102 				   enum rte_crypto_auth_operation op,
11103 				   const struct HMAC_MD5_vector *test_case)
11104 {
11105 	uint8_t key[64];
11106 
11107 	memcpy(key, test_case->key.data, test_case->key.len);
11108 
11109 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11110 	ut_params->auth_xform.next = NULL;
11111 	ut_params->auth_xform.auth.op = op;
11112 
11113 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
11114 
11115 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
11116 	ut_params->auth_xform.auth.key.length = test_case->key.len;
11117 	ut_params->auth_xform.auth.key.data = key;
11118 
11119 	ut_params->sess = rte_cryptodev_sym_session_create(
11120 			ts_params->session_mpool);
11121 
11122 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11123 			ut_params->sess, &ut_params->auth_xform,
11124 			ts_params->session_priv_mpool);
11125 
11126 	if (ut_params->sess == NULL)
11127 		return TEST_FAILED;
11128 
11129 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11130 
11131 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11132 			rte_pktmbuf_tailroom(ut_params->ibuf));
11133 
11134 	return 0;
11135 }
11136 
11137 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
11138 			      const struct HMAC_MD5_vector *test_case,
11139 			      uint8_t **plaintext)
11140 {
11141 	uint16_t plaintext_pad_len;
11142 
11143 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11144 
11145 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11146 				16);
11147 
11148 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11149 			plaintext_pad_len);
11150 	memcpy(*plaintext, test_case->plaintext.data,
11151 			test_case->plaintext.len);
11152 
11153 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11154 			ut_params->ibuf, MD5_DIGEST_LEN);
11155 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11156 			"no room to append digest");
11157 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11158 			ut_params->ibuf, plaintext_pad_len);
11159 
11160 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11161 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
11162 			   test_case->auth_tag.len);
11163 	}
11164 
11165 	sym_op->auth.data.offset = 0;
11166 	sym_op->auth.data.length = test_case->plaintext.len;
11167 
11168 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11169 	ut_params->op->sym->m_src = ut_params->ibuf;
11170 
11171 	return 0;
11172 }
11173 
11174 static int
11175 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
11176 {
11177 	uint16_t plaintext_pad_len;
11178 	uint8_t *plaintext, *auth_tag;
11179 
11180 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11181 	struct crypto_unittest_params *ut_params = &unittest_params;
11182 	struct rte_cryptodev_info dev_info;
11183 
11184 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11185 	uint64_t feat_flags = dev_info.feature_flags;
11186 
11187 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11188 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11189 		printf("Device doesn't support RAW data-path APIs.\n");
11190 		return TEST_SKIPPED;
11191 	}
11192 
11193 	/* Verify the capabilities */
11194 	struct rte_cryptodev_sym_capability_idx cap_idx;
11195 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11196 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11197 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11198 			&cap_idx) == NULL)
11199 		return TEST_SKIPPED;
11200 
11201 	if (MD5_HMAC_create_session(ts_params, ut_params,
11202 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
11203 		return TEST_FAILED;
11204 
11205 	/* Generate Crypto op data structure */
11206 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11207 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11208 	TEST_ASSERT_NOT_NULL(ut_params->op,
11209 			"Failed to allocate symmetric crypto operation struct");
11210 
11211 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11212 				16);
11213 
11214 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11215 		return TEST_FAILED;
11216 
11217 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11218 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11219 			ut_params->op);
11220 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11221 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11222 				ut_params->op, 0, 1, 0, 0);
11223 	else
11224 		TEST_ASSERT_NOT_NULL(
11225 			process_crypto_request(ts_params->valid_devs[0],
11226 				ut_params->op),
11227 				"failed to process sym crypto op");
11228 
11229 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11230 			"crypto op processing failed");
11231 
11232 	if (ut_params->op->sym->m_dst) {
11233 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11234 				uint8_t *, plaintext_pad_len);
11235 	} else {
11236 		auth_tag = plaintext + plaintext_pad_len;
11237 	}
11238 
11239 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11240 			auth_tag,
11241 			test_case->auth_tag.data,
11242 			test_case->auth_tag.len,
11243 			"HMAC_MD5 generated tag not as expected");
11244 
11245 	return TEST_SUCCESS;
11246 }
11247 
11248 static int
11249 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
11250 {
11251 	uint8_t *plaintext;
11252 
11253 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11254 	struct crypto_unittest_params *ut_params = &unittest_params;
11255 	struct rte_cryptodev_info dev_info;
11256 
11257 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11258 	uint64_t feat_flags = dev_info.feature_flags;
11259 
11260 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11261 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11262 		printf("Device doesn't support RAW data-path APIs.\n");
11263 		return TEST_SKIPPED;
11264 	}
11265 
11266 	/* Verify the capabilities */
11267 	struct rte_cryptodev_sym_capability_idx cap_idx;
11268 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11269 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11270 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11271 			&cap_idx) == NULL)
11272 		return TEST_SKIPPED;
11273 
11274 	if (MD5_HMAC_create_session(ts_params, ut_params,
11275 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
11276 		return TEST_FAILED;
11277 	}
11278 
11279 	/* Generate Crypto op data structure */
11280 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11281 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11282 	TEST_ASSERT_NOT_NULL(ut_params->op,
11283 			"Failed to allocate symmetric crypto operation struct");
11284 
11285 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11286 		return TEST_FAILED;
11287 
11288 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11289 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11290 			ut_params->op);
11291 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11292 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11293 				ut_params->op, 0, 1, 0, 0);
11294 	else
11295 		TEST_ASSERT_NOT_NULL(
11296 			process_crypto_request(ts_params->valid_devs[0],
11297 				ut_params->op),
11298 				"failed to process sym crypto op");
11299 
11300 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11301 			"HMAC_MD5 crypto op processing failed");
11302 
11303 	return TEST_SUCCESS;
11304 }
11305 
11306 static int
11307 test_MD5_HMAC_generate_case_1(void)
11308 {
11309 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
11310 }
11311 
11312 static int
11313 test_MD5_HMAC_verify_case_1(void)
11314 {
11315 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
11316 }
11317 
11318 static int
11319 test_MD5_HMAC_generate_case_2(void)
11320 {
11321 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
11322 }
11323 
11324 static int
11325 test_MD5_HMAC_verify_case_2(void)
11326 {
11327 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
11328 }
11329 
11330 static int
11331 test_multi_session(void)
11332 {
11333 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11334 	struct crypto_unittest_params *ut_params = &unittest_params;
11335 
11336 	struct rte_cryptodev_info dev_info;
11337 	struct rte_cryptodev_sym_session **sessions;
11338 
11339 	uint16_t i;
11340 
11341 	/* Verify the capabilities */
11342 	struct rte_cryptodev_sym_capability_idx cap_idx;
11343 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11344 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11345 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11346 			&cap_idx) == NULL)
11347 		return TEST_SKIPPED;
11348 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11349 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11350 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11351 			&cap_idx) == NULL)
11352 		return TEST_SKIPPED;
11353 
11354 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
11355 			aes_cbc_key, hmac_sha512_key);
11356 
11357 
11358 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11359 
11360 	sessions = rte_malloc(NULL,
11361 			sizeof(struct rte_cryptodev_sym_session *) *
11362 			(MAX_NB_SESSIONS + 1), 0);
11363 
11364 	/* Create multiple crypto sessions*/
11365 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
11366 
11367 		sessions[i] = rte_cryptodev_sym_session_create(
11368 				ts_params->session_mpool);
11369 
11370 		rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11371 				sessions[i], &ut_params->auth_xform,
11372 				ts_params->session_priv_mpool);
11373 		TEST_ASSERT_NOT_NULL(sessions[i],
11374 				"Session creation failed at session number %u",
11375 				i);
11376 
11377 		/* Attempt to send a request on each session */
11378 		TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
11379 			sessions[i],
11380 			ut_params,
11381 			ts_params,
11382 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
11383 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
11384 			aes_cbc_iv),
11385 			"Failed to perform decrypt on request number %u.", i);
11386 		/* free crypto operation structure */
11387 		if (ut_params->op)
11388 			rte_crypto_op_free(ut_params->op);
11389 
11390 		/*
11391 		 * free mbuf - both obuf and ibuf are usually the same,
11392 		 * so check if they point at the same address is necessary,
11393 		 * to avoid freeing the mbuf twice.
11394 		 */
11395 		if (ut_params->obuf) {
11396 			rte_pktmbuf_free(ut_params->obuf);
11397 			if (ut_params->ibuf == ut_params->obuf)
11398 				ut_params->ibuf = 0;
11399 			ut_params->obuf = 0;
11400 		}
11401 		if (ut_params->ibuf) {
11402 			rte_pktmbuf_free(ut_params->ibuf);
11403 			ut_params->ibuf = 0;
11404 		}
11405 	}
11406 
11407 	sessions[i] = NULL;
11408 	/* Next session create should fail */
11409 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11410 			sessions[i], &ut_params->auth_xform,
11411 			ts_params->session_priv_mpool);
11412 	TEST_ASSERT_NULL(sessions[i],
11413 			"Session creation succeeded unexpectedly!");
11414 
11415 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
11416 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11417 				sessions[i]);
11418 		rte_cryptodev_sym_session_free(sessions[i]);
11419 	}
11420 
11421 	rte_free(sessions);
11422 
11423 	return TEST_SUCCESS;
11424 }
11425 
11426 struct multi_session_params {
11427 	struct crypto_unittest_params ut_params;
11428 	uint8_t *cipher_key;
11429 	uint8_t *hmac_key;
11430 	const uint8_t *cipher;
11431 	const uint8_t *digest;
11432 	uint8_t *iv;
11433 };
11434 
11435 #define MB_SESSION_NUMBER 3
11436 
11437 static int
11438 test_multi_session_random_usage(void)
11439 {
11440 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11441 	struct rte_cryptodev_info dev_info;
11442 	struct rte_cryptodev_sym_session **sessions;
11443 	uint32_t i, j;
11444 	struct multi_session_params ut_paramz[] = {
11445 
11446 		{
11447 			.cipher_key = ms_aes_cbc_key0,
11448 			.hmac_key = ms_hmac_key0,
11449 			.cipher = ms_aes_cbc_cipher0,
11450 			.digest = ms_hmac_digest0,
11451 			.iv = ms_aes_cbc_iv0
11452 		},
11453 		{
11454 			.cipher_key = ms_aes_cbc_key1,
11455 			.hmac_key = ms_hmac_key1,
11456 			.cipher = ms_aes_cbc_cipher1,
11457 			.digest = ms_hmac_digest1,
11458 			.iv = ms_aes_cbc_iv1
11459 		},
11460 		{
11461 			.cipher_key = ms_aes_cbc_key2,
11462 			.hmac_key = ms_hmac_key2,
11463 			.cipher = ms_aes_cbc_cipher2,
11464 			.digest = ms_hmac_digest2,
11465 			.iv = ms_aes_cbc_iv2
11466 		},
11467 
11468 	};
11469 
11470 	/* Verify the capabilities */
11471 	struct rte_cryptodev_sym_capability_idx cap_idx;
11472 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11473 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11474 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11475 			&cap_idx) == NULL)
11476 		return TEST_SKIPPED;
11477 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11478 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11479 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11480 			&cap_idx) == NULL)
11481 		return TEST_SKIPPED;
11482 
11483 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11484 
11485 	sessions = rte_malloc(NULL,
11486 			(sizeof(struct rte_cryptodev_sym_session *)
11487 					* MAX_NB_SESSIONS) + 1, 0);
11488 
11489 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
11490 		sessions[i] = rte_cryptodev_sym_session_create(
11491 				ts_params->session_mpool);
11492 
11493 		rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
11494 				sizeof(struct crypto_unittest_params));
11495 
11496 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
11497 				&ut_paramz[i].ut_params,
11498 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
11499 
11500 		/* Create multiple crypto sessions*/
11501 		rte_cryptodev_sym_session_init(
11502 				ts_params->valid_devs[0],
11503 				sessions[i],
11504 				&ut_paramz[i].ut_params.auth_xform,
11505 				ts_params->session_priv_mpool);
11506 
11507 		TEST_ASSERT_NOT_NULL(sessions[i],
11508 				"Session creation failed at session number %u",
11509 				i);
11510 
11511 	}
11512 
11513 	srand(time(NULL));
11514 	for (i = 0; i < 40000; i++) {
11515 
11516 		j = rand() % MB_SESSION_NUMBER;
11517 
11518 		TEST_ASSERT_SUCCESS(
11519 			test_AES_CBC_HMAC_SHA512_decrypt_perform(
11520 					sessions[j],
11521 					&ut_paramz[j].ut_params,
11522 					ts_params, ut_paramz[j].cipher,
11523 					ut_paramz[j].digest,
11524 					ut_paramz[j].iv),
11525 			"Failed to perform decrypt on request number %u.", i);
11526 
11527 		if (ut_paramz[j].ut_params.op)
11528 			rte_crypto_op_free(ut_paramz[j].ut_params.op);
11529 
11530 		/*
11531 		 * free mbuf - both obuf and ibuf are usually the same,
11532 		 * so check if they point at the same address is necessary,
11533 		 * to avoid freeing the mbuf twice.
11534 		 */
11535 		if (ut_paramz[j].ut_params.obuf) {
11536 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
11537 			if (ut_paramz[j].ut_params.ibuf
11538 					== ut_paramz[j].ut_params.obuf)
11539 				ut_paramz[j].ut_params.ibuf = 0;
11540 			ut_paramz[j].ut_params.obuf = 0;
11541 		}
11542 		if (ut_paramz[j].ut_params.ibuf) {
11543 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
11544 			ut_paramz[j].ut_params.ibuf = 0;
11545 		}
11546 	}
11547 
11548 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
11549 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11550 				sessions[i]);
11551 		rte_cryptodev_sym_session_free(sessions[i]);
11552 	}
11553 
11554 	rte_free(sessions);
11555 
11556 	return TEST_SUCCESS;
11557 }
11558 
11559 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
11560 			0xab, 0xab, 0xab, 0xab,
11561 			0xab, 0xab, 0xab, 0xab,
11562 			0xab, 0xab, 0xab, 0xab};
11563 
11564 static int
11565 test_null_invalid_operation(void)
11566 {
11567 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11568 	struct crypto_unittest_params *ut_params = &unittest_params;
11569 	int ret;
11570 
11571 	/* This test is for NULL PMD only */
11572 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
11573 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11574 		return TEST_SKIPPED;
11575 
11576 	/* Setup Cipher Parameters */
11577 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11578 	ut_params->cipher_xform.next = NULL;
11579 
11580 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
11581 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11582 
11583 	ut_params->sess = rte_cryptodev_sym_session_create(
11584 			ts_params->session_mpool);
11585 
11586 	/* Create Crypto session*/
11587 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11588 			ut_params->sess, &ut_params->cipher_xform,
11589 			ts_params->session_priv_mpool);
11590 	TEST_ASSERT(ret < 0,
11591 			"Session creation succeeded unexpectedly");
11592 
11593 
11594 	/* Setup HMAC Parameters */
11595 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11596 	ut_params->auth_xform.next = NULL;
11597 
11598 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
11599 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11600 
11601 	ut_params->sess = rte_cryptodev_sym_session_create(
11602 			ts_params->session_mpool);
11603 
11604 	/* Create Crypto session*/
11605 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11606 			ut_params->sess, &ut_params->auth_xform,
11607 			ts_params->session_priv_mpool);
11608 	TEST_ASSERT(ret < 0,
11609 			"Session creation succeeded unexpectedly");
11610 
11611 	return TEST_SUCCESS;
11612 }
11613 
11614 
11615 #define NULL_BURST_LENGTH (32)
11616 
11617 static int
11618 test_null_burst_operation(void)
11619 {
11620 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11621 	struct crypto_unittest_params *ut_params = &unittest_params;
11622 
11623 	unsigned i, burst_len = NULL_BURST_LENGTH;
11624 
11625 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
11626 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
11627 
11628 	/* This test is for NULL PMD only */
11629 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
11630 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11631 		return TEST_SKIPPED;
11632 
11633 	/* Setup Cipher Parameters */
11634 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11635 	ut_params->cipher_xform.next = &ut_params->auth_xform;
11636 
11637 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
11638 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11639 
11640 	/* Setup HMAC Parameters */
11641 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11642 	ut_params->auth_xform.next = NULL;
11643 
11644 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
11645 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11646 
11647 	ut_params->sess = rte_cryptodev_sym_session_create(
11648 			ts_params->session_mpool);
11649 
11650 	/* Create Crypto session*/
11651 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11652 			ut_params->sess, &ut_params->cipher_xform,
11653 			ts_params->session_priv_mpool);
11654 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11655 
11656 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
11657 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
11658 			burst_len, "failed to generate burst of crypto ops");
11659 
11660 	/* Generate an operation for each mbuf in burst */
11661 	for (i = 0; i < burst_len; i++) {
11662 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11663 
11664 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
11665 
11666 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
11667 				sizeof(unsigned));
11668 		*data = i;
11669 
11670 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
11671 
11672 		burst[i]->sym->m_src = m;
11673 	}
11674 
11675 	/* Process crypto operation */
11676 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
11677 			0, burst, burst_len),
11678 			burst_len,
11679 			"Error enqueuing burst");
11680 
11681 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
11682 			0, burst_dequeued, burst_len),
11683 			burst_len,
11684 			"Error dequeuing burst");
11685 
11686 
11687 	for (i = 0; i < burst_len; i++) {
11688 		TEST_ASSERT_EQUAL(
11689 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
11690 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
11691 					uint32_t *),
11692 			"data not as expected");
11693 
11694 		rte_pktmbuf_free(burst[i]->sym->m_src);
11695 		rte_crypto_op_free(burst[i]);
11696 	}
11697 
11698 	return TEST_SUCCESS;
11699 }
11700 
11701 static uint16_t
11702 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11703 		  uint16_t nb_ops, void *user_param)
11704 {
11705 	RTE_SET_USED(dev_id);
11706 	RTE_SET_USED(qp_id);
11707 	RTE_SET_USED(ops);
11708 	RTE_SET_USED(user_param);
11709 
11710 	printf("crypto enqueue callback called\n");
11711 	return nb_ops;
11712 }
11713 
11714 static uint16_t
11715 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11716 		  uint16_t nb_ops, void *user_param)
11717 {
11718 	RTE_SET_USED(dev_id);
11719 	RTE_SET_USED(qp_id);
11720 	RTE_SET_USED(ops);
11721 	RTE_SET_USED(user_param);
11722 
11723 	printf("crypto dequeue callback called\n");
11724 	return nb_ops;
11725 }
11726 
11727 /*
11728  * Thread using enqueue/dequeue callback with RCU.
11729  */
11730 static int
11731 test_enqdeq_callback_thread(void *arg)
11732 {
11733 	RTE_SET_USED(arg);
11734 	/* DP thread calls rte_cryptodev_enqueue_burst()/
11735 	 * rte_cryptodev_dequeue_burst() and invokes callback.
11736 	 */
11737 	test_null_burst_operation();
11738 	return 0;
11739 }
11740 
11741 static int
11742 test_enq_callback_setup(void)
11743 {
11744 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11745 	struct rte_cryptodev_info dev_info;
11746 	struct rte_cryptodev_qp_conf qp_conf = {
11747 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
11748 	};
11749 
11750 	struct rte_cryptodev_cb *cb;
11751 	uint16_t qp_id = 0;
11752 
11753 	/* Stop the device in case it's started so it can be configured */
11754 	rte_cryptodev_stop(ts_params->valid_devs[0]);
11755 
11756 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11757 
11758 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11759 			&ts_params->conf),
11760 			"Failed to configure cryptodev %u",
11761 			ts_params->valid_devs[0]);
11762 
11763 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11764 	qp_conf.mp_session = ts_params->session_mpool;
11765 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
11766 
11767 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11768 			ts_params->valid_devs[0], qp_id, &qp_conf,
11769 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11770 			"Failed test for "
11771 			"rte_cryptodev_queue_pair_setup: num_inflights "
11772 			"%u on qp %u on cryptodev %u",
11773 			qp_conf.nb_descriptors, qp_id,
11774 			ts_params->valid_devs[0]);
11775 
11776 	/* Test with invalid crypto device */
11777 	cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
11778 			qp_id, test_enq_callback, NULL);
11779 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11780 			"cryptodev %u did not fail",
11781 			qp_id, RTE_CRYPTO_MAX_DEVS);
11782 
11783 	/* Test with invalid queue pair */
11784 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11785 			dev_info.max_nb_queue_pairs + 1,
11786 			test_enq_callback, NULL);
11787 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11788 			"cryptodev %u did not fail",
11789 			dev_info.max_nb_queue_pairs + 1,
11790 			ts_params->valid_devs[0]);
11791 
11792 	/* Test with NULL callback */
11793 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11794 			qp_id, NULL, NULL);
11795 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11796 			"cryptodev %u did not fail",
11797 			qp_id, ts_params->valid_devs[0]);
11798 
11799 	/* Test with valid configuration */
11800 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11801 			qp_id, test_enq_callback, NULL);
11802 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11803 			"qp %u on cryptodev %u",
11804 			qp_id, ts_params->valid_devs[0]);
11805 
11806 	rte_cryptodev_start(ts_params->valid_devs[0]);
11807 
11808 	/* Launch a thread */
11809 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11810 				rte_get_next_lcore(-1, 1, 0));
11811 
11812 	/* Wait until reader exited. */
11813 	rte_eal_mp_wait_lcore();
11814 
11815 	/* Test with invalid crypto device */
11816 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11817 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11818 			"Expected call to fail as crypto device is invalid");
11819 
11820 	/* Test with invalid queue pair */
11821 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11822 			ts_params->valid_devs[0],
11823 			dev_info.max_nb_queue_pairs + 1, cb),
11824 			"Expected call to fail as queue pair is invalid");
11825 
11826 	/* Test with NULL callback */
11827 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11828 			ts_params->valid_devs[0], qp_id, NULL),
11829 			"Expected call to fail as callback is NULL");
11830 
11831 	/* Test with valid configuration */
11832 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
11833 			ts_params->valid_devs[0], qp_id, cb),
11834 			"Failed test to remove callback on "
11835 			"qp %u on cryptodev %u",
11836 			qp_id, ts_params->valid_devs[0]);
11837 
11838 	return TEST_SUCCESS;
11839 }
11840 
11841 static int
11842 test_deq_callback_setup(void)
11843 {
11844 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11845 	struct rte_cryptodev_info dev_info;
11846 	struct rte_cryptodev_qp_conf qp_conf = {
11847 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
11848 	};
11849 
11850 	struct rte_cryptodev_cb *cb;
11851 	uint16_t qp_id = 0;
11852 
11853 	/* Stop the device in case it's started so it can be configured */
11854 	rte_cryptodev_stop(ts_params->valid_devs[0]);
11855 
11856 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11857 
11858 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11859 			&ts_params->conf),
11860 			"Failed to configure cryptodev %u",
11861 			ts_params->valid_devs[0]);
11862 
11863 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11864 	qp_conf.mp_session = ts_params->session_mpool;
11865 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
11866 
11867 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11868 			ts_params->valid_devs[0], qp_id, &qp_conf,
11869 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11870 			"Failed test for "
11871 			"rte_cryptodev_queue_pair_setup: num_inflights "
11872 			"%u on qp %u on cryptodev %u",
11873 			qp_conf.nb_descriptors, qp_id,
11874 			ts_params->valid_devs[0]);
11875 
11876 	/* Test with invalid crypto device */
11877 	cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
11878 			qp_id, test_deq_callback, NULL);
11879 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11880 			"cryptodev %u did not fail",
11881 			qp_id, RTE_CRYPTO_MAX_DEVS);
11882 
11883 	/* Test with invalid queue pair */
11884 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11885 			dev_info.max_nb_queue_pairs + 1,
11886 			test_deq_callback, NULL);
11887 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11888 			"cryptodev %u did not fail",
11889 			dev_info.max_nb_queue_pairs + 1,
11890 			ts_params->valid_devs[0]);
11891 
11892 	/* Test with NULL callback */
11893 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11894 			qp_id, NULL, NULL);
11895 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11896 			"cryptodev %u did not fail",
11897 			qp_id, ts_params->valid_devs[0]);
11898 
11899 	/* Test with valid configuration */
11900 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11901 			qp_id, test_deq_callback, NULL);
11902 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11903 			"qp %u on cryptodev %u",
11904 			qp_id, ts_params->valid_devs[0]);
11905 
11906 	rte_cryptodev_start(ts_params->valid_devs[0]);
11907 
11908 	/* Launch a thread */
11909 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11910 				rte_get_next_lcore(-1, 1, 0));
11911 
11912 	/* Wait until reader exited. */
11913 	rte_eal_mp_wait_lcore();
11914 
11915 	/* Test with invalid crypto device */
11916 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11917 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11918 			"Expected call to fail as crypto device is invalid");
11919 
11920 	/* Test with invalid queue pair */
11921 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11922 			ts_params->valid_devs[0],
11923 			dev_info.max_nb_queue_pairs + 1, cb),
11924 			"Expected call to fail as queue pair is invalid");
11925 
11926 	/* Test with NULL callback */
11927 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11928 			ts_params->valid_devs[0], qp_id, NULL),
11929 			"Expected call to fail as callback is NULL");
11930 
11931 	/* Test with valid configuration */
11932 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
11933 			ts_params->valid_devs[0], qp_id, cb),
11934 			"Failed test to remove callback on "
11935 			"qp %u on cryptodev %u",
11936 			qp_id, ts_params->valid_devs[0]);
11937 
11938 	return TEST_SUCCESS;
11939 }
11940 
11941 static void
11942 generate_gmac_large_plaintext(uint8_t *data)
11943 {
11944 	uint16_t i;
11945 
11946 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
11947 		memcpy(&data[i], &data[0], 32);
11948 }
11949 
11950 static int
11951 create_gmac_operation(enum rte_crypto_auth_operation op,
11952 		const struct gmac_test_data *tdata)
11953 {
11954 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11955 	struct crypto_unittest_params *ut_params = &unittest_params;
11956 	struct rte_crypto_sym_op *sym_op;
11957 
11958 	uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11959 
11960 	/* Generate Crypto op data structure */
11961 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11962 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11963 	TEST_ASSERT_NOT_NULL(ut_params->op,
11964 			"Failed to allocate symmetric crypto operation struct");
11965 
11966 	sym_op = ut_params->op->sym;
11967 
11968 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11969 			ut_params->ibuf, tdata->gmac_tag.len);
11970 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11971 			"no room to append digest");
11972 
11973 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11974 			ut_params->ibuf, plaintext_pad_len);
11975 
11976 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11977 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11978 				tdata->gmac_tag.len);
11979 		debug_hexdump(stdout, "digest:",
11980 				sym_op->auth.digest.data,
11981 				tdata->gmac_tag.len);
11982 	}
11983 
11984 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11985 			uint8_t *, IV_OFFSET);
11986 
11987 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11988 
11989 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11990 
11991 	sym_op->cipher.data.length = 0;
11992 	sym_op->cipher.data.offset = 0;
11993 
11994 	sym_op->auth.data.offset = 0;
11995 	sym_op->auth.data.length = tdata->plaintext.len;
11996 
11997 	return 0;
11998 }
11999 
12000 static int
12001 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
12002 		const struct gmac_test_data *tdata,
12003 		void *digest_mem, uint64_t digest_phys)
12004 {
12005 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12006 	struct crypto_unittest_params *ut_params = &unittest_params;
12007 	struct rte_crypto_sym_op *sym_op;
12008 
12009 	/* Generate Crypto op data structure */
12010 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12011 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12012 	TEST_ASSERT_NOT_NULL(ut_params->op,
12013 			"Failed to allocate symmetric crypto operation struct");
12014 
12015 	sym_op = ut_params->op->sym;
12016 
12017 	sym_op->auth.digest.data = digest_mem;
12018 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12019 			"no room to append digest");
12020 
12021 	sym_op->auth.digest.phys_addr = digest_phys;
12022 
12023 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12024 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12025 				tdata->gmac_tag.len);
12026 		debug_hexdump(stdout, "digest:",
12027 				sym_op->auth.digest.data,
12028 				tdata->gmac_tag.len);
12029 	}
12030 
12031 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12032 			uint8_t *, IV_OFFSET);
12033 
12034 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12035 
12036 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12037 
12038 	sym_op->cipher.data.length = 0;
12039 	sym_op->cipher.data.offset = 0;
12040 
12041 	sym_op->auth.data.offset = 0;
12042 	sym_op->auth.data.length = tdata->plaintext.len;
12043 
12044 	return 0;
12045 }
12046 
12047 static int create_gmac_session(uint8_t dev_id,
12048 		const struct gmac_test_data *tdata,
12049 		enum rte_crypto_auth_operation auth_op)
12050 {
12051 	uint8_t auth_key[tdata->key.len];
12052 
12053 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12054 	struct crypto_unittest_params *ut_params = &unittest_params;
12055 
12056 	memcpy(auth_key, tdata->key.data, tdata->key.len);
12057 
12058 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12059 	ut_params->auth_xform.next = NULL;
12060 
12061 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
12062 	ut_params->auth_xform.auth.op = auth_op;
12063 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
12064 	ut_params->auth_xform.auth.key.length = tdata->key.len;
12065 	ut_params->auth_xform.auth.key.data = auth_key;
12066 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12067 	ut_params->auth_xform.auth.iv.length = tdata->iv.len;
12068 
12069 
12070 	ut_params->sess = rte_cryptodev_sym_session_create(
12071 			ts_params->session_mpool);
12072 
12073 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12074 			&ut_params->auth_xform,
12075 			ts_params->session_priv_mpool);
12076 
12077 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12078 
12079 	return 0;
12080 }
12081 
12082 static int
12083 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
12084 {
12085 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12086 	struct crypto_unittest_params *ut_params = &unittest_params;
12087 	struct rte_cryptodev_info dev_info;
12088 
12089 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12090 	uint64_t feat_flags = dev_info.feature_flags;
12091 
12092 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12093 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12094 		printf("Device doesn't support RAW data-path APIs.\n");
12095 		return TEST_SKIPPED;
12096 	}
12097 
12098 	int retval;
12099 
12100 	uint8_t *auth_tag, *plaintext;
12101 	uint16_t plaintext_pad_len;
12102 
12103 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12104 			      "No GMAC length in the source data");
12105 
12106 	/* Verify the capabilities */
12107 	struct rte_cryptodev_sym_capability_idx cap_idx;
12108 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12109 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12110 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12111 			&cap_idx) == NULL)
12112 		return TEST_SKIPPED;
12113 
12114 	retval = create_gmac_session(ts_params->valid_devs[0],
12115 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12116 
12117 	if (retval < 0)
12118 		return retval;
12119 
12120 	if (tdata->plaintext.len > MBUF_SIZE)
12121 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12122 	else
12123 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12124 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12125 			"Failed to allocate input buffer in mempool");
12126 
12127 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12128 			rte_pktmbuf_tailroom(ut_params->ibuf));
12129 
12130 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12131 	/*
12132 	 * Runtime generate the large plain text instead of use hard code
12133 	 * plain text vector. It is done to avoid create huge source file
12134 	 * with the test vector.
12135 	 */
12136 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12137 		generate_gmac_large_plaintext(tdata->plaintext.data);
12138 
12139 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12140 				plaintext_pad_len);
12141 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12142 
12143 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12144 	debug_hexdump(stdout, "plaintext:", plaintext,
12145 			tdata->plaintext.len);
12146 
12147 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
12148 			tdata);
12149 
12150 	if (retval < 0)
12151 		return retval;
12152 
12153 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12154 
12155 	ut_params->op->sym->m_src = ut_params->ibuf;
12156 
12157 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12158 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12159 			ut_params->op);
12160 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12161 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12162 				ut_params->op, 0, 1, 0, 0);
12163 	else
12164 		TEST_ASSERT_NOT_NULL(
12165 			process_crypto_request(ts_params->valid_devs[0],
12166 			ut_params->op), "failed to process sym crypto op");
12167 
12168 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12169 			"crypto op processing failed");
12170 
12171 	if (ut_params->op->sym->m_dst) {
12172 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12173 				uint8_t *, plaintext_pad_len);
12174 	} else {
12175 		auth_tag = plaintext + plaintext_pad_len;
12176 	}
12177 
12178 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12179 
12180 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12181 			auth_tag,
12182 			tdata->gmac_tag.data,
12183 			tdata->gmac_tag.len,
12184 			"GMAC Generated auth tag not as expected");
12185 
12186 	return 0;
12187 }
12188 
12189 static int
12190 test_AES_GMAC_authentication_test_case_1(void)
12191 {
12192 	return test_AES_GMAC_authentication(&gmac_test_case_1);
12193 }
12194 
12195 static int
12196 test_AES_GMAC_authentication_test_case_2(void)
12197 {
12198 	return test_AES_GMAC_authentication(&gmac_test_case_2);
12199 }
12200 
12201 static int
12202 test_AES_GMAC_authentication_test_case_3(void)
12203 {
12204 	return test_AES_GMAC_authentication(&gmac_test_case_3);
12205 }
12206 
12207 static int
12208 test_AES_GMAC_authentication_test_case_4(void)
12209 {
12210 	return test_AES_GMAC_authentication(&gmac_test_case_4);
12211 }
12212 
12213 static int
12214 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
12215 {
12216 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12217 	struct crypto_unittest_params *ut_params = &unittest_params;
12218 	int retval;
12219 	uint32_t plaintext_pad_len;
12220 	uint8_t *plaintext;
12221 	struct rte_cryptodev_info dev_info;
12222 
12223 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12224 	uint64_t feat_flags = dev_info.feature_flags;
12225 
12226 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12227 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12228 		printf("Device doesn't support RAW data-path APIs.\n");
12229 		return TEST_SKIPPED;
12230 	}
12231 
12232 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12233 			      "No GMAC length in the source data");
12234 
12235 	/* Verify the capabilities */
12236 	struct rte_cryptodev_sym_capability_idx cap_idx;
12237 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12238 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12239 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12240 			&cap_idx) == NULL)
12241 		return TEST_SKIPPED;
12242 
12243 	retval = create_gmac_session(ts_params->valid_devs[0],
12244 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
12245 
12246 	if (retval < 0)
12247 		return retval;
12248 
12249 	if (tdata->plaintext.len > MBUF_SIZE)
12250 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12251 	else
12252 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12253 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12254 			"Failed to allocate input buffer in mempool");
12255 
12256 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12257 			rte_pktmbuf_tailroom(ut_params->ibuf));
12258 
12259 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12260 
12261 	/*
12262 	 * Runtime generate the large plain text instead of use hard code
12263 	 * plain text vector. It is done to avoid create huge source file
12264 	 * with the test vector.
12265 	 */
12266 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12267 		generate_gmac_large_plaintext(tdata->plaintext.data);
12268 
12269 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12270 				plaintext_pad_len);
12271 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12272 
12273 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12274 	debug_hexdump(stdout, "plaintext:", plaintext,
12275 			tdata->plaintext.len);
12276 
12277 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
12278 			tdata);
12279 
12280 	if (retval < 0)
12281 		return retval;
12282 
12283 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12284 
12285 	ut_params->op->sym->m_src = ut_params->ibuf;
12286 
12287 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12288 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12289 			ut_params->op);
12290 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12291 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12292 				ut_params->op, 0, 1, 0, 0);
12293 	else
12294 		TEST_ASSERT_NOT_NULL(
12295 			process_crypto_request(ts_params->valid_devs[0],
12296 			ut_params->op), "failed to process sym crypto op");
12297 
12298 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12299 			"crypto op processing failed");
12300 
12301 	return 0;
12302 
12303 }
12304 
12305 static int
12306 test_AES_GMAC_authentication_verify_test_case_1(void)
12307 {
12308 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
12309 }
12310 
12311 static int
12312 test_AES_GMAC_authentication_verify_test_case_2(void)
12313 {
12314 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
12315 }
12316 
12317 static int
12318 test_AES_GMAC_authentication_verify_test_case_3(void)
12319 {
12320 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
12321 }
12322 
12323 static int
12324 test_AES_GMAC_authentication_verify_test_case_4(void)
12325 {
12326 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
12327 }
12328 
12329 static int
12330 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
12331 				uint32_t fragsz)
12332 {
12333 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12334 	struct crypto_unittest_params *ut_params = &unittest_params;
12335 	struct rte_cryptodev_info dev_info;
12336 	uint64_t feature_flags;
12337 	unsigned int trn_data = 0;
12338 	void *digest_mem = NULL;
12339 	uint32_t segs = 1;
12340 	unsigned int to_trn = 0;
12341 	struct rte_mbuf *buf = NULL;
12342 	uint8_t *auth_tag, *plaintext;
12343 	int retval;
12344 
12345 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12346 			      "No GMAC length in the source data");
12347 
12348 	/* Verify the capabilities */
12349 	struct rte_cryptodev_sym_capability_idx cap_idx;
12350 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12351 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12352 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12353 			&cap_idx) == NULL)
12354 		return TEST_SKIPPED;
12355 
12356 	/* Check for any input SGL support */
12357 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12358 	feature_flags = dev_info.feature_flags;
12359 
12360 	if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
12361 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
12362 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
12363 		return TEST_SKIPPED;
12364 
12365 	if (fragsz > tdata->plaintext.len)
12366 		fragsz = tdata->plaintext.len;
12367 
12368 	uint16_t plaintext_len = fragsz;
12369 
12370 	retval = create_gmac_session(ts_params->valid_devs[0],
12371 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12372 
12373 	if (retval < 0)
12374 		return retval;
12375 
12376 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12377 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12378 			"Failed to allocate input buffer in mempool");
12379 
12380 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12381 			rte_pktmbuf_tailroom(ut_params->ibuf));
12382 
12383 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12384 				plaintext_len);
12385 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12386 
12387 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12388 
12389 	trn_data += plaintext_len;
12390 
12391 	buf = ut_params->ibuf;
12392 
12393 	/*
12394 	 * Loop until no more fragments
12395 	 */
12396 
12397 	while (trn_data < tdata->plaintext.len) {
12398 		++segs;
12399 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12400 				(tdata->plaintext.len - trn_data) : fragsz;
12401 
12402 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12403 		buf = buf->next;
12404 
12405 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12406 				rte_pktmbuf_tailroom(buf));
12407 
12408 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12409 				to_trn);
12410 
12411 		memcpy(plaintext, tdata->plaintext.data + trn_data,
12412 				to_trn);
12413 		trn_data += to_trn;
12414 		if (trn_data  == tdata->plaintext.len)
12415 			digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12416 					tdata->gmac_tag.len);
12417 	}
12418 	ut_params->ibuf->nb_segs = segs;
12419 
12420 	/*
12421 	 * Place digest at the end of the last buffer
12422 	 */
12423 	uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12424 
12425 	if (!digest_mem) {
12426 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12427 				+ tdata->gmac_tag.len);
12428 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12429 				tdata->plaintext.len);
12430 	}
12431 
12432 	retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
12433 			tdata, digest_mem, digest_phys);
12434 
12435 	if (retval < 0)
12436 		return retval;
12437 
12438 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12439 
12440 	ut_params->op->sym->m_src = ut_params->ibuf;
12441 
12442 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12443 		return TEST_SKIPPED;
12444 
12445 	TEST_ASSERT_NOT_NULL(
12446 		process_crypto_request(ts_params->valid_devs[0],
12447 		ut_params->op), "failed to process sym crypto op");
12448 
12449 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12450 			"crypto op processing failed");
12451 
12452 	auth_tag = digest_mem;
12453 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12454 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12455 			auth_tag,
12456 			tdata->gmac_tag.data,
12457 			tdata->gmac_tag.len,
12458 			"GMAC Generated auth tag not as expected");
12459 
12460 	return 0;
12461 }
12462 
12463 /* Segment size not multiple of block size (16B) */
12464 static int
12465 test_AES_GMAC_authentication_SGL_40B(void)
12466 {
12467 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
12468 }
12469 
12470 static int
12471 test_AES_GMAC_authentication_SGL_80B(void)
12472 {
12473 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
12474 }
12475 
12476 static int
12477 test_AES_GMAC_authentication_SGL_2048B(void)
12478 {
12479 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
12480 }
12481 
12482 /* Segment size not multiple of block size (16B) */
12483 static int
12484 test_AES_GMAC_authentication_SGL_2047B(void)
12485 {
12486 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
12487 }
12488 
12489 struct test_crypto_vector {
12490 	enum rte_crypto_cipher_algorithm crypto_algo;
12491 	unsigned int cipher_offset;
12492 	unsigned int cipher_len;
12493 
12494 	struct {
12495 		uint8_t data[64];
12496 		unsigned int len;
12497 	} cipher_key;
12498 
12499 	struct {
12500 		uint8_t data[64];
12501 		unsigned int len;
12502 	} iv;
12503 
12504 	struct {
12505 		const uint8_t *data;
12506 		unsigned int len;
12507 	} plaintext;
12508 
12509 	struct {
12510 		const uint8_t *data;
12511 		unsigned int len;
12512 	} ciphertext;
12513 
12514 	enum rte_crypto_auth_algorithm auth_algo;
12515 	unsigned int auth_offset;
12516 
12517 	struct {
12518 		uint8_t data[128];
12519 		unsigned int len;
12520 	} auth_key;
12521 
12522 	struct {
12523 		const uint8_t *data;
12524 		unsigned int len;
12525 	} aad;
12526 
12527 	struct {
12528 		uint8_t data[128];
12529 		unsigned int len;
12530 	} digest;
12531 };
12532 
12533 static const struct test_crypto_vector
12534 hmac_sha1_test_crypto_vector = {
12535 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12536 	.plaintext = {
12537 		.data = plaintext_hash,
12538 		.len = 512
12539 	},
12540 	.auth_key = {
12541 		.data = {
12542 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12543 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12544 			0xDE, 0xF4, 0xDE, 0xAD
12545 		},
12546 		.len = 20
12547 	},
12548 	.digest = {
12549 		.data = {
12550 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
12551 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
12552 			0x3F, 0x91, 0x64, 0x59
12553 		},
12554 		.len = 20
12555 	}
12556 };
12557 
12558 static const struct test_crypto_vector
12559 aes128_gmac_test_vector = {
12560 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
12561 	.plaintext = {
12562 		.data = plaintext_hash,
12563 		.len = 512
12564 	},
12565 	.iv = {
12566 		.data = {
12567 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12568 			0x08, 0x09, 0x0A, 0x0B
12569 		},
12570 		.len = 12
12571 	},
12572 	.auth_key = {
12573 		.data = {
12574 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12575 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
12576 		},
12577 		.len = 16
12578 	},
12579 	.digest = {
12580 		.data = {
12581 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
12582 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
12583 		},
12584 		.len = 16
12585 	}
12586 };
12587 
12588 static const struct test_crypto_vector
12589 aes128cbc_hmac_sha1_test_vector = {
12590 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12591 	.cipher_offset = 0,
12592 	.cipher_len = 512,
12593 	.cipher_key = {
12594 		.data = {
12595 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12596 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12597 		},
12598 		.len = 16
12599 	},
12600 	.iv = {
12601 		.data = {
12602 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12603 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12604 		},
12605 		.len = 16
12606 	},
12607 	.plaintext = {
12608 		.data = plaintext_hash,
12609 		.len = 512
12610 	},
12611 	.ciphertext = {
12612 		.data = ciphertext512_aes128cbc,
12613 		.len = 512
12614 	},
12615 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12616 	.auth_offset = 0,
12617 	.auth_key = {
12618 		.data = {
12619 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12620 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12621 			0xDE, 0xF4, 0xDE, 0xAD
12622 		},
12623 		.len = 20
12624 	},
12625 	.digest = {
12626 		.data = {
12627 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
12628 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12629 			0x18, 0x8C, 0x1D, 0x32
12630 		},
12631 		.len = 20
12632 	}
12633 };
12634 
12635 static const struct test_crypto_vector
12636 aes128cbc_hmac_sha1_aad_test_vector = {
12637 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12638 	.cipher_offset = 8,
12639 	.cipher_len = 496,
12640 	.cipher_key = {
12641 		.data = {
12642 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12643 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12644 		},
12645 		.len = 16
12646 	},
12647 	.iv = {
12648 		.data = {
12649 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12650 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12651 		},
12652 		.len = 16
12653 	},
12654 	.plaintext = {
12655 		.data = plaintext_hash,
12656 		.len = 512
12657 	},
12658 	.ciphertext = {
12659 		.data = ciphertext512_aes128cbc_aad,
12660 		.len = 512
12661 	},
12662 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12663 	.auth_offset = 0,
12664 	.auth_key = {
12665 		.data = {
12666 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12667 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12668 			0xDE, 0xF4, 0xDE, 0xAD
12669 		},
12670 		.len = 20
12671 	},
12672 	.digest = {
12673 		.data = {
12674 			0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
12675 			0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
12676 			0x62, 0x0F, 0xFB, 0x10
12677 		},
12678 		.len = 20
12679 	}
12680 };
12681 
12682 static void
12683 data_corruption(uint8_t *data)
12684 {
12685 	data[0] += 1;
12686 }
12687 
12688 static void
12689 tag_corruption(uint8_t *data, unsigned int tag_offset)
12690 {
12691 	data[tag_offset] += 1;
12692 }
12693 
12694 static int
12695 create_auth_session(struct crypto_unittest_params *ut_params,
12696 		uint8_t dev_id,
12697 		const struct test_crypto_vector *reference,
12698 		enum rte_crypto_auth_operation auth_op)
12699 {
12700 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12701 	uint8_t auth_key[reference->auth_key.len + 1];
12702 
12703 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12704 
12705 	/* Setup Authentication Parameters */
12706 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12707 	ut_params->auth_xform.auth.op = auth_op;
12708 	ut_params->auth_xform.next = NULL;
12709 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12710 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12711 	ut_params->auth_xform.auth.key.data = auth_key;
12712 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12713 
12714 	/* Create Crypto session*/
12715 	ut_params->sess = rte_cryptodev_sym_session_create(
12716 			ts_params->session_mpool);
12717 
12718 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12719 				&ut_params->auth_xform,
12720 				ts_params->session_priv_mpool);
12721 
12722 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12723 
12724 	return 0;
12725 }
12726 
12727 static int
12728 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
12729 		uint8_t dev_id,
12730 		const struct test_crypto_vector *reference,
12731 		enum rte_crypto_auth_operation auth_op,
12732 		enum rte_crypto_cipher_operation cipher_op)
12733 {
12734 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12735 	uint8_t cipher_key[reference->cipher_key.len + 1];
12736 	uint8_t auth_key[reference->auth_key.len + 1];
12737 
12738 	memcpy(cipher_key, reference->cipher_key.data,
12739 			reference->cipher_key.len);
12740 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12741 
12742 	/* Setup Authentication Parameters */
12743 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12744 	ut_params->auth_xform.auth.op = auth_op;
12745 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12746 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12747 	ut_params->auth_xform.auth.key.data = auth_key;
12748 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12749 
12750 	if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
12751 		ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12752 		ut_params->auth_xform.auth.iv.length = reference->iv.len;
12753 	} else {
12754 		ut_params->auth_xform.next = &ut_params->cipher_xform;
12755 
12756 		/* Setup Cipher Parameters */
12757 		ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12758 		ut_params->cipher_xform.next = NULL;
12759 		ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12760 		ut_params->cipher_xform.cipher.op = cipher_op;
12761 		ut_params->cipher_xform.cipher.key.data = cipher_key;
12762 		ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12763 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12764 		ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12765 	}
12766 
12767 	/* Create Crypto session*/
12768 	ut_params->sess = rte_cryptodev_sym_session_create(
12769 			ts_params->session_mpool);
12770 
12771 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12772 				&ut_params->auth_xform,
12773 				ts_params->session_priv_mpool);
12774 
12775 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12776 
12777 	return 0;
12778 }
12779 
12780 static int
12781 create_auth_operation(struct crypto_testsuite_params *ts_params,
12782 		struct crypto_unittest_params *ut_params,
12783 		const struct test_crypto_vector *reference,
12784 		unsigned int auth_generate)
12785 {
12786 	/* Generate Crypto op data structure */
12787 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12788 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12789 	TEST_ASSERT_NOT_NULL(ut_params->op,
12790 			"Failed to allocate pktmbuf offload");
12791 
12792 	/* Set crypto operation data parameters */
12793 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12794 
12795 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12796 
12797 	/* set crypto operation source mbuf */
12798 	sym_op->m_src = ut_params->ibuf;
12799 
12800 	/* digest */
12801 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12802 			ut_params->ibuf, reference->digest.len);
12803 
12804 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12805 			"no room to append auth tag");
12806 
12807 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12808 			ut_params->ibuf, reference->plaintext.len);
12809 
12810 	if (auth_generate)
12811 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12812 	else
12813 		memcpy(sym_op->auth.digest.data,
12814 				reference->digest.data,
12815 				reference->digest.len);
12816 
12817 	debug_hexdump(stdout, "digest:",
12818 			sym_op->auth.digest.data,
12819 			reference->digest.len);
12820 
12821 	sym_op->auth.data.length = reference->plaintext.len;
12822 	sym_op->auth.data.offset = 0;
12823 
12824 	return 0;
12825 }
12826 
12827 static int
12828 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
12829 		struct crypto_unittest_params *ut_params,
12830 		const struct test_crypto_vector *reference,
12831 		unsigned int auth_generate)
12832 {
12833 	/* Generate Crypto op data structure */
12834 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12835 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12836 	TEST_ASSERT_NOT_NULL(ut_params->op,
12837 			"Failed to allocate pktmbuf offload");
12838 
12839 	/* Set crypto operation data parameters */
12840 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12841 
12842 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12843 
12844 	/* set crypto operation source mbuf */
12845 	sym_op->m_src = ut_params->ibuf;
12846 
12847 	/* digest */
12848 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12849 			ut_params->ibuf, reference->digest.len);
12850 
12851 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12852 			"no room to append auth tag");
12853 
12854 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12855 			ut_params->ibuf, reference->ciphertext.len);
12856 
12857 	if (auth_generate)
12858 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12859 	else
12860 		memcpy(sym_op->auth.digest.data,
12861 				reference->digest.data,
12862 				reference->digest.len);
12863 
12864 	debug_hexdump(stdout, "digest:",
12865 			sym_op->auth.digest.data,
12866 			reference->digest.len);
12867 
12868 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12869 			reference->iv.data, reference->iv.len);
12870 
12871 	sym_op->cipher.data.length = 0;
12872 	sym_op->cipher.data.offset = 0;
12873 
12874 	sym_op->auth.data.length = reference->plaintext.len;
12875 	sym_op->auth.data.offset = 0;
12876 
12877 	return 0;
12878 }
12879 
12880 static int
12881 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
12882 		struct crypto_unittest_params *ut_params,
12883 		const struct test_crypto_vector *reference,
12884 		unsigned int auth_generate)
12885 {
12886 	/* Generate Crypto op data structure */
12887 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12888 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12889 	TEST_ASSERT_NOT_NULL(ut_params->op,
12890 			"Failed to allocate pktmbuf offload");
12891 
12892 	/* Set crypto operation data parameters */
12893 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12894 
12895 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12896 
12897 	/* set crypto operation source mbuf */
12898 	sym_op->m_src = ut_params->ibuf;
12899 
12900 	/* digest */
12901 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12902 			ut_params->ibuf, reference->digest.len);
12903 
12904 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12905 			"no room to append auth tag");
12906 
12907 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12908 			ut_params->ibuf, reference->ciphertext.len);
12909 
12910 	if (auth_generate)
12911 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12912 	else
12913 		memcpy(sym_op->auth.digest.data,
12914 				reference->digest.data,
12915 				reference->digest.len);
12916 
12917 	debug_hexdump(stdout, "digest:",
12918 			sym_op->auth.digest.data,
12919 			reference->digest.len);
12920 
12921 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12922 			reference->iv.data, reference->iv.len);
12923 
12924 	sym_op->cipher.data.length = reference->cipher_len;
12925 	sym_op->cipher.data.offset = reference->cipher_offset;
12926 
12927 	sym_op->auth.data.length = reference->plaintext.len;
12928 	sym_op->auth.data.offset = reference->auth_offset;
12929 
12930 	return 0;
12931 }
12932 
12933 static int
12934 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12935 		struct crypto_unittest_params *ut_params,
12936 		const struct test_crypto_vector *reference)
12937 {
12938 	return create_auth_operation(ts_params, ut_params, reference, 0);
12939 }
12940 
12941 static int
12942 create_auth_verify_GMAC_operation(
12943 		struct crypto_testsuite_params *ts_params,
12944 		struct crypto_unittest_params *ut_params,
12945 		const struct test_crypto_vector *reference)
12946 {
12947 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
12948 }
12949 
12950 static int
12951 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12952 		struct crypto_unittest_params *ut_params,
12953 		const struct test_crypto_vector *reference)
12954 {
12955 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
12956 }
12957 
12958 static int
12959 test_authentication_verify_fail_when_data_corruption(
12960 		struct crypto_testsuite_params *ts_params,
12961 		struct crypto_unittest_params *ut_params,
12962 		const struct test_crypto_vector *reference,
12963 		unsigned int data_corrupted)
12964 {
12965 	int retval;
12966 
12967 	uint8_t *plaintext;
12968 	struct rte_cryptodev_info dev_info;
12969 
12970 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12971 	uint64_t feat_flags = dev_info.feature_flags;
12972 
12973 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12974 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12975 		printf("Device doesn't support RAW data-path APIs.\n");
12976 		return TEST_SKIPPED;
12977 	}
12978 
12979 	/* Verify the capabilities */
12980 	struct rte_cryptodev_sym_capability_idx cap_idx;
12981 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12982 	cap_idx.algo.auth = reference->auth_algo;
12983 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12984 			&cap_idx) == NULL)
12985 		return TEST_SKIPPED;
12986 
12987 
12988 	/* Create session */
12989 	retval = create_auth_session(ut_params,
12990 			ts_params->valid_devs[0],
12991 			reference,
12992 			RTE_CRYPTO_AUTH_OP_VERIFY);
12993 	if (retval < 0)
12994 		return retval;
12995 
12996 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12997 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12998 			"Failed to allocate input buffer in mempool");
12999 
13000 	/* clear mbuf payload */
13001 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13002 			rte_pktmbuf_tailroom(ut_params->ibuf));
13003 
13004 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13005 			reference->plaintext.len);
13006 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13007 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13008 
13009 	debug_hexdump(stdout, "plaintext:", plaintext,
13010 		reference->plaintext.len);
13011 
13012 	/* Create operation */
13013 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
13014 
13015 	if (retval < 0)
13016 		return retval;
13017 
13018 	if (data_corrupted)
13019 		data_corruption(plaintext);
13020 	else
13021 		tag_corruption(plaintext, reference->plaintext.len);
13022 
13023 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13024 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13025 			ut_params->op);
13026 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13027 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13028 			"authentication not failed");
13029 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13030 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13031 				ut_params->op, 0, 1, 0, 0);
13032 	else {
13033 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13034 			ut_params->op);
13035 	}
13036 	if (ut_params->op == NULL)
13037 		return 0;
13038 	else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
13039 		return 0;
13040 
13041 	return -1;
13042 }
13043 
13044 static int
13045 test_authentication_verify_GMAC_fail_when_corruption(
13046 		struct crypto_testsuite_params *ts_params,
13047 		struct crypto_unittest_params *ut_params,
13048 		const struct test_crypto_vector *reference,
13049 		unsigned int data_corrupted)
13050 {
13051 	int retval;
13052 	uint8_t *plaintext;
13053 	struct rte_cryptodev_info dev_info;
13054 
13055 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13056 	uint64_t feat_flags = dev_info.feature_flags;
13057 
13058 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13059 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13060 		printf("Device doesn't support RAW data-path APIs.\n");
13061 		return TEST_SKIPPED;
13062 	}
13063 
13064 	/* Verify the capabilities */
13065 	struct rte_cryptodev_sym_capability_idx cap_idx;
13066 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13067 	cap_idx.algo.auth = reference->auth_algo;
13068 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13069 			&cap_idx) == NULL)
13070 		return TEST_SKIPPED;
13071 
13072 	/* Create session */
13073 	retval = create_auth_cipher_session(ut_params,
13074 			ts_params->valid_devs[0],
13075 			reference,
13076 			RTE_CRYPTO_AUTH_OP_VERIFY,
13077 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
13078 	if (retval < 0)
13079 		return retval;
13080 
13081 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13082 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13083 			"Failed to allocate input buffer in mempool");
13084 
13085 	/* clear mbuf payload */
13086 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13087 			rte_pktmbuf_tailroom(ut_params->ibuf));
13088 
13089 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13090 			reference->plaintext.len);
13091 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13092 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13093 
13094 	debug_hexdump(stdout, "plaintext:", plaintext,
13095 		reference->plaintext.len);
13096 
13097 	/* Create operation */
13098 	retval = create_auth_verify_GMAC_operation(ts_params,
13099 			ut_params,
13100 			reference);
13101 
13102 	if (retval < 0)
13103 		return retval;
13104 
13105 	if (data_corrupted)
13106 		data_corruption(plaintext);
13107 	else
13108 		tag_corruption(plaintext, reference->aad.len);
13109 
13110 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13111 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13112 			ut_params->op);
13113 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13114 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13115 			"authentication not failed");
13116 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13117 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13118 				ut_params->op, 0, 1, 0, 0);
13119 	else {
13120 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13121 			ut_params->op);
13122 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13123 	}
13124 
13125 	return 0;
13126 }
13127 
13128 static int
13129 test_authenticated_decryption_fail_when_corruption(
13130 		struct crypto_testsuite_params *ts_params,
13131 		struct crypto_unittest_params *ut_params,
13132 		const struct test_crypto_vector *reference,
13133 		unsigned int data_corrupted)
13134 {
13135 	int retval;
13136 
13137 	uint8_t *ciphertext;
13138 	struct rte_cryptodev_info dev_info;
13139 
13140 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13141 	uint64_t feat_flags = dev_info.feature_flags;
13142 
13143 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13144 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13145 		printf("Device doesn't support RAW data-path APIs.\n");
13146 		return TEST_SKIPPED;
13147 	}
13148 
13149 	/* Verify the capabilities */
13150 	struct rte_cryptodev_sym_capability_idx cap_idx;
13151 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13152 	cap_idx.algo.auth = reference->auth_algo;
13153 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13154 			&cap_idx) == NULL)
13155 		return TEST_SKIPPED;
13156 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13157 	cap_idx.algo.cipher = reference->crypto_algo;
13158 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13159 			&cap_idx) == NULL)
13160 		return TEST_SKIPPED;
13161 
13162 	/* Create session */
13163 	retval = create_auth_cipher_session(ut_params,
13164 			ts_params->valid_devs[0],
13165 			reference,
13166 			RTE_CRYPTO_AUTH_OP_VERIFY,
13167 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
13168 	if (retval < 0)
13169 		return retval;
13170 
13171 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13172 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13173 			"Failed to allocate input buffer in mempool");
13174 
13175 	/* clear mbuf payload */
13176 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13177 			rte_pktmbuf_tailroom(ut_params->ibuf));
13178 
13179 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13180 			reference->ciphertext.len);
13181 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13182 	memcpy(ciphertext, reference->ciphertext.data,
13183 			reference->ciphertext.len);
13184 
13185 	/* Create operation */
13186 	retval = create_cipher_auth_verify_operation(ts_params,
13187 			ut_params,
13188 			reference);
13189 
13190 	if (retval < 0)
13191 		return retval;
13192 
13193 	if (data_corrupted)
13194 		data_corruption(ciphertext);
13195 	else
13196 		tag_corruption(ciphertext, reference->ciphertext.len);
13197 
13198 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13199 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13200 			ut_params->op);
13201 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13202 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13203 			"authentication not failed");
13204 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13205 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13206 				ut_params->op, 1, 1, 0, 0);
13207 	else {
13208 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13209 			ut_params->op);
13210 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13211 	}
13212 
13213 	return 0;
13214 }
13215 
13216 static int
13217 test_authenticated_encrypt_with_esn(
13218 		struct crypto_testsuite_params *ts_params,
13219 		struct crypto_unittest_params *ut_params,
13220 		const struct test_crypto_vector *reference)
13221 {
13222 	int retval;
13223 
13224 	uint8_t *authciphertext, *plaintext, *auth_tag;
13225 	uint16_t plaintext_pad_len;
13226 	uint8_t cipher_key[reference->cipher_key.len + 1];
13227 	uint8_t auth_key[reference->auth_key.len + 1];
13228 	struct rte_cryptodev_info dev_info;
13229 
13230 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13231 	uint64_t feat_flags = dev_info.feature_flags;
13232 
13233 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13234 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13235 		printf("Device doesn't support RAW data-path APIs.\n");
13236 		return TEST_SKIPPED;
13237 	}
13238 
13239 	/* Verify the capabilities */
13240 	struct rte_cryptodev_sym_capability_idx cap_idx;
13241 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13242 	cap_idx.algo.auth = reference->auth_algo;
13243 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13244 			&cap_idx) == NULL)
13245 		return TEST_SKIPPED;
13246 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13247 	cap_idx.algo.cipher = reference->crypto_algo;
13248 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13249 			&cap_idx) == NULL)
13250 		return TEST_SKIPPED;
13251 
13252 	/* Create session */
13253 	memcpy(cipher_key, reference->cipher_key.data,
13254 			reference->cipher_key.len);
13255 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13256 
13257 	/* Setup Cipher Parameters */
13258 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13259 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13260 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13261 	ut_params->cipher_xform.cipher.key.data = cipher_key;
13262 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13263 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13264 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13265 
13266 	ut_params->cipher_xform.next = &ut_params->auth_xform;
13267 
13268 	/* Setup Authentication Parameters */
13269 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13270 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13271 	ut_params->auth_xform.auth.algo = reference->auth_algo;
13272 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13273 	ut_params->auth_xform.auth.key.data = auth_key;
13274 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
13275 	ut_params->auth_xform.next = NULL;
13276 
13277 	/* Create Crypto session*/
13278 	ut_params->sess = rte_cryptodev_sym_session_create(
13279 			ts_params->session_mpool);
13280 
13281 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13282 				ut_params->sess,
13283 				&ut_params->cipher_xform,
13284 				ts_params->session_priv_mpool);
13285 
13286 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13287 
13288 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13289 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13290 			"Failed to allocate input buffer in mempool");
13291 
13292 	/* clear mbuf payload */
13293 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13294 			rte_pktmbuf_tailroom(ut_params->ibuf));
13295 
13296 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13297 			reference->plaintext.len);
13298 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13299 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13300 
13301 	/* Create operation */
13302 	retval = create_cipher_auth_operation(ts_params,
13303 			ut_params,
13304 			reference, 0);
13305 
13306 	if (retval < 0)
13307 		return retval;
13308 
13309 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13310 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13311 			ut_params->op);
13312 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13313 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13314 				ut_params->op, 1, 1, 0, 0);
13315 	else
13316 		ut_params->op = process_crypto_request(
13317 			ts_params->valid_devs[0], ut_params->op);
13318 
13319 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
13320 
13321 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13322 			"crypto op processing failed");
13323 
13324 	plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
13325 
13326 	authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
13327 			ut_params->op->sym->auth.data.offset);
13328 	auth_tag = authciphertext + plaintext_pad_len;
13329 	debug_hexdump(stdout, "ciphertext:", authciphertext,
13330 			reference->ciphertext.len);
13331 	debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
13332 
13333 	/* Validate obuf */
13334 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13335 			authciphertext,
13336 			reference->ciphertext.data,
13337 			reference->ciphertext.len,
13338 			"Ciphertext data not as expected");
13339 
13340 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13341 			auth_tag,
13342 			reference->digest.data,
13343 			reference->digest.len,
13344 			"Generated digest not as expected");
13345 
13346 	return TEST_SUCCESS;
13347 
13348 }
13349 
13350 static int
13351 test_authenticated_decrypt_with_esn(
13352 		struct crypto_testsuite_params *ts_params,
13353 		struct crypto_unittest_params *ut_params,
13354 		const struct test_crypto_vector *reference)
13355 {
13356 	int retval;
13357 
13358 	uint8_t *ciphertext;
13359 	uint8_t cipher_key[reference->cipher_key.len + 1];
13360 	uint8_t auth_key[reference->auth_key.len + 1];
13361 	struct rte_cryptodev_info dev_info;
13362 
13363 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13364 	uint64_t feat_flags = dev_info.feature_flags;
13365 
13366 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13367 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13368 		printf("Device doesn't support RAW data-path APIs.\n");
13369 		return TEST_SKIPPED;
13370 	}
13371 
13372 	/* Verify the capabilities */
13373 	struct rte_cryptodev_sym_capability_idx cap_idx;
13374 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13375 	cap_idx.algo.auth = reference->auth_algo;
13376 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13377 			&cap_idx) == NULL)
13378 		return TEST_SKIPPED;
13379 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13380 	cap_idx.algo.cipher = reference->crypto_algo;
13381 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13382 			&cap_idx) == NULL)
13383 		return TEST_SKIPPED;
13384 
13385 	/* Create session */
13386 	memcpy(cipher_key, reference->cipher_key.data,
13387 			reference->cipher_key.len);
13388 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13389 
13390 	/* Setup Authentication Parameters */
13391 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13392 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
13393 	ut_params->auth_xform.auth.algo = reference->auth_algo;
13394 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13395 	ut_params->auth_xform.auth.key.data = auth_key;
13396 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
13397 	ut_params->auth_xform.next = &ut_params->cipher_xform;
13398 
13399 	/* Setup Cipher Parameters */
13400 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13401 	ut_params->cipher_xform.next = NULL;
13402 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13403 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
13404 	ut_params->cipher_xform.cipher.key.data = cipher_key;
13405 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13406 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13407 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13408 
13409 	/* Create Crypto session*/
13410 	ut_params->sess = rte_cryptodev_sym_session_create(
13411 			ts_params->session_mpool);
13412 
13413 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13414 				ut_params->sess,
13415 				&ut_params->auth_xform,
13416 				ts_params->session_priv_mpool);
13417 
13418 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13419 
13420 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13421 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13422 			"Failed to allocate input buffer in mempool");
13423 
13424 	/* clear mbuf payload */
13425 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13426 			rte_pktmbuf_tailroom(ut_params->ibuf));
13427 
13428 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13429 			reference->ciphertext.len);
13430 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13431 	memcpy(ciphertext, reference->ciphertext.data,
13432 			reference->ciphertext.len);
13433 
13434 	/* Create operation */
13435 	retval = create_cipher_auth_verify_operation(ts_params,
13436 			ut_params,
13437 			reference);
13438 
13439 	if (retval < 0)
13440 		return retval;
13441 
13442 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13443 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13444 			ut_params->op);
13445 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13446 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13447 				ut_params->op, 1, 1, 0, 0);
13448 	else
13449 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13450 			ut_params->op);
13451 
13452 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
13453 	TEST_ASSERT_EQUAL(ut_params->op->status,
13454 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13455 			"crypto op processing passed");
13456 
13457 	ut_params->obuf = ut_params->op->sym->m_src;
13458 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
13459 
13460 	return 0;
13461 }
13462 
13463 static int
13464 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
13465 		const struct aead_test_data *tdata,
13466 		void *digest_mem, uint64_t digest_phys)
13467 {
13468 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13469 	struct crypto_unittest_params *ut_params = &unittest_params;
13470 
13471 	const unsigned int auth_tag_len = tdata->auth_tag.len;
13472 	const unsigned int iv_len = tdata->iv.len;
13473 	unsigned int aad_len = tdata->aad.len;
13474 	unsigned int aad_len_pad = 0;
13475 
13476 	/* Generate Crypto op data structure */
13477 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13478 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13479 	TEST_ASSERT_NOT_NULL(ut_params->op,
13480 		"Failed to allocate symmetric crypto operation struct");
13481 
13482 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13483 
13484 	sym_op->aead.digest.data = digest_mem;
13485 
13486 	TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
13487 			"no room to append digest");
13488 
13489 	sym_op->aead.digest.phys_addr = digest_phys;
13490 
13491 	if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
13492 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
13493 				auth_tag_len);
13494 		debug_hexdump(stdout, "digest:",
13495 				sym_op->aead.digest.data,
13496 				auth_tag_len);
13497 	}
13498 
13499 	/* Append aad data */
13500 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
13501 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13502 				uint8_t *, IV_OFFSET);
13503 
13504 		/* Copy IV 1 byte after the IV pointer, according to the API */
13505 		rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
13506 
13507 		aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
13508 
13509 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13510 				ut_params->ibuf, aad_len);
13511 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13512 				"no room to prepend aad");
13513 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13514 				ut_params->ibuf);
13515 
13516 		memset(sym_op->aead.aad.data, 0, aad_len);
13517 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
13518 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13519 
13520 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13521 		debug_hexdump(stdout, "aad:",
13522 				sym_op->aead.aad.data, aad_len);
13523 	} else {
13524 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13525 				uint8_t *, IV_OFFSET);
13526 
13527 		rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
13528 
13529 		aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
13530 
13531 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13532 				ut_params->ibuf, aad_len_pad);
13533 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13534 				"no room to prepend aad");
13535 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13536 				ut_params->ibuf);
13537 
13538 		memset(sym_op->aead.aad.data, 0, aad_len);
13539 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13540 
13541 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13542 		debug_hexdump(stdout, "aad:",
13543 				sym_op->aead.aad.data, aad_len);
13544 	}
13545 
13546 	sym_op->aead.data.length = tdata->plaintext.len;
13547 	sym_op->aead.data.offset = aad_len_pad;
13548 
13549 	return 0;
13550 }
13551 
13552 #define SGL_MAX_NO	16
13553 
13554 static int
13555 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
13556 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
13557 {
13558 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13559 	struct crypto_unittest_params *ut_params = &unittest_params;
13560 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
13561 	int retval;
13562 	int to_trn = 0;
13563 	int to_trn_tbl[SGL_MAX_NO];
13564 	int segs = 1;
13565 	unsigned int trn_data = 0;
13566 	uint8_t *plaintext, *ciphertext, *auth_tag;
13567 	struct rte_cryptodev_info dev_info;
13568 
13569 	/* Verify the capabilities */
13570 	struct rte_cryptodev_sym_capability_idx cap_idx;
13571 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
13572 	cap_idx.algo.aead = tdata->algo;
13573 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13574 			&cap_idx) == NULL)
13575 		return TEST_SKIPPED;
13576 
13577 	/* OOP not supported with CPU crypto */
13578 	if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13579 		return TEST_SKIPPED;
13580 
13581 	/* Detailed check for the particular SGL support flag */
13582 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13583 	if (!oop) {
13584 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
13585 		if (sgl_in && (!(dev_info.feature_flags &
13586 				RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
13587 			return TEST_SKIPPED;
13588 
13589 		uint64_t feat_flags = dev_info.feature_flags;
13590 
13591 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13592 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13593 			printf("Device doesn't support RAW data-path APIs.\n");
13594 			return TEST_SKIPPED;
13595 		}
13596 	} else {
13597 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
13598 		unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
13599 				tdata->plaintext.len;
13600 		/* Raw data path API does not support OOP */
13601 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13602 			return TEST_SKIPPED;
13603 		if (sgl_in && !sgl_out) {
13604 			if (!(dev_info.feature_flags &
13605 					RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
13606 				return TEST_SKIPPED;
13607 		} else if (!sgl_in && sgl_out) {
13608 			if (!(dev_info.feature_flags &
13609 					RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
13610 				return TEST_SKIPPED;
13611 		} else if (sgl_in && sgl_out) {
13612 			if (!(dev_info.feature_flags &
13613 					RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
13614 				return TEST_SKIPPED;
13615 		}
13616 	}
13617 
13618 	if (fragsz > tdata->plaintext.len)
13619 		fragsz = tdata->plaintext.len;
13620 
13621 	uint16_t plaintext_len = fragsz;
13622 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
13623 
13624 	if (fragsz_oop > tdata->plaintext.len)
13625 		frag_size_oop = tdata->plaintext.len;
13626 
13627 	int ecx = 0;
13628 	void *digest_mem = NULL;
13629 
13630 	uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
13631 
13632 	if (tdata->plaintext.len % fragsz != 0) {
13633 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
13634 			return 1;
13635 	}	else {
13636 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
13637 			return 1;
13638 	}
13639 
13640 	/*
13641 	 * For out-op-place we need to alloc another mbuf
13642 	 */
13643 	if (oop) {
13644 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13645 		rte_pktmbuf_append(ut_params->obuf,
13646 				frag_size_oop + prepend_len);
13647 		buf_oop = ut_params->obuf;
13648 	}
13649 
13650 	/* Create AEAD session */
13651 	retval = create_aead_session(ts_params->valid_devs[0],
13652 			tdata->algo,
13653 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
13654 			tdata->key.data, tdata->key.len,
13655 			tdata->aad.len, tdata->auth_tag.len,
13656 			tdata->iv.len);
13657 	if (retval < 0)
13658 		return retval;
13659 
13660 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13661 
13662 	/* clear mbuf payload */
13663 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13664 			rte_pktmbuf_tailroom(ut_params->ibuf));
13665 
13666 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13667 			plaintext_len);
13668 
13669 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13670 
13671 	trn_data += plaintext_len;
13672 
13673 	buf = ut_params->ibuf;
13674 
13675 	/*
13676 	 * Loop until no more fragments
13677 	 */
13678 
13679 	while (trn_data < tdata->plaintext.len) {
13680 		++segs;
13681 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13682 				(tdata->plaintext.len - trn_data) : fragsz;
13683 
13684 		to_trn_tbl[ecx++] = to_trn;
13685 
13686 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13687 		buf = buf->next;
13688 
13689 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13690 				rte_pktmbuf_tailroom(buf));
13691 
13692 		/* OOP */
13693 		if (oop && !fragsz_oop) {
13694 			buf_last_oop = buf_oop->next =
13695 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
13696 			buf_oop = buf_oop->next;
13697 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13698 					0, rte_pktmbuf_tailroom(buf_oop));
13699 			rte_pktmbuf_append(buf_oop, to_trn);
13700 		}
13701 
13702 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
13703 				to_trn);
13704 
13705 		memcpy(plaintext, tdata->plaintext.data + trn_data,
13706 				to_trn);
13707 		trn_data += to_trn;
13708 		if (trn_data  == tdata->plaintext.len) {
13709 			if (oop) {
13710 				if (!fragsz_oop)
13711 					digest_mem = rte_pktmbuf_append(buf_oop,
13712 						tdata->auth_tag.len);
13713 			} else
13714 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
13715 					tdata->auth_tag.len);
13716 		}
13717 	}
13718 
13719 	uint64_t digest_phys = 0;
13720 
13721 	ut_params->ibuf->nb_segs = segs;
13722 
13723 	segs = 1;
13724 	if (fragsz_oop && oop) {
13725 		to_trn = 0;
13726 		ecx = 0;
13727 
13728 		if (frag_size_oop == tdata->plaintext.len) {
13729 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
13730 				tdata->auth_tag.len);
13731 
13732 			digest_phys = rte_pktmbuf_iova_offset(
13733 					ut_params->obuf,
13734 					tdata->plaintext.len + prepend_len);
13735 		}
13736 
13737 		trn_data = frag_size_oop;
13738 		while (trn_data < tdata->plaintext.len) {
13739 			++segs;
13740 			to_trn =
13741 				(tdata->plaintext.len - trn_data <
13742 						frag_size_oop) ?
13743 				(tdata->plaintext.len - trn_data) :
13744 						frag_size_oop;
13745 
13746 			to_trn_tbl[ecx++] = to_trn;
13747 
13748 			buf_last_oop = buf_oop->next =
13749 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
13750 			buf_oop = buf_oop->next;
13751 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13752 					0, rte_pktmbuf_tailroom(buf_oop));
13753 			rte_pktmbuf_append(buf_oop, to_trn);
13754 
13755 			trn_data += to_trn;
13756 
13757 			if (trn_data  == tdata->plaintext.len) {
13758 				digest_mem = rte_pktmbuf_append(buf_oop,
13759 					tdata->auth_tag.len);
13760 			}
13761 		}
13762 
13763 		ut_params->obuf->nb_segs = segs;
13764 	}
13765 
13766 	/*
13767 	 * Place digest at the end of the last buffer
13768 	 */
13769 	if (!digest_phys)
13770 		digest_phys = rte_pktmbuf_iova(buf) + to_trn;
13771 	if (oop && buf_last_oop)
13772 		digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
13773 
13774 	if (!digest_mem && !oop) {
13775 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13776 				+ tdata->auth_tag.len);
13777 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
13778 				tdata->plaintext.len);
13779 	}
13780 
13781 	/* Create AEAD operation */
13782 	retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
13783 			tdata, digest_mem, digest_phys);
13784 
13785 	if (retval < 0)
13786 		return retval;
13787 
13788 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13789 
13790 	ut_params->op->sym->m_src = ut_params->ibuf;
13791 	if (oop)
13792 		ut_params->op->sym->m_dst = ut_params->obuf;
13793 
13794 	/* Process crypto operation */
13795 	if (oop == IN_PLACE &&
13796 			gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13797 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
13798 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13799 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13800 				ut_params->op, 0, 0, 0, 0);
13801 	else
13802 		TEST_ASSERT_NOT_NULL(
13803 			process_crypto_request(ts_params->valid_devs[0],
13804 			ut_params->op), "failed to process sym crypto op");
13805 
13806 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13807 			"crypto op processing failed");
13808 
13809 
13810 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
13811 			uint8_t *, prepend_len);
13812 	if (oop) {
13813 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
13814 				uint8_t *, prepend_len);
13815 	}
13816 
13817 	if (fragsz_oop)
13818 		fragsz = fragsz_oop;
13819 
13820 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13821 			ciphertext,
13822 			tdata->ciphertext.data,
13823 			fragsz,
13824 			"Ciphertext data not as expected");
13825 
13826 	buf = ut_params->op->sym->m_src->next;
13827 	if (oop)
13828 		buf = ut_params->op->sym->m_dst->next;
13829 
13830 	unsigned int off = fragsz;
13831 
13832 	ecx = 0;
13833 	while (buf) {
13834 		ciphertext = rte_pktmbuf_mtod(buf,
13835 				uint8_t *);
13836 
13837 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
13838 				ciphertext,
13839 				tdata->ciphertext.data + off,
13840 				to_trn_tbl[ecx],
13841 				"Ciphertext data not as expected");
13842 
13843 		off += to_trn_tbl[ecx++];
13844 		buf = buf->next;
13845 	}
13846 
13847 	auth_tag = digest_mem;
13848 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13849 			auth_tag,
13850 			tdata->auth_tag.data,
13851 			tdata->auth_tag.len,
13852 			"Generated auth tag not as expected");
13853 
13854 	return 0;
13855 }
13856 
13857 static int
13858 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
13859 {
13860 	return test_authenticated_encryption_SGL(
13861 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
13862 }
13863 
13864 static int
13865 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
13866 {
13867 	return test_authenticated_encryption_SGL(
13868 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
13869 }
13870 
13871 static int
13872 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
13873 {
13874 	return test_authenticated_encryption_SGL(
13875 			&gcm_test_case_8, OUT_OF_PLACE, 400,
13876 			gcm_test_case_8.plaintext.len);
13877 }
13878 
13879 static int
13880 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
13881 {
13882 	/* This test is not for OPENSSL PMD */
13883 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
13884 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
13885 		return TEST_SKIPPED;
13886 
13887 	return test_authenticated_encryption_SGL(
13888 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
13889 }
13890 
13891 static int
13892 test_authentication_verify_fail_when_data_corrupted(
13893 		struct crypto_testsuite_params *ts_params,
13894 		struct crypto_unittest_params *ut_params,
13895 		const struct test_crypto_vector *reference)
13896 {
13897 	return test_authentication_verify_fail_when_data_corruption(
13898 			ts_params, ut_params, reference, 1);
13899 }
13900 
13901 static int
13902 test_authentication_verify_fail_when_tag_corrupted(
13903 		struct crypto_testsuite_params *ts_params,
13904 		struct crypto_unittest_params *ut_params,
13905 		const struct test_crypto_vector *reference)
13906 {
13907 	return test_authentication_verify_fail_when_data_corruption(
13908 			ts_params, ut_params, reference, 0);
13909 }
13910 
13911 static int
13912 test_authentication_verify_GMAC_fail_when_data_corrupted(
13913 		struct crypto_testsuite_params *ts_params,
13914 		struct crypto_unittest_params *ut_params,
13915 		const struct test_crypto_vector *reference)
13916 {
13917 	return test_authentication_verify_GMAC_fail_when_corruption(
13918 			ts_params, ut_params, reference, 1);
13919 }
13920 
13921 static int
13922 test_authentication_verify_GMAC_fail_when_tag_corrupted(
13923 		struct crypto_testsuite_params *ts_params,
13924 		struct crypto_unittest_params *ut_params,
13925 		const struct test_crypto_vector *reference)
13926 {
13927 	return test_authentication_verify_GMAC_fail_when_corruption(
13928 			ts_params, ut_params, reference, 0);
13929 }
13930 
13931 static int
13932 test_authenticated_decryption_fail_when_data_corrupted(
13933 		struct crypto_testsuite_params *ts_params,
13934 		struct crypto_unittest_params *ut_params,
13935 		const struct test_crypto_vector *reference)
13936 {
13937 	return test_authenticated_decryption_fail_when_corruption(
13938 			ts_params, ut_params, reference, 1);
13939 }
13940 
13941 static int
13942 test_authenticated_decryption_fail_when_tag_corrupted(
13943 		struct crypto_testsuite_params *ts_params,
13944 		struct crypto_unittest_params *ut_params,
13945 		const struct test_crypto_vector *reference)
13946 {
13947 	return test_authenticated_decryption_fail_when_corruption(
13948 			ts_params, ut_params, reference, 0);
13949 }
13950 
13951 static int
13952 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
13953 {
13954 	return test_authentication_verify_fail_when_data_corrupted(
13955 			&testsuite_params, &unittest_params,
13956 			&hmac_sha1_test_crypto_vector);
13957 }
13958 
13959 static int
13960 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
13961 {
13962 	return test_authentication_verify_fail_when_tag_corrupted(
13963 			&testsuite_params, &unittest_params,
13964 			&hmac_sha1_test_crypto_vector);
13965 }
13966 
13967 static int
13968 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
13969 {
13970 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
13971 			&testsuite_params, &unittest_params,
13972 			&aes128_gmac_test_vector);
13973 }
13974 
13975 static int
13976 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
13977 {
13978 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
13979 			&testsuite_params, &unittest_params,
13980 			&aes128_gmac_test_vector);
13981 }
13982 
13983 static int
13984 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
13985 {
13986 	return test_authenticated_decryption_fail_when_data_corrupted(
13987 			&testsuite_params,
13988 			&unittest_params,
13989 			&aes128cbc_hmac_sha1_test_vector);
13990 }
13991 
13992 static int
13993 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
13994 {
13995 	return test_authenticated_decryption_fail_when_tag_corrupted(
13996 			&testsuite_params,
13997 			&unittest_params,
13998 			&aes128cbc_hmac_sha1_test_vector);
13999 }
14000 
14001 static int
14002 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14003 {
14004 	return test_authenticated_encrypt_with_esn(
14005 			&testsuite_params,
14006 			&unittest_params,
14007 			&aes128cbc_hmac_sha1_aad_test_vector);
14008 }
14009 
14010 static int
14011 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14012 {
14013 	return test_authenticated_decrypt_with_esn(
14014 			&testsuite_params,
14015 			&unittest_params,
14016 			&aes128cbc_hmac_sha1_aad_test_vector);
14017 }
14018 
14019 static int
14020 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
14021 {
14022 	return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
14023 }
14024 
14025 static int
14026 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
14027 {
14028 	return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
14029 }
14030 
14031 static int
14032 test_chacha20_poly1305_encrypt_SGL_out_of_place(void)
14033 {
14034 	return test_authenticated_encryption_SGL(
14035 		&chacha20_poly1305_case_2, OUT_OF_PLACE, 32,
14036 		chacha20_poly1305_case_2.plaintext.len);
14037 }
14038 
14039 #ifdef RTE_CRYPTO_SCHEDULER
14040 
14041 /* global AESNI worker IDs for the scheduler test */
14042 uint8_t aesni_ids[2];
14043 
14044 static int
14045 scheduler_testsuite_setup(void)
14046 {
14047 	uint32_t i = 0;
14048 	int32_t nb_devs, ret;
14049 	char vdev_args[VDEV_ARGS_SIZE] = {""};
14050 	char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
14051 		"ordering=enable,name=cryptodev_test_scheduler,corelist="};
14052 	uint16_t worker_core_count = 0;
14053 	uint16_t socket_id = 0;
14054 
14055 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
14056 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
14057 
14058 		/* Identify the Worker Cores
14059 		 * Use 2 worker cores for the device args
14060 		 */
14061 		RTE_LCORE_FOREACH_WORKER(i) {
14062 			if (worker_core_count > 1)
14063 				break;
14064 			snprintf(vdev_args, sizeof(vdev_args),
14065 					"%s%d", temp_str, i);
14066 			strcpy(temp_str, vdev_args);
14067 			strlcat(temp_str, ";", sizeof(temp_str));
14068 			worker_core_count++;
14069 			socket_id = rte_lcore_to_socket_id(i);
14070 		}
14071 		if (worker_core_count != 2) {
14072 			RTE_LOG(ERR, USER1,
14073 				"Cryptodev scheduler test require at least "
14074 				"two worker cores to run. "
14075 				"Please use the correct coremask.\n");
14076 			return TEST_FAILED;
14077 		}
14078 		strcpy(temp_str, vdev_args);
14079 		snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
14080 				temp_str, socket_id);
14081 		RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
14082 		nb_devs = rte_cryptodev_device_count_by_driver(
14083 				rte_cryptodev_driver_id_get(
14084 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
14085 		if (nb_devs < 1) {
14086 			ret = rte_vdev_init(
14087 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
14088 					vdev_args);
14089 			TEST_ASSERT(ret == 0,
14090 				"Failed to create instance %u of pmd : %s",
14091 				i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14092 		}
14093 	}
14094 	return testsuite_setup();
14095 }
14096 
14097 static int
14098 test_scheduler_attach_worker_op(void)
14099 {
14100 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14101 	uint8_t sched_id = ts_params->valid_devs[0];
14102 	uint32_t i, nb_devs_attached = 0;
14103 	int ret;
14104 	char vdev_name[32];
14105 	unsigned int count = rte_cryptodev_count();
14106 
14107 	/* create 2 AESNI_MB vdevs on top of existing devices */
14108 	for (i = count; i < count + 2; i++) {
14109 		snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
14110 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
14111 				i);
14112 		ret = rte_vdev_init(vdev_name, NULL);
14113 
14114 		TEST_ASSERT(ret == 0,
14115 			"Failed to create instance %u of"
14116 			" pmd : %s",
14117 			i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14118 
14119 		if (ret < 0) {
14120 			RTE_LOG(ERR, USER1,
14121 				"Failed to create 2 AESNI MB PMDs.\n");
14122 			return TEST_SKIPPED;
14123 		}
14124 	}
14125 
14126 	/* attach 2 AESNI_MB cdevs */
14127 	for (i = count; i < count + 2; i++) {
14128 		struct rte_cryptodev_info info;
14129 		unsigned int session_size;
14130 
14131 		rte_cryptodev_info_get(i, &info);
14132 		if (info.driver_id != rte_cryptodev_driver_id_get(
14133 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
14134 			continue;
14135 
14136 		session_size = rte_cryptodev_sym_get_private_session_size(i);
14137 		/*
14138 		 * Create the session mempool again, since now there are new devices
14139 		 * to use the mempool.
14140 		 */
14141 		if (ts_params->session_mpool) {
14142 			rte_mempool_free(ts_params->session_mpool);
14143 			ts_params->session_mpool = NULL;
14144 		}
14145 		if (ts_params->session_priv_mpool) {
14146 			rte_mempool_free(ts_params->session_priv_mpool);
14147 			ts_params->session_priv_mpool = NULL;
14148 		}
14149 
14150 		if (info.sym.max_nb_sessions != 0 &&
14151 				info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
14152 			RTE_LOG(ERR, USER1,
14153 					"Device does not support "
14154 					"at least %u sessions\n",
14155 					MAX_NB_SESSIONS);
14156 			return TEST_FAILED;
14157 		}
14158 		/*
14159 		 * Create mempool with maximum number of sessions,
14160 		 * to include the session headers
14161 		 */
14162 		if (ts_params->session_mpool == NULL) {
14163 			ts_params->session_mpool =
14164 				rte_cryptodev_sym_session_pool_create(
14165 						"test_sess_mp",
14166 						MAX_NB_SESSIONS, 0, 0, 0,
14167 						SOCKET_ID_ANY);
14168 			TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
14169 					"session mempool allocation failed");
14170 		}
14171 
14172 		/*
14173 		 * Create mempool with maximum number of sessions,
14174 		 * to include device specific session private data
14175 		 */
14176 		if (ts_params->session_priv_mpool == NULL) {
14177 			ts_params->session_priv_mpool = rte_mempool_create(
14178 					"test_sess_mp_priv",
14179 					MAX_NB_SESSIONS,
14180 					session_size,
14181 					0, 0, NULL, NULL, NULL,
14182 					NULL, SOCKET_ID_ANY,
14183 					0);
14184 
14185 			TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
14186 					"session mempool allocation failed");
14187 		}
14188 
14189 		ts_params->qp_conf.mp_session = ts_params->session_mpool;
14190 		ts_params->qp_conf.mp_session_private =
14191 				ts_params->session_priv_mpool;
14192 
14193 		ret = rte_cryptodev_scheduler_worker_attach(sched_id,
14194 				(uint8_t)i);
14195 
14196 		TEST_ASSERT(ret == 0,
14197 			"Failed to attach device %u of pmd : %s", i,
14198 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14199 
14200 		aesni_ids[nb_devs_attached] = (uint8_t)i;
14201 
14202 		nb_devs_attached++;
14203 	}
14204 
14205 	return 0;
14206 }
14207 
14208 static int
14209 test_scheduler_detach_worker_op(void)
14210 {
14211 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14212 	uint8_t sched_id = ts_params->valid_devs[0];
14213 	uint32_t i;
14214 	int ret;
14215 
14216 	for (i = 0; i < 2; i++) {
14217 		ret = rte_cryptodev_scheduler_worker_detach(sched_id,
14218 				aesni_ids[i]);
14219 		TEST_ASSERT(ret == 0,
14220 			"Failed to detach device %u", aesni_ids[i]);
14221 	}
14222 
14223 	return 0;
14224 }
14225 
14226 static int
14227 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
14228 {
14229 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14230 	uint8_t sched_id = ts_params->valid_devs[0];
14231 	/* set mode */
14232 	return rte_cryptodev_scheduler_mode_set(sched_id,
14233 		scheduler_mode);
14234 }
14235 
14236 static int
14237 test_scheduler_mode_roundrobin_op(void)
14238 {
14239 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
14240 			0, "Failed to set roundrobin mode");
14241 	return 0;
14242 
14243 }
14244 
14245 static int
14246 test_scheduler_mode_multicore_op(void)
14247 {
14248 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
14249 			0, "Failed to set multicore mode");
14250 
14251 	return 0;
14252 }
14253 
14254 static int
14255 test_scheduler_mode_failover_op(void)
14256 {
14257 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
14258 			0, "Failed to set failover mode");
14259 
14260 	return 0;
14261 }
14262 
14263 static int
14264 test_scheduler_mode_pkt_size_distr_op(void)
14265 {
14266 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
14267 			0, "Failed to set pktsize mode");
14268 
14269 	return 0;
14270 }
14271 
14272 static int
14273 scheduler_multicore_testsuite_setup(void)
14274 {
14275 	if (test_scheduler_attach_worker_op() < 0)
14276 		return TEST_SKIPPED;
14277 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
14278 		return TEST_SKIPPED;
14279 	return 0;
14280 }
14281 
14282 static int
14283 scheduler_roundrobin_testsuite_setup(void)
14284 {
14285 	if (test_scheduler_attach_worker_op() < 0)
14286 		return TEST_SKIPPED;
14287 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
14288 		return TEST_SKIPPED;
14289 	return 0;
14290 }
14291 
14292 static int
14293 scheduler_failover_testsuite_setup(void)
14294 {
14295 	if (test_scheduler_attach_worker_op() < 0)
14296 		return TEST_SKIPPED;
14297 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
14298 		return TEST_SKIPPED;
14299 	return 0;
14300 }
14301 
14302 static int
14303 scheduler_pkt_size_distr_testsuite_setup(void)
14304 {
14305 	if (test_scheduler_attach_worker_op() < 0)
14306 		return TEST_SKIPPED;
14307 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
14308 		return TEST_SKIPPED;
14309 	return 0;
14310 }
14311 
14312 static void
14313 scheduler_mode_testsuite_teardown(void)
14314 {
14315 	test_scheduler_detach_worker_op();
14316 }
14317 
14318 #endif /* RTE_CRYPTO_SCHEDULER */
14319 
14320 static struct unit_test_suite end_testsuite = {
14321 	.suite_name = NULL,
14322 	.setup = NULL,
14323 	.teardown = NULL,
14324 	.unit_test_suites = NULL
14325 };
14326 
14327 #ifdef RTE_LIB_SECURITY
14328 static struct unit_test_suite ipsec_proto_testsuite  = {
14329 	.suite_name = "IPsec Proto Unit Test Suite",
14330 	.setup = ipsec_proto_testsuite_setup,
14331 	.unit_test_cases = {
14332 		TEST_CASE_NAMED_WITH_DATA(
14333 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14334 			ut_setup_security, ut_teardown,
14335 			test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
14336 		TEST_CASE_NAMED_WITH_DATA(
14337 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14338 			ut_setup_security, ut_teardown,
14339 			test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
14340 		TEST_CASE_NAMED_WITH_DATA(
14341 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14342 			ut_setup_security, ut_teardown,
14343 			test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
14344 		TEST_CASE_NAMED_WITH_DATA(
14345 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14346 			ut_setup_security, ut_teardown,
14347 			test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
14348 		TEST_CASE_NAMED_WITH_DATA(
14349 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14350 			ut_setup_security, ut_teardown,
14351 			test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
14352 		TEST_CASE_NAMED_WITH_DATA(
14353 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14354 			ut_setup_security, ut_teardown,
14355 			test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
14356 		TEST_CASE_NAMED_ST(
14357 			"Combined test alg list",
14358 			ut_setup_security, ut_teardown,
14359 			test_ipsec_proto_display_list),
14360 		TEST_CASE_NAMED_ST(
14361 			"IV generation",
14362 			ut_setup_security, ut_teardown,
14363 			test_ipsec_proto_iv_gen),
14364 		TEST_CASE_NAMED_ST(
14365 			"UDP encapsulation",
14366 			ut_setup_security, ut_teardown,
14367 			test_ipsec_proto_udp_encap),
14368 		TEST_CASE_NAMED_ST(
14369 			"UDP encapsulation ports verification test",
14370 			ut_setup_security, ut_teardown,
14371 			test_ipsec_proto_udp_ports_verify),
14372 		TEST_CASE_NAMED_ST(
14373 			"SA expiry packets soft",
14374 			ut_setup_security, ut_teardown,
14375 			test_ipsec_proto_sa_exp_pkts_soft),
14376 		TEST_CASE_NAMED_ST(
14377 			"SA expiry packets hard",
14378 			ut_setup_security, ut_teardown,
14379 			test_ipsec_proto_sa_exp_pkts_hard),
14380 		TEST_CASE_NAMED_ST(
14381 			"Negative test: ICV corruption",
14382 			ut_setup_security, ut_teardown,
14383 			test_ipsec_proto_err_icv_corrupt),
14384 		TEST_CASE_NAMED_ST(
14385 			"Tunnel dst addr verification",
14386 			ut_setup_security, ut_teardown,
14387 			test_ipsec_proto_tunnel_dst_addr_verify),
14388 		TEST_CASE_NAMED_ST(
14389 			"Tunnel src and dst addr verification",
14390 			ut_setup_security, ut_teardown,
14391 			test_ipsec_proto_tunnel_src_dst_addr_verify),
14392 		TEST_CASE_NAMED_ST(
14393 			"Inner IP checksum",
14394 			ut_setup_security, ut_teardown,
14395 			test_ipsec_proto_inner_ip_csum),
14396 		TEST_CASE_NAMED_ST(
14397 			"Inner L4 checksum",
14398 			ut_setup_security, ut_teardown,
14399 			test_ipsec_proto_inner_l4_csum),
14400 		TEST_CASES_END() /**< NULL terminate unit test array */
14401 	}
14402 };
14403 
14404 static struct unit_test_suite pdcp_proto_testsuite  = {
14405 	.suite_name = "PDCP Proto Unit Test Suite",
14406 	.setup = pdcp_proto_testsuite_setup,
14407 	.unit_test_cases = {
14408 		TEST_CASE_ST(ut_setup_security, ut_teardown,
14409 			test_PDCP_PROTO_all),
14410 		TEST_CASES_END() /**< NULL terminate unit test array */
14411 	}
14412 };
14413 
14414 #define ADD_UPLINK_TESTCASE(data)						\
14415 	TEST_CASE_NAMED_WITH_DATA(data.test_descr_uplink, ut_setup_security,	\
14416 	ut_teardown, test_docsis_proto_uplink, (const void *) &data),		\
14417 
14418 #define ADD_DOWNLINK_TESTCASE(data)						\
14419 	TEST_CASE_NAMED_WITH_DATA(data.test_descr_downlink, ut_setup_security,	\
14420 	ut_teardown, test_docsis_proto_downlink, (const void *) &data),		\
14421 
14422 static struct unit_test_suite docsis_proto_testsuite  = {
14423 	.suite_name = "DOCSIS Proto Unit Test Suite",
14424 	.setup = docsis_proto_testsuite_setup,
14425 	.unit_test_cases = {
14426 		/* Uplink */
14427 		ADD_UPLINK_TESTCASE(docsis_test_case_1)
14428 		ADD_UPLINK_TESTCASE(docsis_test_case_2)
14429 		ADD_UPLINK_TESTCASE(docsis_test_case_3)
14430 		ADD_UPLINK_TESTCASE(docsis_test_case_4)
14431 		ADD_UPLINK_TESTCASE(docsis_test_case_5)
14432 		ADD_UPLINK_TESTCASE(docsis_test_case_6)
14433 		ADD_UPLINK_TESTCASE(docsis_test_case_7)
14434 		ADD_UPLINK_TESTCASE(docsis_test_case_8)
14435 		ADD_UPLINK_TESTCASE(docsis_test_case_9)
14436 		ADD_UPLINK_TESTCASE(docsis_test_case_10)
14437 		ADD_UPLINK_TESTCASE(docsis_test_case_11)
14438 		ADD_UPLINK_TESTCASE(docsis_test_case_12)
14439 		ADD_UPLINK_TESTCASE(docsis_test_case_13)
14440 		ADD_UPLINK_TESTCASE(docsis_test_case_14)
14441 		ADD_UPLINK_TESTCASE(docsis_test_case_15)
14442 		ADD_UPLINK_TESTCASE(docsis_test_case_16)
14443 		ADD_UPLINK_TESTCASE(docsis_test_case_17)
14444 		ADD_UPLINK_TESTCASE(docsis_test_case_18)
14445 		ADD_UPLINK_TESTCASE(docsis_test_case_19)
14446 		ADD_UPLINK_TESTCASE(docsis_test_case_20)
14447 		ADD_UPLINK_TESTCASE(docsis_test_case_21)
14448 		ADD_UPLINK_TESTCASE(docsis_test_case_22)
14449 		ADD_UPLINK_TESTCASE(docsis_test_case_23)
14450 		ADD_UPLINK_TESTCASE(docsis_test_case_24)
14451 		ADD_UPLINK_TESTCASE(docsis_test_case_25)
14452 		ADD_UPLINK_TESTCASE(docsis_test_case_26)
14453 		/* Downlink */
14454 		ADD_DOWNLINK_TESTCASE(docsis_test_case_1)
14455 		ADD_DOWNLINK_TESTCASE(docsis_test_case_2)
14456 		ADD_DOWNLINK_TESTCASE(docsis_test_case_3)
14457 		ADD_DOWNLINK_TESTCASE(docsis_test_case_4)
14458 		ADD_DOWNLINK_TESTCASE(docsis_test_case_5)
14459 		ADD_DOWNLINK_TESTCASE(docsis_test_case_6)
14460 		ADD_DOWNLINK_TESTCASE(docsis_test_case_7)
14461 		ADD_DOWNLINK_TESTCASE(docsis_test_case_8)
14462 		ADD_DOWNLINK_TESTCASE(docsis_test_case_9)
14463 		ADD_DOWNLINK_TESTCASE(docsis_test_case_10)
14464 		ADD_DOWNLINK_TESTCASE(docsis_test_case_11)
14465 		ADD_DOWNLINK_TESTCASE(docsis_test_case_12)
14466 		ADD_DOWNLINK_TESTCASE(docsis_test_case_13)
14467 		ADD_DOWNLINK_TESTCASE(docsis_test_case_14)
14468 		ADD_DOWNLINK_TESTCASE(docsis_test_case_15)
14469 		ADD_DOWNLINK_TESTCASE(docsis_test_case_16)
14470 		ADD_DOWNLINK_TESTCASE(docsis_test_case_17)
14471 		ADD_DOWNLINK_TESTCASE(docsis_test_case_18)
14472 		ADD_DOWNLINK_TESTCASE(docsis_test_case_19)
14473 		ADD_DOWNLINK_TESTCASE(docsis_test_case_20)
14474 		ADD_DOWNLINK_TESTCASE(docsis_test_case_21)
14475 		ADD_DOWNLINK_TESTCASE(docsis_test_case_22)
14476 		ADD_DOWNLINK_TESTCASE(docsis_test_case_23)
14477 		ADD_DOWNLINK_TESTCASE(docsis_test_case_24)
14478 		ADD_DOWNLINK_TESTCASE(docsis_test_case_25)
14479 		ADD_DOWNLINK_TESTCASE(docsis_test_case_26)
14480 		TEST_CASES_END() /**< NULL terminate unit test array */
14481 	}
14482 };
14483 #endif
14484 
14485 static struct unit_test_suite cryptodev_gen_testsuite  = {
14486 	.suite_name = "Crypto General Unit Test Suite",
14487 	.setup = crypto_gen_testsuite_setup,
14488 	.unit_test_cases = {
14489 		TEST_CASE_ST(ut_setup, ut_teardown,
14490 				test_device_configure_invalid_dev_id),
14491 		TEST_CASE_ST(ut_setup, ut_teardown,
14492 				test_queue_pair_descriptor_setup),
14493 		TEST_CASE_ST(ut_setup, ut_teardown,
14494 				test_device_configure_invalid_queue_pair_ids),
14495 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
14496 		TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
14497 		TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
14498 		TEST_CASES_END() /**< NULL terminate unit test array */
14499 	}
14500 };
14501 
14502 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
14503 	.suite_name = "Negative HMAC SHA1 Unit Test Suite",
14504 	.setup = negative_hmac_sha1_testsuite_setup,
14505 	.unit_test_cases = {
14506 		/** Negative tests */
14507 		TEST_CASE_ST(ut_setup, ut_teardown,
14508 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
14509 		TEST_CASE_ST(ut_setup, ut_teardown,
14510 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14511 		TEST_CASE_ST(ut_setup, ut_teardown,
14512 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14513 		TEST_CASE_ST(ut_setup, ut_teardown,
14514 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14515 
14516 		TEST_CASES_END() /**< NULL terminate unit test array */
14517 	}
14518 };
14519 
14520 static struct unit_test_suite cryptodev_multi_session_testsuite = {
14521 	.suite_name = "Multi Session Unit Test Suite",
14522 	.setup = multi_session_testsuite_setup,
14523 	.unit_test_cases = {
14524 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
14525 		TEST_CASE_ST(ut_setup, ut_teardown,
14526 				test_multi_session_random_usage),
14527 
14528 		TEST_CASES_END() /**< NULL terminate unit test array */
14529 	}
14530 };
14531 
14532 static struct unit_test_suite cryptodev_null_testsuite  = {
14533 	.suite_name = "NULL Test Suite",
14534 	.setup = null_testsuite_setup,
14535 	.unit_test_cases = {
14536 		TEST_CASE_ST(ut_setup, ut_teardown,
14537 			test_null_invalid_operation),
14538 		TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
14539 		TEST_CASES_END()
14540 	}
14541 };
14542 
14543 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
14544 	.suite_name = "AES CCM Authenticated Test Suite",
14545 	.setup = aes_ccm_auth_testsuite_setup,
14546 	.unit_test_cases = {
14547 		/** AES CCM Authenticated Encryption 128 bits key*/
14548 		TEST_CASE_ST(ut_setup, ut_teardown,
14549 			test_AES_CCM_authenticated_encryption_test_case_128_1),
14550 		TEST_CASE_ST(ut_setup, ut_teardown,
14551 			test_AES_CCM_authenticated_encryption_test_case_128_2),
14552 		TEST_CASE_ST(ut_setup, ut_teardown,
14553 			test_AES_CCM_authenticated_encryption_test_case_128_3),
14554 
14555 		/** AES CCM Authenticated Decryption 128 bits key*/
14556 		TEST_CASE_ST(ut_setup, ut_teardown,
14557 			test_AES_CCM_authenticated_decryption_test_case_128_1),
14558 		TEST_CASE_ST(ut_setup, ut_teardown,
14559 			test_AES_CCM_authenticated_decryption_test_case_128_2),
14560 		TEST_CASE_ST(ut_setup, ut_teardown,
14561 			test_AES_CCM_authenticated_decryption_test_case_128_3),
14562 
14563 		/** AES CCM Authenticated Encryption 192 bits key */
14564 		TEST_CASE_ST(ut_setup, ut_teardown,
14565 			test_AES_CCM_authenticated_encryption_test_case_192_1),
14566 		TEST_CASE_ST(ut_setup, ut_teardown,
14567 			test_AES_CCM_authenticated_encryption_test_case_192_2),
14568 		TEST_CASE_ST(ut_setup, ut_teardown,
14569 			test_AES_CCM_authenticated_encryption_test_case_192_3),
14570 
14571 		/** AES CCM Authenticated Decryption 192 bits key*/
14572 		TEST_CASE_ST(ut_setup, ut_teardown,
14573 			test_AES_CCM_authenticated_decryption_test_case_192_1),
14574 		TEST_CASE_ST(ut_setup, ut_teardown,
14575 			test_AES_CCM_authenticated_decryption_test_case_192_2),
14576 		TEST_CASE_ST(ut_setup, ut_teardown,
14577 			test_AES_CCM_authenticated_decryption_test_case_192_3),
14578 
14579 		/** AES CCM Authenticated Encryption 256 bits key */
14580 		TEST_CASE_ST(ut_setup, ut_teardown,
14581 			test_AES_CCM_authenticated_encryption_test_case_256_1),
14582 		TEST_CASE_ST(ut_setup, ut_teardown,
14583 			test_AES_CCM_authenticated_encryption_test_case_256_2),
14584 		TEST_CASE_ST(ut_setup, ut_teardown,
14585 			test_AES_CCM_authenticated_encryption_test_case_256_3),
14586 
14587 		/** AES CCM Authenticated Decryption 256 bits key*/
14588 		TEST_CASE_ST(ut_setup, ut_teardown,
14589 			test_AES_CCM_authenticated_decryption_test_case_256_1),
14590 		TEST_CASE_ST(ut_setup, ut_teardown,
14591 			test_AES_CCM_authenticated_decryption_test_case_256_2),
14592 		TEST_CASE_ST(ut_setup, ut_teardown,
14593 			test_AES_CCM_authenticated_decryption_test_case_256_3),
14594 		TEST_CASES_END()
14595 	}
14596 };
14597 
14598 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
14599 	.suite_name = "AES GCM Authenticated Test Suite",
14600 	.setup = aes_gcm_auth_testsuite_setup,
14601 	.unit_test_cases = {
14602 		/** AES GCM Authenticated Encryption */
14603 		TEST_CASE_ST(ut_setup, ut_teardown,
14604 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
14605 		TEST_CASE_ST(ut_setup, ut_teardown,
14606 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
14607 		TEST_CASE_ST(ut_setup, ut_teardown,
14608 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
14609 		TEST_CASE_ST(ut_setup, ut_teardown,
14610 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
14611 		TEST_CASE_ST(ut_setup, ut_teardown,
14612 			test_AES_GCM_authenticated_encryption_test_case_1),
14613 		TEST_CASE_ST(ut_setup, ut_teardown,
14614 			test_AES_GCM_authenticated_encryption_test_case_2),
14615 		TEST_CASE_ST(ut_setup, ut_teardown,
14616 			test_AES_GCM_authenticated_encryption_test_case_3),
14617 		TEST_CASE_ST(ut_setup, ut_teardown,
14618 			test_AES_GCM_authenticated_encryption_test_case_4),
14619 		TEST_CASE_ST(ut_setup, ut_teardown,
14620 			test_AES_GCM_authenticated_encryption_test_case_5),
14621 		TEST_CASE_ST(ut_setup, ut_teardown,
14622 			test_AES_GCM_authenticated_encryption_test_case_6),
14623 		TEST_CASE_ST(ut_setup, ut_teardown,
14624 			test_AES_GCM_authenticated_encryption_test_case_7),
14625 		TEST_CASE_ST(ut_setup, ut_teardown,
14626 			test_AES_GCM_authenticated_encryption_test_case_8),
14627 		TEST_CASE_ST(ut_setup, ut_teardown,
14628 			test_AES_GCM_J0_authenticated_encryption_test_case_1),
14629 
14630 		/** AES GCM Authenticated Decryption */
14631 		TEST_CASE_ST(ut_setup, ut_teardown,
14632 			test_AES_GCM_authenticated_decryption_test_case_1),
14633 		TEST_CASE_ST(ut_setup, ut_teardown,
14634 			test_AES_GCM_authenticated_decryption_test_case_2),
14635 		TEST_CASE_ST(ut_setup, ut_teardown,
14636 			test_AES_GCM_authenticated_decryption_test_case_3),
14637 		TEST_CASE_ST(ut_setup, ut_teardown,
14638 			test_AES_GCM_authenticated_decryption_test_case_4),
14639 		TEST_CASE_ST(ut_setup, ut_teardown,
14640 			test_AES_GCM_authenticated_decryption_test_case_5),
14641 		TEST_CASE_ST(ut_setup, ut_teardown,
14642 			test_AES_GCM_authenticated_decryption_test_case_6),
14643 		TEST_CASE_ST(ut_setup, ut_teardown,
14644 			test_AES_GCM_authenticated_decryption_test_case_7),
14645 		TEST_CASE_ST(ut_setup, ut_teardown,
14646 			test_AES_GCM_authenticated_decryption_test_case_8),
14647 		TEST_CASE_ST(ut_setup, ut_teardown,
14648 			test_AES_GCM_J0_authenticated_decryption_test_case_1),
14649 
14650 		/** AES GCM Authenticated Encryption 192 bits key */
14651 		TEST_CASE_ST(ut_setup, ut_teardown,
14652 			test_AES_GCM_auth_encryption_test_case_192_1),
14653 		TEST_CASE_ST(ut_setup, ut_teardown,
14654 			test_AES_GCM_auth_encryption_test_case_192_2),
14655 		TEST_CASE_ST(ut_setup, ut_teardown,
14656 			test_AES_GCM_auth_encryption_test_case_192_3),
14657 		TEST_CASE_ST(ut_setup, ut_teardown,
14658 			test_AES_GCM_auth_encryption_test_case_192_4),
14659 		TEST_CASE_ST(ut_setup, ut_teardown,
14660 			test_AES_GCM_auth_encryption_test_case_192_5),
14661 		TEST_CASE_ST(ut_setup, ut_teardown,
14662 			test_AES_GCM_auth_encryption_test_case_192_6),
14663 		TEST_CASE_ST(ut_setup, ut_teardown,
14664 			test_AES_GCM_auth_encryption_test_case_192_7),
14665 
14666 		/** AES GCM Authenticated Decryption 192 bits key */
14667 		TEST_CASE_ST(ut_setup, ut_teardown,
14668 			test_AES_GCM_auth_decryption_test_case_192_1),
14669 		TEST_CASE_ST(ut_setup, ut_teardown,
14670 			test_AES_GCM_auth_decryption_test_case_192_2),
14671 		TEST_CASE_ST(ut_setup, ut_teardown,
14672 			test_AES_GCM_auth_decryption_test_case_192_3),
14673 		TEST_CASE_ST(ut_setup, ut_teardown,
14674 			test_AES_GCM_auth_decryption_test_case_192_4),
14675 		TEST_CASE_ST(ut_setup, ut_teardown,
14676 			test_AES_GCM_auth_decryption_test_case_192_5),
14677 		TEST_CASE_ST(ut_setup, ut_teardown,
14678 			test_AES_GCM_auth_decryption_test_case_192_6),
14679 		TEST_CASE_ST(ut_setup, ut_teardown,
14680 			test_AES_GCM_auth_decryption_test_case_192_7),
14681 
14682 		/** AES GCM Authenticated Encryption 256 bits key */
14683 		TEST_CASE_ST(ut_setup, ut_teardown,
14684 			test_AES_GCM_auth_encryption_test_case_256_1),
14685 		TEST_CASE_ST(ut_setup, ut_teardown,
14686 			test_AES_GCM_auth_encryption_test_case_256_2),
14687 		TEST_CASE_ST(ut_setup, ut_teardown,
14688 			test_AES_GCM_auth_encryption_test_case_256_3),
14689 		TEST_CASE_ST(ut_setup, ut_teardown,
14690 			test_AES_GCM_auth_encryption_test_case_256_4),
14691 		TEST_CASE_ST(ut_setup, ut_teardown,
14692 			test_AES_GCM_auth_encryption_test_case_256_5),
14693 		TEST_CASE_ST(ut_setup, ut_teardown,
14694 			test_AES_GCM_auth_encryption_test_case_256_6),
14695 		TEST_CASE_ST(ut_setup, ut_teardown,
14696 			test_AES_GCM_auth_encryption_test_case_256_7),
14697 
14698 		/** AES GCM Authenticated Decryption 256 bits key */
14699 		TEST_CASE_ST(ut_setup, ut_teardown,
14700 			test_AES_GCM_auth_decryption_test_case_256_1),
14701 		TEST_CASE_ST(ut_setup, ut_teardown,
14702 			test_AES_GCM_auth_decryption_test_case_256_2),
14703 		TEST_CASE_ST(ut_setup, ut_teardown,
14704 			test_AES_GCM_auth_decryption_test_case_256_3),
14705 		TEST_CASE_ST(ut_setup, ut_teardown,
14706 			test_AES_GCM_auth_decryption_test_case_256_4),
14707 		TEST_CASE_ST(ut_setup, ut_teardown,
14708 			test_AES_GCM_auth_decryption_test_case_256_5),
14709 		TEST_CASE_ST(ut_setup, ut_teardown,
14710 			test_AES_GCM_auth_decryption_test_case_256_6),
14711 		TEST_CASE_ST(ut_setup, ut_teardown,
14712 			test_AES_GCM_auth_decryption_test_case_256_7),
14713 
14714 		/** AES GCM Authenticated Encryption big aad size */
14715 		TEST_CASE_ST(ut_setup, ut_teardown,
14716 			test_AES_GCM_auth_encryption_test_case_aad_1),
14717 		TEST_CASE_ST(ut_setup, ut_teardown,
14718 			test_AES_GCM_auth_encryption_test_case_aad_2),
14719 
14720 		/** AES GCM Authenticated Decryption big aad size */
14721 		TEST_CASE_ST(ut_setup, ut_teardown,
14722 			test_AES_GCM_auth_decryption_test_case_aad_1),
14723 		TEST_CASE_ST(ut_setup, ut_teardown,
14724 			test_AES_GCM_auth_decryption_test_case_aad_2),
14725 
14726 		/** Out of place tests */
14727 		TEST_CASE_ST(ut_setup, ut_teardown,
14728 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
14729 		TEST_CASE_ST(ut_setup, ut_teardown,
14730 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
14731 
14732 		/** Session-less tests */
14733 		TEST_CASE_ST(ut_setup, ut_teardown,
14734 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
14735 		TEST_CASE_ST(ut_setup, ut_teardown,
14736 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
14737 
14738 		TEST_CASES_END()
14739 	}
14740 };
14741 
14742 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
14743 	.suite_name = "AES GMAC Authentication Test Suite",
14744 	.setup = aes_gmac_auth_testsuite_setup,
14745 	.unit_test_cases = {
14746 		TEST_CASE_ST(ut_setup, ut_teardown,
14747 			test_AES_GMAC_authentication_test_case_1),
14748 		TEST_CASE_ST(ut_setup, ut_teardown,
14749 			test_AES_GMAC_authentication_verify_test_case_1),
14750 		TEST_CASE_ST(ut_setup, ut_teardown,
14751 			test_AES_GMAC_authentication_test_case_2),
14752 		TEST_CASE_ST(ut_setup, ut_teardown,
14753 			test_AES_GMAC_authentication_verify_test_case_2),
14754 		TEST_CASE_ST(ut_setup, ut_teardown,
14755 			test_AES_GMAC_authentication_test_case_3),
14756 		TEST_CASE_ST(ut_setup, ut_teardown,
14757 			test_AES_GMAC_authentication_verify_test_case_3),
14758 		TEST_CASE_ST(ut_setup, ut_teardown,
14759 			test_AES_GMAC_authentication_test_case_4),
14760 		TEST_CASE_ST(ut_setup, ut_teardown,
14761 			test_AES_GMAC_authentication_verify_test_case_4),
14762 		TEST_CASE_ST(ut_setup, ut_teardown,
14763 			test_AES_GMAC_authentication_SGL_40B),
14764 		TEST_CASE_ST(ut_setup, ut_teardown,
14765 			test_AES_GMAC_authentication_SGL_80B),
14766 		TEST_CASE_ST(ut_setup, ut_teardown,
14767 			test_AES_GMAC_authentication_SGL_2048B),
14768 		TEST_CASE_ST(ut_setup, ut_teardown,
14769 			test_AES_GMAC_authentication_SGL_2047B),
14770 
14771 		TEST_CASES_END()
14772 	}
14773 };
14774 
14775 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
14776 	.suite_name = "Chacha20-Poly1305 Test Suite",
14777 	.setup = chacha20_poly1305_testsuite_setup,
14778 	.unit_test_cases = {
14779 		TEST_CASE_ST(ut_setup, ut_teardown,
14780 			test_chacha20_poly1305_encrypt_test_case_rfc8439),
14781 		TEST_CASE_ST(ut_setup, ut_teardown,
14782 			test_chacha20_poly1305_decrypt_test_case_rfc8439),
14783 		TEST_CASE_ST(ut_setup, ut_teardown,
14784 			test_chacha20_poly1305_encrypt_SGL_out_of_place),
14785 		TEST_CASES_END()
14786 	}
14787 };
14788 
14789 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
14790 	.suite_name = "SNOW 3G Test Suite",
14791 	.setup = snow3g_testsuite_setup,
14792 	.unit_test_cases = {
14793 		/** SNOW 3G encrypt only (UEA2) */
14794 		TEST_CASE_ST(ut_setup, ut_teardown,
14795 			test_snow3g_encryption_test_case_1),
14796 		TEST_CASE_ST(ut_setup, ut_teardown,
14797 			test_snow3g_encryption_test_case_2),
14798 		TEST_CASE_ST(ut_setup, ut_teardown,
14799 			test_snow3g_encryption_test_case_3),
14800 		TEST_CASE_ST(ut_setup, ut_teardown,
14801 			test_snow3g_encryption_test_case_4),
14802 		TEST_CASE_ST(ut_setup, ut_teardown,
14803 			test_snow3g_encryption_test_case_5),
14804 
14805 		TEST_CASE_ST(ut_setup, ut_teardown,
14806 			test_snow3g_encryption_test_case_1_oop),
14807 		TEST_CASE_ST(ut_setup, ut_teardown,
14808 			test_snow3g_encryption_test_case_1_oop_sgl),
14809 		TEST_CASE_ST(ut_setup, ut_teardown,
14810 			test_snow3g_encryption_test_case_1_offset_oop),
14811 		TEST_CASE_ST(ut_setup, ut_teardown,
14812 			test_snow3g_decryption_test_case_1_oop),
14813 
14814 		/** SNOW 3G generate auth, then encrypt (UEA2) */
14815 		TEST_CASE_ST(ut_setup, ut_teardown,
14816 			test_snow3g_auth_cipher_test_case_1),
14817 		TEST_CASE_ST(ut_setup, ut_teardown,
14818 			test_snow3g_auth_cipher_test_case_2),
14819 		TEST_CASE_ST(ut_setup, ut_teardown,
14820 			test_snow3g_auth_cipher_test_case_2_oop),
14821 		TEST_CASE_ST(ut_setup, ut_teardown,
14822 			test_snow3g_auth_cipher_part_digest_enc),
14823 		TEST_CASE_ST(ut_setup, ut_teardown,
14824 			test_snow3g_auth_cipher_part_digest_enc_oop),
14825 		TEST_CASE_ST(ut_setup, ut_teardown,
14826 			test_snow3g_auth_cipher_test_case_3_sgl),
14827 		TEST_CASE_ST(ut_setup, ut_teardown,
14828 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
14829 		TEST_CASE_ST(ut_setup, ut_teardown,
14830 			test_snow3g_auth_cipher_part_digest_enc_sgl),
14831 		TEST_CASE_ST(ut_setup, ut_teardown,
14832 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
14833 
14834 		/** SNOW 3G decrypt (UEA2), then verify auth */
14835 		TEST_CASE_ST(ut_setup, ut_teardown,
14836 			test_snow3g_auth_cipher_verify_test_case_1),
14837 		TEST_CASE_ST(ut_setup, ut_teardown,
14838 			test_snow3g_auth_cipher_verify_test_case_2),
14839 		TEST_CASE_ST(ut_setup, ut_teardown,
14840 			test_snow3g_auth_cipher_verify_test_case_2_oop),
14841 		TEST_CASE_ST(ut_setup, ut_teardown,
14842 			test_snow3g_auth_cipher_verify_part_digest_enc),
14843 		TEST_CASE_ST(ut_setup, ut_teardown,
14844 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
14845 		TEST_CASE_ST(ut_setup, ut_teardown,
14846 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
14847 		TEST_CASE_ST(ut_setup, ut_teardown,
14848 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
14849 		TEST_CASE_ST(ut_setup, ut_teardown,
14850 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
14851 		TEST_CASE_ST(ut_setup, ut_teardown,
14852 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
14853 
14854 		/** SNOW 3G decrypt only (UEA2) */
14855 		TEST_CASE_ST(ut_setup, ut_teardown,
14856 			test_snow3g_decryption_test_case_1),
14857 		TEST_CASE_ST(ut_setup, ut_teardown,
14858 			test_snow3g_decryption_test_case_2),
14859 		TEST_CASE_ST(ut_setup, ut_teardown,
14860 			test_snow3g_decryption_test_case_3),
14861 		TEST_CASE_ST(ut_setup, ut_teardown,
14862 			test_snow3g_decryption_test_case_4),
14863 		TEST_CASE_ST(ut_setup, ut_teardown,
14864 			test_snow3g_decryption_test_case_5),
14865 		TEST_CASE_ST(ut_setup, ut_teardown,
14866 			test_snow3g_decryption_with_digest_test_case_1),
14867 		TEST_CASE_ST(ut_setup, ut_teardown,
14868 			test_snow3g_hash_generate_test_case_1),
14869 		TEST_CASE_ST(ut_setup, ut_teardown,
14870 			test_snow3g_hash_generate_test_case_2),
14871 		TEST_CASE_ST(ut_setup, ut_teardown,
14872 			test_snow3g_hash_generate_test_case_3),
14873 
14874 		/* Tests with buffers which length is not byte-aligned */
14875 		TEST_CASE_ST(ut_setup, ut_teardown,
14876 			test_snow3g_hash_generate_test_case_4),
14877 		TEST_CASE_ST(ut_setup, ut_teardown,
14878 			test_snow3g_hash_generate_test_case_5),
14879 		TEST_CASE_ST(ut_setup, ut_teardown,
14880 			test_snow3g_hash_generate_test_case_6),
14881 		TEST_CASE_ST(ut_setup, ut_teardown,
14882 			test_snow3g_hash_verify_test_case_1),
14883 		TEST_CASE_ST(ut_setup, ut_teardown,
14884 			test_snow3g_hash_verify_test_case_2),
14885 		TEST_CASE_ST(ut_setup, ut_teardown,
14886 			test_snow3g_hash_verify_test_case_3),
14887 
14888 		/* Tests with buffers which length is not byte-aligned */
14889 		TEST_CASE_ST(ut_setup, ut_teardown,
14890 			test_snow3g_hash_verify_test_case_4),
14891 		TEST_CASE_ST(ut_setup, ut_teardown,
14892 			test_snow3g_hash_verify_test_case_5),
14893 		TEST_CASE_ST(ut_setup, ut_teardown,
14894 			test_snow3g_hash_verify_test_case_6),
14895 		TEST_CASE_ST(ut_setup, ut_teardown,
14896 			test_snow3g_cipher_auth_test_case_1),
14897 		TEST_CASE_ST(ut_setup, ut_teardown,
14898 			test_snow3g_auth_cipher_with_digest_test_case_1),
14899 		TEST_CASES_END()
14900 	}
14901 };
14902 
14903 static struct unit_test_suite cryptodev_zuc_testsuite  = {
14904 	.suite_name = "ZUC Test Suite",
14905 	.setup = zuc_testsuite_setup,
14906 	.unit_test_cases = {
14907 		/** ZUC encrypt only (EEA3) */
14908 		TEST_CASE_ST(ut_setup, ut_teardown,
14909 			test_zuc_encryption_test_case_1),
14910 		TEST_CASE_ST(ut_setup, ut_teardown,
14911 			test_zuc_encryption_test_case_2),
14912 		TEST_CASE_ST(ut_setup, ut_teardown,
14913 			test_zuc_encryption_test_case_3),
14914 		TEST_CASE_ST(ut_setup, ut_teardown,
14915 			test_zuc_encryption_test_case_4),
14916 		TEST_CASE_ST(ut_setup, ut_teardown,
14917 			test_zuc_encryption_test_case_5),
14918 		TEST_CASE_ST(ut_setup, ut_teardown,
14919 			test_zuc_encryption_test_case_6_sgl),
14920 
14921 		/** ZUC authenticate (EIA3) */
14922 		TEST_CASE_ST(ut_setup, ut_teardown,
14923 			test_zuc_hash_generate_test_case_1),
14924 		TEST_CASE_ST(ut_setup, ut_teardown,
14925 			test_zuc_hash_generate_test_case_2),
14926 		TEST_CASE_ST(ut_setup, ut_teardown,
14927 			test_zuc_hash_generate_test_case_3),
14928 		TEST_CASE_ST(ut_setup, ut_teardown,
14929 			test_zuc_hash_generate_test_case_4),
14930 		TEST_CASE_ST(ut_setup, ut_teardown,
14931 			test_zuc_hash_generate_test_case_5),
14932 		TEST_CASE_ST(ut_setup, ut_teardown,
14933 			test_zuc_hash_generate_test_case_6),
14934 		TEST_CASE_ST(ut_setup, ut_teardown,
14935 			test_zuc_hash_generate_test_case_7),
14936 		TEST_CASE_ST(ut_setup, ut_teardown,
14937 			test_zuc_hash_generate_test_case_8),
14938 		TEST_CASE_ST(ut_setup, ut_teardown,
14939 			test_zuc_hash_generate_test_case_9),
14940 		TEST_CASE_ST(ut_setup, ut_teardown,
14941 			test_zuc_hash_generate_test_case_10),
14942 		TEST_CASE_ST(ut_setup, ut_teardown,
14943 			test_zuc_hash_generate_test_case_11),
14944 
14945 
14946 		/** ZUC alg-chain (EEA3/EIA3) */
14947 		TEST_CASE_ST(ut_setup, ut_teardown,
14948 			test_zuc_cipher_auth_test_case_1),
14949 		TEST_CASE_ST(ut_setup, ut_teardown,
14950 			test_zuc_cipher_auth_test_case_2),
14951 
14952 		/** ZUC generate auth, then encrypt (EEA3) */
14953 		TEST_CASE_ST(ut_setup, ut_teardown,
14954 			test_zuc_auth_cipher_test_case_1),
14955 		TEST_CASE_ST(ut_setup, ut_teardown,
14956 			test_zuc_auth_cipher_test_case_1_oop),
14957 		TEST_CASE_ST(ut_setup, ut_teardown,
14958 			test_zuc_auth_cipher_test_case_1_sgl),
14959 		TEST_CASE_ST(ut_setup, ut_teardown,
14960 			test_zuc_auth_cipher_test_case_1_oop_sgl),
14961 
14962 		/** ZUC decrypt (EEA3), then verify auth */
14963 		TEST_CASE_ST(ut_setup, ut_teardown,
14964 			test_zuc_auth_cipher_verify_test_case_1),
14965 		TEST_CASE_ST(ut_setup, ut_teardown,
14966 			test_zuc_auth_cipher_verify_test_case_1_oop),
14967 		TEST_CASE_ST(ut_setup, ut_teardown,
14968 			test_zuc_auth_cipher_verify_test_case_1_sgl),
14969 		TEST_CASE_ST(ut_setup, ut_teardown,
14970 			test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
14971 
14972 		/** ZUC-256 encrypt only **/
14973 		TEST_CASE_ST(ut_setup, ut_teardown,
14974 			test_zuc256_encryption_test_case_1),
14975 		TEST_CASE_ST(ut_setup, ut_teardown,
14976 			test_zuc256_encryption_test_case_2),
14977 
14978 		/** ZUC-256 authentication only **/
14979 		TEST_CASE_ST(ut_setup, ut_teardown,
14980 			test_zuc256_authentication_test_case_1),
14981 		TEST_CASE_ST(ut_setup, ut_teardown,
14982 			test_zuc256_authentication_test_case_2),
14983 
14984 		TEST_CASES_END()
14985 	}
14986 };
14987 
14988 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
14989 	.suite_name = "HMAC_MD5 Authentication Test Suite",
14990 	.setup = hmac_md5_auth_testsuite_setup,
14991 	.unit_test_cases = {
14992 		TEST_CASE_ST(ut_setup, ut_teardown,
14993 			test_MD5_HMAC_generate_case_1),
14994 		TEST_CASE_ST(ut_setup, ut_teardown,
14995 			test_MD5_HMAC_verify_case_1),
14996 		TEST_CASE_ST(ut_setup, ut_teardown,
14997 			test_MD5_HMAC_generate_case_2),
14998 		TEST_CASE_ST(ut_setup, ut_teardown,
14999 			test_MD5_HMAC_verify_case_2),
15000 		TEST_CASES_END()
15001 	}
15002 };
15003 
15004 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
15005 	.suite_name = "Kasumi Test Suite",
15006 	.setup = kasumi_testsuite_setup,
15007 	.unit_test_cases = {
15008 		/** KASUMI hash only (UIA1) */
15009 		TEST_CASE_ST(ut_setup, ut_teardown,
15010 			test_kasumi_hash_generate_test_case_1),
15011 		TEST_CASE_ST(ut_setup, ut_teardown,
15012 			test_kasumi_hash_generate_test_case_2),
15013 		TEST_CASE_ST(ut_setup, ut_teardown,
15014 			test_kasumi_hash_generate_test_case_3),
15015 		TEST_CASE_ST(ut_setup, ut_teardown,
15016 			test_kasumi_hash_generate_test_case_4),
15017 		TEST_CASE_ST(ut_setup, ut_teardown,
15018 			test_kasumi_hash_generate_test_case_5),
15019 		TEST_CASE_ST(ut_setup, ut_teardown,
15020 			test_kasumi_hash_generate_test_case_6),
15021 
15022 		TEST_CASE_ST(ut_setup, ut_teardown,
15023 			test_kasumi_hash_verify_test_case_1),
15024 		TEST_CASE_ST(ut_setup, ut_teardown,
15025 			test_kasumi_hash_verify_test_case_2),
15026 		TEST_CASE_ST(ut_setup, ut_teardown,
15027 			test_kasumi_hash_verify_test_case_3),
15028 		TEST_CASE_ST(ut_setup, ut_teardown,
15029 			test_kasumi_hash_verify_test_case_4),
15030 		TEST_CASE_ST(ut_setup, ut_teardown,
15031 			test_kasumi_hash_verify_test_case_5),
15032 
15033 		/** KASUMI encrypt only (UEA1) */
15034 		TEST_CASE_ST(ut_setup, ut_teardown,
15035 			test_kasumi_encryption_test_case_1),
15036 		TEST_CASE_ST(ut_setup, ut_teardown,
15037 			test_kasumi_encryption_test_case_1_sgl),
15038 		TEST_CASE_ST(ut_setup, ut_teardown,
15039 			test_kasumi_encryption_test_case_1_oop),
15040 		TEST_CASE_ST(ut_setup, ut_teardown,
15041 			test_kasumi_encryption_test_case_1_oop_sgl),
15042 		TEST_CASE_ST(ut_setup, ut_teardown,
15043 			test_kasumi_encryption_test_case_2),
15044 		TEST_CASE_ST(ut_setup, ut_teardown,
15045 			test_kasumi_encryption_test_case_3),
15046 		TEST_CASE_ST(ut_setup, ut_teardown,
15047 			test_kasumi_encryption_test_case_4),
15048 		TEST_CASE_ST(ut_setup, ut_teardown,
15049 			test_kasumi_encryption_test_case_5),
15050 
15051 		/** KASUMI decrypt only (UEA1) */
15052 		TEST_CASE_ST(ut_setup, ut_teardown,
15053 			test_kasumi_decryption_test_case_1),
15054 		TEST_CASE_ST(ut_setup, ut_teardown,
15055 			test_kasumi_decryption_test_case_2),
15056 		TEST_CASE_ST(ut_setup, ut_teardown,
15057 			test_kasumi_decryption_test_case_3),
15058 		TEST_CASE_ST(ut_setup, ut_teardown,
15059 			test_kasumi_decryption_test_case_4),
15060 		TEST_CASE_ST(ut_setup, ut_teardown,
15061 			test_kasumi_decryption_test_case_5),
15062 		TEST_CASE_ST(ut_setup, ut_teardown,
15063 			test_kasumi_decryption_test_case_1_oop),
15064 		TEST_CASE_ST(ut_setup, ut_teardown,
15065 			test_kasumi_cipher_auth_test_case_1),
15066 
15067 		/** KASUMI generate auth, then encrypt (F8) */
15068 		TEST_CASE_ST(ut_setup, ut_teardown,
15069 			test_kasumi_auth_cipher_test_case_1),
15070 		TEST_CASE_ST(ut_setup, ut_teardown,
15071 			test_kasumi_auth_cipher_test_case_2),
15072 		TEST_CASE_ST(ut_setup, ut_teardown,
15073 			test_kasumi_auth_cipher_test_case_2_oop),
15074 		TEST_CASE_ST(ut_setup, ut_teardown,
15075 			test_kasumi_auth_cipher_test_case_2_sgl),
15076 		TEST_CASE_ST(ut_setup, ut_teardown,
15077 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
15078 
15079 		/** KASUMI decrypt (F8), then verify auth */
15080 		TEST_CASE_ST(ut_setup, ut_teardown,
15081 			test_kasumi_auth_cipher_verify_test_case_1),
15082 		TEST_CASE_ST(ut_setup, ut_teardown,
15083 			test_kasumi_auth_cipher_verify_test_case_2),
15084 		TEST_CASE_ST(ut_setup, ut_teardown,
15085 			test_kasumi_auth_cipher_verify_test_case_2_oop),
15086 		TEST_CASE_ST(ut_setup, ut_teardown,
15087 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
15088 		TEST_CASE_ST(ut_setup, ut_teardown,
15089 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
15090 
15091 		TEST_CASES_END()
15092 	}
15093 };
15094 
15095 static struct unit_test_suite cryptodev_esn_testsuite  = {
15096 	.suite_name = "ESN Test Suite",
15097 	.setup = esn_testsuite_setup,
15098 	.unit_test_cases = {
15099 		TEST_CASE_ST(ut_setup, ut_teardown,
15100 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
15101 		TEST_CASE_ST(ut_setup, ut_teardown,
15102 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
15103 		TEST_CASES_END()
15104 	}
15105 };
15106 
15107 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
15108 	.suite_name = "Negative AES GCM Test Suite",
15109 	.setup = negative_aes_gcm_testsuite_setup,
15110 	.unit_test_cases = {
15111 		TEST_CASE_ST(ut_setup, ut_teardown,
15112 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
15113 		TEST_CASE_ST(ut_setup, ut_teardown,
15114 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
15115 		TEST_CASE_ST(ut_setup, ut_teardown,
15116 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
15117 		TEST_CASE_ST(ut_setup, ut_teardown,
15118 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
15119 		TEST_CASE_ST(ut_setup, ut_teardown,
15120 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
15121 		TEST_CASE_ST(ut_setup, ut_teardown,
15122 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
15123 		TEST_CASE_ST(ut_setup, ut_teardown,
15124 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
15125 		TEST_CASE_ST(ut_setup, ut_teardown,
15126 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
15127 		TEST_CASE_ST(ut_setup, ut_teardown,
15128 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
15129 		TEST_CASE_ST(ut_setup, ut_teardown,
15130 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
15131 		TEST_CASE_ST(ut_setup, ut_teardown,
15132 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
15133 		TEST_CASE_ST(ut_setup, ut_teardown,
15134 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
15135 
15136 		TEST_CASES_END()
15137 	}
15138 };
15139 
15140 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
15141 	.suite_name = "Negative AES GMAC Test Suite",
15142 	.setup = negative_aes_gmac_testsuite_setup,
15143 	.unit_test_cases = {
15144 		TEST_CASE_ST(ut_setup, ut_teardown,
15145 			authentication_verify_AES128_GMAC_fail_data_corrupt),
15146 		TEST_CASE_ST(ut_setup, ut_teardown,
15147 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
15148 
15149 		TEST_CASES_END()
15150 	}
15151 };
15152 
15153 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
15154 	.suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
15155 	.setup = mixed_cipher_hash_testsuite_setup,
15156 	.unit_test_cases = {
15157 		/** AUTH AES CMAC + CIPHER AES CTR */
15158 		TEST_CASE_ST(ut_setup, ut_teardown,
15159 			test_aes_cmac_aes_ctr_digest_enc_test_case_1),
15160 		TEST_CASE_ST(ut_setup, ut_teardown,
15161 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15162 		TEST_CASE_ST(ut_setup, ut_teardown,
15163 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15164 		TEST_CASE_ST(ut_setup, ut_teardown,
15165 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15166 		TEST_CASE_ST(ut_setup, ut_teardown,
15167 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
15168 		TEST_CASE_ST(ut_setup, ut_teardown,
15169 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15170 		TEST_CASE_ST(ut_setup, ut_teardown,
15171 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15172 		TEST_CASE_ST(ut_setup, ut_teardown,
15173 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15174 
15175 		/** AUTH ZUC + CIPHER SNOW3G */
15176 		TEST_CASE_ST(ut_setup, ut_teardown,
15177 			test_auth_zuc_cipher_snow_test_case_1),
15178 		TEST_CASE_ST(ut_setup, ut_teardown,
15179 			test_verify_auth_zuc_cipher_snow_test_case_1),
15180 		/** AUTH AES CMAC + CIPHER SNOW3G */
15181 		TEST_CASE_ST(ut_setup, ut_teardown,
15182 			test_auth_aes_cmac_cipher_snow_test_case_1),
15183 		TEST_CASE_ST(ut_setup, ut_teardown,
15184 			test_verify_auth_aes_cmac_cipher_snow_test_case_1),
15185 		/** AUTH ZUC + CIPHER AES CTR */
15186 		TEST_CASE_ST(ut_setup, ut_teardown,
15187 			test_auth_zuc_cipher_aes_ctr_test_case_1),
15188 		TEST_CASE_ST(ut_setup, ut_teardown,
15189 			test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
15190 		/** AUTH SNOW3G + CIPHER AES CTR */
15191 		TEST_CASE_ST(ut_setup, ut_teardown,
15192 			test_auth_snow_cipher_aes_ctr_test_case_1),
15193 		TEST_CASE_ST(ut_setup, ut_teardown,
15194 			test_verify_auth_snow_cipher_aes_ctr_test_case_1),
15195 		/** AUTH SNOW3G + CIPHER ZUC */
15196 		TEST_CASE_ST(ut_setup, ut_teardown,
15197 			test_auth_snow_cipher_zuc_test_case_1),
15198 		TEST_CASE_ST(ut_setup, ut_teardown,
15199 			test_verify_auth_snow_cipher_zuc_test_case_1),
15200 		/** AUTH AES CMAC + CIPHER ZUC */
15201 		TEST_CASE_ST(ut_setup, ut_teardown,
15202 			test_auth_aes_cmac_cipher_zuc_test_case_1),
15203 		TEST_CASE_ST(ut_setup, ut_teardown,
15204 			test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
15205 
15206 		/** AUTH NULL + CIPHER SNOW3G */
15207 		TEST_CASE_ST(ut_setup, ut_teardown,
15208 			test_auth_null_cipher_snow_test_case_1),
15209 		TEST_CASE_ST(ut_setup, ut_teardown,
15210 			test_verify_auth_null_cipher_snow_test_case_1),
15211 		/** AUTH NULL + CIPHER ZUC */
15212 		TEST_CASE_ST(ut_setup, ut_teardown,
15213 			test_auth_null_cipher_zuc_test_case_1),
15214 		TEST_CASE_ST(ut_setup, ut_teardown,
15215 			test_verify_auth_null_cipher_zuc_test_case_1),
15216 		/** AUTH SNOW3G + CIPHER NULL */
15217 		TEST_CASE_ST(ut_setup, ut_teardown,
15218 			test_auth_snow_cipher_null_test_case_1),
15219 		TEST_CASE_ST(ut_setup, ut_teardown,
15220 			test_verify_auth_snow_cipher_null_test_case_1),
15221 		/** AUTH ZUC + CIPHER NULL */
15222 		TEST_CASE_ST(ut_setup, ut_teardown,
15223 			test_auth_zuc_cipher_null_test_case_1),
15224 		TEST_CASE_ST(ut_setup, ut_teardown,
15225 			test_verify_auth_zuc_cipher_null_test_case_1),
15226 		/** AUTH NULL + CIPHER AES CTR */
15227 		TEST_CASE_ST(ut_setup, ut_teardown,
15228 			test_auth_null_cipher_aes_ctr_test_case_1),
15229 		TEST_CASE_ST(ut_setup, ut_teardown,
15230 			test_verify_auth_null_cipher_aes_ctr_test_case_1),
15231 		/** AUTH AES CMAC + CIPHER NULL */
15232 		TEST_CASE_ST(ut_setup, ut_teardown,
15233 			test_auth_aes_cmac_cipher_null_test_case_1),
15234 		TEST_CASE_ST(ut_setup, ut_teardown,
15235 			test_verify_auth_aes_cmac_cipher_null_test_case_1),
15236 		TEST_CASES_END()
15237 	}
15238 };
15239 
15240 static int
15241 run_cryptodev_testsuite(const char *pmd_name)
15242 {
15243 	uint8_t ret, j, i = 0, blk_start_idx = 0;
15244 	const enum blockcipher_test_type blk_suites[] = {
15245 		BLKCIPHER_AES_CHAIN_TYPE,
15246 		BLKCIPHER_AES_CIPHERONLY_TYPE,
15247 		BLKCIPHER_AES_DOCSIS_TYPE,
15248 		BLKCIPHER_3DES_CHAIN_TYPE,
15249 		BLKCIPHER_3DES_CIPHERONLY_TYPE,
15250 		BLKCIPHER_DES_CIPHERONLY_TYPE,
15251 		BLKCIPHER_DES_DOCSIS_TYPE,
15252 		BLKCIPHER_AUTHONLY_TYPE};
15253 	struct unit_test_suite *static_suites[] = {
15254 		&cryptodev_multi_session_testsuite,
15255 		&cryptodev_null_testsuite,
15256 		&cryptodev_aes_ccm_auth_testsuite,
15257 		&cryptodev_aes_gcm_auth_testsuite,
15258 		&cryptodev_aes_gmac_auth_testsuite,
15259 		&cryptodev_snow3g_testsuite,
15260 		&cryptodev_chacha20_poly1305_testsuite,
15261 		&cryptodev_zuc_testsuite,
15262 		&cryptodev_hmac_md5_auth_testsuite,
15263 		&cryptodev_kasumi_testsuite,
15264 		&cryptodev_esn_testsuite,
15265 		&cryptodev_negative_aes_gcm_testsuite,
15266 		&cryptodev_negative_aes_gmac_testsuite,
15267 		&cryptodev_mixed_cipher_hash_testsuite,
15268 		&cryptodev_negative_hmac_sha1_testsuite,
15269 		&cryptodev_gen_testsuite,
15270 #ifdef RTE_LIB_SECURITY
15271 		&ipsec_proto_testsuite,
15272 		&pdcp_proto_testsuite,
15273 		&docsis_proto_testsuite,
15274 #endif
15275 		&end_testsuite
15276 	};
15277 	static struct unit_test_suite ts = {
15278 		.suite_name = "Cryptodev Unit Test Suite",
15279 		.setup = testsuite_setup,
15280 		.teardown = testsuite_teardown,
15281 		.unit_test_cases = {TEST_CASES_END()}
15282 	};
15283 
15284 	gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
15285 
15286 	if (gbl_driver_id == -1) {
15287 		RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
15288 		return TEST_SKIPPED;
15289 	}
15290 
15291 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15292 			(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
15293 
15294 	ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
15295 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15296 	ret = unit_test_suite_runner(&ts);
15297 
15298 	FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
15299 	free(ts.unit_test_suites);
15300 	return ret;
15301 }
15302 
15303 static int
15304 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
15305 {
15306 	struct rte_cryptodev_info dev_info;
15307 	uint8_t i, nb_devs;
15308 	int driver_id;
15309 
15310 	driver_id = rte_cryptodev_driver_id_get(pmd_name);
15311 	if (driver_id == -1) {
15312 		RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
15313 		return TEST_SKIPPED;
15314 	}
15315 
15316 	nb_devs = rte_cryptodev_count();
15317 	if (nb_devs < 1) {
15318 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
15319 		return TEST_SKIPPED;
15320 	}
15321 
15322 	for (i = 0; i < nb_devs; i++) {
15323 		rte_cryptodev_info_get(i, &dev_info);
15324 		if (dev_info.driver_id == driver_id) {
15325 			if (!(dev_info.feature_flags & flag)) {
15326 				RTE_LOG(INFO, USER1, "%s not supported\n",
15327 						flag_name);
15328 				return TEST_SKIPPED;
15329 			}
15330 			return 0; /* found */
15331 		}
15332 	}
15333 
15334 	RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
15335 	return TEST_SKIPPED;
15336 }
15337 
15338 static int
15339 test_cryptodev_qat(void)
15340 {
15341 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
15342 }
15343 
15344 static int
15345 test_cryptodev_virtio(void)
15346 {
15347 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
15348 }
15349 
15350 static int
15351 test_cryptodev_aesni_mb(void)
15352 {
15353 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15354 }
15355 
15356 static int
15357 test_cryptodev_cpu_aesni_mb(void)
15358 {
15359 	int32_t rc;
15360 	enum rte_security_session_action_type at = gbl_action_type;
15361 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15362 	rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15363 	gbl_action_type = at;
15364 	return rc;
15365 }
15366 
15367 static int
15368 test_cryptodev_chacha_poly_mb(void)
15369 {
15370 	int32_t rc;
15371 	enum rte_security_session_action_type at = gbl_action_type;
15372 	rc = run_cryptodev_testsuite(
15373 			RTE_STR(CRYPTODEV_NAME_CHACHA20_POLY1305_PMD));
15374 	gbl_action_type = at;
15375 	return rc;
15376 }
15377 
15378 static int
15379 test_cryptodev_openssl(void)
15380 {
15381 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
15382 }
15383 
15384 static int
15385 test_cryptodev_aesni_gcm(void)
15386 {
15387 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15388 }
15389 
15390 static int
15391 test_cryptodev_cpu_aesni_gcm(void)
15392 {
15393 	int32_t rc;
15394 	enum rte_security_session_action_type at = gbl_action_type;
15395 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15396 	rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15397 	gbl_action_type = at;
15398 	return rc;
15399 }
15400 
15401 static int
15402 test_cryptodev_mlx5(void)
15403 {
15404 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
15405 }
15406 
15407 static int
15408 test_cryptodev_null(void)
15409 {
15410 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
15411 }
15412 
15413 static int
15414 test_cryptodev_sw_snow3g(void)
15415 {
15416 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
15417 }
15418 
15419 static int
15420 test_cryptodev_sw_kasumi(void)
15421 {
15422 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
15423 }
15424 
15425 static int
15426 test_cryptodev_sw_zuc(void)
15427 {
15428 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
15429 }
15430 
15431 static int
15432 test_cryptodev_armv8(void)
15433 {
15434 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
15435 }
15436 
15437 static int
15438 test_cryptodev_mrvl(void)
15439 {
15440 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
15441 }
15442 
15443 #ifdef RTE_CRYPTO_SCHEDULER
15444 
15445 static int
15446 test_cryptodev_scheduler(void)
15447 {
15448 	uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
15449 	const enum blockcipher_test_type blk_suites[] = {
15450 		BLKCIPHER_AES_CHAIN_TYPE,
15451 		BLKCIPHER_AES_CIPHERONLY_TYPE,
15452 		BLKCIPHER_AUTHONLY_TYPE
15453 	};
15454 	static struct unit_test_suite scheduler_multicore = {
15455 		.suite_name = "Scheduler Multicore Unit Test Suite",
15456 		.setup = scheduler_multicore_testsuite_setup,
15457 		.teardown = scheduler_mode_testsuite_teardown,
15458 		.unit_test_cases = {TEST_CASES_END()}
15459 	};
15460 	static struct unit_test_suite scheduler_round_robin = {
15461 		.suite_name = "Scheduler Round Robin Unit Test Suite",
15462 		.setup = scheduler_roundrobin_testsuite_setup,
15463 		.teardown = scheduler_mode_testsuite_teardown,
15464 		.unit_test_cases = {TEST_CASES_END()}
15465 	};
15466 	static struct unit_test_suite scheduler_failover = {
15467 		.suite_name = "Scheduler Failover Unit Test Suite",
15468 		.setup = scheduler_failover_testsuite_setup,
15469 		.teardown = scheduler_mode_testsuite_teardown,
15470 		.unit_test_cases = {TEST_CASES_END()}
15471 	};
15472 	static struct unit_test_suite scheduler_pkt_size_distr = {
15473 		.suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
15474 		.setup = scheduler_pkt_size_distr_testsuite_setup,
15475 		.teardown = scheduler_mode_testsuite_teardown,
15476 		.unit_test_cases = {TEST_CASES_END()}
15477 	};
15478 	struct unit_test_suite *sched_mode_suites[] = {
15479 		&scheduler_multicore,
15480 		&scheduler_round_robin,
15481 		&scheduler_failover,
15482 		&scheduler_pkt_size_distr
15483 	};
15484 	static struct unit_test_suite scheduler_config = {
15485 		.suite_name = "Crypto Device Scheduler Config Unit Test Suite",
15486 		.unit_test_cases = {
15487 			TEST_CASE(test_scheduler_attach_worker_op),
15488 			TEST_CASE(test_scheduler_mode_multicore_op),
15489 			TEST_CASE(test_scheduler_mode_roundrobin_op),
15490 			TEST_CASE(test_scheduler_mode_failover_op),
15491 			TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
15492 			TEST_CASE(test_scheduler_detach_worker_op),
15493 
15494 			TEST_CASES_END() /**< NULL terminate array */
15495 		}
15496 	};
15497 	struct unit_test_suite *static_suites[] = {
15498 		&scheduler_config,
15499 		&end_testsuite
15500 	};
15501 	static struct unit_test_suite ts = {
15502 		.suite_name = "Scheduler Unit Test Suite",
15503 		.setup = scheduler_testsuite_setup,
15504 		.teardown = testsuite_teardown,
15505 		.unit_test_cases = {TEST_CASES_END()}
15506 	};
15507 
15508 	gbl_driver_id =	rte_cryptodev_driver_id_get(
15509 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
15510 
15511 	if (gbl_driver_id == -1) {
15512 		RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
15513 		return TEST_SKIPPED;
15514 	}
15515 
15516 	if (rte_cryptodev_driver_id_get(
15517 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
15518 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
15519 		return TEST_SKIPPED;
15520 	}
15521 
15522 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15523 		uint8_t blk_i = 0;
15524 		sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
15525 				(struct unit_test_suite *) *
15526 				(RTE_DIM(blk_suites) + 1));
15527 		ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
15528 				blk_suites, RTE_DIM(blk_suites));
15529 		sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
15530 	}
15531 
15532 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15533 			(RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
15534 	ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
15535 			RTE_DIM(sched_mode_suites));
15536 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15537 	ret = unit_test_suite_runner(&ts);
15538 
15539 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15540 		FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
15541 				(*sched_mode_suites[sched_i]),
15542 				RTE_DIM(blk_suites));
15543 		free(sched_mode_suites[sched_i]->unit_test_suites);
15544 	}
15545 	free(ts.unit_test_suites);
15546 	return ret;
15547 }
15548 
15549 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
15550 
15551 #endif
15552 
15553 static int
15554 test_cryptodev_dpaa2_sec(void)
15555 {
15556 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
15557 }
15558 
15559 static int
15560 test_cryptodev_dpaa_sec(void)
15561 {
15562 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
15563 }
15564 
15565 static int
15566 test_cryptodev_ccp(void)
15567 {
15568 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
15569 }
15570 
15571 static int
15572 test_cryptodev_octeontx(void)
15573 {
15574 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
15575 }
15576 
15577 static int
15578 test_cryptodev_octeontx2(void)
15579 {
15580 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
15581 }
15582 
15583 static int
15584 test_cryptodev_caam_jr(void)
15585 {
15586 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
15587 }
15588 
15589 static int
15590 test_cryptodev_nitrox(void)
15591 {
15592 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
15593 }
15594 
15595 static int
15596 test_cryptodev_bcmfs(void)
15597 {
15598 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
15599 }
15600 
15601 static int
15602 test_cryptodev_qat_raw_api(void)
15603 {
15604 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
15605 	int ret;
15606 
15607 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15608 			"RAW API");
15609 	if (ret)
15610 		return ret;
15611 
15612 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
15613 	ret = run_cryptodev_testsuite(pmd_name);
15614 	global_api_test_type = CRYPTODEV_API_TEST;
15615 
15616 	return ret;
15617 }
15618 
15619 static int
15620 test_cryptodev_cn9k(void)
15621 {
15622 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
15623 }
15624 
15625 static int
15626 test_cryptodev_cn10k(void)
15627 {
15628 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
15629 }
15630 
15631 static int
15632 test_cryptodev_dpaa2_sec_raw_api(void)
15633 {
15634 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
15635 	int ret;
15636 
15637 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15638 			"RAW API");
15639 	if (ret)
15640 		return ret;
15641 
15642 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
15643 	ret = run_cryptodev_testsuite(pmd_name);
15644 	global_api_test_type = CRYPTODEV_API_TEST;
15645 
15646 	return ret;
15647 }
15648 
15649 static int
15650 test_cryptodev_dpaa_sec_raw_api(void)
15651 {
15652 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
15653 	int ret;
15654 
15655 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15656 			"RAW API");
15657 	if (ret)
15658 		return ret;
15659 
15660 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
15661 	ret = run_cryptodev_testsuite(pmd_name);
15662 	global_api_test_type = CRYPTODEV_API_TEST;
15663 
15664 	return ret;
15665 }
15666 
15667 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest,
15668 		test_cryptodev_dpaa2_sec_raw_api);
15669 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest,
15670 		test_cryptodev_dpaa_sec_raw_api);
15671 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
15672 		test_cryptodev_qat_raw_api);
15673 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
15674 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
15675 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
15676 	test_cryptodev_cpu_aesni_mb);
15677 REGISTER_TEST_COMMAND(cryptodev_chacha_poly_mb_autotest,
15678 	test_cryptodev_chacha_poly_mb);
15679 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
15680 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
15681 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
15682 	test_cryptodev_cpu_aesni_gcm);
15683 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
15684 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
15685 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
15686 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
15687 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
15688 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
15689 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
15690 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
15691 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
15692 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
15693 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
15694 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
15695 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
15696 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
15697 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
15698 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
15699 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
15700 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);
15701