xref: /dpdk/app/test/test_cryptodev.c (revision 8ef09fdc)
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_string_fns.h>
20 
21 #ifdef RTE_CRYPTO_SCHEDULER
22 #include <rte_cryptodev_scheduler.h>
23 #include <rte_cryptodev_scheduler_operations.h>
24 #endif
25 
26 #include <rte_lcore.h>
27 
28 #include "test.h"
29 #include "test_cryptodev.h"
30 
31 #include "test_cryptodev_blockcipher.h"
32 #include "test_cryptodev_aes_test_vectors.h"
33 #include "test_cryptodev_des_test_vectors.h"
34 #include "test_cryptodev_hash_test_vectors.h"
35 #include "test_cryptodev_kasumi_test_vectors.h"
36 #include "test_cryptodev_kasumi_hash_test_vectors.h"
37 #include "test_cryptodev_snow3g_test_vectors.h"
38 #include "test_cryptodev_snow3g_hash_test_vectors.h"
39 #include "test_cryptodev_zuc_test_vectors.h"
40 #include "test_cryptodev_aead_test_vectors.h"
41 #include "test_cryptodev_hmac_test_vectors.h"
42 #include "test_cryptodev_mixed_test_vectors.h"
43 #ifdef RTE_LIB_SECURITY
44 #include "test_cryptodev_security_pdcp_test_vectors.h"
45 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
46 #include "test_cryptodev_security_pdcp_test_func.h"
47 #include "test_cryptodev_security_docsis_test_vectors.h"
48 
49 #define SDAP_DISABLED	0
50 #define SDAP_ENABLED	1
51 #endif
52 
53 #define VDEV_ARGS_SIZE 100
54 #define MAX_NB_SESSIONS 4
55 
56 #define MAX_DRV_SERVICE_CTX_SIZE 256
57 
58 #define MAX_RAW_DEQUEUE_COUNT	65535
59 
60 #define IN_PLACE 0
61 #define OUT_OF_PLACE 1
62 
63 static int gbl_driver_id;
64 
65 static enum rte_security_session_action_type gbl_action_type =
66 	RTE_SECURITY_ACTION_TYPE_NONE;
67 
68 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
69 
70 struct crypto_unittest_params {
71 	struct rte_crypto_sym_xform cipher_xform;
72 	struct rte_crypto_sym_xform auth_xform;
73 	struct rte_crypto_sym_xform aead_xform;
74 #ifdef RTE_LIB_SECURITY
75 	struct rte_security_docsis_xform docsis_xform;
76 #endif
77 
78 	union {
79 		struct rte_cryptodev_sym_session *sess;
80 #ifdef RTE_LIB_SECURITY
81 		struct rte_security_session *sec_session;
82 #endif
83 	};
84 #ifdef RTE_LIB_SECURITY
85 	enum rte_security_session_action_type type;
86 #endif
87 	struct rte_crypto_op *op;
88 
89 	struct rte_mbuf *obuf, *ibuf;
90 
91 	uint8_t *digest;
92 };
93 
94 #define ALIGN_POW2_ROUNDUP(num, align) \
95 	(((num) + (align) - 1) & ~((align) - 1))
96 
97 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts)	\
98 	for (j = 0; j < num_child_ts; index++, j++)			\
99 		parent_ts.unit_test_suites[index] = child_ts[j]
100 
101 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types)	\
102 	for (j = 0; j < num_blk_types; index++, j++)				\
103 		parent_ts.unit_test_suites[index] =				\
104 				build_blockcipher_test_suite(blk_types[j])
105 
106 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types)		\
107 	for (j = index; j < index + num_blk_types; j++)				\
108 		free_blockcipher_test_suite(parent_ts.unit_test_suites[j])
109 
110 /*
111  * Forward declarations.
112  */
113 static int
114 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
115 		struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
116 		uint8_t *hmac_key);
117 
118 static int
119 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
120 		struct crypto_unittest_params *ut_params,
121 		struct crypto_testsuite_params *ts_param,
122 		const uint8_t *cipher,
123 		const uint8_t *digest,
124 		const uint8_t *iv);
125 
126 static struct rte_mbuf *
127 setup_test_string(struct rte_mempool *mpool,
128 		const char *string, size_t len, uint8_t blocksize)
129 {
130 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
131 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
132 
133 	if (m) {
134 		char *dst;
135 
136 		memset(m->buf_addr, 0, m->buf_len);
137 		dst = rte_pktmbuf_append(m, t_len);
138 		if (!dst) {
139 			rte_pktmbuf_free(m);
140 			return NULL;
141 		}
142 		if (string != NULL)
143 			rte_memcpy(dst, string, t_len);
144 		else
145 			memset(dst, 0, t_len);
146 	}
147 
148 	return m;
149 }
150 
151 /* Get number of bytes in X bits (rounding up) */
152 static uint32_t
153 ceil_byte_length(uint32_t num_bits)
154 {
155 	if (num_bits % 8)
156 		return ((num_bits >> 3) + 1);
157 	else
158 		return (num_bits >> 3);
159 }
160 
161 static void
162 post_process_raw_dp_op(void *user_data,	uint32_t index __rte_unused,
163 		uint8_t is_op_success)
164 {
165 	struct rte_crypto_op *op = user_data;
166 	op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
167 			RTE_CRYPTO_OP_STATUS_ERROR;
168 }
169 
170 void
171 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
172 		struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
173 		uint8_t len_in_bits, uint8_t cipher_iv_len)
174 {
175 	struct rte_crypto_sym_op *sop = op->sym;
176 	struct rte_crypto_op *ret_op = NULL;
177 	struct rte_crypto_vec data_vec[UINT8_MAX];
178 	struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
179 	union rte_crypto_sym_ofs ofs;
180 	struct rte_crypto_sym_vec vec;
181 	struct rte_crypto_sgl sgl;
182 	uint32_t max_len;
183 	union rte_cryptodev_session_ctx sess;
184 	uint32_t count = 0;
185 	struct rte_crypto_raw_dp_ctx *ctx;
186 	uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
187 			auth_len = 0;
188 	int32_t n;
189 	uint32_t n_success;
190 	int ctx_service_size;
191 	int32_t status = 0;
192 	int enqueue_status, dequeue_status;
193 
194 	ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
195 	if (ctx_service_size < 0) {
196 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
197 		return;
198 	}
199 
200 	ctx = malloc(ctx_service_size);
201 	if (!ctx) {
202 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
203 		return;
204 	}
205 
206 	/* Both are enums, setting crypto_sess will suit any session type */
207 	sess.crypto_sess = op->sym->session;
208 
209 	if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
210 			op->sess_type, sess, 0) < 0) {
211 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
212 		goto exit;
213 	}
214 
215 	cipher_iv.iova = 0;
216 	cipher_iv.va = NULL;
217 	aad_auth_iv.iova = 0;
218 	aad_auth_iv.va = NULL;
219 	digest.iova = 0;
220 	digest.va = NULL;
221 	sgl.vec = data_vec;
222 	vec.num = 1;
223 	vec.sgl = &sgl;
224 	vec.iv = &cipher_iv;
225 	vec.digest = &digest;
226 	vec.aad = &aad_auth_iv;
227 	vec.status = &status;
228 
229 	ofs.raw = 0;
230 
231 	if (is_cipher && is_auth) {
232 		cipher_offset = sop->cipher.data.offset;
233 		cipher_len = sop->cipher.data.length;
234 		auth_offset = sop->auth.data.offset;
235 		auth_len = sop->auth.data.length;
236 		max_len = RTE_MAX(cipher_offset + cipher_len,
237 				auth_offset + auth_len);
238 		if (len_in_bits) {
239 			max_len = max_len >> 3;
240 			cipher_offset = cipher_offset >> 3;
241 			auth_offset = auth_offset >> 3;
242 			cipher_len = cipher_len >> 3;
243 			auth_len = auth_len >> 3;
244 		}
245 		ofs.ofs.cipher.head = cipher_offset;
246 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
247 		ofs.ofs.auth.head = auth_offset;
248 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
249 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
250 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
251 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
252 				op, void *, IV_OFFSET + cipher_iv_len);
253 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
254 				cipher_iv_len);
255 		digest.va = (void *)sop->auth.digest.data;
256 		digest.iova = sop->auth.digest.phys_addr;
257 
258 	} else if (is_cipher) {
259 		cipher_offset = sop->cipher.data.offset;
260 		cipher_len = sop->cipher.data.length;
261 		max_len = cipher_len + cipher_offset;
262 		if (len_in_bits) {
263 			max_len = max_len >> 3;
264 			cipher_offset = cipher_offset >> 3;
265 			cipher_len = cipher_len >> 3;
266 		}
267 		ofs.ofs.cipher.head = cipher_offset;
268 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
269 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
270 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
271 
272 	} else if (is_auth) {
273 		auth_offset = sop->auth.data.offset;
274 		auth_len = sop->auth.data.length;
275 		max_len = auth_len + auth_offset;
276 		if (len_in_bits) {
277 			max_len = max_len >> 3;
278 			auth_offset = auth_offset >> 3;
279 			auth_len = auth_len >> 3;
280 		}
281 		ofs.ofs.auth.head = auth_offset;
282 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
283 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
284 				op, void *, IV_OFFSET + cipher_iv_len);
285 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
286 				cipher_iv_len);
287 		digest.va = (void *)sop->auth.digest.data;
288 		digest.iova = sop->auth.digest.phys_addr;
289 
290 	} else { /* aead */
291 		cipher_offset = sop->aead.data.offset;
292 		cipher_len = sop->aead.data.length;
293 		max_len = cipher_len + cipher_offset;
294 		if (len_in_bits) {
295 			max_len = max_len >> 3;
296 			cipher_offset = cipher_offset >> 3;
297 			cipher_len = cipher_len >> 3;
298 		}
299 		ofs.ofs.cipher.head = cipher_offset;
300 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
301 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
302 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
303 		aad_auth_iv.va = (void *)sop->aead.aad.data;
304 		aad_auth_iv.iova = sop->aead.aad.phys_addr;
305 		digest.va = (void *)sop->aead.digest.data;
306 		digest.iova = sop->aead.digest.phys_addr;
307 	}
308 
309 	n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
310 			data_vec, RTE_DIM(data_vec));
311 	if (n < 0 || n > sop->m_src->nb_segs) {
312 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
313 		goto exit;
314 	}
315 
316 	sgl.num = n;
317 
318 	if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
319 			&enqueue_status) < 1) {
320 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
321 		goto exit;
322 	}
323 
324 	if (enqueue_status == 0) {
325 		status = rte_cryptodev_raw_enqueue_done(ctx, 1);
326 		if (status < 0) {
327 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
328 			goto exit;
329 		}
330 	} else if (enqueue_status < 0) {
331 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
332 		goto exit;
333 	}
334 
335 	n = n_success = 0;
336 	while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
337 		n = rte_cryptodev_raw_dequeue_burst(ctx,
338 			NULL, 1, post_process_raw_dp_op,
339 				(void **)&ret_op, 0, &n_success,
340 				&dequeue_status);
341 		if (dequeue_status < 0) {
342 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
343 			goto exit;
344 		}
345 		if (n == 0)
346 			rte_pause();
347 	}
348 
349 	if (n == 1 && dequeue_status == 0) {
350 		if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
351 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
352 			goto exit;
353 		}
354 	}
355 
356 	op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
357 			n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
358 					RTE_CRYPTO_OP_STATUS_SUCCESS;
359 
360 exit:
361 	free(ctx);
362 }
363 
364 static void
365 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
366 {
367 	int32_t n, st;
368 	struct rte_crypto_sym_op *sop;
369 	union rte_crypto_sym_ofs ofs;
370 	struct rte_crypto_sgl sgl;
371 	struct rte_crypto_sym_vec symvec;
372 	struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
373 	struct rte_crypto_vec vec[UINT8_MAX];
374 
375 	sop = op->sym;
376 
377 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
378 		sop->aead.data.length, vec, RTE_DIM(vec));
379 
380 	if (n < 0 || n != sop->m_src->nb_segs) {
381 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
382 		return;
383 	}
384 
385 	sgl.vec = vec;
386 	sgl.num = n;
387 	symvec.sgl = &sgl;
388 	symvec.iv = &iv_ptr;
389 	symvec.digest = &digest_ptr;
390 	symvec.aad = &aad_ptr;
391 	symvec.status = &st;
392 	symvec.num = 1;
393 
394 	/* for CPU crypto the IOVA address is not required */
395 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
396 	digest_ptr.va = (void *)sop->aead.digest.data;
397 	aad_ptr.va = (void *)sop->aead.aad.data;
398 
399 	ofs.raw = 0;
400 
401 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
402 		&symvec);
403 
404 	if (n != 1)
405 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
406 	else
407 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
408 }
409 
410 static void
411 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
412 {
413 	int32_t n, st;
414 	struct rte_crypto_sym_op *sop;
415 	union rte_crypto_sym_ofs ofs;
416 	struct rte_crypto_sgl sgl;
417 	struct rte_crypto_sym_vec symvec;
418 	struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
419 	struct rte_crypto_vec vec[UINT8_MAX];
420 
421 	sop = op->sym;
422 
423 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
424 		sop->auth.data.length, vec, RTE_DIM(vec));
425 
426 	if (n < 0 || n != sop->m_src->nb_segs) {
427 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
428 		return;
429 	}
430 
431 	sgl.vec = vec;
432 	sgl.num = n;
433 	symvec.sgl = &sgl;
434 	symvec.iv = &iv_ptr;
435 	symvec.digest = &digest_ptr;
436 	symvec.status = &st;
437 	symvec.num = 1;
438 
439 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
440 	digest_ptr.va = (void *)sop->auth.digest.data;
441 
442 	ofs.raw = 0;
443 	ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
444 	ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
445 		(sop->cipher.data.offset + sop->cipher.data.length);
446 
447 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
448 		&symvec);
449 
450 	if (n != 1)
451 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
452 	else
453 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
454 }
455 
456 static struct rte_crypto_op *
457 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
458 {
459 
460 	RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
461 
462 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
463 		RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
464 		return NULL;
465 	}
466 
467 	op = NULL;
468 
469 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
470 		rte_pause();
471 
472 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
473 		RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
474 		return NULL;
475 	}
476 
477 	return op;
478 }
479 
480 static struct crypto_testsuite_params testsuite_params = { NULL };
481 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
482 static struct crypto_unittest_params unittest_params;
483 
484 static int
485 testsuite_setup(void)
486 {
487 	struct crypto_testsuite_params *ts_params = &testsuite_params;
488 	struct rte_cryptodev_info info;
489 	uint32_t i = 0, nb_devs, dev_id;
490 	uint16_t qp_id;
491 
492 	memset(ts_params, 0, sizeof(*ts_params));
493 
494 	ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
495 	if (ts_params->mbuf_pool == NULL) {
496 		/* Not already created so create */
497 		ts_params->mbuf_pool = rte_pktmbuf_pool_create(
498 				"CRYPTO_MBUFPOOL",
499 				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
500 				rte_socket_id());
501 		if (ts_params->mbuf_pool == NULL) {
502 			RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
503 			return TEST_FAILED;
504 		}
505 	}
506 
507 	ts_params->large_mbuf_pool = rte_mempool_lookup(
508 			"CRYPTO_LARGE_MBUFPOOL");
509 	if (ts_params->large_mbuf_pool == NULL) {
510 		/* Not already created so create */
511 		ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
512 				"CRYPTO_LARGE_MBUFPOOL",
513 				1, 0, 0, UINT16_MAX,
514 				rte_socket_id());
515 		if (ts_params->large_mbuf_pool == NULL) {
516 			RTE_LOG(ERR, USER1,
517 				"Can't create CRYPTO_LARGE_MBUFPOOL\n");
518 			return TEST_FAILED;
519 		}
520 	}
521 
522 	ts_params->op_mpool = rte_crypto_op_pool_create(
523 			"MBUF_CRYPTO_SYM_OP_POOL",
524 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
525 			NUM_MBUFS, MBUF_CACHE_SIZE,
526 			DEFAULT_NUM_XFORMS *
527 			sizeof(struct rte_crypto_sym_xform) +
528 			MAXIMUM_IV_LENGTH,
529 			rte_socket_id());
530 	if (ts_params->op_mpool == NULL) {
531 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
532 		return TEST_FAILED;
533 	}
534 
535 	nb_devs = rte_cryptodev_count();
536 	if (nb_devs < 1) {
537 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
538 		return TEST_SKIPPED;
539 	}
540 
541 	if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
542 		RTE_LOG(WARNING, USER1, "No %s devices found?\n",
543 				rte_cryptodev_driver_name_get(gbl_driver_id));
544 		return TEST_SKIPPED;
545 	}
546 
547 	/* Create list of valid crypto devs */
548 	for (i = 0; i < nb_devs; i++) {
549 		rte_cryptodev_info_get(i, &info);
550 		if (info.driver_id == gbl_driver_id)
551 			ts_params->valid_devs[ts_params->valid_dev_count++] = i;
552 	}
553 
554 	if (ts_params->valid_dev_count < 1)
555 		return TEST_FAILED;
556 
557 	/* Set up all the qps on the first of the valid devices found */
558 
559 	dev_id = ts_params->valid_devs[0];
560 
561 	rte_cryptodev_info_get(dev_id, &info);
562 
563 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
564 	ts_params->conf.socket_id = SOCKET_ID_ANY;
565 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
566 
567 	unsigned int session_size =
568 		rte_cryptodev_sym_get_private_session_size(dev_id);
569 
570 #ifdef RTE_LIB_SECURITY
571 	unsigned int security_session_size = rte_security_session_get_size(
572 			rte_cryptodev_get_sec_ctx(dev_id));
573 
574 	if (session_size < security_session_size)
575 		session_size = security_session_size;
576 #endif
577 	/*
578 	 * Create mempool with maximum number of sessions.
579 	 */
580 	if (info.sym.max_nb_sessions != 0 &&
581 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
582 		RTE_LOG(ERR, USER1, "Device does not support "
583 				"at least %u sessions\n",
584 				MAX_NB_SESSIONS);
585 		return TEST_FAILED;
586 	}
587 
588 	ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
589 			"test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
590 			SOCKET_ID_ANY);
591 	TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
592 			"session mempool allocation failed");
593 
594 	ts_params->session_priv_mpool = rte_mempool_create(
595 			"test_sess_mp_priv",
596 			MAX_NB_SESSIONS,
597 			session_size,
598 			0, 0, NULL, NULL, NULL,
599 			NULL, SOCKET_ID_ANY,
600 			0);
601 	TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
602 			"session mempool allocation failed");
603 
604 
605 
606 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
607 			&ts_params->conf),
608 			"Failed to configure cryptodev %u with %u qps",
609 			dev_id, ts_params->conf.nb_queue_pairs);
610 
611 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
612 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
613 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
614 
615 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
616 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
617 			dev_id, qp_id, &ts_params->qp_conf,
618 			rte_cryptodev_socket_id(dev_id)),
619 			"Failed to setup queue pair %u on cryptodev %u",
620 			qp_id, dev_id);
621 	}
622 
623 	return TEST_SUCCESS;
624 }
625 
626 static void
627 testsuite_teardown(void)
628 {
629 	struct crypto_testsuite_params *ts_params = &testsuite_params;
630 	int res;
631 
632 	if (ts_params->mbuf_pool != NULL) {
633 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
634 		rte_mempool_avail_count(ts_params->mbuf_pool));
635 	}
636 
637 	if (ts_params->op_mpool != NULL) {
638 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
639 		rte_mempool_avail_count(ts_params->op_mpool));
640 	}
641 
642 	/* Free session mempools */
643 	if (ts_params->session_priv_mpool != NULL) {
644 		rte_mempool_free(ts_params->session_priv_mpool);
645 		ts_params->session_priv_mpool = NULL;
646 	}
647 
648 	if (ts_params->session_mpool != NULL) {
649 		rte_mempool_free(ts_params->session_mpool);
650 		ts_params->session_mpool = NULL;
651 	}
652 
653 	res = rte_cryptodev_close(ts_params->valid_devs[0]);
654 	if (res)
655 		RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
656 }
657 
658 static int
659 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
660 		const int *algs, uint16_t num_algs)
661 {
662 	uint8_t dev_id = testsuite_params.valid_devs[0];
663 	bool some_alg_supported = FALSE;
664 	uint16_t i;
665 
666 	for (i = 0; i < num_algs && !some_alg_supported; i++) {
667 		struct rte_cryptodev_sym_capability_idx alg = {
668 			type, {algs[i]}
669 		};
670 		if (rte_cryptodev_sym_capability_get(dev_id,
671 				&alg) != NULL)
672 			some_alg_supported = TRUE;
673 	}
674 	if (!some_alg_supported)
675 		return TEST_SKIPPED;
676 
677 	return 0;
678 }
679 
680 int
681 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
682 		uint16_t num_ciphers)
683 {
684 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
685 			(const int *) ciphers, num_ciphers);
686 }
687 
688 int
689 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
690 		uint16_t num_auths)
691 {
692 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
693 			(const int *) auths, num_auths);
694 }
695 
696 int
697 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
698 		uint16_t num_aeads)
699 {
700 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
701 			(const int *) aeads, num_aeads);
702 }
703 
704 static int
705 null_testsuite_setup(void)
706 {
707 	struct crypto_testsuite_params *ts_params = &testsuite_params;
708 	uint8_t dev_id = ts_params->valid_devs[0];
709 	struct rte_cryptodev_info dev_info;
710 	const enum rte_crypto_cipher_algorithm ciphers[] = {
711 		RTE_CRYPTO_CIPHER_NULL
712 	};
713 	const enum rte_crypto_auth_algorithm auths[] = {
714 		RTE_CRYPTO_AUTH_NULL
715 	};
716 
717 	rte_cryptodev_info_get(dev_id, &dev_info);
718 
719 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
720 		RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
721 				"testsuite not met\n");
722 		return TEST_SKIPPED;
723 	}
724 
725 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
726 			&& check_auth_capabilities_supported(auths,
727 			RTE_DIM(auths)) != 0) {
728 		RTE_LOG(INFO, USER1, "Capability requirements for NULL "
729 				"testsuite not met\n");
730 		return TEST_SKIPPED;
731 	}
732 
733 	return 0;
734 }
735 
736 static int
737 crypto_gen_testsuite_setup(void)
738 {
739 	struct crypto_testsuite_params *ts_params = &testsuite_params;
740 	uint8_t dev_id = ts_params->valid_devs[0];
741 	struct rte_cryptodev_info dev_info;
742 
743 	rte_cryptodev_info_get(dev_id, &dev_info);
744 
745 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
746 		RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
747 				"testsuite not met\n");
748 		return TEST_SKIPPED;
749 	}
750 
751 	return 0;
752 }
753 
754 #ifdef RTE_LIB_SECURITY
755 static int
756 pdcp_proto_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 		RTE_CRYPTO_CIPHER_AES_CTR,
764 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
765 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
766 	};
767 	const enum rte_crypto_auth_algorithm auths[] = {
768 		RTE_CRYPTO_AUTH_NULL,
769 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
770 		RTE_CRYPTO_AUTH_AES_CMAC,
771 		RTE_CRYPTO_AUTH_ZUC_EIA3
772 	};
773 
774 	rte_cryptodev_info_get(dev_id, &dev_info);
775 
776 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
777 			!(dev_info.feature_flags &
778 			RTE_CRYPTODEV_FF_SECURITY)) {
779 		RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
780 				"testsuite not met\n");
781 		return TEST_SKIPPED;
782 	}
783 
784 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
785 			&& check_auth_capabilities_supported(auths,
786 			RTE_DIM(auths)) != 0) {
787 		RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
788 				"testsuite not met\n");
789 		return TEST_SKIPPED;
790 	}
791 
792 	return 0;
793 }
794 
795 static int
796 docsis_proto_testsuite_setup(void)
797 {
798 	struct crypto_testsuite_params *ts_params = &testsuite_params;
799 	uint8_t dev_id = ts_params->valid_devs[0];
800 	struct rte_cryptodev_info dev_info;
801 	const enum rte_crypto_cipher_algorithm ciphers[] = {
802 		RTE_CRYPTO_CIPHER_AES_DOCSISBPI
803 	};
804 
805 	rte_cryptodev_info_get(dev_id, &dev_info);
806 
807 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
808 			!(dev_info.feature_flags &
809 			RTE_CRYPTODEV_FF_SECURITY)) {
810 		RTE_LOG(INFO, USER1, "Feature flag requirements for Docsis "
811 				"Proto testsuite not met\n");
812 		return TEST_SKIPPED;
813 	}
814 
815 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
816 		RTE_LOG(INFO, USER1, "Capability requirements for Docsis Proto "
817 				"testsuite not met\n");
818 		return TEST_SKIPPED;
819 	}
820 
821 	return 0;
822 }
823 #endif
824 
825 static int
826 aes_ccm_auth_testsuite_setup(void)
827 {
828 	struct crypto_testsuite_params *ts_params = &testsuite_params;
829 	uint8_t dev_id = ts_params->valid_devs[0];
830 	struct rte_cryptodev_info dev_info;
831 	const enum rte_crypto_aead_algorithm aeads[] = {
832 		RTE_CRYPTO_AEAD_AES_CCM
833 	};
834 
835 	rte_cryptodev_info_get(dev_id, &dev_info);
836 
837 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
838 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
839 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
840 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
841 				"testsuite not met\n");
842 		return TEST_SKIPPED;
843 	}
844 
845 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
846 		RTE_LOG(INFO, USER1, "Capability requirements for AES CCM "
847 				"testsuite not met\n");
848 		return TEST_SKIPPED;
849 	}
850 
851 	return 0;
852 }
853 
854 static int
855 aes_gcm_auth_testsuite_setup(void)
856 {
857 	struct crypto_testsuite_params *ts_params = &testsuite_params;
858 	uint8_t dev_id = ts_params->valid_devs[0];
859 	struct rte_cryptodev_info dev_info;
860 	const enum rte_crypto_aead_algorithm aeads[] = {
861 		RTE_CRYPTO_AEAD_AES_GCM
862 	};
863 
864 	rte_cryptodev_info_get(dev_id, &dev_info);
865 
866 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
867 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
868 				"testsuite not met\n");
869 		return TEST_SKIPPED;
870 	}
871 
872 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
873 		RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
874 				"testsuite not met\n");
875 		return TEST_SKIPPED;
876 	}
877 
878 	return 0;
879 }
880 
881 static int
882 aes_gmac_auth_testsuite_setup(void)
883 {
884 	struct crypto_testsuite_params *ts_params = &testsuite_params;
885 	uint8_t dev_id = ts_params->valid_devs[0];
886 	struct rte_cryptodev_info dev_info;
887 	const enum rte_crypto_auth_algorithm auths[] = {
888 		RTE_CRYPTO_AUTH_AES_GMAC
889 	};
890 
891 	rte_cryptodev_info_get(dev_id, &dev_info);
892 
893 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
894 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
895 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
896 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
897 				"testsuite not met\n");
898 		return TEST_SKIPPED;
899 	}
900 
901 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
902 		RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
903 				"testsuite not met\n");
904 		return TEST_SKIPPED;
905 	}
906 
907 	return 0;
908 }
909 
910 static int
911 chacha20_poly1305_testsuite_setup(void)
912 {
913 	struct crypto_testsuite_params *ts_params = &testsuite_params;
914 	uint8_t dev_id = ts_params->valid_devs[0];
915 	struct rte_cryptodev_info dev_info;
916 	const enum rte_crypto_aead_algorithm aeads[] = {
917 		RTE_CRYPTO_AEAD_CHACHA20_POLY1305
918 	};
919 
920 	rte_cryptodev_info_get(dev_id, &dev_info);
921 
922 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
923 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
924 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
925 		RTE_LOG(INFO, USER1, "Feature flag requirements for "
926 				"Chacha20-Poly1305 testsuite not met\n");
927 		return TEST_SKIPPED;
928 	}
929 
930 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
931 		RTE_LOG(INFO, USER1, "Capability requirements for "
932 				"Chacha20-Poly1305 testsuite not met\n");
933 		return TEST_SKIPPED;
934 	}
935 
936 	return 0;
937 }
938 
939 static int
940 snow3g_testsuite_setup(void)
941 {
942 	struct crypto_testsuite_params *ts_params = &testsuite_params;
943 	uint8_t dev_id = ts_params->valid_devs[0];
944 	struct rte_cryptodev_info dev_info;
945 	const enum rte_crypto_cipher_algorithm ciphers[] = {
946 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
947 
948 	};
949 	const enum rte_crypto_auth_algorithm auths[] = {
950 		RTE_CRYPTO_AUTH_SNOW3G_UIA2
951 	};
952 
953 	rte_cryptodev_info_get(dev_id, &dev_info);
954 
955 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
956 		RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
957 				"testsuite not met\n");
958 		return TEST_SKIPPED;
959 	}
960 
961 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
962 			&& check_auth_capabilities_supported(auths,
963 			RTE_DIM(auths)) != 0) {
964 		RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
965 				"testsuite not met\n");
966 		return TEST_SKIPPED;
967 	}
968 
969 	return 0;
970 }
971 
972 static int
973 zuc_testsuite_setup(void)
974 {
975 	struct crypto_testsuite_params *ts_params = &testsuite_params;
976 	uint8_t dev_id = ts_params->valid_devs[0];
977 	struct rte_cryptodev_info dev_info;
978 	const enum rte_crypto_cipher_algorithm ciphers[] = {
979 		RTE_CRYPTO_CIPHER_ZUC_EEA3
980 	};
981 	const enum rte_crypto_auth_algorithm auths[] = {
982 		RTE_CRYPTO_AUTH_ZUC_EIA3
983 	};
984 
985 	rte_cryptodev_info_get(dev_id, &dev_info);
986 
987 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
988 		RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
989 				"testsuite not met\n");
990 		return TEST_SKIPPED;
991 	}
992 
993 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
994 			&& check_auth_capabilities_supported(auths,
995 			RTE_DIM(auths)) != 0) {
996 		RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
997 				"testsuite not met\n");
998 		return TEST_SKIPPED;
999 	}
1000 
1001 	return 0;
1002 }
1003 
1004 static int
1005 hmac_md5_auth_testsuite_setup(void)
1006 {
1007 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1008 	uint8_t dev_id = ts_params->valid_devs[0];
1009 	struct rte_cryptodev_info dev_info;
1010 	const enum rte_crypto_auth_algorithm auths[] = {
1011 		RTE_CRYPTO_AUTH_MD5_HMAC
1012 	};
1013 
1014 	rte_cryptodev_info_get(dev_id, &dev_info);
1015 
1016 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1017 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1018 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1019 		RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1020 				"Auth testsuite not met\n");
1021 		return TEST_SKIPPED;
1022 	}
1023 
1024 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1025 		RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1026 				"testsuite not met\n");
1027 		return TEST_SKIPPED;
1028 	}
1029 
1030 	return 0;
1031 }
1032 
1033 static int
1034 kasumi_testsuite_setup(void)
1035 {
1036 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1037 	uint8_t dev_id = ts_params->valid_devs[0];
1038 	struct rte_cryptodev_info dev_info;
1039 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1040 		RTE_CRYPTO_CIPHER_KASUMI_F8
1041 	};
1042 	const enum rte_crypto_auth_algorithm auths[] = {
1043 		RTE_CRYPTO_AUTH_KASUMI_F9
1044 	};
1045 
1046 	rte_cryptodev_info_get(dev_id, &dev_info);
1047 
1048 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1049 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1050 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1051 		RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1052 				"testsuite not met\n");
1053 		return TEST_SKIPPED;
1054 	}
1055 
1056 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1057 			&& check_auth_capabilities_supported(auths,
1058 			RTE_DIM(auths)) != 0) {
1059 		RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1060 				"testsuite not met\n");
1061 		return TEST_SKIPPED;
1062 	}
1063 
1064 	return 0;
1065 }
1066 
1067 static int
1068 negative_aes_gcm_testsuite_setup(void)
1069 {
1070 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1071 	uint8_t dev_id = ts_params->valid_devs[0];
1072 	struct rte_cryptodev_info dev_info;
1073 	const enum rte_crypto_aead_algorithm aeads[] = {
1074 		RTE_CRYPTO_AEAD_AES_GCM
1075 	};
1076 
1077 	rte_cryptodev_info_get(dev_id, &dev_info);
1078 
1079 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1080 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1081 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1082 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1083 				"AES GCM testsuite not met\n");
1084 		return TEST_SKIPPED;
1085 	}
1086 
1087 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1088 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1089 				"AES GCM testsuite not met\n");
1090 		return TEST_SKIPPED;
1091 	}
1092 
1093 	return 0;
1094 }
1095 
1096 static int
1097 negative_aes_gmac_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_AES_GMAC
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 Negative "
1112 				"AES GMAC 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 Negative "
1118 				"AES GMAC testsuite not met\n");
1119 		return TEST_SKIPPED;
1120 	}
1121 
1122 	return 0;
1123 }
1124 
1125 static int
1126 mixed_cipher_hash_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 	uint64_t feat_flags;
1132 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1133 		RTE_CRYPTO_CIPHER_NULL,
1134 		RTE_CRYPTO_CIPHER_AES_CTR,
1135 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
1136 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1137 	};
1138 	const enum rte_crypto_auth_algorithm auths[] = {
1139 		RTE_CRYPTO_AUTH_NULL,
1140 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1141 		RTE_CRYPTO_AUTH_AES_CMAC,
1142 		RTE_CRYPTO_AUTH_ZUC_EIA3
1143 	};
1144 
1145 	rte_cryptodev_info_get(dev_id, &dev_info);
1146 	feat_flags = dev_info.feature_flags;
1147 
1148 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1149 			(global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1150 		RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1151 				"Cipher Hash testsuite not met\n");
1152 		return TEST_SKIPPED;
1153 	}
1154 
1155 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1156 			&& check_auth_capabilities_supported(auths,
1157 			RTE_DIM(auths)) != 0) {
1158 		RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1159 				"Cipher Hash testsuite not met\n");
1160 		return TEST_SKIPPED;
1161 	}
1162 
1163 	return 0;
1164 }
1165 
1166 static int
1167 esn_testsuite_setup(void)
1168 {
1169 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1170 	uint8_t dev_id = ts_params->valid_devs[0];
1171 	struct rte_cryptodev_info dev_info;
1172 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1173 		RTE_CRYPTO_CIPHER_AES_CBC
1174 	};
1175 	const enum rte_crypto_auth_algorithm auths[] = {
1176 		RTE_CRYPTO_AUTH_SHA1_HMAC
1177 	};
1178 
1179 	rte_cryptodev_info_get(dev_id, &dev_info);
1180 
1181 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1182 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1183 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1184 		RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1185 				"testsuite not met\n");
1186 		return TEST_SKIPPED;
1187 	}
1188 
1189 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1190 			&& check_auth_capabilities_supported(auths,
1191 			RTE_DIM(auths)) != 0) {
1192 		RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1193 				"testsuite not met\n");
1194 		return TEST_SKIPPED;
1195 	}
1196 
1197 	return 0;
1198 }
1199 
1200 static int
1201 multi_session_testsuite_setup(void)
1202 {
1203 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1204 	uint8_t dev_id = ts_params->valid_devs[0];
1205 	struct rte_cryptodev_info dev_info;
1206 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1207 		RTE_CRYPTO_CIPHER_AES_CBC
1208 	};
1209 	const enum rte_crypto_auth_algorithm auths[] = {
1210 		RTE_CRYPTO_AUTH_SHA512_HMAC
1211 	};
1212 
1213 	rte_cryptodev_info_get(dev_id, &dev_info);
1214 
1215 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1216 		RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1217 				"Session testsuite not met\n");
1218 		return TEST_SKIPPED;
1219 	}
1220 
1221 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1222 			&& check_auth_capabilities_supported(auths,
1223 			RTE_DIM(auths)) != 0) {
1224 		RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1225 				"Session testsuite not met\n");
1226 		return TEST_SKIPPED;
1227 	}
1228 
1229 	return 0;
1230 }
1231 
1232 static int
1233 negative_hmac_sha1_testsuite_setup(void)
1234 {
1235 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1236 	uint8_t dev_id = ts_params->valid_devs[0];
1237 	struct rte_cryptodev_info dev_info;
1238 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1239 		RTE_CRYPTO_CIPHER_AES_CBC
1240 	};
1241 	const enum rte_crypto_auth_algorithm auths[] = {
1242 		RTE_CRYPTO_AUTH_SHA1_HMAC
1243 	};
1244 
1245 	rte_cryptodev_info_get(dev_id, &dev_info);
1246 
1247 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1248 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1249 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1250 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1251 				"HMAC SHA1 testsuite not met\n");
1252 		return TEST_SKIPPED;
1253 	}
1254 
1255 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1256 			&& check_auth_capabilities_supported(auths,
1257 			RTE_DIM(auths)) != 0) {
1258 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1259 				"HMAC SHA1 testsuite not met\n");
1260 		return TEST_SKIPPED;
1261 	}
1262 
1263 	return 0;
1264 }
1265 
1266 static int
1267 dev_configure_and_start(uint64_t ff_disable)
1268 {
1269 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1270 	struct crypto_unittest_params *ut_params = &unittest_params;
1271 
1272 	uint16_t qp_id;
1273 
1274 	/* Clear unit test parameters before running test */
1275 	memset(ut_params, 0, sizeof(*ut_params));
1276 
1277 	/* Reconfigure device to default parameters */
1278 	ts_params->conf.socket_id = SOCKET_ID_ANY;
1279 	ts_params->conf.ff_disable = ff_disable;
1280 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1281 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
1282 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
1283 
1284 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1285 			&ts_params->conf),
1286 			"Failed to configure cryptodev %u",
1287 			ts_params->valid_devs[0]);
1288 
1289 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1290 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1291 			ts_params->valid_devs[0], qp_id,
1292 			&ts_params->qp_conf,
1293 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1294 			"Failed to setup queue pair %u on cryptodev %u",
1295 			qp_id, ts_params->valid_devs[0]);
1296 	}
1297 
1298 
1299 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1300 
1301 	/* Start the device */
1302 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1303 			"Failed to start cryptodev %u",
1304 			ts_params->valid_devs[0]);
1305 
1306 	return TEST_SUCCESS;
1307 }
1308 
1309 int
1310 ut_setup(void)
1311 {
1312 	/* Configure and start the device with security feature disabled */
1313 	return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1314 }
1315 
1316 static int
1317 ut_setup_security(void)
1318 {
1319 	/* Configure and start the device with no features disabled */
1320 	return dev_configure_and_start(0);
1321 }
1322 
1323 void
1324 ut_teardown(void)
1325 {
1326 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1327 	struct crypto_unittest_params *ut_params = &unittest_params;
1328 	struct rte_cryptodev_stats stats;
1329 
1330 	/* free crypto session structure */
1331 #ifdef RTE_LIB_SECURITY
1332 	if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1333 		if (ut_params->sec_session) {
1334 			rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1335 						(ts_params->valid_devs[0]),
1336 						ut_params->sec_session);
1337 			ut_params->sec_session = NULL;
1338 		}
1339 	} else
1340 #endif
1341 	{
1342 		if (ut_params->sess) {
1343 			rte_cryptodev_sym_session_clear(
1344 					ts_params->valid_devs[0],
1345 					ut_params->sess);
1346 			rte_cryptodev_sym_session_free(ut_params->sess);
1347 			ut_params->sess = NULL;
1348 		}
1349 	}
1350 
1351 	/* free crypto operation structure */
1352 	if (ut_params->op)
1353 		rte_crypto_op_free(ut_params->op);
1354 
1355 	/*
1356 	 * free mbuf - both obuf and ibuf are usually the same,
1357 	 * so check if they point at the same address is necessary,
1358 	 * to avoid freeing the mbuf twice.
1359 	 */
1360 	if (ut_params->obuf) {
1361 		rte_pktmbuf_free(ut_params->obuf);
1362 		if (ut_params->ibuf == ut_params->obuf)
1363 			ut_params->ibuf = 0;
1364 		ut_params->obuf = 0;
1365 	}
1366 	if (ut_params->ibuf) {
1367 		rte_pktmbuf_free(ut_params->ibuf);
1368 		ut_params->ibuf = 0;
1369 	}
1370 
1371 	if (ts_params->mbuf_pool != NULL)
1372 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1373 			rte_mempool_avail_count(ts_params->mbuf_pool));
1374 
1375 	rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
1376 
1377 	/* Stop the device */
1378 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1379 }
1380 
1381 static int
1382 test_device_configure_invalid_dev_id(void)
1383 {
1384 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1385 	uint16_t dev_id, num_devs = 0;
1386 
1387 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1388 			"Need at least %d devices for test", 1);
1389 
1390 	/* valid dev_id values */
1391 	dev_id = ts_params->valid_devs[0];
1392 
1393 	/* Stop the device in case it's started so it can be configured */
1394 	rte_cryptodev_stop(dev_id);
1395 
1396 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1397 			"Failed test for rte_cryptodev_configure: "
1398 			"invalid dev_num %u", dev_id);
1399 
1400 	/* invalid dev_id values */
1401 	dev_id = num_devs;
1402 
1403 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1404 			"Failed test for rte_cryptodev_configure: "
1405 			"invalid dev_num %u", dev_id);
1406 
1407 	dev_id = 0xff;
1408 
1409 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1410 			"Failed test for rte_cryptodev_configure:"
1411 			"invalid dev_num %u", dev_id);
1412 
1413 	return TEST_SUCCESS;
1414 }
1415 
1416 static int
1417 test_device_configure_invalid_queue_pair_ids(void)
1418 {
1419 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1420 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1421 
1422 	/* Stop the device in case it's started so it can be configured */
1423 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1424 
1425 	/* valid - max value queue pairs */
1426 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1427 
1428 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1429 			&ts_params->conf),
1430 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1431 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1432 
1433 	/* valid - one queue pairs */
1434 	ts_params->conf.nb_queue_pairs = 1;
1435 
1436 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1437 			&ts_params->conf),
1438 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1439 			ts_params->valid_devs[0],
1440 			ts_params->conf.nb_queue_pairs);
1441 
1442 
1443 	/* invalid - zero queue pairs */
1444 	ts_params->conf.nb_queue_pairs = 0;
1445 
1446 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1447 			&ts_params->conf),
1448 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1449 			" invalid qps: %u",
1450 			ts_params->valid_devs[0],
1451 			ts_params->conf.nb_queue_pairs);
1452 
1453 
1454 	/* invalid - max value supported by field queue pairs */
1455 	ts_params->conf.nb_queue_pairs = UINT16_MAX;
1456 
1457 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1458 			&ts_params->conf),
1459 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1460 			" invalid qps: %u",
1461 			ts_params->valid_devs[0],
1462 			ts_params->conf.nb_queue_pairs);
1463 
1464 
1465 	/* invalid - max value + 1 queue pairs */
1466 	ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1467 
1468 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1469 			&ts_params->conf),
1470 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1471 			" invalid qps: %u",
1472 			ts_params->valid_devs[0],
1473 			ts_params->conf.nb_queue_pairs);
1474 
1475 	/* revert to original testsuite value */
1476 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1477 
1478 	return TEST_SUCCESS;
1479 }
1480 
1481 static int
1482 test_queue_pair_descriptor_setup(void)
1483 {
1484 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1485 	struct rte_cryptodev_qp_conf qp_conf = {
1486 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
1487 	};
1488 	uint16_t qp_id;
1489 
1490 	/* Stop the device in case it's started so it can be configured */
1491 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1492 
1493 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1494 			&ts_params->conf),
1495 			"Failed to configure cryptodev %u",
1496 			ts_params->valid_devs[0]);
1497 
1498 	/*
1499 	 * Test various ring sizes on this device. memzones can't be
1500 	 * freed so are re-used if ring is released and re-created.
1501 	 */
1502 	qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1503 	qp_conf.mp_session = ts_params->session_mpool;
1504 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
1505 
1506 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1507 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1508 				ts_params->valid_devs[0], qp_id, &qp_conf,
1509 				rte_cryptodev_socket_id(
1510 						ts_params->valid_devs[0])),
1511 				"Failed test for "
1512 				"rte_cryptodev_queue_pair_setup: num_inflights "
1513 				"%u on qp %u on cryptodev %u",
1514 				qp_conf.nb_descriptors, qp_id,
1515 				ts_params->valid_devs[0]);
1516 	}
1517 
1518 	qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1519 
1520 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1521 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1522 				ts_params->valid_devs[0], qp_id, &qp_conf,
1523 				rte_cryptodev_socket_id(
1524 						ts_params->valid_devs[0])),
1525 				"Failed test for"
1526 				" rte_cryptodev_queue_pair_setup: num_inflights"
1527 				" %u on qp %u on cryptodev %u",
1528 				qp_conf.nb_descriptors, qp_id,
1529 				ts_params->valid_devs[0]);
1530 	}
1531 
1532 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1533 
1534 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1535 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1536 				ts_params->valid_devs[0], qp_id, &qp_conf,
1537 				rte_cryptodev_socket_id(
1538 						ts_params->valid_devs[0])),
1539 				"Failed test for "
1540 				"rte_cryptodev_queue_pair_setup: num_inflights"
1541 				" %u on qp %u on cryptodev %u",
1542 				qp_conf.nb_descriptors, qp_id,
1543 				ts_params->valid_devs[0]);
1544 	}
1545 
1546 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1547 
1548 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1549 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1550 				ts_params->valid_devs[0], qp_id, &qp_conf,
1551 				rte_cryptodev_socket_id(
1552 						ts_params->valid_devs[0])),
1553 				"Failed test for"
1554 				" rte_cryptodev_queue_pair_setup:"
1555 				"num_inflights %u on qp %u on cryptodev %u",
1556 				qp_conf.nb_descriptors, qp_id,
1557 				ts_params->valid_devs[0]);
1558 	}
1559 
1560 	/* test invalid queue pair id */
1561 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;	/*valid */
1562 
1563 	qp_id = ts_params->conf.nb_queue_pairs;		/*invalid */
1564 
1565 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1566 			ts_params->valid_devs[0],
1567 			qp_id, &qp_conf,
1568 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1569 			"Failed test for rte_cryptodev_queue_pair_setup:"
1570 			"invalid qp %u on cryptodev %u",
1571 			qp_id, ts_params->valid_devs[0]);
1572 
1573 	qp_id = 0xffff; /*invalid*/
1574 
1575 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1576 			ts_params->valid_devs[0],
1577 			qp_id, &qp_conf,
1578 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1579 			"Failed test for rte_cryptodev_queue_pair_setup:"
1580 			"invalid qp %u on cryptodev %u",
1581 			qp_id, ts_params->valid_devs[0]);
1582 
1583 	return TEST_SUCCESS;
1584 }
1585 
1586 /* ***** Plaintext data for tests ***** */
1587 
1588 const char catch_22_quote_1[] =
1589 		"There was only one catch and that was Catch-22, which "
1590 		"specified that a concern for one's safety in the face of "
1591 		"dangers that were real and immediate was the process of a "
1592 		"rational mind. Orr was crazy and could be grounded. All he "
1593 		"had to do was ask; and as soon as he did, he would no longer "
1594 		"be crazy and would have to fly more missions. Orr would be "
1595 		"crazy to fly more missions and sane if he didn't, but if he "
1596 		"was sane he had to fly them. If he flew them he was crazy "
1597 		"and didn't have to; but if he didn't want to he was sane and "
1598 		"had to. Yossarian was moved very deeply by the absolute "
1599 		"simplicity of this clause of Catch-22 and let out a "
1600 		"respectful whistle. \"That's some catch, that Catch-22\", he "
1601 		"observed. \"It's the best there is,\" Doc Daneeka agreed.";
1602 
1603 const char catch_22_quote[] =
1604 		"What a lousy earth! He wondered how many people were "
1605 		"destitute that same night even in his own prosperous country, "
1606 		"how many homes were shanties, how many husbands were drunk "
1607 		"and wives socked, and how many children were bullied, abused, "
1608 		"or abandoned. How many families hungered for food they could "
1609 		"not afford to buy? How many hearts were broken? How many "
1610 		"suicides would take place that same night, how many people "
1611 		"would go insane? How many cockroaches and landlords would "
1612 		"triumph? How many winners were losers, successes failures, "
1613 		"and rich men poor men? How many wise guys were stupid? How "
1614 		"many happy endings were unhappy endings? How many honest men "
1615 		"were liars, brave men cowards, loyal men traitors, how many "
1616 		"sainted men were corrupt, how many people in positions of "
1617 		"trust had sold their souls to bodyguards, how many had never "
1618 		"had souls? How many straight-and-narrow paths were crooked "
1619 		"paths? How many best families were worst families and how "
1620 		"many good people were bad people? When you added them all up "
1621 		"and then subtracted, you might be left with only the children, "
1622 		"and perhaps with Albert Einstein and an old violinist or "
1623 		"sculptor somewhere.";
1624 
1625 #define QUOTE_480_BYTES		(480)
1626 #define QUOTE_512_BYTES		(512)
1627 #define QUOTE_768_BYTES		(768)
1628 #define QUOTE_1024_BYTES	(1024)
1629 
1630 
1631 
1632 /* ***** SHA1 Hash Tests ***** */
1633 
1634 #define HMAC_KEY_LENGTH_SHA1	(DIGEST_BYTE_LENGTH_SHA1)
1635 
1636 static uint8_t hmac_sha1_key[] = {
1637 	0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1638 	0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1639 	0xDE, 0xF4, 0xDE, 0xAD };
1640 
1641 /* ***** SHA224 Hash Tests ***** */
1642 
1643 #define HMAC_KEY_LENGTH_SHA224	(DIGEST_BYTE_LENGTH_SHA224)
1644 
1645 
1646 /* ***** AES-CBC Cipher Tests ***** */
1647 
1648 #define CIPHER_KEY_LENGTH_AES_CBC	(16)
1649 #define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
1650 
1651 static uint8_t aes_cbc_key[] = {
1652 	0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1653 	0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1654 
1655 static uint8_t aes_cbc_iv[] = {
1656 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1657 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1658 
1659 
1660 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1661 
1662 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1663 	0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1664 	0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1665 	0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1666 	0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1667 	0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1668 	0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1669 	0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1670 	0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1671 	0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1672 	0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1673 	0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1674 	0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1675 	0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1676 	0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1677 	0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1678 	0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1679 	0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1680 	0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1681 	0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1682 	0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1683 	0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1684 	0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1685 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1686 	0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1687 	0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1688 	0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1689 	0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1690 	0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1691 	0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1692 	0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1693 	0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1694 	0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1695 	0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1696 	0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1697 	0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1698 	0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1699 	0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1700 	0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1701 	0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1702 	0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1703 	0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1704 	0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1705 	0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1706 	0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1707 	0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1708 	0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1709 	0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1710 	0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1711 	0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1712 	0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1713 	0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1714 	0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1715 	0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1716 	0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1717 	0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1718 	0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1719 	0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1720 	0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1721 	0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1722 	0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1723 	0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1724 	0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1725 	0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1726 	0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1727 };
1728 
1729 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1730 	0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1731 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1732 	0x18, 0x8c, 0x1d, 0x32
1733 };
1734 
1735 
1736 /* Multisession Vector context Test */
1737 /*Begin Session 0 */
1738 static uint8_t ms_aes_cbc_key0[] = {
1739 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1740 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1741 };
1742 
1743 static uint8_t ms_aes_cbc_iv0[] = {
1744 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1745 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1746 };
1747 
1748 static const uint8_t ms_aes_cbc_cipher0[] = {
1749 		0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1750 		0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1751 		0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1752 		0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1753 		0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1754 		0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1755 		0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1756 		0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1757 		0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1758 		0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1759 		0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1760 		0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1761 		0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1762 		0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1763 		0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1764 		0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1765 		0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1766 		0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1767 		0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1768 		0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1769 		0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1770 		0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1771 		0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1772 		0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1773 		0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1774 		0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1775 		0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1776 		0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1777 		0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1778 		0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1779 		0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1780 		0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1781 		0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1782 		0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1783 		0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1784 		0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1785 		0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1786 		0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1787 		0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1788 		0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1789 		0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1790 		0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1791 		0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1792 		0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1793 		0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1794 		0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1795 		0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1796 		0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1797 		0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1798 		0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1799 		0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1800 		0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1801 		0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1802 		0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1803 		0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1804 		0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1805 		0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1806 		0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1807 		0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1808 		0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1809 		0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1810 		0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1811 		0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1812 		0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1813 };
1814 
1815 
1816 static  uint8_t ms_hmac_key0[] = {
1817 		0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1818 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1819 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1820 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1821 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1822 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1823 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1824 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1825 };
1826 
1827 static const uint8_t ms_hmac_digest0[] = {
1828 		0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1829 		0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1830 		0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1831 		0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1832 		0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1833 		0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1834 		0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1835 		0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1836 		};
1837 
1838 /* End Session 0 */
1839 /* Begin session 1 */
1840 
1841 static  uint8_t ms_aes_cbc_key1[] = {
1842 		0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1843 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1844 };
1845 
1846 static  uint8_t ms_aes_cbc_iv1[] = {
1847 	0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1848 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1849 };
1850 
1851 static const uint8_t ms_aes_cbc_cipher1[] = {
1852 		0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1853 		0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1854 		0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1855 		0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1856 		0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1857 		0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1858 		0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1859 		0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1860 		0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1861 		0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1862 		0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1863 		0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1864 		0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1865 		0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1866 		0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1867 		0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1868 		0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1869 		0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1870 		0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1871 		0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1872 		0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1873 		0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1874 		0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1875 		0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1876 		0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1877 		0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1878 		0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1879 		0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1880 		0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1881 		0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1882 		0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1883 		0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1884 		0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1885 		0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1886 		0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1887 		0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1888 		0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1889 		0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1890 		0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1891 		0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1892 		0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1893 		0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1894 		0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1895 		0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1896 		0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1897 		0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1898 		0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1899 		0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1900 		0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1901 		0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1902 		0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1903 		0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1904 		0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1905 		0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1906 		0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1907 		0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1908 		0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1909 		0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1910 		0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1911 		0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1912 		0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1913 		0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1914 		0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1915 		0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1916 
1917 };
1918 
1919 static uint8_t ms_hmac_key1[] = {
1920 		0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1921 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1922 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1923 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1924 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1925 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1926 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1927 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1928 };
1929 
1930 static const uint8_t ms_hmac_digest1[] = {
1931 		0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1932 		0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
1933 		0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
1934 		0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
1935 		0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
1936 		0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
1937 		0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
1938 		0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
1939 };
1940 /* End Session 1  */
1941 /* Begin Session 2 */
1942 static  uint8_t ms_aes_cbc_key2[] = {
1943 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1944 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1945 };
1946 
1947 static  uint8_t ms_aes_cbc_iv2[] = {
1948 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1949 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1950 };
1951 
1952 static const uint8_t ms_aes_cbc_cipher2[] = {
1953 		0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
1954 		0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
1955 		0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
1956 		0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
1957 		0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
1958 		0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
1959 		0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
1960 		0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
1961 		0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
1962 		0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
1963 		0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
1964 		0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
1965 		0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
1966 		0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
1967 		0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
1968 		0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
1969 		0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
1970 		0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
1971 		0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
1972 		0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
1973 		0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
1974 		0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
1975 		0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
1976 		0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
1977 		0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
1978 		0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
1979 		0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
1980 		0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
1981 		0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
1982 		0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
1983 		0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
1984 		0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
1985 		0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
1986 		0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
1987 		0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
1988 		0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
1989 		0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
1990 		0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
1991 		0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
1992 		0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
1993 		0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
1994 		0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
1995 		0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
1996 		0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
1997 		0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
1998 		0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
1999 		0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2000 		0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2001 		0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2002 		0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2003 		0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2004 		0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2005 		0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2006 		0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2007 		0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2008 		0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2009 		0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2010 		0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2011 		0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2012 		0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2013 		0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2014 		0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2015 		0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2016 		0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2017 };
2018 
2019 static  uint8_t ms_hmac_key2[] = {
2020 		0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2021 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2022 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2023 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2024 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2025 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2026 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2027 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2028 };
2029 
2030 static const uint8_t ms_hmac_digest2[] = {
2031 		0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2032 		0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2033 		0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2034 		0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2035 		0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2036 		0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2037 		0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2038 		0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2039 };
2040 
2041 /* End Session 2 */
2042 
2043 
2044 static int
2045 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2046 {
2047 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2048 	struct crypto_unittest_params *ut_params = &unittest_params;
2049 
2050 	/* Verify the capabilities */
2051 	struct rte_cryptodev_sym_capability_idx cap_idx;
2052 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2053 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2054 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2055 			&cap_idx) == NULL)
2056 		return TEST_SKIPPED;
2057 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2058 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2059 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2060 			&cap_idx) == NULL)
2061 		return TEST_SKIPPED;
2062 
2063 	/* Generate test mbuf data and space for digest */
2064 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2065 			catch_22_quote,	QUOTE_512_BYTES, 0);
2066 
2067 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2068 			DIGEST_BYTE_LENGTH_SHA1);
2069 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2070 
2071 	/* Setup Cipher Parameters */
2072 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2073 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2074 
2075 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2076 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2077 	ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2078 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2079 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2080 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2081 
2082 	/* Setup HMAC Parameters */
2083 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2084 
2085 	ut_params->auth_xform.next = NULL;
2086 
2087 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2088 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2089 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2090 	ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2091 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2092 
2093 	ut_params->sess = rte_cryptodev_sym_session_create(
2094 			ts_params->session_mpool);
2095 
2096 	/* Create crypto session*/
2097 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
2098 			ut_params->sess, &ut_params->cipher_xform,
2099 			ts_params->session_priv_mpool);
2100 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2101 
2102 	/* Generate crypto op data structure */
2103 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2104 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2105 	TEST_ASSERT_NOT_NULL(ut_params->op,
2106 			"Failed to allocate symmetric crypto operation struct");
2107 
2108 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2109 
2110 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2111 
2112 	/* set crypto operation source mbuf */
2113 	sym_op->m_src = ut_params->ibuf;
2114 
2115 	/* Set crypto operation authentication parameters */
2116 	sym_op->auth.digest.data = ut_params->digest;
2117 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2118 			ut_params->ibuf, QUOTE_512_BYTES);
2119 
2120 	sym_op->auth.data.offset = 0;
2121 	sym_op->auth.data.length = QUOTE_512_BYTES;
2122 
2123 	/* Copy IV at the end of the crypto operation */
2124 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2125 			aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2126 
2127 	/* Set crypto operation cipher parameters */
2128 	sym_op->cipher.data.offset = 0;
2129 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2130 
2131 	/* Process crypto operation */
2132 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2133 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2134 			ut_params->op);
2135 	else
2136 		TEST_ASSERT_NOT_NULL(
2137 			process_crypto_request(ts_params->valid_devs[0],
2138 				ut_params->op),
2139 				"failed to process sym crypto op");
2140 
2141 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2142 			"crypto op processing failed");
2143 
2144 	/* Validate obuf */
2145 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2146 			uint8_t *);
2147 
2148 	TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2149 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2150 			QUOTE_512_BYTES,
2151 			"ciphertext data not as expected");
2152 
2153 	uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2154 
2155 	TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2156 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2157 			gbl_driver_id == rte_cryptodev_driver_id_get(
2158 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2159 					TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2160 					DIGEST_BYTE_LENGTH_SHA1,
2161 			"Generated digest data not as expected");
2162 
2163 	return TEST_SUCCESS;
2164 }
2165 
2166 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2167 
2168 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
2169 
2170 static uint8_t hmac_sha512_key[] = {
2171 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2172 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2173 	0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2174 	0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2175 	0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2176 	0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2177 	0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2178 	0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2179 
2180 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2181 	0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2182 	0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2183 	0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2184 	0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2185 	0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2186 	0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2187 	0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2188 	0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2189 
2190 
2191 
2192 static int
2193 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2194 		struct crypto_unittest_params *ut_params,
2195 		uint8_t *cipher_key,
2196 		uint8_t *hmac_key);
2197 
2198 static int
2199 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2200 		struct crypto_unittest_params *ut_params,
2201 		struct crypto_testsuite_params *ts_params,
2202 		const uint8_t *cipher,
2203 		const uint8_t *digest,
2204 		const uint8_t *iv);
2205 
2206 
2207 static int
2208 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2209 		struct crypto_unittest_params *ut_params,
2210 		uint8_t *cipher_key,
2211 		uint8_t *hmac_key)
2212 {
2213 
2214 	/* Setup Cipher Parameters */
2215 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2216 	ut_params->cipher_xform.next = NULL;
2217 
2218 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2219 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2220 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2221 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2222 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2223 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2224 
2225 	/* Setup HMAC Parameters */
2226 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2227 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2228 
2229 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2230 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2231 	ut_params->auth_xform.auth.key.data = hmac_key;
2232 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2233 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2234 
2235 	return TEST_SUCCESS;
2236 }
2237 
2238 
2239 static int
2240 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2241 		struct crypto_unittest_params *ut_params,
2242 		struct crypto_testsuite_params *ts_params,
2243 		const uint8_t *cipher,
2244 		const uint8_t *digest,
2245 		const uint8_t *iv)
2246 {
2247 	/* Generate test mbuf data and digest */
2248 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2249 			(const char *)
2250 			cipher,
2251 			QUOTE_512_BYTES, 0);
2252 
2253 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2254 			DIGEST_BYTE_LENGTH_SHA512);
2255 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2256 
2257 	rte_memcpy(ut_params->digest,
2258 			digest,
2259 			DIGEST_BYTE_LENGTH_SHA512);
2260 
2261 	/* Generate Crypto op data structure */
2262 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2263 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2264 	TEST_ASSERT_NOT_NULL(ut_params->op,
2265 			"Failed to allocate symmetric crypto operation struct");
2266 
2267 	rte_crypto_op_attach_sym_session(ut_params->op, sess);
2268 
2269 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2270 
2271 	/* set crypto operation source mbuf */
2272 	sym_op->m_src = ut_params->ibuf;
2273 
2274 	sym_op->auth.digest.data = ut_params->digest;
2275 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2276 			ut_params->ibuf, QUOTE_512_BYTES);
2277 
2278 	sym_op->auth.data.offset = 0;
2279 	sym_op->auth.data.length = QUOTE_512_BYTES;
2280 
2281 	/* Copy IV at the end of the crypto operation */
2282 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2283 			iv, CIPHER_IV_LENGTH_AES_CBC);
2284 
2285 	sym_op->cipher.data.offset = 0;
2286 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2287 
2288 	/* Process crypto operation */
2289 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2290 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2291 			ut_params->op);
2292 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2293 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2294 				ut_params->op, 1, 1, 0, 0);
2295 	else
2296 		TEST_ASSERT_NOT_NULL(
2297 				process_crypto_request(ts_params->valid_devs[0],
2298 					ut_params->op),
2299 					"failed to process sym crypto op");
2300 
2301 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2302 			"crypto op processing failed");
2303 
2304 	ut_params->obuf = ut_params->op->sym->m_src;
2305 
2306 	/* Validate obuf */
2307 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2308 			rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2309 			catch_22_quote,
2310 			QUOTE_512_BYTES,
2311 			"Plaintext data not as expected");
2312 
2313 	/* Validate obuf */
2314 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2315 			"Digest verification failed");
2316 
2317 	return TEST_SUCCESS;
2318 }
2319 
2320 /* ***** SNOW 3G Tests ***** */
2321 static int
2322 create_wireless_algo_hash_session(uint8_t dev_id,
2323 	const uint8_t *key, const uint8_t key_len,
2324 	const uint8_t iv_len, const uint8_t auth_len,
2325 	enum rte_crypto_auth_operation op,
2326 	enum rte_crypto_auth_algorithm algo)
2327 {
2328 	uint8_t hash_key[key_len];
2329 	int status;
2330 
2331 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2332 	struct crypto_unittest_params *ut_params = &unittest_params;
2333 
2334 	memcpy(hash_key, key, key_len);
2335 
2336 	debug_hexdump(stdout, "key:", key, key_len);
2337 
2338 	/* Setup Authentication Parameters */
2339 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2340 	ut_params->auth_xform.next = NULL;
2341 
2342 	ut_params->auth_xform.auth.op = op;
2343 	ut_params->auth_xform.auth.algo = algo;
2344 	ut_params->auth_xform.auth.key.length = key_len;
2345 	ut_params->auth_xform.auth.key.data = hash_key;
2346 	ut_params->auth_xform.auth.digest_length = auth_len;
2347 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2348 	ut_params->auth_xform.auth.iv.length = iv_len;
2349 	ut_params->sess = rte_cryptodev_sym_session_create(
2350 			ts_params->session_mpool);
2351 
2352 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2353 			&ut_params->auth_xform,
2354 			ts_params->session_priv_mpool);
2355 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2356 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2357 	return 0;
2358 }
2359 
2360 static int
2361 create_wireless_algo_cipher_session(uint8_t dev_id,
2362 			enum rte_crypto_cipher_operation op,
2363 			enum rte_crypto_cipher_algorithm algo,
2364 			const uint8_t *key, const uint8_t key_len,
2365 			uint8_t iv_len)
2366 {
2367 	uint8_t cipher_key[key_len];
2368 	int status;
2369 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2370 	struct crypto_unittest_params *ut_params = &unittest_params;
2371 
2372 	memcpy(cipher_key, key, key_len);
2373 
2374 	/* Setup Cipher Parameters */
2375 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2376 	ut_params->cipher_xform.next = NULL;
2377 
2378 	ut_params->cipher_xform.cipher.algo = algo;
2379 	ut_params->cipher_xform.cipher.op = op;
2380 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2381 	ut_params->cipher_xform.cipher.key.length = key_len;
2382 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2383 	ut_params->cipher_xform.cipher.iv.length = iv_len;
2384 
2385 	debug_hexdump(stdout, "key:", key, key_len);
2386 
2387 	/* Create Crypto session */
2388 	ut_params->sess = rte_cryptodev_sym_session_create(
2389 			ts_params->session_mpool);
2390 
2391 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2392 			&ut_params->cipher_xform,
2393 			ts_params->session_priv_mpool);
2394 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2395 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2396 	return 0;
2397 }
2398 
2399 static int
2400 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2401 			unsigned int cipher_len,
2402 			unsigned int cipher_offset)
2403 {
2404 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2405 	struct crypto_unittest_params *ut_params = &unittest_params;
2406 
2407 	/* Generate Crypto op data structure */
2408 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2409 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2410 	TEST_ASSERT_NOT_NULL(ut_params->op,
2411 				"Failed to allocate pktmbuf offload");
2412 
2413 	/* Set crypto operation data parameters */
2414 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2415 
2416 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2417 
2418 	/* set crypto operation source mbuf */
2419 	sym_op->m_src = ut_params->ibuf;
2420 
2421 	/* iv */
2422 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2423 			iv, iv_len);
2424 	sym_op->cipher.data.length = cipher_len;
2425 	sym_op->cipher.data.offset = cipher_offset;
2426 	return 0;
2427 }
2428 
2429 static int
2430 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2431 			unsigned int cipher_len,
2432 			unsigned int cipher_offset)
2433 {
2434 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2435 	struct crypto_unittest_params *ut_params = &unittest_params;
2436 
2437 	/* Generate Crypto op data structure */
2438 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2439 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2440 	TEST_ASSERT_NOT_NULL(ut_params->op,
2441 				"Failed to allocate pktmbuf offload");
2442 
2443 	/* Set crypto operation data parameters */
2444 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2445 
2446 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2447 
2448 	/* set crypto operation source mbuf */
2449 	sym_op->m_src = ut_params->ibuf;
2450 	sym_op->m_dst = ut_params->obuf;
2451 
2452 	/* iv */
2453 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2454 			iv, iv_len);
2455 	sym_op->cipher.data.length = cipher_len;
2456 	sym_op->cipher.data.offset = cipher_offset;
2457 	return 0;
2458 }
2459 
2460 static int
2461 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2462 		enum rte_crypto_cipher_operation cipher_op,
2463 		enum rte_crypto_auth_operation auth_op,
2464 		enum rte_crypto_auth_algorithm auth_algo,
2465 		enum rte_crypto_cipher_algorithm cipher_algo,
2466 		const uint8_t *key, uint8_t key_len,
2467 		uint8_t auth_iv_len, uint8_t auth_len,
2468 		uint8_t cipher_iv_len)
2469 
2470 {
2471 	uint8_t cipher_auth_key[key_len];
2472 	int status;
2473 
2474 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2475 	struct crypto_unittest_params *ut_params = &unittest_params;
2476 
2477 	memcpy(cipher_auth_key, key, key_len);
2478 
2479 	/* Setup Authentication Parameters */
2480 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2481 	ut_params->auth_xform.next = NULL;
2482 
2483 	ut_params->auth_xform.auth.op = auth_op;
2484 	ut_params->auth_xform.auth.algo = auth_algo;
2485 	ut_params->auth_xform.auth.key.length = key_len;
2486 	/* Hash key = cipher key */
2487 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2488 	ut_params->auth_xform.auth.digest_length = auth_len;
2489 	/* Auth IV will be after cipher IV */
2490 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2491 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2492 
2493 	/* Setup Cipher Parameters */
2494 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2495 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2496 
2497 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2498 	ut_params->cipher_xform.cipher.op = cipher_op;
2499 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2500 	ut_params->cipher_xform.cipher.key.length = key_len;
2501 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2502 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2503 
2504 	debug_hexdump(stdout, "key:", key, key_len);
2505 
2506 	/* Create Crypto session*/
2507 	ut_params->sess = rte_cryptodev_sym_session_create(
2508 			ts_params->session_mpool);
2509 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2510 
2511 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2512 			&ut_params->cipher_xform,
2513 			ts_params->session_priv_mpool);
2514 	if (status == -ENOTSUP)
2515 		return TEST_SKIPPED;
2516 
2517 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2518 	return 0;
2519 }
2520 
2521 static int
2522 create_wireless_cipher_auth_session(uint8_t dev_id,
2523 		enum rte_crypto_cipher_operation cipher_op,
2524 		enum rte_crypto_auth_operation auth_op,
2525 		enum rte_crypto_auth_algorithm auth_algo,
2526 		enum rte_crypto_cipher_algorithm cipher_algo,
2527 		const struct wireless_test_data *tdata)
2528 {
2529 	const uint8_t key_len = tdata->key.len;
2530 	uint8_t cipher_auth_key[key_len];
2531 	int status;
2532 
2533 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2534 	struct crypto_unittest_params *ut_params = &unittest_params;
2535 	const uint8_t *key = tdata->key.data;
2536 	const uint8_t auth_len = tdata->digest.len;
2537 	uint8_t cipher_iv_len = tdata->cipher_iv.len;
2538 	uint8_t auth_iv_len = tdata->auth_iv.len;
2539 
2540 	memcpy(cipher_auth_key, key, key_len);
2541 
2542 	/* Setup Authentication Parameters */
2543 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2544 	ut_params->auth_xform.next = NULL;
2545 
2546 	ut_params->auth_xform.auth.op = auth_op;
2547 	ut_params->auth_xform.auth.algo = auth_algo;
2548 	ut_params->auth_xform.auth.key.length = key_len;
2549 	/* Hash key = cipher key */
2550 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2551 	ut_params->auth_xform.auth.digest_length = auth_len;
2552 	/* Auth IV will be after cipher IV */
2553 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2554 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2555 
2556 	/* Setup Cipher Parameters */
2557 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2558 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2559 
2560 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2561 	ut_params->cipher_xform.cipher.op = cipher_op;
2562 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2563 	ut_params->cipher_xform.cipher.key.length = key_len;
2564 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2565 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2566 
2567 
2568 	debug_hexdump(stdout, "key:", key, key_len);
2569 
2570 	/* Create Crypto session*/
2571 	ut_params->sess = rte_cryptodev_sym_session_create(
2572 			ts_params->session_mpool);
2573 
2574 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2575 			&ut_params->cipher_xform,
2576 			ts_params->session_priv_mpool);
2577 	if (status == -ENOTSUP)
2578 		return TEST_SKIPPED;
2579 
2580 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2581 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2582 	return 0;
2583 }
2584 
2585 static int
2586 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2587 		const struct wireless_test_data *tdata)
2588 {
2589 	return create_wireless_cipher_auth_session(dev_id,
2590 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2591 		RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2592 		RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2593 }
2594 
2595 static int
2596 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2597 		enum rte_crypto_cipher_operation cipher_op,
2598 		enum rte_crypto_auth_operation auth_op,
2599 		enum rte_crypto_auth_algorithm auth_algo,
2600 		enum rte_crypto_cipher_algorithm cipher_algo,
2601 		const uint8_t *key, const uint8_t key_len,
2602 		uint8_t auth_iv_len, uint8_t auth_len,
2603 		uint8_t cipher_iv_len)
2604 {
2605 	uint8_t auth_cipher_key[key_len];
2606 	int status;
2607 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2608 	struct crypto_unittest_params *ut_params = &unittest_params;
2609 
2610 	memcpy(auth_cipher_key, key, key_len);
2611 
2612 	/* Setup Authentication Parameters */
2613 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2614 	ut_params->auth_xform.auth.op = auth_op;
2615 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2616 	ut_params->auth_xform.auth.algo = auth_algo;
2617 	ut_params->auth_xform.auth.key.length = key_len;
2618 	ut_params->auth_xform.auth.key.data = auth_cipher_key;
2619 	ut_params->auth_xform.auth.digest_length = auth_len;
2620 	/* Auth IV will be after cipher IV */
2621 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2622 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2623 
2624 	/* Setup Cipher Parameters */
2625 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2626 	ut_params->cipher_xform.next = NULL;
2627 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2628 	ut_params->cipher_xform.cipher.op = cipher_op;
2629 	ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2630 	ut_params->cipher_xform.cipher.key.length = key_len;
2631 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2632 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2633 
2634 	debug_hexdump(stdout, "key:", key, key_len);
2635 
2636 	/* Create Crypto session*/
2637 	ut_params->sess = rte_cryptodev_sym_session_create(
2638 			ts_params->session_mpool);
2639 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2640 
2641 	if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2642 		ut_params->auth_xform.next = NULL;
2643 		ut_params->cipher_xform.next = &ut_params->auth_xform;
2644 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2645 				&ut_params->cipher_xform,
2646 				ts_params->session_priv_mpool);
2647 
2648 	} else
2649 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2650 				&ut_params->auth_xform,
2651 				ts_params->session_priv_mpool);
2652 
2653 	if (status == -ENOTSUP)
2654 		return TEST_SKIPPED;
2655 
2656 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2657 
2658 	return 0;
2659 }
2660 
2661 static int
2662 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2663 		unsigned int auth_tag_len,
2664 		const uint8_t *iv, unsigned int iv_len,
2665 		unsigned int data_pad_len,
2666 		enum rte_crypto_auth_operation op,
2667 		unsigned int auth_len, unsigned int auth_offset)
2668 {
2669 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2670 
2671 	struct crypto_unittest_params *ut_params = &unittest_params;
2672 
2673 	/* Generate Crypto op data structure */
2674 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2675 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2676 	TEST_ASSERT_NOT_NULL(ut_params->op,
2677 		"Failed to allocate pktmbuf offload");
2678 
2679 	/* Set crypto operation data parameters */
2680 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2681 
2682 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2683 
2684 	/* set crypto operation source mbuf */
2685 	sym_op->m_src = ut_params->ibuf;
2686 
2687 	/* iv */
2688 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2689 			iv, iv_len);
2690 	/* digest */
2691 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2692 					ut_params->ibuf, auth_tag_len);
2693 
2694 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2695 				"no room to append auth tag");
2696 	ut_params->digest = sym_op->auth.digest.data;
2697 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2698 			ut_params->ibuf, data_pad_len);
2699 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2700 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2701 	else
2702 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2703 
2704 	debug_hexdump(stdout, "digest:",
2705 		sym_op->auth.digest.data,
2706 		auth_tag_len);
2707 
2708 	sym_op->auth.data.length = auth_len;
2709 	sym_op->auth.data.offset = auth_offset;
2710 
2711 	return 0;
2712 }
2713 
2714 static int
2715 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2716 	enum rte_crypto_auth_operation op)
2717 {
2718 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2719 	struct crypto_unittest_params *ut_params = &unittest_params;
2720 
2721 	const uint8_t *auth_tag = tdata->digest.data;
2722 	const unsigned int auth_tag_len = tdata->digest.len;
2723 	unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2724 	unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2725 
2726 	const uint8_t *cipher_iv = tdata->cipher_iv.data;
2727 	const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2728 	const uint8_t *auth_iv = tdata->auth_iv.data;
2729 	const uint8_t auth_iv_len = tdata->auth_iv.len;
2730 	const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2731 	const unsigned int auth_len = tdata->validAuthLenInBits.len;
2732 
2733 	/* Generate Crypto op data structure */
2734 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2735 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2736 	TEST_ASSERT_NOT_NULL(ut_params->op,
2737 			"Failed to allocate pktmbuf offload");
2738 	/* Set crypto operation data parameters */
2739 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2740 
2741 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2742 
2743 	/* set crypto operation source mbuf */
2744 	sym_op->m_src = ut_params->ibuf;
2745 
2746 	/* digest */
2747 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2748 			ut_params->ibuf, auth_tag_len);
2749 
2750 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2751 			"no room to append auth tag");
2752 	ut_params->digest = sym_op->auth.digest.data;
2753 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2754 			ut_params->ibuf, data_pad_len);
2755 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2756 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2757 	else
2758 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2759 
2760 	debug_hexdump(stdout, "digest:",
2761 		sym_op->auth.digest.data,
2762 		auth_tag_len);
2763 
2764 	/* Copy cipher and auth IVs at the end of the crypto operation */
2765 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2766 						IV_OFFSET);
2767 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2768 	iv_ptr += cipher_iv_len;
2769 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2770 
2771 	sym_op->cipher.data.length = cipher_len;
2772 	sym_op->cipher.data.offset = 0;
2773 	sym_op->auth.data.length = auth_len;
2774 	sym_op->auth.data.offset = 0;
2775 
2776 	return 0;
2777 }
2778 
2779 static int
2780 create_zuc_cipher_hash_generate_operation(
2781 		const struct wireless_test_data *tdata)
2782 {
2783 	return create_wireless_cipher_hash_operation(tdata,
2784 		RTE_CRYPTO_AUTH_OP_GENERATE);
2785 }
2786 
2787 static int
2788 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2789 		const unsigned auth_tag_len,
2790 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2791 		unsigned data_pad_len,
2792 		enum rte_crypto_auth_operation op,
2793 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2794 		const unsigned cipher_len, const unsigned cipher_offset,
2795 		const unsigned auth_len, const unsigned auth_offset)
2796 {
2797 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2798 	struct crypto_unittest_params *ut_params = &unittest_params;
2799 
2800 	enum rte_crypto_cipher_algorithm cipher_algo =
2801 			ut_params->cipher_xform.cipher.algo;
2802 	enum rte_crypto_auth_algorithm auth_algo =
2803 			ut_params->auth_xform.auth.algo;
2804 
2805 	/* Generate Crypto op data structure */
2806 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2807 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2808 	TEST_ASSERT_NOT_NULL(ut_params->op,
2809 			"Failed to allocate pktmbuf offload");
2810 	/* Set crypto operation data parameters */
2811 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2812 
2813 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2814 
2815 	/* set crypto operation source mbuf */
2816 	sym_op->m_src = ut_params->ibuf;
2817 
2818 	/* digest */
2819 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2820 			ut_params->ibuf, auth_tag_len);
2821 
2822 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2823 			"no room to append auth tag");
2824 	ut_params->digest = sym_op->auth.digest.data;
2825 
2826 	if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2827 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2828 				ut_params->ibuf, data_pad_len);
2829 	} else {
2830 		struct rte_mbuf *m = ut_params->ibuf;
2831 		unsigned int offset = data_pad_len;
2832 
2833 		while (offset > m->data_len && m->next != NULL) {
2834 			offset -= m->data_len;
2835 			m = m->next;
2836 		}
2837 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2838 			m, offset);
2839 	}
2840 
2841 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2842 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2843 	else
2844 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2845 
2846 	debug_hexdump(stdout, "digest:",
2847 		sym_op->auth.digest.data,
2848 		auth_tag_len);
2849 
2850 	/* Copy cipher and auth IVs at the end of the crypto operation */
2851 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2852 						IV_OFFSET);
2853 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2854 	iv_ptr += cipher_iv_len;
2855 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2856 
2857 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2858 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2859 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2860 		sym_op->cipher.data.length = cipher_len;
2861 		sym_op->cipher.data.offset = cipher_offset;
2862 	} else {
2863 		sym_op->cipher.data.length = cipher_len >> 3;
2864 		sym_op->cipher.data.offset = cipher_offset >> 3;
2865 	}
2866 
2867 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2868 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2869 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2870 		sym_op->auth.data.length = auth_len;
2871 		sym_op->auth.data.offset = auth_offset;
2872 	} else {
2873 		sym_op->auth.data.length = auth_len >> 3;
2874 		sym_op->auth.data.offset = auth_offset >> 3;
2875 	}
2876 
2877 	return 0;
2878 }
2879 
2880 static int
2881 create_wireless_algo_auth_cipher_operation(
2882 		const uint8_t *auth_tag, unsigned int auth_tag_len,
2883 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2884 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2885 		unsigned int data_pad_len,
2886 		unsigned int cipher_len, unsigned int cipher_offset,
2887 		unsigned int auth_len, unsigned int auth_offset,
2888 		uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2889 {
2890 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2891 	struct crypto_unittest_params *ut_params = &unittest_params;
2892 
2893 	enum rte_crypto_cipher_algorithm cipher_algo =
2894 			ut_params->cipher_xform.cipher.algo;
2895 	enum rte_crypto_auth_algorithm auth_algo =
2896 			ut_params->auth_xform.auth.algo;
2897 
2898 	/* Generate Crypto op data structure */
2899 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2900 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2901 	TEST_ASSERT_NOT_NULL(ut_params->op,
2902 			"Failed to allocate pktmbuf offload");
2903 
2904 	/* Set crypto operation data parameters */
2905 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2906 
2907 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2908 
2909 	/* set crypto operation mbufs */
2910 	sym_op->m_src = ut_params->ibuf;
2911 	if (op_mode == OUT_OF_PLACE)
2912 		sym_op->m_dst = ut_params->obuf;
2913 
2914 	/* digest */
2915 	if (!do_sgl) {
2916 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
2917 			(op_mode == IN_PLACE ?
2918 				ut_params->ibuf : ut_params->obuf),
2919 			uint8_t *, data_pad_len);
2920 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2921 			(op_mode == IN_PLACE ?
2922 				ut_params->ibuf : ut_params->obuf),
2923 			data_pad_len);
2924 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2925 	} else {
2926 		uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
2927 		struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
2928 				sym_op->m_src : sym_op->m_dst);
2929 		while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
2930 			remaining_off -= rte_pktmbuf_data_len(sgl_buf);
2931 			sgl_buf = sgl_buf->next;
2932 		}
2933 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
2934 				uint8_t *, remaining_off);
2935 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
2936 				remaining_off);
2937 		memset(sym_op->auth.digest.data, 0, remaining_off);
2938 		while (sgl_buf->next != NULL) {
2939 			memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
2940 				0, rte_pktmbuf_data_len(sgl_buf));
2941 			sgl_buf = sgl_buf->next;
2942 		}
2943 	}
2944 
2945 	/* Copy digest for the verification */
2946 	if (verify)
2947 		memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2948 
2949 	/* Copy cipher and auth IVs at the end of the crypto operation */
2950 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
2951 			ut_params->op, uint8_t *, IV_OFFSET);
2952 
2953 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2954 	iv_ptr += cipher_iv_len;
2955 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2956 
2957 	/* Only copy over the offset data needed from src to dst in OOP,
2958 	 * if the auth and cipher offsets are not aligned
2959 	 */
2960 	if (op_mode == OUT_OF_PLACE) {
2961 		if (cipher_offset > auth_offset)
2962 			rte_memcpy(
2963 				rte_pktmbuf_mtod_offset(
2964 					sym_op->m_dst,
2965 					uint8_t *, auth_offset >> 3),
2966 				rte_pktmbuf_mtod_offset(
2967 					sym_op->m_src,
2968 					uint8_t *, auth_offset >> 3),
2969 				((cipher_offset >> 3) - (auth_offset >> 3)));
2970 	}
2971 
2972 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2973 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2974 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2975 		sym_op->cipher.data.length = cipher_len;
2976 		sym_op->cipher.data.offset = cipher_offset;
2977 	} else {
2978 		sym_op->cipher.data.length = cipher_len >> 3;
2979 		sym_op->cipher.data.offset = cipher_offset >> 3;
2980 	}
2981 
2982 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2983 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2984 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2985 		sym_op->auth.data.length = auth_len;
2986 		sym_op->auth.data.offset = auth_offset;
2987 	} else {
2988 		sym_op->auth.data.length = auth_len >> 3;
2989 		sym_op->auth.data.offset = auth_offset >> 3;
2990 	}
2991 
2992 	return 0;
2993 }
2994 
2995 static int
2996 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
2997 {
2998 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2999 	struct crypto_unittest_params *ut_params = &unittest_params;
3000 
3001 	int retval;
3002 	unsigned plaintext_pad_len;
3003 	unsigned plaintext_len;
3004 	uint8_t *plaintext;
3005 	struct rte_cryptodev_info dev_info;
3006 
3007 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3008 	uint64_t feat_flags = dev_info.feature_flags;
3009 
3010 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3011 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3012 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3013 		return TEST_SKIPPED;
3014 	}
3015 
3016 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3017 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3018 		printf("Device doesn't support RAW data-path APIs.\n");
3019 		return TEST_SKIPPED;
3020 	}
3021 
3022 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3023 		return TEST_SKIPPED;
3024 
3025 	/* Verify the capabilities */
3026 	struct rte_cryptodev_sym_capability_idx cap_idx;
3027 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3028 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3029 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3030 			&cap_idx) == NULL)
3031 		return TEST_SKIPPED;
3032 
3033 	/* Create SNOW 3G session */
3034 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3035 			tdata->key.data, tdata->key.len,
3036 			tdata->auth_iv.len, tdata->digest.len,
3037 			RTE_CRYPTO_AUTH_OP_GENERATE,
3038 			RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3039 	if (retval < 0)
3040 		return retval;
3041 
3042 	/* alloc mbuf and set payload */
3043 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3044 
3045 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3046 	rte_pktmbuf_tailroom(ut_params->ibuf));
3047 
3048 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3049 	/* Append data which is padded to a multiple of */
3050 	/* the algorithms block size */
3051 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3052 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3053 				plaintext_pad_len);
3054 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3055 
3056 	/* Create SNOW 3G operation */
3057 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3058 			tdata->auth_iv.data, tdata->auth_iv.len,
3059 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3060 			tdata->validAuthLenInBits.len,
3061 			0);
3062 	if (retval < 0)
3063 		return retval;
3064 
3065 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3066 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3067 				ut_params->op, 0, 1, 1, 0);
3068 	else
3069 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3070 				ut_params->op);
3071 	ut_params->obuf = ut_params->op->sym->m_src;
3072 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3073 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3074 			+ plaintext_pad_len;
3075 
3076 	/* Validate obuf */
3077 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3078 	ut_params->digest,
3079 	tdata->digest.data,
3080 	DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3081 	"SNOW 3G Generated auth tag not as expected");
3082 
3083 	return 0;
3084 }
3085 
3086 static int
3087 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3088 {
3089 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3090 	struct crypto_unittest_params *ut_params = &unittest_params;
3091 
3092 	int retval;
3093 	unsigned plaintext_pad_len;
3094 	unsigned plaintext_len;
3095 	uint8_t *plaintext;
3096 	struct rte_cryptodev_info dev_info;
3097 
3098 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3099 	uint64_t feat_flags = dev_info.feature_flags;
3100 
3101 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3102 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3103 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3104 		return TEST_SKIPPED;
3105 	}
3106 
3107 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3108 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3109 		printf("Device doesn't support RAW data-path APIs.\n");
3110 		return TEST_SKIPPED;
3111 	}
3112 
3113 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3114 		return TEST_SKIPPED;
3115 
3116 	/* Verify the capabilities */
3117 	struct rte_cryptodev_sym_capability_idx cap_idx;
3118 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3119 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3120 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3121 			&cap_idx) == NULL)
3122 		return TEST_SKIPPED;
3123 
3124 	/* Create SNOW 3G session */
3125 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3126 				tdata->key.data, tdata->key.len,
3127 				tdata->auth_iv.len, tdata->digest.len,
3128 				RTE_CRYPTO_AUTH_OP_VERIFY,
3129 				RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3130 	if (retval < 0)
3131 		return retval;
3132 	/* alloc mbuf and set payload */
3133 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3134 
3135 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3136 	rte_pktmbuf_tailroom(ut_params->ibuf));
3137 
3138 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3139 	/* Append data which is padded to a multiple of */
3140 	/* the algorithms block size */
3141 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3142 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3143 				plaintext_pad_len);
3144 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3145 
3146 	/* Create SNOW 3G operation */
3147 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3148 			tdata->digest.len,
3149 			tdata->auth_iv.data, tdata->auth_iv.len,
3150 			plaintext_pad_len,
3151 			RTE_CRYPTO_AUTH_OP_VERIFY,
3152 			tdata->validAuthLenInBits.len,
3153 			0);
3154 	if (retval < 0)
3155 		return retval;
3156 
3157 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3158 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3159 				ut_params->op, 0, 1, 1, 0);
3160 	else
3161 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3162 				ut_params->op);
3163 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3164 	ut_params->obuf = ut_params->op->sym->m_src;
3165 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3166 				+ plaintext_pad_len;
3167 
3168 	/* Validate obuf */
3169 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3170 		return 0;
3171 	else
3172 		return -1;
3173 
3174 	return 0;
3175 }
3176 
3177 static int
3178 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3179 {
3180 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3181 	struct crypto_unittest_params *ut_params = &unittest_params;
3182 
3183 	int retval;
3184 	unsigned plaintext_pad_len;
3185 	unsigned plaintext_len;
3186 	uint8_t *plaintext;
3187 	struct rte_cryptodev_info dev_info;
3188 
3189 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3190 	uint64_t feat_flags = dev_info.feature_flags;
3191 
3192 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3193 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3194 		printf("Device doesn't support RAW data-path APIs.\n");
3195 		return TEST_SKIPPED;
3196 	}
3197 
3198 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3199 		return TEST_SKIPPED;
3200 
3201 	/* Verify the capabilities */
3202 	struct rte_cryptodev_sym_capability_idx cap_idx;
3203 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3204 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3205 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3206 			&cap_idx) == NULL)
3207 		return TEST_SKIPPED;
3208 
3209 	/* Create KASUMI session */
3210 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3211 			tdata->key.data, tdata->key.len,
3212 			0, tdata->digest.len,
3213 			RTE_CRYPTO_AUTH_OP_GENERATE,
3214 			RTE_CRYPTO_AUTH_KASUMI_F9);
3215 	if (retval < 0)
3216 		return retval;
3217 
3218 	/* alloc mbuf and set payload */
3219 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3220 
3221 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3222 	rte_pktmbuf_tailroom(ut_params->ibuf));
3223 
3224 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3225 	/* Append data which is padded to a multiple of */
3226 	/* the algorithms block size */
3227 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3228 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3229 				plaintext_pad_len);
3230 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3231 
3232 	/* Create KASUMI operation */
3233 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3234 			NULL, 0,
3235 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3236 			tdata->plaintext.len,
3237 			0);
3238 	if (retval < 0)
3239 		return retval;
3240 
3241 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3242 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3243 			ut_params->op);
3244 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3245 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3246 				ut_params->op, 0, 1, 1, 0);
3247 	else
3248 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3249 			ut_params->op);
3250 
3251 	ut_params->obuf = ut_params->op->sym->m_src;
3252 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3253 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3254 			+ plaintext_pad_len;
3255 
3256 	/* Validate obuf */
3257 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3258 	ut_params->digest,
3259 	tdata->digest.data,
3260 	DIGEST_BYTE_LENGTH_KASUMI_F9,
3261 	"KASUMI Generated auth tag not as expected");
3262 
3263 	return 0;
3264 }
3265 
3266 static int
3267 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3268 {
3269 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3270 	struct crypto_unittest_params *ut_params = &unittest_params;
3271 
3272 	int retval;
3273 	unsigned plaintext_pad_len;
3274 	unsigned plaintext_len;
3275 	uint8_t *plaintext;
3276 	struct rte_cryptodev_info dev_info;
3277 
3278 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3279 	uint64_t feat_flags = dev_info.feature_flags;
3280 
3281 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3282 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3283 		printf("Device doesn't support RAW data-path APIs.\n");
3284 		return TEST_SKIPPED;
3285 	}
3286 
3287 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3288 		return TEST_SKIPPED;
3289 
3290 	/* Verify the capabilities */
3291 	struct rte_cryptodev_sym_capability_idx cap_idx;
3292 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3293 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3294 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3295 			&cap_idx) == NULL)
3296 		return TEST_SKIPPED;
3297 
3298 	/* Create KASUMI session */
3299 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3300 				tdata->key.data, tdata->key.len,
3301 				0, tdata->digest.len,
3302 				RTE_CRYPTO_AUTH_OP_VERIFY,
3303 				RTE_CRYPTO_AUTH_KASUMI_F9);
3304 	if (retval < 0)
3305 		return retval;
3306 	/* alloc mbuf and set payload */
3307 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3308 
3309 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3310 	rte_pktmbuf_tailroom(ut_params->ibuf));
3311 
3312 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3313 	/* Append data which is padded to a multiple */
3314 	/* of the algorithms block size */
3315 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3316 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3317 				plaintext_pad_len);
3318 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3319 
3320 	/* Create KASUMI operation */
3321 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3322 			tdata->digest.len,
3323 			NULL, 0,
3324 			plaintext_pad_len,
3325 			RTE_CRYPTO_AUTH_OP_VERIFY,
3326 			tdata->plaintext.len,
3327 			0);
3328 	if (retval < 0)
3329 		return retval;
3330 
3331 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3332 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3333 				ut_params->op, 0, 1, 1, 0);
3334 	else
3335 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3336 				ut_params->op);
3337 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3338 	ut_params->obuf = ut_params->op->sym->m_src;
3339 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3340 				+ plaintext_pad_len;
3341 
3342 	/* Validate obuf */
3343 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3344 		return 0;
3345 	else
3346 		return -1;
3347 
3348 	return 0;
3349 }
3350 
3351 static int
3352 test_snow3g_hash_generate_test_case_1(void)
3353 {
3354 	return test_snow3g_authentication(&snow3g_hash_test_case_1);
3355 }
3356 
3357 static int
3358 test_snow3g_hash_generate_test_case_2(void)
3359 {
3360 	return test_snow3g_authentication(&snow3g_hash_test_case_2);
3361 }
3362 
3363 static int
3364 test_snow3g_hash_generate_test_case_3(void)
3365 {
3366 	return test_snow3g_authentication(&snow3g_hash_test_case_3);
3367 }
3368 
3369 static int
3370 test_snow3g_hash_generate_test_case_4(void)
3371 {
3372 	return test_snow3g_authentication(&snow3g_hash_test_case_4);
3373 }
3374 
3375 static int
3376 test_snow3g_hash_generate_test_case_5(void)
3377 {
3378 	return test_snow3g_authentication(&snow3g_hash_test_case_5);
3379 }
3380 
3381 static int
3382 test_snow3g_hash_generate_test_case_6(void)
3383 {
3384 	return test_snow3g_authentication(&snow3g_hash_test_case_6);
3385 }
3386 
3387 static int
3388 test_snow3g_hash_verify_test_case_1(void)
3389 {
3390 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3391 
3392 }
3393 
3394 static int
3395 test_snow3g_hash_verify_test_case_2(void)
3396 {
3397 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3398 }
3399 
3400 static int
3401 test_snow3g_hash_verify_test_case_3(void)
3402 {
3403 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3404 }
3405 
3406 static int
3407 test_snow3g_hash_verify_test_case_4(void)
3408 {
3409 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3410 }
3411 
3412 static int
3413 test_snow3g_hash_verify_test_case_5(void)
3414 {
3415 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3416 }
3417 
3418 static int
3419 test_snow3g_hash_verify_test_case_6(void)
3420 {
3421 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3422 }
3423 
3424 static int
3425 test_kasumi_hash_generate_test_case_1(void)
3426 {
3427 	return test_kasumi_authentication(&kasumi_hash_test_case_1);
3428 }
3429 
3430 static int
3431 test_kasumi_hash_generate_test_case_2(void)
3432 {
3433 	return test_kasumi_authentication(&kasumi_hash_test_case_2);
3434 }
3435 
3436 static int
3437 test_kasumi_hash_generate_test_case_3(void)
3438 {
3439 	return test_kasumi_authentication(&kasumi_hash_test_case_3);
3440 }
3441 
3442 static int
3443 test_kasumi_hash_generate_test_case_4(void)
3444 {
3445 	return test_kasumi_authentication(&kasumi_hash_test_case_4);
3446 }
3447 
3448 static int
3449 test_kasumi_hash_generate_test_case_5(void)
3450 {
3451 	return test_kasumi_authentication(&kasumi_hash_test_case_5);
3452 }
3453 
3454 static int
3455 test_kasumi_hash_generate_test_case_6(void)
3456 {
3457 	return test_kasumi_authentication(&kasumi_hash_test_case_6);
3458 }
3459 
3460 static int
3461 test_kasumi_hash_verify_test_case_1(void)
3462 {
3463 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3464 }
3465 
3466 static int
3467 test_kasumi_hash_verify_test_case_2(void)
3468 {
3469 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3470 }
3471 
3472 static int
3473 test_kasumi_hash_verify_test_case_3(void)
3474 {
3475 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3476 }
3477 
3478 static int
3479 test_kasumi_hash_verify_test_case_4(void)
3480 {
3481 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3482 }
3483 
3484 static int
3485 test_kasumi_hash_verify_test_case_5(void)
3486 {
3487 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3488 }
3489 
3490 static int
3491 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3492 {
3493 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3494 	struct crypto_unittest_params *ut_params = &unittest_params;
3495 
3496 	int retval;
3497 	uint8_t *plaintext, *ciphertext;
3498 	unsigned plaintext_pad_len;
3499 	unsigned plaintext_len;
3500 	struct rte_cryptodev_info dev_info;
3501 
3502 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3503 	uint64_t feat_flags = dev_info.feature_flags;
3504 
3505 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3506 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3507 		printf("Device doesn't support RAW data-path APIs.\n");
3508 		return TEST_SKIPPED;
3509 	}
3510 
3511 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3512 		return TEST_SKIPPED;
3513 
3514 	/* Verify the capabilities */
3515 	struct rte_cryptodev_sym_capability_idx cap_idx;
3516 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3517 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3518 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3519 			&cap_idx) == NULL)
3520 		return TEST_SKIPPED;
3521 
3522 	/* Create KASUMI session */
3523 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3524 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3525 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3526 					tdata->key.data, tdata->key.len,
3527 					tdata->cipher_iv.len);
3528 	if (retval < 0)
3529 		return retval;
3530 
3531 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3532 
3533 	/* Clear mbuf payload */
3534 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3535 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3536 
3537 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3538 	/* Append data which is padded to a multiple */
3539 	/* of the algorithms block size */
3540 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3541 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3542 				plaintext_pad_len);
3543 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3544 
3545 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3546 
3547 	/* Create KASUMI operation */
3548 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3549 				tdata->cipher_iv.len,
3550 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3551 				tdata->validCipherOffsetInBits.len);
3552 	if (retval < 0)
3553 		return retval;
3554 
3555 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3556 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3557 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3558 	else
3559 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3560 				ut_params->op);
3561 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3562 
3563 	ut_params->obuf = ut_params->op->sym->m_dst;
3564 	if (ut_params->obuf)
3565 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3566 	else
3567 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3568 
3569 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3570 
3571 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3572 				(tdata->validCipherOffsetInBits.len >> 3);
3573 	/* Validate obuf */
3574 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3575 		ciphertext,
3576 		reference_ciphertext,
3577 		tdata->validCipherLenInBits.len,
3578 		"KASUMI Ciphertext data not as expected");
3579 	return 0;
3580 }
3581 
3582 static int
3583 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3584 {
3585 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3586 	struct crypto_unittest_params *ut_params = &unittest_params;
3587 
3588 	int retval;
3589 
3590 	unsigned int plaintext_pad_len;
3591 	unsigned int plaintext_len;
3592 
3593 	uint8_t buffer[10000];
3594 	const uint8_t *ciphertext;
3595 
3596 	struct rte_cryptodev_info dev_info;
3597 
3598 	/* Verify the capabilities */
3599 	struct rte_cryptodev_sym_capability_idx cap_idx;
3600 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3601 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3602 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3603 			&cap_idx) == NULL)
3604 		return TEST_SKIPPED;
3605 
3606 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3607 
3608 	uint64_t feat_flags = dev_info.feature_flags;
3609 
3610 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3611 		printf("Device doesn't support in-place scatter-gather. "
3612 				"Test Skipped.\n");
3613 		return TEST_SKIPPED;
3614 	}
3615 
3616 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3617 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3618 		printf("Device doesn't support RAW data-path APIs.\n");
3619 		return TEST_SKIPPED;
3620 	}
3621 
3622 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3623 		return TEST_SKIPPED;
3624 
3625 	/* Create KASUMI session */
3626 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3627 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3628 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3629 					tdata->key.data, tdata->key.len,
3630 					tdata->cipher_iv.len);
3631 	if (retval < 0)
3632 		return retval;
3633 
3634 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3635 
3636 
3637 	/* Append data which is padded to a multiple */
3638 	/* of the algorithms block size */
3639 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3640 
3641 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3642 			plaintext_pad_len, 10, 0);
3643 
3644 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3645 
3646 	/* Create KASUMI operation */
3647 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3648 				tdata->cipher_iv.len,
3649 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3650 				tdata->validCipherOffsetInBits.len);
3651 	if (retval < 0)
3652 		return retval;
3653 
3654 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3655 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3656 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3657 	else
3658 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3659 						ut_params->op);
3660 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3661 
3662 	ut_params->obuf = ut_params->op->sym->m_dst;
3663 
3664 	if (ut_params->obuf)
3665 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3666 				plaintext_len, buffer);
3667 	else
3668 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3669 				tdata->validCipherOffsetInBits.len >> 3,
3670 				plaintext_len, buffer);
3671 
3672 	/* Validate obuf */
3673 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3674 
3675 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3676 				(tdata->validCipherOffsetInBits.len >> 3);
3677 	/* Validate obuf */
3678 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3679 		ciphertext,
3680 		reference_ciphertext,
3681 		tdata->validCipherLenInBits.len,
3682 		"KASUMI Ciphertext data not as expected");
3683 	return 0;
3684 }
3685 
3686 static int
3687 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3688 {
3689 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3690 	struct crypto_unittest_params *ut_params = &unittest_params;
3691 
3692 	int retval;
3693 	uint8_t *plaintext, *ciphertext;
3694 	unsigned plaintext_pad_len;
3695 	unsigned plaintext_len;
3696 
3697 	/* Verify the capabilities */
3698 	struct rte_cryptodev_sym_capability_idx cap_idx;
3699 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3700 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3701 	/* Data-path service does not support OOP */
3702 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3703 			&cap_idx) == NULL)
3704 		return TEST_SKIPPED;
3705 
3706 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3707 		return TEST_SKIPPED;
3708 
3709 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3710 		return TEST_SKIPPED;
3711 
3712 	/* Create KASUMI session */
3713 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3714 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3715 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3716 					tdata->key.data, tdata->key.len,
3717 					tdata->cipher_iv.len);
3718 	if (retval < 0)
3719 		return retval;
3720 
3721 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3722 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3723 
3724 	/* Clear mbuf payload */
3725 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3726 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3727 
3728 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3729 	/* Append data which is padded to a multiple */
3730 	/* of the algorithms block size */
3731 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3732 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3733 				plaintext_pad_len);
3734 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3735 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3736 
3737 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3738 
3739 	/* Create KASUMI operation */
3740 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3741 				tdata->cipher_iv.len,
3742 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3743 				tdata->validCipherOffsetInBits.len);
3744 	if (retval < 0)
3745 		return retval;
3746 
3747 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3748 						ut_params->op);
3749 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3750 
3751 	ut_params->obuf = ut_params->op->sym->m_dst;
3752 	if (ut_params->obuf)
3753 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3754 	else
3755 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3756 
3757 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3758 
3759 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3760 				(tdata->validCipherOffsetInBits.len >> 3);
3761 	/* Validate obuf */
3762 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3763 		ciphertext,
3764 		reference_ciphertext,
3765 		tdata->validCipherLenInBits.len,
3766 		"KASUMI Ciphertext data not as expected");
3767 	return 0;
3768 }
3769 
3770 static int
3771 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3772 {
3773 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3774 	struct crypto_unittest_params *ut_params = &unittest_params;
3775 
3776 	int retval;
3777 	unsigned int plaintext_pad_len;
3778 	unsigned int plaintext_len;
3779 
3780 	const uint8_t *ciphertext;
3781 	uint8_t buffer[2048];
3782 
3783 	struct rte_cryptodev_info dev_info;
3784 
3785 	/* Verify the capabilities */
3786 	struct rte_cryptodev_sym_capability_idx cap_idx;
3787 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3788 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3789 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3790 			&cap_idx) == NULL)
3791 		return TEST_SKIPPED;
3792 
3793 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3794 		return TEST_SKIPPED;
3795 
3796 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3797 		return TEST_SKIPPED;
3798 
3799 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3800 
3801 	uint64_t feat_flags = dev_info.feature_flags;
3802 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3803 		printf("Device doesn't support out-of-place scatter-gather "
3804 				"in both input and output mbufs. "
3805 				"Test Skipped.\n");
3806 		return TEST_SKIPPED;
3807 	}
3808 
3809 	/* Create KASUMI session */
3810 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3811 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3812 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3813 					tdata->key.data, tdata->key.len,
3814 					tdata->cipher_iv.len);
3815 	if (retval < 0)
3816 		return retval;
3817 
3818 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3819 	/* Append data which is padded to a multiple */
3820 	/* of the algorithms block size */
3821 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3822 
3823 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3824 			plaintext_pad_len, 10, 0);
3825 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3826 			plaintext_pad_len, 3, 0);
3827 
3828 	/* Append data which is padded to a multiple */
3829 	/* of the algorithms block size */
3830 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3831 
3832 	/* Create KASUMI operation */
3833 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3834 				tdata->cipher_iv.len,
3835 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3836 				tdata->validCipherOffsetInBits.len);
3837 	if (retval < 0)
3838 		return retval;
3839 
3840 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3841 						ut_params->op);
3842 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3843 
3844 	ut_params->obuf = ut_params->op->sym->m_dst;
3845 	if (ut_params->obuf)
3846 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3847 				plaintext_pad_len, buffer);
3848 	else
3849 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3850 				tdata->validCipherOffsetInBits.len >> 3,
3851 				plaintext_pad_len, buffer);
3852 
3853 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3854 				(tdata->validCipherOffsetInBits.len >> 3);
3855 	/* Validate obuf */
3856 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3857 		ciphertext,
3858 		reference_ciphertext,
3859 		tdata->validCipherLenInBits.len,
3860 		"KASUMI Ciphertext data not as expected");
3861 	return 0;
3862 }
3863 
3864 
3865 static int
3866 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3867 {
3868 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3869 	struct crypto_unittest_params *ut_params = &unittest_params;
3870 
3871 	int retval;
3872 	uint8_t *ciphertext, *plaintext;
3873 	unsigned ciphertext_pad_len;
3874 	unsigned ciphertext_len;
3875 
3876 	/* Verify the capabilities */
3877 	struct rte_cryptodev_sym_capability_idx cap_idx;
3878 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3879 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3880 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3881 			&cap_idx) == NULL)
3882 		return TEST_SKIPPED;
3883 
3884 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3885 		return TEST_SKIPPED;
3886 
3887 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3888 		return TEST_SKIPPED;
3889 
3890 	/* Create KASUMI session */
3891 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3892 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3893 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3894 					tdata->key.data, tdata->key.len,
3895 					tdata->cipher_iv.len);
3896 	if (retval < 0)
3897 		return retval;
3898 
3899 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3900 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3901 
3902 	/* Clear mbuf payload */
3903 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3904 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3905 
3906 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3907 	/* Append data which is padded to a multiple */
3908 	/* of the algorithms block size */
3909 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3910 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3911 				ciphertext_pad_len);
3912 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3913 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3914 
3915 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3916 
3917 	/* Create KASUMI operation */
3918 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3919 				tdata->cipher_iv.len,
3920 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3921 				tdata->validCipherOffsetInBits.len);
3922 	if (retval < 0)
3923 		return retval;
3924 
3925 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3926 						ut_params->op);
3927 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3928 
3929 	ut_params->obuf = ut_params->op->sym->m_dst;
3930 	if (ut_params->obuf)
3931 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3932 	else
3933 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3934 
3935 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3936 
3937 	const uint8_t *reference_plaintext = tdata->plaintext.data +
3938 				(tdata->validCipherOffsetInBits.len >> 3);
3939 	/* Validate obuf */
3940 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3941 		plaintext,
3942 		reference_plaintext,
3943 		tdata->validCipherLenInBits.len,
3944 		"KASUMI Plaintext data not as expected");
3945 	return 0;
3946 }
3947 
3948 static int
3949 test_kasumi_decryption(const struct kasumi_test_data *tdata)
3950 {
3951 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3952 	struct crypto_unittest_params *ut_params = &unittest_params;
3953 
3954 	int retval;
3955 	uint8_t *ciphertext, *plaintext;
3956 	unsigned ciphertext_pad_len;
3957 	unsigned ciphertext_len;
3958 	struct rte_cryptodev_info dev_info;
3959 
3960 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3961 	uint64_t feat_flags = dev_info.feature_flags;
3962 
3963 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3964 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3965 		printf("Device doesn't support RAW data-path APIs.\n");
3966 		return TEST_SKIPPED;
3967 	}
3968 
3969 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3970 		return TEST_SKIPPED;
3971 
3972 	/* Verify the capabilities */
3973 	struct rte_cryptodev_sym_capability_idx cap_idx;
3974 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3975 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3976 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3977 			&cap_idx) == NULL)
3978 		return TEST_SKIPPED;
3979 
3980 	/* Create KASUMI session */
3981 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3982 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3983 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3984 					tdata->key.data, tdata->key.len,
3985 					tdata->cipher_iv.len);
3986 	if (retval < 0)
3987 		return retval;
3988 
3989 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3990 
3991 	/* Clear mbuf payload */
3992 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3993 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3994 
3995 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3996 	/* Append data which is padded to a multiple */
3997 	/* of the algorithms block size */
3998 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3999 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4000 				ciphertext_pad_len);
4001 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4002 
4003 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4004 
4005 	/* Create KASUMI operation */
4006 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4007 					tdata->cipher_iv.len,
4008 					tdata->ciphertext.len,
4009 					tdata->validCipherOffsetInBits.len);
4010 	if (retval < 0)
4011 		return retval;
4012 
4013 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4014 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4015 				ut_params->op, 1, 0, 1, 0);
4016 	else
4017 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4018 						ut_params->op);
4019 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4020 
4021 	ut_params->obuf = ut_params->op->sym->m_dst;
4022 	if (ut_params->obuf)
4023 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4024 	else
4025 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4026 
4027 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4028 
4029 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4030 				(tdata->validCipherOffsetInBits.len >> 3);
4031 	/* Validate obuf */
4032 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4033 		plaintext,
4034 		reference_plaintext,
4035 		tdata->validCipherLenInBits.len,
4036 		"KASUMI Plaintext data not as expected");
4037 	return 0;
4038 }
4039 
4040 static int
4041 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4042 {
4043 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4044 	struct crypto_unittest_params *ut_params = &unittest_params;
4045 
4046 	int retval;
4047 	uint8_t *plaintext, *ciphertext;
4048 	unsigned plaintext_pad_len;
4049 	unsigned plaintext_len;
4050 	struct rte_cryptodev_info dev_info;
4051 
4052 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4053 	uint64_t feat_flags = dev_info.feature_flags;
4054 
4055 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4056 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4057 		printf("Device doesn't support RAW data-path APIs.\n");
4058 		return TEST_SKIPPED;
4059 	}
4060 
4061 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4062 		return TEST_SKIPPED;
4063 
4064 	/* Verify the capabilities */
4065 	struct rte_cryptodev_sym_capability_idx cap_idx;
4066 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4067 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4068 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4069 			&cap_idx) == NULL)
4070 		return TEST_SKIPPED;
4071 
4072 	/* Create SNOW 3G session */
4073 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4074 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4075 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4076 					tdata->key.data, tdata->key.len,
4077 					tdata->cipher_iv.len);
4078 	if (retval < 0)
4079 		return retval;
4080 
4081 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4082 
4083 	/* Clear mbuf payload */
4084 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4085 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4086 
4087 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4088 	/* Append data which is padded to a multiple of */
4089 	/* the algorithms block size */
4090 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4091 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4092 				plaintext_pad_len);
4093 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4094 
4095 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4096 
4097 	/* Create SNOW 3G operation */
4098 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4099 					tdata->cipher_iv.len,
4100 					tdata->validCipherLenInBits.len,
4101 					0);
4102 	if (retval < 0)
4103 		return retval;
4104 
4105 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4106 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4107 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4108 	else
4109 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4110 						ut_params->op);
4111 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4112 
4113 	ut_params->obuf = ut_params->op->sym->m_dst;
4114 	if (ut_params->obuf)
4115 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4116 	else
4117 		ciphertext = plaintext;
4118 
4119 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4120 
4121 	/* Validate obuf */
4122 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4123 		ciphertext,
4124 		tdata->ciphertext.data,
4125 		tdata->validDataLenInBits.len,
4126 		"SNOW 3G Ciphertext data not as expected");
4127 	return 0;
4128 }
4129 
4130 
4131 static int
4132 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4133 {
4134 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4135 	struct crypto_unittest_params *ut_params = &unittest_params;
4136 	uint8_t *plaintext, *ciphertext;
4137 
4138 	int retval;
4139 	unsigned plaintext_pad_len;
4140 	unsigned plaintext_len;
4141 
4142 	/* Verify the capabilities */
4143 	struct rte_cryptodev_sym_capability_idx cap_idx;
4144 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4145 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4146 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4147 			&cap_idx) == NULL)
4148 		return TEST_SKIPPED;
4149 
4150 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4151 		return TEST_SKIPPED;
4152 
4153 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4154 		return TEST_SKIPPED;
4155 
4156 	/* Create SNOW 3G session */
4157 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4158 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4159 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4160 					tdata->key.data, tdata->key.len,
4161 					tdata->cipher_iv.len);
4162 	if (retval < 0)
4163 		return retval;
4164 
4165 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4166 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4167 
4168 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4169 			"Failed to allocate input buffer in mempool");
4170 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4171 			"Failed to allocate output buffer in mempool");
4172 
4173 	/* Clear mbuf payload */
4174 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4175 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4176 
4177 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4178 	/* Append data which is padded to a multiple of */
4179 	/* the algorithms block size */
4180 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4181 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4182 				plaintext_pad_len);
4183 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4184 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4185 
4186 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4187 
4188 	/* Create SNOW 3G operation */
4189 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4190 					tdata->cipher_iv.len,
4191 					tdata->validCipherLenInBits.len,
4192 					0);
4193 	if (retval < 0)
4194 		return retval;
4195 
4196 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4197 						ut_params->op);
4198 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4199 
4200 	ut_params->obuf = ut_params->op->sym->m_dst;
4201 	if (ut_params->obuf)
4202 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4203 	else
4204 		ciphertext = plaintext;
4205 
4206 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4207 
4208 	/* Validate obuf */
4209 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4210 		ciphertext,
4211 		tdata->ciphertext.data,
4212 		tdata->validDataLenInBits.len,
4213 		"SNOW 3G Ciphertext data not as expected");
4214 	return 0;
4215 }
4216 
4217 static int
4218 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4219 {
4220 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4221 	struct crypto_unittest_params *ut_params = &unittest_params;
4222 
4223 	int retval;
4224 	unsigned int plaintext_pad_len;
4225 	unsigned int plaintext_len;
4226 	uint8_t buffer[10000];
4227 	const uint8_t *ciphertext;
4228 
4229 	struct rte_cryptodev_info dev_info;
4230 
4231 	/* Verify the capabilities */
4232 	struct rte_cryptodev_sym_capability_idx cap_idx;
4233 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4234 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4235 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4236 			&cap_idx) == NULL)
4237 		return TEST_SKIPPED;
4238 
4239 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4240 		return TEST_SKIPPED;
4241 
4242 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4243 		return TEST_SKIPPED;
4244 
4245 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4246 
4247 	uint64_t feat_flags = dev_info.feature_flags;
4248 
4249 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4250 		printf("Device doesn't support out-of-place scatter-gather "
4251 				"in both input and output mbufs. "
4252 				"Test Skipped.\n");
4253 		return TEST_SKIPPED;
4254 	}
4255 
4256 	/* Create SNOW 3G session */
4257 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4258 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4259 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4260 					tdata->key.data, tdata->key.len,
4261 					tdata->cipher_iv.len);
4262 	if (retval < 0)
4263 		return retval;
4264 
4265 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4266 	/* Append data which is padded to a multiple of */
4267 	/* the algorithms block size */
4268 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4269 
4270 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4271 			plaintext_pad_len, 10, 0);
4272 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4273 			plaintext_pad_len, 3, 0);
4274 
4275 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4276 			"Failed to allocate input buffer in mempool");
4277 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4278 			"Failed to allocate output buffer in mempool");
4279 
4280 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4281 
4282 	/* Create SNOW 3G operation */
4283 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4284 					tdata->cipher_iv.len,
4285 					tdata->validCipherLenInBits.len,
4286 					0);
4287 	if (retval < 0)
4288 		return retval;
4289 
4290 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4291 						ut_params->op);
4292 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4293 
4294 	ut_params->obuf = ut_params->op->sym->m_dst;
4295 	if (ut_params->obuf)
4296 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4297 				plaintext_len, buffer);
4298 	else
4299 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4300 				plaintext_len, buffer);
4301 
4302 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4303 
4304 	/* Validate obuf */
4305 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4306 		ciphertext,
4307 		tdata->ciphertext.data,
4308 		tdata->validDataLenInBits.len,
4309 		"SNOW 3G Ciphertext data not as expected");
4310 
4311 	return 0;
4312 }
4313 
4314 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4315 static void
4316 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4317 {
4318 	uint8_t curr_byte, prev_byte;
4319 	uint32_t length_in_bytes = ceil_byte_length(length + offset);
4320 	uint8_t lower_byte_mask = (1 << offset) - 1;
4321 	unsigned i;
4322 
4323 	prev_byte = buffer[0];
4324 	buffer[0] >>= offset;
4325 
4326 	for (i = 1; i < length_in_bytes; i++) {
4327 		curr_byte = buffer[i];
4328 		buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4329 				(curr_byte >> offset);
4330 		prev_byte = curr_byte;
4331 	}
4332 }
4333 
4334 static int
4335 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4336 {
4337 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4338 	struct crypto_unittest_params *ut_params = &unittest_params;
4339 	uint8_t *plaintext, *ciphertext;
4340 	int retval;
4341 	uint32_t plaintext_len;
4342 	uint32_t plaintext_pad_len;
4343 	uint8_t extra_offset = 4;
4344 	uint8_t *expected_ciphertext_shifted;
4345 	struct rte_cryptodev_info dev_info;
4346 
4347 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4348 	uint64_t feat_flags = dev_info.feature_flags;
4349 
4350 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4351 			((tdata->validDataLenInBits.len % 8) != 0)) {
4352 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4353 		return TEST_SKIPPED;
4354 	}
4355 
4356 	/* Verify the capabilities */
4357 	struct rte_cryptodev_sym_capability_idx cap_idx;
4358 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4359 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4360 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4361 			&cap_idx) == NULL)
4362 		return TEST_SKIPPED;
4363 
4364 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4365 		return TEST_SKIPPED;
4366 
4367 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4368 		return TEST_SKIPPED;
4369 
4370 	/* Create SNOW 3G session */
4371 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4372 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4373 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4374 					tdata->key.data, tdata->key.len,
4375 					tdata->cipher_iv.len);
4376 	if (retval < 0)
4377 		return retval;
4378 
4379 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4380 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4381 
4382 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4383 			"Failed to allocate input buffer in mempool");
4384 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4385 			"Failed to allocate output buffer in mempool");
4386 
4387 	/* Clear mbuf payload */
4388 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4389 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4390 
4391 	plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4392 	/*
4393 	 * Append data which is padded to a
4394 	 * multiple of the algorithms block size
4395 	 */
4396 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4397 
4398 	plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4399 						plaintext_pad_len);
4400 
4401 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4402 
4403 	memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4404 	buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4405 
4406 #ifdef RTE_APP_TEST_DEBUG
4407 	rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4408 #endif
4409 	/* Create SNOW 3G operation */
4410 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4411 					tdata->cipher_iv.len,
4412 					tdata->validCipherLenInBits.len,
4413 					extra_offset);
4414 	if (retval < 0)
4415 		return retval;
4416 
4417 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4418 						ut_params->op);
4419 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4420 
4421 	ut_params->obuf = ut_params->op->sym->m_dst;
4422 	if (ut_params->obuf)
4423 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4424 	else
4425 		ciphertext = plaintext;
4426 
4427 #ifdef RTE_APP_TEST_DEBUG
4428 	rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4429 #endif
4430 
4431 	expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4432 
4433 	TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4434 			"failed to reserve memory for ciphertext shifted\n");
4435 
4436 	memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4437 			ceil_byte_length(tdata->ciphertext.len));
4438 	buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4439 			extra_offset);
4440 	/* Validate obuf */
4441 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4442 		ciphertext,
4443 		expected_ciphertext_shifted,
4444 		tdata->validDataLenInBits.len,
4445 		extra_offset,
4446 		"SNOW 3G Ciphertext data not as expected");
4447 	return 0;
4448 }
4449 
4450 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4451 {
4452 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4453 	struct crypto_unittest_params *ut_params = &unittest_params;
4454 
4455 	int retval;
4456 
4457 	uint8_t *plaintext, *ciphertext;
4458 	unsigned ciphertext_pad_len;
4459 	unsigned ciphertext_len;
4460 	struct rte_cryptodev_info dev_info;
4461 
4462 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4463 	uint64_t feat_flags = dev_info.feature_flags;
4464 
4465 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4466 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4467 		printf("Device doesn't support RAW data-path APIs.\n");
4468 		return TEST_SKIPPED;
4469 	}
4470 
4471 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4472 		return TEST_SKIPPED;
4473 
4474 	/* Verify the capabilities */
4475 	struct rte_cryptodev_sym_capability_idx cap_idx;
4476 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4477 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4478 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4479 			&cap_idx) == NULL)
4480 		return TEST_SKIPPED;
4481 
4482 	/* Create SNOW 3G session */
4483 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4484 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4485 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4486 					tdata->key.data, tdata->key.len,
4487 					tdata->cipher_iv.len);
4488 	if (retval < 0)
4489 		return retval;
4490 
4491 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4492 
4493 	/* Clear mbuf payload */
4494 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4495 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4496 
4497 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4498 	/* Append data which is padded to a multiple of */
4499 	/* the algorithms block size */
4500 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4501 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4502 				ciphertext_pad_len);
4503 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4504 
4505 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4506 
4507 	/* Create SNOW 3G operation */
4508 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4509 					tdata->cipher_iv.len,
4510 					tdata->validCipherLenInBits.len,
4511 					tdata->cipher.offset_bits);
4512 	if (retval < 0)
4513 		return retval;
4514 
4515 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4516 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4517 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4518 	else
4519 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4520 						ut_params->op);
4521 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4522 	ut_params->obuf = ut_params->op->sym->m_dst;
4523 	if (ut_params->obuf)
4524 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4525 	else
4526 		plaintext = ciphertext;
4527 
4528 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4529 
4530 	/* Validate obuf */
4531 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4532 				tdata->plaintext.data,
4533 				tdata->validDataLenInBits.len,
4534 				"SNOW 3G Plaintext data not as expected");
4535 	return 0;
4536 }
4537 
4538 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4539 {
4540 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4541 	struct crypto_unittest_params *ut_params = &unittest_params;
4542 
4543 	int retval;
4544 
4545 	uint8_t *plaintext, *ciphertext;
4546 	unsigned ciphertext_pad_len;
4547 	unsigned ciphertext_len;
4548 
4549 	/* Verify the capabilities */
4550 	struct rte_cryptodev_sym_capability_idx cap_idx;
4551 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4552 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4553 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4554 			&cap_idx) == NULL)
4555 		return TEST_SKIPPED;
4556 
4557 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4558 		return TEST_SKIPPED;
4559 
4560 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4561 		return TEST_SKIPPED;
4562 
4563 	/* Create SNOW 3G session */
4564 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4565 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4566 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4567 					tdata->key.data, tdata->key.len,
4568 					tdata->cipher_iv.len);
4569 	if (retval < 0)
4570 		return retval;
4571 
4572 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4573 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4574 
4575 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4576 			"Failed to allocate input buffer");
4577 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4578 			"Failed to allocate output buffer");
4579 
4580 	/* Clear mbuf payload */
4581 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4582 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4583 
4584 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4585 		       rte_pktmbuf_tailroom(ut_params->obuf));
4586 
4587 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4588 	/* Append data which is padded to a multiple of */
4589 	/* the algorithms block size */
4590 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4591 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4592 				ciphertext_pad_len);
4593 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4594 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4595 
4596 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4597 
4598 	/* Create SNOW 3G operation */
4599 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4600 					tdata->cipher_iv.len,
4601 					tdata->validCipherLenInBits.len,
4602 					0);
4603 	if (retval < 0)
4604 		return retval;
4605 
4606 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4607 						ut_params->op);
4608 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4609 	ut_params->obuf = ut_params->op->sym->m_dst;
4610 	if (ut_params->obuf)
4611 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4612 	else
4613 		plaintext = ciphertext;
4614 
4615 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4616 
4617 	/* Validate obuf */
4618 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4619 				tdata->plaintext.data,
4620 				tdata->validDataLenInBits.len,
4621 				"SNOW 3G Plaintext data not as expected");
4622 	return 0;
4623 }
4624 
4625 static int
4626 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4627 {
4628 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4629 	struct crypto_unittest_params *ut_params = &unittest_params;
4630 
4631 	int retval;
4632 
4633 	uint8_t *plaintext, *ciphertext;
4634 	unsigned int plaintext_pad_len;
4635 	unsigned int plaintext_len;
4636 
4637 	struct rte_cryptodev_info dev_info;
4638 	struct rte_cryptodev_sym_capability_idx cap_idx;
4639 
4640 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4641 	uint64_t feat_flags = dev_info.feature_flags;
4642 
4643 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4644 			((tdata->validAuthLenInBits.len % 8 != 0) ||
4645 			(tdata->validDataLenInBits.len % 8 != 0))) {
4646 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4647 		return TEST_SKIPPED;
4648 	}
4649 
4650 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4651 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4652 		printf("Device doesn't support RAW data-path APIs.\n");
4653 		return TEST_SKIPPED;
4654 	}
4655 
4656 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4657 		return TEST_SKIPPED;
4658 
4659 	/* Check if device supports ZUC EEA3 */
4660 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4661 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4662 
4663 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4664 			&cap_idx) == NULL)
4665 		return TEST_SKIPPED;
4666 
4667 	/* Check if device supports ZUC EIA3 */
4668 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4669 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4670 
4671 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4672 			&cap_idx) == NULL)
4673 		return TEST_SKIPPED;
4674 
4675 	/* Create ZUC session */
4676 	retval = create_zuc_cipher_auth_encrypt_generate_session(
4677 			ts_params->valid_devs[0],
4678 			tdata);
4679 	if (retval != 0)
4680 		return retval;
4681 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4682 
4683 	/* clear mbuf payload */
4684 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4685 			rte_pktmbuf_tailroom(ut_params->ibuf));
4686 
4687 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4688 	/* Append data which is padded to a multiple of */
4689 	/* the algorithms block size */
4690 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4691 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4692 				plaintext_pad_len);
4693 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4694 
4695 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4696 
4697 	/* Create ZUC operation */
4698 	retval = create_zuc_cipher_hash_generate_operation(tdata);
4699 	if (retval < 0)
4700 		return retval;
4701 
4702 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4703 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4704 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4705 	else
4706 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4707 			ut_params->op);
4708 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4709 	ut_params->obuf = ut_params->op->sym->m_src;
4710 	if (ut_params->obuf)
4711 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4712 	else
4713 		ciphertext = plaintext;
4714 
4715 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4716 	/* Validate obuf */
4717 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4718 			ciphertext,
4719 			tdata->ciphertext.data,
4720 			tdata->validDataLenInBits.len,
4721 			"ZUC Ciphertext data not as expected");
4722 
4723 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4724 	    + plaintext_pad_len;
4725 
4726 	/* Validate obuf */
4727 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4728 			ut_params->digest,
4729 			tdata->digest.data,
4730 			4,
4731 			"ZUC Generated auth tag not as expected");
4732 	return 0;
4733 }
4734 
4735 static int
4736 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4737 {
4738 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4739 	struct crypto_unittest_params *ut_params = &unittest_params;
4740 
4741 	int retval;
4742 
4743 	uint8_t *plaintext, *ciphertext;
4744 	unsigned plaintext_pad_len;
4745 	unsigned plaintext_len;
4746 	struct rte_cryptodev_info dev_info;
4747 
4748 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4749 	uint64_t feat_flags = dev_info.feature_flags;
4750 
4751 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4752 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4753 		printf("Device doesn't support RAW data-path APIs.\n");
4754 		return TEST_SKIPPED;
4755 	}
4756 
4757 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4758 		return TEST_SKIPPED;
4759 
4760 	/* Verify the capabilities */
4761 	struct rte_cryptodev_sym_capability_idx cap_idx;
4762 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4763 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4764 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4765 			&cap_idx) == NULL)
4766 		return TEST_SKIPPED;
4767 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4768 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4769 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4770 			&cap_idx) == NULL)
4771 		return TEST_SKIPPED;
4772 
4773 	/* Create SNOW 3G session */
4774 	retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4775 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4776 			RTE_CRYPTO_AUTH_OP_GENERATE,
4777 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4778 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4779 			tdata->key.data, tdata->key.len,
4780 			tdata->auth_iv.len, tdata->digest.len,
4781 			tdata->cipher_iv.len);
4782 	if (retval != 0)
4783 		return retval;
4784 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4785 
4786 	/* clear mbuf payload */
4787 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4788 			rte_pktmbuf_tailroom(ut_params->ibuf));
4789 
4790 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4791 	/* Append data which is padded to a multiple of */
4792 	/* the algorithms block size */
4793 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4794 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4795 				plaintext_pad_len);
4796 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4797 
4798 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4799 
4800 	/* Create SNOW 3G operation */
4801 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4802 			tdata->digest.len, tdata->auth_iv.data,
4803 			tdata->auth_iv.len,
4804 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4805 			tdata->cipher_iv.data, tdata->cipher_iv.len,
4806 			tdata->validCipherLenInBits.len,
4807 			0,
4808 			tdata->validAuthLenInBits.len,
4809 			0
4810 			);
4811 	if (retval < 0)
4812 		return retval;
4813 
4814 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4815 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4816 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4817 	else
4818 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4819 			ut_params->op);
4820 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4821 	ut_params->obuf = ut_params->op->sym->m_src;
4822 	if (ut_params->obuf)
4823 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4824 	else
4825 		ciphertext = plaintext;
4826 
4827 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4828 	/* Validate obuf */
4829 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4830 			ciphertext,
4831 			tdata->ciphertext.data,
4832 			tdata->validDataLenInBits.len,
4833 			"SNOW 3G Ciphertext data not as expected");
4834 
4835 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4836 	    + plaintext_pad_len;
4837 
4838 	/* Validate obuf */
4839 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4840 			ut_params->digest,
4841 			tdata->digest.data,
4842 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4843 			"SNOW 3G Generated auth tag not as expected");
4844 	return 0;
4845 }
4846 
4847 static int
4848 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4849 	uint8_t op_mode, uint8_t verify)
4850 {
4851 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4852 	struct crypto_unittest_params *ut_params = &unittest_params;
4853 
4854 	int retval;
4855 
4856 	uint8_t *plaintext = NULL, *ciphertext = NULL;
4857 	unsigned int plaintext_pad_len;
4858 	unsigned int plaintext_len;
4859 	unsigned int ciphertext_pad_len;
4860 	unsigned int ciphertext_len;
4861 
4862 	struct rte_cryptodev_info dev_info;
4863 
4864 	/* Verify the capabilities */
4865 	struct rte_cryptodev_sym_capability_idx cap_idx;
4866 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4867 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4868 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4869 			&cap_idx) == NULL)
4870 		return TEST_SKIPPED;
4871 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4872 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4873 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4874 			&cap_idx) == NULL)
4875 		return TEST_SKIPPED;
4876 
4877 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4878 		return TEST_SKIPPED;
4879 
4880 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4881 
4882 	uint64_t feat_flags = dev_info.feature_flags;
4883 
4884 	if (op_mode == OUT_OF_PLACE) {
4885 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4886 			printf("Device doesn't support digest encrypted.\n");
4887 			return TEST_SKIPPED;
4888 		}
4889 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4890 			return TEST_SKIPPED;
4891 	}
4892 
4893 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4894 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4895 		printf("Device doesn't support RAW data-path APIs.\n");
4896 		return TEST_SKIPPED;
4897 	}
4898 
4899 	/* Create SNOW 3G session */
4900 	retval = create_wireless_algo_auth_cipher_session(
4901 			ts_params->valid_devs[0],
4902 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4903 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4904 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4905 					: RTE_CRYPTO_AUTH_OP_GENERATE),
4906 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4907 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4908 			tdata->key.data, tdata->key.len,
4909 			tdata->auth_iv.len, tdata->digest.len,
4910 			tdata->cipher_iv.len);
4911 	if (retval != 0)
4912 		return retval;
4913 
4914 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4915 	if (op_mode == OUT_OF_PLACE)
4916 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4917 
4918 	/* clear mbuf payload */
4919 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4920 		rte_pktmbuf_tailroom(ut_params->ibuf));
4921 	if (op_mode == OUT_OF_PLACE)
4922 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4923 			rte_pktmbuf_tailroom(ut_params->obuf));
4924 
4925 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4926 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4927 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4928 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4929 
4930 	if (verify) {
4931 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4932 					ciphertext_pad_len);
4933 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4934 		if (op_mode == OUT_OF_PLACE)
4935 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4936 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4937 			ciphertext_len);
4938 	} else {
4939 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4940 					plaintext_pad_len);
4941 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4942 		if (op_mode == OUT_OF_PLACE)
4943 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4944 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4945 	}
4946 
4947 	/* Create SNOW 3G operation */
4948 	retval = create_wireless_algo_auth_cipher_operation(
4949 		tdata->digest.data, tdata->digest.len,
4950 		tdata->cipher_iv.data, tdata->cipher_iv.len,
4951 		tdata->auth_iv.data, tdata->auth_iv.len,
4952 		(tdata->digest.offset_bytes == 0 ?
4953 		(verify ? ciphertext_pad_len : plaintext_pad_len)
4954 			: tdata->digest.offset_bytes),
4955 		tdata->validCipherLenInBits.len,
4956 		tdata->cipher.offset_bits,
4957 		tdata->validAuthLenInBits.len,
4958 		tdata->auth.offset_bits,
4959 		op_mode, 0, verify);
4960 
4961 	if (retval < 0)
4962 		return retval;
4963 
4964 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4965 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4966 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4967 	else
4968 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4969 			ut_params->op);
4970 
4971 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4972 
4973 	ut_params->obuf = (op_mode == IN_PLACE ?
4974 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4975 
4976 	if (verify) {
4977 		if (ut_params->obuf)
4978 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
4979 							uint8_t *);
4980 		else
4981 			plaintext = ciphertext +
4982 				(tdata->cipher.offset_bits >> 3);
4983 
4984 		debug_hexdump(stdout, "plaintext:", plaintext,
4985 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4986 		debug_hexdump(stdout, "plaintext expected:",
4987 			tdata->plaintext.data,
4988 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4989 	} else {
4990 		if (ut_params->obuf)
4991 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
4992 							uint8_t *);
4993 		else
4994 			ciphertext = plaintext;
4995 
4996 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4997 			ciphertext_len);
4998 		debug_hexdump(stdout, "ciphertext expected:",
4999 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5000 
5001 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5002 			+ (tdata->digest.offset_bytes == 0 ?
5003 		plaintext_pad_len : tdata->digest.offset_bytes);
5004 
5005 		debug_hexdump(stdout, "digest:", ut_params->digest,
5006 			tdata->digest.len);
5007 		debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5008 				tdata->digest.len);
5009 	}
5010 
5011 	/* Validate obuf */
5012 	if (verify) {
5013 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5014 			plaintext,
5015 			tdata->plaintext.data,
5016 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5017 			 (tdata->digest.len << 3)),
5018 			tdata->cipher.offset_bits,
5019 			"SNOW 3G Plaintext data not as expected");
5020 	} else {
5021 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5022 			ciphertext,
5023 			tdata->ciphertext.data,
5024 			(tdata->validDataLenInBits.len -
5025 			 tdata->cipher.offset_bits),
5026 			tdata->cipher.offset_bits,
5027 			"SNOW 3G Ciphertext data not as expected");
5028 
5029 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5030 			ut_params->digest,
5031 			tdata->digest.data,
5032 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5033 			"SNOW 3G Generated auth tag not as expected");
5034 	}
5035 	return 0;
5036 }
5037 
5038 static int
5039 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5040 	uint8_t op_mode, uint8_t verify)
5041 {
5042 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5043 	struct crypto_unittest_params *ut_params = &unittest_params;
5044 
5045 	int retval;
5046 
5047 	const uint8_t *plaintext = NULL;
5048 	const uint8_t *ciphertext = NULL;
5049 	const uint8_t *digest = NULL;
5050 	unsigned int plaintext_pad_len;
5051 	unsigned int plaintext_len;
5052 	unsigned int ciphertext_pad_len;
5053 	unsigned int ciphertext_len;
5054 	uint8_t buffer[10000];
5055 	uint8_t digest_buffer[10000];
5056 
5057 	struct rte_cryptodev_info dev_info;
5058 
5059 	/* Verify the capabilities */
5060 	struct rte_cryptodev_sym_capability_idx cap_idx;
5061 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5062 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5063 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5064 			&cap_idx) == NULL)
5065 		return TEST_SKIPPED;
5066 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5067 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5068 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5069 			&cap_idx) == NULL)
5070 		return TEST_SKIPPED;
5071 
5072 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5073 		return TEST_SKIPPED;
5074 
5075 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5076 
5077 	uint64_t feat_flags = dev_info.feature_flags;
5078 
5079 	if (op_mode == IN_PLACE) {
5080 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5081 			printf("Device doesn't support in-place scatter-gather "
5082 					"in both input and output mbufs.\n");
5083 			return TEST_SKIPPED;
5084 		}
5085 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5086 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5087 			printf("Device doesn't support RAW data-path APIs.\n");
5088 			return TEST_SKIPPED;
5089 		}
5090 	} else {
5091 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5092 			return TEST_SKIPPED;
5093 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5094 			printf("Device doesn't support out-of-place scatter-gather "
5095 					"in both input and output mbufs.\n");
5096 			return TEST_SKIPPED;
5097 		}
5098 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5099 			printf("Device doesn't support digest encrypted.\n");
5100 			return TEST_SKIPPED;
5101 		}
5102 	}
5103 
5104 	/* Create SNOW 3G session */
5105 	retval = create_wireless_algo_auth_cipher_session(
5106 			ts_params->valid_devs[0],
5107 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5108 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5109 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5110 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5111 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5112 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5113 			tdata->key.data, tdata->key.len,
5114 			tdata->auth_iv.len, tdata->digest.len,
5115 			tdata->cipher_iv.len);
5116 
5117 	if (retval != 0)
5118 		return retval;
5119 
5120 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5121 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5122 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5123 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5124 
5125 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5126 			plaintext_pad_len, 15, 0);
5127 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5128 			"Failed to allocate input buffer in mempool");
5129 
5130 	if (op_mode == OUT_OF_PLACE) {
5131 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5132 				plaintext_pad_len, 15, 0);
5133 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5134 				"Failed to allocate output buffer in mempool");
5135 	}
5136 
5137 	if (verify) {
5138 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5139 			tdata->ciphertext.data);
5140 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5141 					ciphertext_len, buffer);
5142 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5143 			ciphertext_len);
5144 	} else {
5145 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5146 			tdata->plaintext.data);
5147 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5148 					plaintext_len, buffer);
5149 		debug_hexdump(stdout, "plaintext:", plaintext,
5150 			plaintext_len);
5151 	}
5152 	memset(buffer, 0, sizeof(buffer));
5153 
5154 	/* Create SNOW 3G operation */
5155 	retval = create_wireless_algo_auth_cipher_operation(
5156 		tdata->digest.data, tdata->digest.len,
5157 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5158 		tdata->auth_iv.data, tdata->auth_iv.len,
5159 		(tdata->digest.offset_bytes == 0 ?
5160 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5161 			: tdata->digest.offset_bytes),
5162 		tdata->validCipherLenInBits.len,
5163 		tdata->cipher.offset_bits,
5164 		tdata->validAuthLenInBits.len,
5165 		tdata->auth.offset_bits,
5166 		op_mode, 1, verify);
5167 
5168 	if (retval < 0)
5169 		return retval;
5170 
5171 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5172 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5173 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5174 	else
5175 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5176 			ut_params->op);
5177 
5178 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5179 
5180 	ut_params->obuf = (op_mode == IN_PLACE ?
5181 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5182 
5183 	if (verify) {
5184 		if (ut_params->obuf)
5185 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5186 					plaintext_len, buffer);
5187 		else
5188 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5189 					plaintext_len, buffer);
5190 
5191 		debug_hexdump(stdout, "plaintext:", plaintext,
5192 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5193 		debug_hexdump(stdout, "plaintext expected:",
5194 			tdata->plaintext.data,
5195 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5196 	} else {
5197 		if (ut_params->obuf)
5198 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5199 					ciphertext_len, buffer);
5200 		else
5201 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5202 					ciphertext_len, buffer);
5203 
5204 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5205 			ciphertext_len);
5206 		debug_hexdump(stdout, "ciphertext expected:",
5207 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5208 
5209 		if (ut_params->obuf)
5210 			digest = rte_pktmbuf_read(ut_params->obuf,
5211 				(tdata->digest.offset_bytes == 0 ?
5212 				plaintext_pad_len : tdata->digest.offset_bytes),
5213 				tdata->digest.len, digest_buffer);
5214 		else
5215 			digest = rte_pktmbuf_read(ut_params->ibuf,
5216 				(tdata->digest.offset_bytes == 0 ?
5217 				plaintext_pad_len : tdata->digest.offset_bytes),
5218 				tdata->digest.len, digest_buffer);
5219 
5220 		debug_hexdump(stdout, "digest:", digest,
5221 			tdata->digest.len);
5222 		debug_hexdump(stdout, "digest expected:",
5223 			tdata->digest.data, tdata->digest.len);
5224 	}
5225 
5226 	/* Validate obuf */
5227 	if (verify) {
5228 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5229 			plaintext,
5230 			tdata->plaintext.data,
5231 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5232 			 (tdata->digest.len << 3)),
5233 			tdata->cipher.offset_bits,
5234 			"SNOW 3G Plaintext data not as expected");
5235 	} else {
5236 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5237 			ciphertext,
5238 			tdata->ciphertext.data,
5239 			(tdata->validDataLenInBits.len -
5240 			 tdata->cipher.offset_bits),
5241 			tdata->cipher.offset_bits,
5242 			"SNOW 3G Ciphertext data not as expected");
5243 
5244 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5245 			digest,
5246 			tdata->digest.data,
5247 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5248 			"SNOW 3G Generated auth tag not as expected");
5249 	}
5250 	return 0;
5251 }
5252 
5253 static int
5254 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5255 	uint8_t op_mode, uint8_t verify)
5256 {
5257 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5258 	struct crypto_unittest_params *ut_params = &unittest_params;
5259 
5260 	int retval;
5261 
5262 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5263 	unsigned int plaintext_pad_len;
5264 	unsigned int plaintext_len;
5265 	unsigned int ciphertext_pad_len;
5266 	unsigned int ciphertext_len;
5267 
5268 	struct rte_cryptodev_info dev_info;
5269 
5270 	/* Verify the capabilities */
5271 	struct rte_cryptodev_sym_capability_idx cap_idx;
5272 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5273 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5274 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5275 			&cap_idx) == NULL)
5276 		return TEST_SKIPPED;
5277 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5278 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5279 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5280 			&cap_idx) == NULL)
5281 		return TEST_SKIPPED;
5282 
5283 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5284 
5285 	uint64_t feat_flags = dev_info.feature_flags;
5286 
5287 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5288 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5289 		printf("Device doesn't support RAW data-path APIs.\n");
5290 		return TEST_SKIPPED;
5291 	}
5292 
5293 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5294 		return TEST_SKIPPED;
5295 
5296 	if (op_mode == OUT_OF_PLACE) {
5297 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5298 			return TEST_SKIPPED;
5299 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5300 			printf("Device doesn't support digest encrypted.\n");
5301 			return TEST_SKIPPED;
5302 		}
5303 	}
5304 
5305 	/* Create KASUMI session */
5306 	retval = create_wireless_algo_auth_cipher_session(
5307 			ts_params->valid_devs[0],
5308 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5309 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5310 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5311 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5312 			RTE_CRYPTO_AUTH_KASUMI_F9,
5313 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5314 			tdata->key.data, tdata->key.len,
5315 			0, tdata->digest.len,
5316 			tdata->cipher_iv.len);
5317 
5318 	if (retval != 0)
5319 		return retval;
5320 
5321 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5322 	if (op_mode == OUT_OF_PLACE)
5323 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5324 
5325 	/* clear mbuf payload */
5326 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5327 		rte_pktmbuf_tailroom(ut_params->ibuf));
5328 	if (op_mode == OUT_OF_PLACE)
5329 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5330 			rte_pktmbuf_tailroom(ut_params->obuf));
5331 
5332 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5333 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5334 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5335 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5336 
5337 	if (verify) {
5338 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5339 					ciphertext_pad_len);
5340 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5341 		if (op_mode == OUT_OF_PLACE)
5342 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5343 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5344 			ciphertext_len);
5345 	} else {
5346 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5347 					plaintext_pad_len);
5348 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5349 		if (op_mode == OUT_OF_PLACE)
5350 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5351 		debug_hexdump(stdout, "plaintext:", plaintext,
5352 			plaintext_len);
5353 	}
5354 
5355 	/* Create KASUMI operation */
5356 	retval = create_wireless_algo_auth_cipher_operation(
5357 		tdata->digest.data, tdata->digest.len,
5358 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5359 		NULL, 0,
5360 		(tdata->digest.offset_bytes == 0 ?
5361 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5362 			: tdata->digest.offset_bytes),
5363 		tdata->validCipherLenInBits.len,
5364 		tdata->validCipherOffsetInBits.len,
5365 		tdata->validAuthLenInBits.len,
5366 		0,
5367 		op_mode, 0, verify);
5368 
5369 	if (retval < 0)
5370 		return retval;
5371 
5372 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5373 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5374 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5375 	else
5376 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5377 			ut_params->op);
5378 
5379 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5380 
5381 	ut_params->obuf = (op_mode == IN_PLACE ?
5382 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5383 
5384 
5385 	if (verify) {
5386 		if (ut_params->obuf)
5387 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5388 							uint8_t *);
5389 		else
5390 			plaintext = ciphertext;
5391 
5392 		debug_hexdump(stdout, "plaintext:", plaintext,
5393 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5394 		debug_hexdump(stdout, "plaintext expected:",
5395 			tdata->plaintext.data,
5396 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5397 	} else {
5398 		if (ut_params->obuf)
5399 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5400 							uint8_t *);
5401 		else
5402 			ciphertext = plaintext;
5403 
5404 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5405 			ciphertext_len);
5406 		debug_hexdump(stdout, "ciphertext expected:",
5407 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5408 
5409 		ut_params->digest = rte_pktmbuf_mtod(
5410 			ut_params->obuf, uint8_t *) +
5411 			(tdata->digest.offset_bytes == 0 ?
5412 			plaintext_pad_len : tdata->digest.offset_bytes);
5413 
5414 		debug_hexdump(stdout, "digest:", ut_params->digest,
5415 			tdata->digest.len);
5416 		debug_hexdump(stdout, "digest expected:",
5417 			tdata->digest.data, tdata->digest.len);
5418 	}
5419 
5420 	/* Validate obuf */
5421 	if (verify) {
5422 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5423 			plaintext,
5424 			tdata->plaintext.data,
5425 			tdata->plaintext.len >> 3,
5426 			"KASUMI Plaintext data not as expected");
5427 	} else {
5428 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5429 			ciphertext,
5430 			tdata->ciphertext.data,
5431 			tdata->ciphertext.len >> 3,
5432 			"KASUMI Ciphertext data not as expected");
5433 
5434 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5435 			ut_params->digest,
5436 			tdata->digest.data,
5437 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5438 			"KASUMI Generated auth tag not as expected");
5439 	}
5440 	return 0;
5441 }
5442 
5443 static int
5444 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5445 	uint8_t op_mode, uint8_t verify)
5446 {
5447 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5448 	struct crypto_unittest_params *ut_params = &unittest_params;
5449 
5450 	int retval;
5451 
5452 	const uint8_t *plaintext = NULL;
5453 	const uint8_t *ciphertext = NULL;
5454 	const uint8_t *digest = NULL;
5455 	unsigned int plaintext_pad_len;
5456 	unsigned int plaintext_len;
5457 	unsigned int ciphertext_pad_len;
5458 	unsigned int ciphertext_len;
5459 	uint8_t buffer[10000];
5460 	uint8_t digest_buffer[10000];
5461 
5462 	struct rte_cryptodev_info dev_info;
5463 
5464 	/* Verify the capabilities */
5465 	struct rte_cryptodev_sym_capability_idx cap_idx;
5466 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5467 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5468 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5469 			&cap_idx) == NULL)
5470 		return TEST_SKIPPED;
5471 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5472 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5473 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5474 			&cap_idx) == NULL)
5475 		return TEST_SKIPPED;
5476 
5477 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5478 		return TEST_SKIPPED;
5479 
5480 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5481 
5482 	uint64_t feat_flags = dev_info.feature_flags;
5483 
5484 	if (op_mode == IN_PLACE) {
5485 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5486 			printf("Device doesn't support in-place scatter-gather "
5487 					"in both input and output mbufs.\n");
5488 			return TEST_SKIPPED;
5489 		}
5490 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5491 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5492 			printf("Device doesn't support RAW data-path APIs.\n");
5493 			return TEST_SKIPPED;
5494 		}
5495 	} else {
5496 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5497 			return TEST_SKIPPED;
5498 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5499 			printf("Device doesn't support out-of-place scatter-gather "
5500 					"in both input and output mbufs.\n");
5501 			return TEST_SKIPPED;
5502 		}
5503 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5504 			printf("Device doesn't support digest encrypted.\n");
5505 			return TEST_SKIPPED;
5506 		}
5507 	}
5508 
5509 	/* Create KASUMI session */
5510 	retval = create_wireless_algo_auth_cipher_session(
5511 			ts_params->valid_devs[0],
5512 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5513 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5514 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5515 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5516 			RTE_CRYPTO_AUTH_KASUMI_F9,
5517 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5518 			tdata->key.data, tdata->key.len,
5519 			0, tdata->digest.len,
5520 			tdata->cipher_iv.len);
5521 
5522 	if (retval != 0)
5523 		return retval;
5524 
5525 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5526 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5527 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5528 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5529 
5530 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5531 			plaintext_pad_len, 15, 0);
5532 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5533 			"Failed to allocate input buffer in mempool");
5534 
5535 	if (op_mode == OUT_OF_PLACE) {
5536 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5537 				plaintext_pad_len, 15, 0);
5538 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5539 				"Failed to allocate output buffer in mempool");
5540 	}
5541 
5542 	if (verify) {
5543 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5544 			tdata->ciphertext.data);
5545 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5546 					ciphertext_len, buffer);
5547 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5548 			ciphertext_len);
5549 	} else {
5550 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5551 			tdata->plaintext.data);
5552 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5553 					plaintext_len, buffer);
5554 		debug_hexdump(stdout, "plaintext:", plaintext,
5555 			plaintext_len);
5556 	}
5557 	memset(buffer, 0, sizeof(buffer));
5558 
5559 	/* Create KASUMI operation */
5560 	retval = create_wireless_algo_auth_cipher_operation(
5561 		tdata->digest.data, tdata->digest.len,
5562 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5563 		NULL, 0,
5564 		(tdata->digest.offset_bytes == 0 ?
5565 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5566 			: tdata->digest.offset_bytes),
5567 		tdata->validCipherLenInBits.len,
5568 		tdata->validCipherOffsetInBits.len,
5569 		tdata->validAuthLenInBits.len,
5570 		0,
5571 		op_mode, 1, verify);
5572 
5573 	if (retval < 0)
5574 		return retval;
5575 
5576 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5577 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5578 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5579 	else
5580 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5581 			ut_params->op);
5582 
5583 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5584 
5585 	ut_params->obuf = (op_mode == IN_PLACE ?
5586 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5587 
5588 	if (verify) {
5589 		if (ut_params->obuf)
5590 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5591 					plaintext_len, buffer);
5592 		else
5593 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5594 					plaintext_len, buffer);
5595 
5596 		debug_hexdump(stdout, "plaintext:", plaintext,
5597 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5598 		debug_hexdump(stdout, "plaintext expected:",
5599 			tdata->plaintext.data,
5600 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5601 	} else {
5602 		if (ut_params->obuf)
5603 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5604 					ciphertext_len, buffer);
5605 		else
5606 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5607 					ciphertext_len, buffer);
5608 
5609 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5610 			ciphertext_len);
5611 		debug_hexdump(stdout, "ciphertext expected:",
5612 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5613 
5614 		if (ut_params->obuf)
5615 			digest = rte_pktmbuf_read(ut_params->obuf,
5616 				(tdata->digest.offset_bytes == 0 ?
5617 				plaintext_pad_len : tdata->digest.offset_bytes),
5618 				tdata->digest.len, digest_buffer);
5619 		else
5620 			digest = rte_pktmbuf_read(ut_params->ibuf,
5621 				(tdata->digest.offset_bytes == 0 ?
5622 				plaintext_pad_len : tdata->digest.offset_bytes),
5623 				tdata->digest.len, digest_buffer);
5624 
5625 		debug_hexdump(stdout, "digest:", digest,
5626 			tdata->digest.len);
5627 		debug_hexdump(stdout, "digest expected:",
5628 			tdata->digest.data, tdata->digest.len);
5629 	}
5630 
5631 	/* Validate obuf */
5632 	if (verify) {
5633 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5634 			plaintext,
5635 			tdata->plaintext.data,
5636 			tdata->plaintext.len >> 3,
5637 			"KASUMI Plaintext data not as expected");
5638 	} else {
5639 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5640 			ciphertext,
5641 			tdata->ciphertext.data,
5642 			tdata->validDataLenInBits.len,
5643 			"KASUMI Ciphertext data not as expected");
5644 
5645 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5646 			digest,
5647 			tdata->digest.data,
5648 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5649 			"KASUMI Generated auth tag not as expected");
5650 	}
5651 	return 0;
5652 }
5653 
5654 static int
5655 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5656 {
5657 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5658 	struct crypto_unittest_params *ut_params = &unittest_params;
5659 
5660 	int retval;
5661 
5662 	uint8_t *plaintext, *ciphertext;
5663 	unsigned plaintext_pad_len;
5664 	unsigned plaintext_len;
5665 	struct rte_cryptodev_info dev_info;
5666 
5667 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5668 	uint64_t feat_flags = dev_info.feature_flags;
5669 
5670 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5671 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5672 		printf("Device doesn't support RAW data-path APIs.\n");
5673 		return TEST_SKIPPED;
5674 	}
5675 
5676 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5677 		return TEST_SKIPPED;
5678 
5679 	/* Verify the capabilities */
5680 	struct rte_cryptodev_sym_capability_idx cap_idx;
5681 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5682 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5683 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5684 			&cap_idx) == NULL)
5685 		return TEST_SKIPPED;
5686 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5687 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5688 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5689 			&cap_idx) == NULL)
5690 		return TEST_SKIPPED;
5691 
5692 	/* Create KASUMI session */
5693 	retval = create_wireless_algo_cipher_auth_session(
5694 			ts_params->valid_devs[0],
5695 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5696 			RTE_CRYPTO_AUTH_OP_GENERATE,
5697 			RTE_CRYPTO_AUTH_KASUMI_F9,
5698 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5699 			tdata->key.data, tdata->key.len,
5700 			0, tdata->digest.len,
5701 			tdata->cipher_iv.len);
5702 	if (retval != 0)
5703 		return retval;
5704 
5705 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5706 
5707 	/* clear mbuf payload */
5708 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5709 			rte_pktmbuf_tailroom(ut_params->ibuf));
5710 
5711 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5712 	/* Append data which is padded to a multiple of */
5713 	/* the algorithms block size */
5714 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5715 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5716 				plaintext_pad_len);
5717 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5718 
5719 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5720 
5721 	/* Create KASUMI operation */
5722 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5723 				tdata->digest.len, NULL, 0,
5724 				plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5725 				tdata->cipher_iv.data, tdata->cipher_iv.len,
5726 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5727 				tdata->validCipherOffsetInBits.len,
5728 				tdata->validAuthLenInBits.len,
5729 				0
5730 				);
5731 	if (retval < 0)
5732 		return retval;
5733 
5734 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5735 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5736 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5737 	else
5738 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5739 			ut_params->op);
5740 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5741 
5742 	if (ut_params->op->sym->m_dst)
5743 		ut_params->obuf = ut_params->op->sym->m_dst;
5744 	else
5745 		ut_params->obuf = ut_params->op->sym->m_src;
5746 
5747 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5748 				tdata->validCipherOffsetInBits.len >> 3);
5749 
5750 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5751 			+ plaintext_pad_len;
5752 
5753 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5754 				(tdata->validCipherOffsetInBits.len >> 3);
5755 	/* Validate obuf */
5756 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5757 		ciphertext,
5758 		reference_ciphertext,
5759 		tdata->validCipherLenInBits.len,
5760 		"KASUMI Ciphertext data not as expected");
5761 
5762 	/* Validate obuf */
5763 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5764 		ut_params->digest,
5765 		tdata->digest.data,
5766 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5767 		"KASUMI Generated auth tag not as expected");
5768 	return 0;
5769 }
5770 
5771 static int
5772 test_zuc_encryption(const struct wireless_test_data *tdata)
5773 {
5774 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5775 	struct crypto_unittest_params *ut_params = &unittest_params;
5776 
5777 	int retval;
5778 	uint8_t *plaintext, *ciphertext;
5779 	unsigned plaintext_pad_len;
5780 	unsigned plaintext_len;
5781 	struct rte_cryptodev_info dev_info;
5782 
5783 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5784 	uint64_t feat_flags = dev_info.feature_flags;
5785 
5786 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5787 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5788 		printf("Device doesn't support RAW data-path APIs.\n");
5789 		return TEST_SKIPPED;
5790 	}
5791 
5792 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5793 		return TEST_SKIPPED;
5794 
5795 	struct rte_cryptodev_sym_capability_idx cap_idx;
5796 
5797 	/* Check if device supports ZUC EEA3 */
5798 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5799 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5800 
5801 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5802 			&cap_idx) == NULL)
5803 		return TEST_SKIPPED;
5804 
5805 	/* Create ZUC session */
5806 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5807 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5808 					RTE_CRYPTO_CIPHER_ZUC_EEA3,
5809 					tdata->key.data, tdata->key.len,
5810 					tdata->cipher_iv.len);
5811 	if (retval < 0)
5812 		return retval;
5813 
5814 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5815 
5816 	/* Clear mbuf payload */
5817 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5818 	       rte_pktmbuf_tailroom(ut_params->ibuf));
5819 
5820 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5821 	/* Append data which is padded to a multiple */
5822 	/* of the algorithms block size */
5823 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5824 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5825 				plaintext_pad_len);
5826 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5827 
5828 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5829 
5830 	/* Create ZUC operation */
5831 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5832 					tdata->cipher_iv.len,
5833 					tdata->plaintext.len,
5834 					0);
5835 	if (retval < 0)
5836 		return retval;
5837 
5838 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5839 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5840 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5841 	else
5842 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5843 						ut_params->op);
5844 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5845 
5846 	ut_params->obuf = ut_params->op->sym->m_dst;
5847 	if (ut_params->obuf)
5848 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
5849 	else
5850 		ciphertext = plaintext;
5851 
5852 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5853 
5854 	/* Validate obuf */
5855 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5856 		ciphertext,
5857 		tdata->ciphertext.data,
5858 		tdata->validCipherLenInBits.len,
5859 		"ZUC Ciphertext data not as expected");
5860 	return 0;
5861 }
5862 
5863 static int
5864 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
5865 {
5866 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5867 	struct crypto_unittest_params *ut_params = &unittest_params;
5868 
5869 	int retval;
5870 
5871 	unsigned int plaintext_pad_len;
5872 	unsigned int plaintext_len;
5873 	const uint8_t *ciphertext;
5874 	uint8_t ciphertext_buffer[2048];
5875 	struct rte_cryptodev_info dev_info;
5876 
5877 	struct rte_cryptodev_sym_capability_idx cap_idx;
5878 
5879 	/* Check if device supports ZUC EEA3 */
5880 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5881 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5882 
5883 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5884 			&cap_idx) == NULL)
5885 		return TEST_SKIPPED;
5886 
5887 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5888 		return TEST_SKIPPED;
5889 
5890 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5891 
5892 	uint64_t feat_flags = dev_info.feature_flags;
5893 
5894 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5895 		printf("Device doesn't support in-place scatter-gather. "
5896 				"Test Skipped.\n");
5897 		return TEST_SKIPPED;
5898 	}
5899 
5900 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5901 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5902 		printf("Device doesn't support RAW data-path APIs.\n");
5903 		return TEST_SKIPPED;
5904 	}
5905 
5906 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5907 
5908 	/* Append data which is padded to a multiple */
5909 	/* of the algorithms block size */
5910 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5911 
5912 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5913 			plaintext_pad_len, 10, 0);
5914 
5915 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5916 			tdata->plaintext.data);
5917 
5918 	/* Create ZUC session */
5919 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5920 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5921 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
5922 			tdata->key.data, tdata->key.len,
5923 			tdata->cipher_iv.len);
5924 	if (retval < 0)
5925 		return retval;
5926 
5927 	/* Clear mbuf payload */
5928 
5929 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
5930 
5931 	/* Create ZUC operation */
5932 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5933 			tdata->cipher_iv.len, tdata->plaintext.len,
5934 			0);
5935 	if (retval < 0)
5936 		return retval;
5937 
5938 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5939 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5940 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5941 	else
5942 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5943 						ut_params->op);
5944 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5945 
5946 	ut_params->obuf = ut_params->op->sym->m_dst;
5947 	if (ut_params->obuf)
5948 		ciphertext = rte_pktmbuf_read(ut_params->obuf,
5949 			0, plaintext_len, ciphertext_buffer);
5950 	else
5951 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
5952 			0, plaintext_len, ciphertext_buffer);
5953 
5954 	/* Validate obuf */
5955 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5956 
5957 	/* Validate obuf */
5958 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5959 		ciphertext,
5960 		tdata->ciphertext.data,
5961 		tdata->validCipherLenInBits.len,
5962 		"ZUC Ciphertext data not as expected");
5963 
5964 	return 0;
5965 }
5966 
5967 static int
5968 test_zuc_authentication(const struct wireless_test_data *tdata)
5969 {
5970 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5971 	struct crypto_unittest_params *ut_params = &unittest_params;
5972 
5973 	int retval;
5974 	unsigned plaintext_pad_len;
5975 	unsigned plaintext_len;
5976 	uint8_t *plaintext;
5977 
5978 	struct rte_cryptodev_sym_capability_idx cap_idx;
5979 	struct rte_cryptodev_info dev_info;
5980 
5981 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5982 	uint64_t feat_flags = dev_info.feature_flags;
5983 
5984 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
5985 			(tdata->validAuthLenInBits.len % 8 != 0)) {
5986 		printf("Device doesn't support NON-Byte Aligned Data.\n");
5987 		return TEST_SKIPPED;
5988 	}
5989 
5990 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5991 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5992 		printf("Device doesn't support RAW data-path APIs.\n");
5993 		return TEST_SKIPPED;
5994 	}
5995 
5996 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5997 		return TEST_SKIPPED;
5998 
5999 	/* Check if device supports ZUC EIA3 */
6000 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6001 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6002 
6003 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6004 			&cap_idx) == NULL)
6005 		return TEST_SKIPPED;
6006 
6007 	/* Create ZUC session */
6008 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6009 			tdata->key.data, tdata->key.len,
6010 			tdata->auth_iv.len, tdata->digest.len,
6011 			RTE_CRYPTO_AUTH_OP_GENERATE,
6012 			RTE_CRYPTO_AUTH_ZUC_EIA3);
6013 	if (retval < 0)
6014 		return retval;
6015 
6016 	/* alloc mbuf and set payload */
6017 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6018 
6019 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6020 	rte_pktmbuf_tailroom(ut_params->ibuf));
6021 
6022 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6023 	/* Append data which is padded to a multiple of */
6024 	/* the algorithms block size */
6025 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6026 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6027 				plaintext_pad_len);
6028 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6029 
6030 	/* Create ZUC operation */
6031 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6032 			tdata->auth_iv.data, tdata->auth_iv.len,
6033 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6034 			tdata->validAuthLenInBits.len,
6035 			0);
6036 	if (retval < 0)
6037 		return retval;
6038 
6039 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6040 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6041 				ut_params->op, 0, 1, 1, 0);
6042 	else
6043 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6044 				ut_params->op);
6045 	ut_params->obuf = ut_params->op->sym->m_src;
6046 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6047 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6048 			+ plaintext_pad_len;
6049 
6050 	/* Validate obuf */
6051 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
6052 	ut_params->digest,
6053 	tdata->digest.data,
6054 	tdata->digest.len,
6055 	"ZUC Generated auth tag not as expected");
6056 
6057 	return 0;
6058 }
6059 
6060 static int
6061 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6062 	uint8_t op_mode, uint8_t verify)
6063 {
6064 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6065 	struct crypto_unittest_params *ut_params = &unittest_params;
6066 
6067 	int retval;
6068 
6069 	uint8_t *plaintext = NULL, *ciphertext = NULL;
6070 	unsigned int plaintext_pad_len;
6071 	unsigned int plaintext_len;
6072 	unsigned int ciphertext_pad_len;
6073 	unsigned int ciphertext_len;
6074 
6075 	struct rte_cryptodev_info dev_info;
6076 	struct rte_cryptodev_sym_capability_idx cap_idx;
6077 
6078 	/* Check if device supports ZUC EIA3 */
6079 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6080 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6081 
6082 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6083 			&cap_idx) == NULL)
6084 		return TEST_SKIPPED;
6085 
6086 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6087 
6088 	uint64_t feat_flags = dev_info.feature_flags;
6089 
6090 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6091 		printf("Device doesn't support digest encrypted.\n");
6092 		return TEST_SKIPPED;
6093 	}
6094 	if (op_mode == IN_PLACE) {
6095 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6096 			printf("Device doesn't support in-place scatter-gather "
6097 					"in both input and output mbufs.\n");
6098 			return TEST_SKIPPED;
6099 		}
6100 
6101 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6102 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6103 			printf("Device doesn't support RAW data-path APIs.\n");
6104 			return TEST_SKIPPED;
6105 		}
6106 	} else {
6107 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6108 			return TEST_SKIPPED;
6109 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6110 			printf("Device doesn't support out-of-place scatter-gather "
6111 					"in both input and output mbufs.\n");
6112 			return TEST_SKIPPED;
6113 		}
6114 	}
6115 
6116 	/* Create ZUC session */
6117 	retval = create_wireless_algo_auth_cipher_session(
6118 			ts_params->valid_devs[0],
6119 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6120 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6121 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6122 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6123 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6124 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6125 			tdata->key.data, tdata->key.len,
6126 			tdata->auth_iv.len, tdata->digest.len,
6127 			tdata->cipher_iv.len);
6128 
6129 	if (retval != 0)
6130 		return retval;
6131 
6132 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6133 	if (op_mode == OUT_OF_PLACE)
6134 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6135 
6136 	/* clear mbuf payload */
6137 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6138 		rte_pktmbuf_tailroom(ut_params->ibuf));
6139 	if (op_mode == OUT_OF_PLACE)
6140 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6141 			rte_pktmbuf_tailroom(ut_params->obuf));
6142 
6143 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6144 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6145 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6146 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6147 
6148 	if (verify) {
6149 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6150 					ciphertext_pad_len);
6151 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6152 		if (op_mode == OUT_OF_PLACE)
6153 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6154 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6155 			ciphertext_len);
6156 	} else {
6157 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6158 					plaintext_pad_len);
6159 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6160 		if (op_mode == OUT_OF_PLACE)
6161 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6162 		debug_hexdump(stdout, "plaintext:", plaintext,
6163 			plaintext_len);
6164 	}
6165 
6166 	/* Create ZUC operation */
6167 	retval = create_wireless_algo_auth_cipher_operation(
6168 		tdata->digest.data, tdata->digest.len,
6169 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6170 		tdata->auth_iv.data, tdata->auth_iv.len,
6171 		(tdata->digest.offset_bytes == 0 ?
6172 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6173 			: tdata->digest.offset_bytes),
6174 		tdata->validCipherLenInBits.len,
6175 		tdata->validCipherOffsetInBits.len,
6176 		tdata->validAuthLenInBits.len,
6177 		0,
6178 		op_mode, 0, verify);
6179 
6180 	if (retval < 0)
6181 		return retval;
6182 
6183 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6184 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6185 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6186 	else
6187 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6188 			ut_params->op);
6189 
6190 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6191 
6192 	ut_params->obuf = (op_mode == IN_PLACE ?
6193 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6194 
6195 
6196 	if (verify) {
6197 		if (ut_params->obuf)
6198 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6199 							uint8_t *);
6200 		else
6201 			plaintext = ciphertext;
6202 
6203 		debug_hexdump(stdout, "plaintext:", plaintext,
6204 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6205 		debug_hexdump(stdout, "plaintext expected:",
6206 			tdata->plaintext.data,
6207 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6208 	} else {
6209 		if (ut_params->obuf)
6210 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6211 							uint8_t *);
6212 		else
6213 			ciphertext = plaintext;
6214 
6215 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6216 			ciphertext_len);
6217 		debug_hexdump(stdout, "ciphertext expected:",
6218 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6219 
6220 		ut_params->digest = rte_pktmbuf_mtod(
6221 			ut_params->obuf, uint8_t *) +
6222 			(tdata->digest.offset_bytes == 0 ?
6223 			plaintext_pad_len : tdata->digest.offset_bytes);
6224 
6225 		debug_hexdump(stdout, "digest:", ut_params->digest,
6226 			tdata->digest.len);
6227 		debug_hexdump(stdout, "digest expected:",
6228 			tdata->digest.data, tdata->digest.len);
6229 	}
6230 
6231 	/* Validate obuf */
6232 	if (verify) {
6233 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6234 			plaintext,
6235 			tdata->plaintext.data,
6236 			tdata->plaintext.len >> 3,
6237 			"ZUC Plaintext data not as expected");
6238 	} else {
6239 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6240 			ciphertext,
6241 			tdata->ciphertext.data,
6242 			tdata->ciphertext.len >> 3,
6243 			"ZUC Ciphertext data not as expected");
6244 
6245 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6246 			ut_params->digest,
6247 			tdata->digest.data,
6248 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6249 			"ZUC Generated auth tag not as expected");
6250 	}
6251 	return 0;
6252 }
6253 
6254 static int
6255 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6256 	uint8_t op_mode, uint8_t verify)
6257 {
6258 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6259 	struct crypto_unittest_params *ut_params = &unittest_params;
6260 
6261 	int retval;
6262 
6263 	const uint8_t *plaintext = NULL;
6264 	const uint8_t *ciphertext = NULL;
6265 	const uint8_t *digest = NULL;
6266 	unsigned int plaintext_pad_len;
6267 	unsigned int plaintext_len;
6268 	unsigned int ciphertext_pad_len;
6269 	unsigned int ciphertext_len;
6270 	uint8_t buffer[10000];
6271 	uint8_t digest_buffer[10000];
6272 
6273 	struct rte_cryptodev_info dev_info;
6274 	struct rte_cryptodev_sym_capability_idx cap_idx;
6275 
6276 	/* Check if device supports ZUC EIA3 */
6277 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6278 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6279 
6280 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6281 			&cap_idx) == NULL)
6282 		return TEST_SKIPPED;
6283 
6284 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6285 
6286 	uint64_t feat_flags = dev_info.feature_flags;
6287 
6288 	if (op_mode == IN_PLACE) {
6289 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6290 			printf("Device doesn't support in-place scatter-gather "
6291 					"in both input and output mbufs.\n");
6292 			return TEST_SKIPPED;
6293 		}
6294 
6295 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6296 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6297 			printf("Device doesn't support RAW data-path APIs.\n");
6298 			return TEST_SKIPPED;
6299 		}
6300 	} else {
6301 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6302 			return TEST_SKIPPED;
6303 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6304 			printf("Device doesn't support out-of-place scatter-gather "
6305 					"in both input and output mbufs.\n");
6306 			return TEST_SKIPPED;
6307 		}
6308 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6309 			printf("Device doesn't support digest encrypted.\n");
6310 			return TEST_SKIPPED;
6311 		}
6312 	}
6313 
6314 	/* Create ZUC session */
6315 	retval = create_wireless_algo_auth_cipher_session(
6316 			ts_params->valid_devs[0],
6317 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6318 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6319 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6320 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6321 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6322 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6323 			tdata->key.data, tdata->key.len,
6324 			tdata->auth_iv.len, tdata->digest.len,
6325 			tdata->cipher_iv.len);
6326 
6327 	if (retval != 0)
6328 		return retval;
6329 
6330 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6331 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6332 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6333 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6334 
6335 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6336 			plaintext_pad_len, 15, 0);
6337 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6338 			"Failed to allocate input buffer in mempool");
6339 
6340 	if (op_mode == OUT_OF_PLACE) {
6341 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6342 				plaintext_pad_len, 15, 0);
6343 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
6344 				"Failed to allocate output buffer in mempool");
6345 	}
6346 
6347 	if (verify) {
6348 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6349 			tdata->ciphertext.data);
6350 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6351 					ciphertext_len, buffer);
6352 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6353 			ciphertext_len);
6354 	} else {
6355 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6356 			tdata->plaintext.data);
6357 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6358 					plaintext_len, buffer);
6359 		debug_hexdump(stdout, "plaintext:", plaintext,
6360 			plaintext_len);
6361 	}
6362 	memset(buffer, 0, sizeof(buffer));
6363 
6364 	/* Create ZUC operation */
6365 	retval = create_wireless_algo_auth_cipher_operation(
6366 		tdata->digest.data, tdata->digest.len,
6367 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6368 		NULL, 0,
6369 		(tdata->digest.offset_bytes == 0 ?
6370 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6371 			: tdata->digest.offset_bytes),
6372 		tdata->validCipherLenInBits.len,
6373 		tdata->validCipherOffsetInBits.len,
6374 		tdata->validAuthLenInBits.len,
6375 		0,
6376 		op_mode, 1, verify);
6377 
6378 	if (retval < 0)
6379 		return retval;
6380 
6381 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6382 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6383 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6384 	else
6385 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6386 			ut_params->op);
6387 
6388 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6389 
6390 	ut_params->obuf = (op_mode == IN_PLACE ?
6391 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6392 
6393 	if (verify) {
6394 		if (ut_params->obuf)
6395 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6396 					plaintext_len, buffer);
6397 		else
6398 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6399 					plaintext_len, buffer);
6400 
6401 		debug_hexdump(stdout, "plaintext:", plaintext,
6402 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6403 		debug_hexdump(stdout, "plaintext expected:",
6404 			tdata->plaintext.data,
6405 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6406 	} else {
6407 		if (ut_params->obuf)
6408 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6409 					ciphertext_len, buffer);
6410 		else
6411 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6412 					ciphertext_len, buffer);
6413 
6414 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6415 			ciphertext_len);
6416 		debug_hexdump(stdout, "ciphertext expected:",
6417 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6418 
6419 		if (ut_params->obuf)
6420 			digest = rte_pktmbuf_read(ut_params->obuf,
6421 				(tdata->digest.offset_bytes == 0 ?
6422 				plaintext_pad_len : tdata->digest.offset_bytes),
6423 				tdata->digest.len, digest_buffer);
6424 		else
6425 			digest = rte_pktmbuf_read(ut_params->ibuf,
6426 				(tdata->digest.offset_bytes == 0 ?
6427 				plaintext_pad_len : tdata->digest.offset_bytes),
6428 				tdata->digest.len, digest_buffer);
6429 
6430 		debug_hexdump(stdout, "digest:", digest,
6431 			tdata->digest.len);
6432 		debug_hexdump(stdout, "digest expected:",
6433 			tdata->digest.data, tdata->digest.len);
6434 	}
6435 
6436 	/* Validate obuf */
6437 	if (verify) {
6438 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6439 			plaintext,
6440 			tdata->plaintext.data,
6441 			tdata->plaintext.len >> 3,
6442 			"ZUC Plaintext data not as expected");
6443 	} else {
6444 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6445 			ciphertext,
6446 			tdata->ciphertext.data,
6447 			tdata->validDataLenInBits.len,
6448 			"ZUC Ciphertext data not as expected");
6449 
6450 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6451 			digest,
6452 			tdata->digest.data,
6453 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6454 			"ZUC Generated auth tag not as expected");
6455 	}
6456 	return 0;
6457 }
6458 
6459 static int
6460 test_kasumi_encryption_test_case_1(void)
6461 {
6462 	return test_kasumi_encryption(&kasumi_test_case_1);
6463 }
6464 
6465 static int
6466 test_kasumi_encryption_test_case_1_sgl(void)
6467 {
6468 	return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6469 }
6470 
6471 static int
6472 test_kasumi_encryption_test_case_1_oop(void)
6473 {
6474 	return test_kasumi_encryption_oop(&kasumi_test_case_1);
6475 }
6476 
6477 static int
6478 test_kasumi_encryption_test_case_1_oop_sgl(void)
6479 {
6480 	return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6481 }
6482 
6483 static int
6484 test_kasumi_encryption_test_case_2(void)
6485 {
6486 	return test_kasumi_encryption(&kasumi_test_case_2);
6487 }
6488 
6489 static int
6490 test_kasumi_encryption_test_case_3(void)
6491 {
6492 	return test_kasumi_encryption(&kasumi_test_case_3);
6493 }
6494 
6495 static int
6496 test_kasumi_encryption_test_case_4(void)
6497 {
6498 	return test_kasumi_encryption(&kasumi_test_case_4);
6499 }
6500 
6501 static int
6502 test_kasumi_encryption_test_case_5(void)
6503 {
6504 	return test_kasumi_encryption(&kasumi_test_case_5);
6505 }
6506 
6507 static int
6508 test_kasumi_decryption_test_case_1(void)
6509 {
6510 	return test_kasumi_decryption(&kasumi_test_case_1);
6511 }
6512 
6513 static int
6514 test_kasumi_decryption_test_case_1_oop(void)
6515 {
6516 	return test_kasumi_decryption_oop(&kasumi_test_case_1);
6517 }
6518 
6519 static int
6520 test_kasumi_decryption_test_case_2(void)
6521 {
6522 	return test_kasumi_decryption(&kasumi_test_case_2);
6523 }
6524 
6525 static int
6526 test_kasumi_decryption_test_case_3(void)
6527 {
6528 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6529 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6530 		return TEST_SKIPPED;
6531 	return test_kasumi_decryption(&kasumi_test_case_3);
6532 }
6533 
6534 static int
6535 test_kasumi_decryption_test_case_4(void)
6536 {
6537 	return test_kasumi_decryption(&kasumi_test_case_4);
6538 }
6539 
6540 static int
6541 test_kasumi_decryption_test_case_5(void)
6542 {
6543 	return test_kasumi_decryption(&kasumi_test_case_5);
6544 }
6545 static int
6546 test_snow3g_encryption_test_case_1(void)
6547 {
6548 	return test_snow3g_encryption(&snow3g_test_case_1);
6549 }
6550 
6551 static int
6552 test_snow3g_encryption_test_case_1_oop(void)
6553 {
6554 	return test_snow3g_encryption_oop(&snow3g_test_case_1);
6555 }
6556 
6557 static int
6558 test_snow3g_encryption_test_case_1_oop_sgl(void)
6559 {
6560 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6561 }
6562 
6563 
6564 static int
6565 test_snow3g_encryption_test_case_1_offset_oop(void)
6566 {
6567 	return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6568 }
6569 
6570 static int
6571 test_snow3g_encryption_test_case_2(void)
6572 {
6573 	return test_snow3g_encryption(&snow3g_test_case_2);
6574 }
6575 
6576 static int
6577 test_snow3g_encryption_test_case_3(void)
6578 {
6579 	return test_snow3g_encryption(&snow3g_test_case_3);
6580 }
6581 
6582 static int
6583 test_snow3g_encryption_test_case_4(void)
6584 {
6585 	return test_snow3g_encryption(&snow3g_test_case_4);
6586 }
6587 
6588 static int
6589 test_snow3g_encryption_test_case_5(void)
6590 {
6591 	return test_snow3g_encryption(&snow3g_test_case_5);
6592 }
6593 
6594 static int
6595 test_snow3g_decryption_test_case_1(void)
6596 {
6597 	return test_snow3g_decryption(&snow3g_test_case_1);
6598 }
6599 
6600 static int
6601 test_snow3g_decryption_test_case_1_oop(void)
6602 {
6603 	return test_snow3g_decryption_oop(&snow3g_test_case_1);
6604 }
6605 
6606 static int
6607 test_snow3g_decryption_test_case_2(void)
6608 {
6609 	return test_snow3g_decryption(&snow3g_test_case_2);
6610 }
6611 
6612 static int
6613 test_snow3g_decryption_test_case_3(void)
6614 {
6615 	return test_snow3g_decryption(&snow3g_test_case_3);
6616 }
6617 
6618 static int
6619 test_snow3g_decryption_test_case_4(void)
6620 {
6621 	return test_snow3g_decryption(&snow3g_test_case_4);
6622 }
6623 
6624 static int
6625 test_snow3g_decryption_test_case_5(void)
6626 {
6627 	return test_snow3g_decryption(&snow3g_test_case_5);
6628 }
6629 
6630 /*
6631  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6632  * Pattern digest from snow3g_test_data must be allocated as
6633  * 4 last bytes in plaintext.
6634  */
6635 static void
6636 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6637 		struct snow3g_hash_test_data *output)
6638 {
6639 	if ((pattern != NULL) && (output != NULL)) {
6640 		output->key.len = pattern->key.len;
6641 
6642 		memcpy(output->key.data,
6643 		pattern->key.data, pattern->key.len);
6644 
6645 		output->auth_iv.len = pattern->auth_iv.len;
6646 
6647 		memcpy(output->auth_iv.data,
6648 		pattern->auth_iv.data, pattern->auth_iv.len);
6649 
6650 		output->plaintext.len = pattern->plaintext.len;
6651 
6652 		memcpy(output->plaintext.data,
6653 		pattern->plaintext.data, pattern->plaintext.len >> 3);
6654 
6655 		output->digest.len = pattern->digest.len;
6656 
6657 		memcpy(output->digest.data,
6658 		&pattern->plaintext.data[pattern->digest.offset_bytes],
6659 		pattern->digest.len);
6660 
6661 		output->validAuthLenInBits.len =
6662 		pattern->validAuthLenInBits.len;
6663 	}
6664 }
6665 
6666 /*
6667  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6668  */
6669 static int
6670 test_snow3g_decryption_with_digest_test_case_1(void)
6671 {
6672 	struct snow3g_hash_test_data snow3g_hash_data;
6673 	struct rte_cryptodev_info dev_info;
6674 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6675 
6676 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6677 	uint64_t feat_flags = dev_info.feature_flags;
6678 
6679 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6680 		printf("Device doesn't support encrypted digest operations.\n");
6681 		return TEST_SKIPPED;
6682 	}
6683 
6684 	/*
6685 	 * Function prepare data for hash veryfication test case.
6686 	 * Digest is allocated in 4 last bytes in plaintext, pattern.
6687 	 */
6688 	snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6689 
6690 	return test_snow3g_decryption(&snow3g_test_case_7) &
6691 			test_snow3g_authentication_verify(&snow3g_hash_data);
6692 }
6693 
6694 static int
6695 test_snow3g_cipher_auth_test_case_1(void)
6696 {
6697 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
6698 }
6699 
6700 static int
6701 test_snow3g_auth_cipher_test_case_1(void)
6702 {
6703 	return test_snow3g_auth_cipher(
6704 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6705 }
6706 
6707 static int
6708 test_snow3g_auth_cipher_test_case_2(void)
6709 {
6710 	return test_snow3g_auth_cipher(
6711 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6712 }
6713 
6714 static int
6715 test_snow3g_auth_cipher_test_case_2_oop(void)
6716 {
6717 	return test_snow3g_auth_cipher(
6718 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6719 }
6720 
6721 static int
6722 test_snow3g_auth_cipher_part_digest_enc(void)
6723 {
6724 	return test_snow3g_auth_cipher(
6725 		&snow3g_auth_cipher_partial_digest_encryption,
6726 			IN_PLACE, 0);
6727 }
6728 
6729 static int
6730 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6731 {
6732 	return test_snow3g_auth_cipher(
6733 		&snow3g_auth_cipher_partial_digest_encryption,
6734 			OUT_OF_PLACE, 0);
6735 }
6736 
6737 static int
6738 test_snow3g_auth_cipher_test_case_3_sgl(void)
6739 {
6740 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6741 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6742 		return TEST_SKIPPED;
6743 	return test_snow3g_auth_cipher_sgl(
6744 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6745 }
6746 
6747 static int
6748 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6749 {
6750 	return test_snow3g_auth_cipher_sgl(
6751 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6752 }
6753 
6754 static int
6755 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6756 {
6757 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6758 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6759 		return TEST_SKIPPED;
6760 	return test_snow3g_auth_cipher_sgl(
6761 		&snow3g_auth_cipher_partial_digest_encryption,
6762 			IN_PLACE, 0);
6763 }
6764 
6765 static int
6766 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6767 {
6768 	return test_snow3g_auth_cipher_sgl(
6769 		&snow3g_auth_cipher_partial_digest_encryption,
6770 			OUT_OF_PLACE, 0);
6771 }
6772 
6773 static int
6774 test_snow3g_auth_cipher_verify_test_case_1(void)
6775 {
6776 	return test_snow3g_auth_cipher(
6777 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6778 }
6779 
6780 static int
6781 test_snow3g_auth_cipher_verify_test_case_2(void)
6782 {
6783 	return test_snow3g_auth_cipher(
6784 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6785 }
6786 
6787 static int
6788 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6789 {
6790 	return test_snow3g_auth_cipher(
6791 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6792 }
6793 
6794 static int
6795 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6796 {
6797 	return test_snow3g_auth_cipher(
6798 		&snow3g_auth_cipher_partial_digest_encryption,
6799 			IN_PLACE, 1);
6800 }
6801 
6802 static int
6803 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6804 {
6805 	return test_snow3g_auth_cipher(
6806 		&snow3g_auth_cipher_partial_digest_encryption,
6807 			OUT_OF_PLACE, 1);
6808 }
6809 
6810 static int
6811 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6812 {
6813 	return test_snow3g_auth_cipher_sgl(
6814 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6815 }
6816 
6817 static int
6818 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6819 {
6820 	return test_snow3g_auth_cipher_sgl(
6821 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6822 }
6823 
6824 static int
6825 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6826 {
6827 	return test_snow3g_auth_cipher_sgl(
6828 		&snow3g_auth_cipher_partial_digest_encryption,
6829 			IN_PLACE, 1);
6830 }
6831 
6832 static int
6833 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6834 {
6835 	return test_snow3g_auth_cipher_sgl(
6836 		&snow3g_auth_cipher_partial_digest_encryption,
6837 			OUT_OF_PLACE, 1);
6838 }
6839 
6840 static int
6841 test_snow3g_auth_cipher_with_digest_test_case_1(void)
6842 {
6843 	return test_snow3g_auth_cipher(
6844 		&snow3g_test_case_7, IN_PLACE, 0);
6845 }
6846 
6847 static int
6848 test_kasumi_auth_cipher_test_case_1(void)
6849 {
6850 	return test_kasumi_auth_cipher(
6851 		&kasumi_test_case_3, IN_PLACE, 0);
6852 }
6853 
6854 static int
6855 test_kasumi_auth_cipher_test_case_2(void)
6856 {
6857 	return test_kasumi_auth_cipher(
6858 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6859 }
6860 
6861 static int
6862 test_kasumi_auth_cipher_test_case_2_oop(void)
6863 {
6864 	return test_kasumi_auth_cipher(
6865 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6866 }
6867 
6868 static int
6869 test_kasumi_auth_cipher_test_case_2_sgl(void)
6870 {
6871 	return test_kasumi_auth_cipher_sgl(
6872 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6873 }
6874 
6875 static int
6876 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
6877 {
6878 	return test_kasumi_auth_cipher_sgl(
6879 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6880 }
6881 
6882 static int
6883 test_kasumi_auth_cipher_verify_test_case_1(void)
6884 {
6885 	return test_kasumi_auth_cipher(
6886 		&kasumi_test_case_3, IN_PLACE, 1);
6887 }
6888 
6889 static int
6890 test_kasumi_auth_cipher_verify_test_case_2(void)
6891 {
6892 	return test_kasumi_auth_cipher(
6893 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6894 }
6895 
6896 static int
6897 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
6898 {
6899 	return test_kasumi_auth_cipher(
6900 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6901 }
6902 
6903 static int
6904 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
6905 {
6906 	return test_kasumi_auth_cipher_sgl(
6907 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6908 }
6909 
6910 static int
6911 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
6912 {
6913 	return test_kasumi_auth_cipher_sgl(
6914 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6915 }
6916 
6917 static int
6918 test_kasumi_cipher_auth_test_case_1(void)
6919 {
6920 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
6921 }
6922 
6923 static int
6924 test_zuc_encryption_test_case_1(void)
6925 {
6926 	return test_zuc_encryption(&zuc_test_case_cipher_193b);
6927 }
6928 
6929 static int
6930 test_zuc_encryption_test_case_2(void)
6931 {
6932 	return test_zuc_encryption(&zuc_test_case_cipher_800b);
6933 }
6934 
6935 static int
6936 test_zuc_encryption_test_case_3(void)
6937 {
6938 	return test_zuc_encryption(&zuc_test_case_cipher_1570b);
6939 }
6940 
6941 static int
6942 test_zuc_encryption_test_case_4(void)
6943 {
6944 	return test_zuc_encryption(&zuc_test_case_cipher_2798b);
6945 }
6946 
6947 static int
6948 test_zuc_encryption_test_case_5(void)
6949 {
6950 	return test_zuc_encryption(&zuc_test_case_cipher_4019b);
6951 }
6952 
6953 static int
6954 test_zuc_encryption_test_case_6_sgl(void)
6955 {
6956 	return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
6957 }
6958 
6959 static int
6960 test_zuc_hash_generate_test_case_1(void)
6961 {
6962 	return test_zuc_authentication(&zuc_test_case_auth_1b);
6963 }
6964 
6965 static int
6966 test_zuc_hash_generate_test_case_2(void)
6967 {
6968 	return test_zuc_authentication(&zuc_test_case_auth_90b);
6969 }
6970 
6971 static int
6972 test_zuc_hash_generate_test_case_3(void)
6973 {
6974 	return test_zuc_authentication(&zuc_test_case_auth_577b);
6975 }
6976 
6977 static int
6978 test_zuc_hash_generate_test_case_4(void)
6979 {
6980 	return test_zuc_authentication(&zuc_test_case_auth_2079b);
6981 }
6982 
6983 static int
6984 test_zuc_hash_generate_test_case_5(void)
6985 {
6986 	return test_zuc_authentication(&zuc_test_auth_5670b);
6987 }
6988 
6989 static int
6990 test_zuc_hash_generate_test_case_6(void)
6991 {
6992 	return test_zuc_authentication(&zuc_test_case_auth_128b);
6993 }
6994 
6995 static int
6996 test_zuc_hash_generate_test_case_7(void)
6997 {
6998 	return test_zuc_authentication(&zuc_test_case_auth_2080b);
6999 }
7000 
7001 static int
7002 test_zuc_hash_generate_test_case_8(void)
7003 {
7004 	return test_zuc_authentication(&zuc_test_case_auth_584b);
7005 }
7006 
7007 static int
7008 test_zuc_cipher_auth_test_case_1(void)
7009 {
7010 	return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7011 }
7012 
7013 static int
7014 test_zuc_cipher_auth_test_case_2(void)
7015 {
7016 	return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7017 }
7018 
7019 static int
7020 test_zuc_auth_cipher_test_case_1(void)
7021 {
7022 	return test_zuc_auth_cipher(
7023 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7024 }
7025 
7026 static int
7027 test_zuc_auth_cipher_test_case_1_oop(void)
7028 {
7029 	return test_zuc_auth_cipher(
7030 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7031 }
7032 
7033 static int
7034 test_zuc_auth_cipher_test_case_1_sgl(void)
7035 {
7036 	return test_zuc_auth_cipher_sgl(
7037 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7038 }
7039 
7040 static int
7041 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7042 {
7043 	return test_zuc_auth_cipher_sgl(
7044 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7045 }
7046 
7047 static int
7048 test_zuc_auth_cipher_verify_test_case_1(void)
7049 {
7050 	return test_zuc_auth_cipher(
7051 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7052 }
7053 
7054 static int
7055 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7056 {
7057 	return test_zuc_auth_cipher(
7058 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7059 }
7060 
7061 static int
7062 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7063 {
7064 	return test_zuc_auth_cipher_sgl(
7065 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7066 }
7067 
7068 static int
7069 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7070 {
7071 	return test_zuc_auth_cipher_sgl(
7072 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7073 }
7074 
7075 static int
7076 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7077 {
7078 	uint8_t dev_id = testsuite_params.valid_devs[0];
7079 
7080 	struct rte_cryptodev_sym_capability_idx cap_idx;
7081 
7082 	/* Check if device supports particular cipher algorithm */
7083 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7084 	cap_idx.algo.cipher = tdata->cipher_algo;
7085 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7086 		return TEST_SKIPPED;
7087 
7088 	/* Check if device supports particular hash algorithm */
7089 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7090 	cap_idx.algo.auth = tdata->auth_algo;
7091 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7092 		return TEST_SKIPPED;
7093 
7094 	return 0;
7095 }
7096 
7097 static int
7098 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7099 	uint8_t op_mode, uint8_t verify)
7100 {
7101 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7102 	struct crypto_unittest_params *ut_params = &unittest_params;
7103 
7104 	int retval;
7105 
7106 	uint8_t *plaintext = NULL, *ciphertext = NULL;
7107 	unsigned int plaintext_pad_len;
7108 	unsigned int plaintext_len;
7109 	unsigned int ciphertext_pad_len;
7110 	unsigned int ciphertext_len;
7111 
7112 	struct rte_cryptodev_info dev_info;
7113 	struct rte_crypto_op *op;
7114 
7115 	/* Check if device supports particular algorithms separately */
7116 	if (test_mixed_check_if_unsupported(tdata))
7117 		return TEST_SKIPPED;
7118 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7119 		return TEST_SKIPPED;
7120 
7121 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7122 
7123 	uint64_t feat_flags = dev_info.feature_flags;
7124 
7125 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7126 		printf("Device doesn't support digest encrypted.\n");
7127 		return TEST_SKIPPED;
7128 	}
7129 
7130 	/* Create the session */
7131 	if (verify)
7132 		retval = create_wireless_algo_cipher_auth_session(
7133 				ts_params->valid_devs[0],
7134 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7135 				RTE_CRYPTO_AUTH_OP_VERIFY,
7136 				tdata->auth_algo,
7137 				tdata->cipher_algo,
7138 				tdata->auth_key.data, tdata->auth_key.len,
7139 				tdata->auth_iv.len, tdata->digest_enc.len,
7140 				tdata->cipher_iv.len);
7141 	else
7142 		retval = create_wireless_algo_auth_cipher_session(
7143 				ts_params->valid_devs[0],
7144 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7145 				RTE_CRYPTO_AUTH_OP_GENERATE,
7146 				tdata->auth_algo,
7147 				tdata->cipher_algo,
7148 				tdata->auth_key.data, tdata->auth_key.len,
7149 				tdata->auth_iv.len, tdata->digest_enc.len,
7150 				tdata->cipher_iv.len);
7151 	if (retval != 0)
7152 		return retval;
7153 
7154 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7155 	if (op_mode == OUT_OF_PLACE)
7156 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7157 
7158 	/* clear mbuf payload */
7159 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7160 		rte_pktmbuf_tailroom(ut_params->ibuf));
7161 	if (op_mode == OUT_OF_PLACE) {
7162 
7163 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7164 				rte_pktmbuf_tailroom(ut_params->obuf));
7165 	}
7166 
7167 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7168 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7169 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7170 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7171 
7172 	if (verify) {
7173 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7174 				ciphertext_pad_len);
7175 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7176 		if (op_mode == OUT_OF_PLACE)
7177 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7178 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7179 				ciphertext_len);
7180 	} else {
7181 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7182 				plaintext_pad_len);
7183 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7184 		if (op_mode == OUT_OF_PLACE)
7185 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
7186 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7187 	}
7188 
7189 	/* Create the operation */
7190 	retval = create_wireless_algo_auth_cipher_operation(
7191 			tdata->digest_enc.data, tdata->digest_enc.len,
7192 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7193 			tdata->auth_iv.data, tdata->auth_iv.len,
7194 			(tdata->digest_enc.offset == 0 ?
7195 				plaintext_pad_len
7196 				: tdata->digest_enc.offset),
7197 			tdata->validCipherLen.len_bits,
7198 			tdata->cipher.offset_bits,
7199 			tdata->validAuthLen.len_bits,
7200 			tdata->auth.offset_bits,
7201 			op_mode, 0, verify);
7202 
7203 	if (retval < 0)
7204 		return retval;
7205 
7206 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7207 
7208 	/* Check if the op failed because the device doesn't */
7209 	/* support this particular combination of algorithms */
7210 	if (op == NULL && ut_params->op->status ==
7211 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7212 		printf("Device doesn't support this mixed combination. "
7213 				"Test Skipped.\n");
7214 		return TEST_SKIPPED;
7215 	}
7216 	ut_params->op = op;
7217 
7218 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7219 
7220 	ut_params->obuf = (op_mode == IN_PLACE ?
7221 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7222 
7223 	if (verify) {
7224 		if (ut_params->obuf)
7225 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7226 							uint8_t *);
7227 		else
7228 			plaintext = ciphertext +
7229 					(tdata->cipher.offset_bits >> 3);
7230 
7231 		debug_hexdump(stdout, "plaintext:", plaintext,
7232 				tdata->plaintext.len_bits >> 3);
7233 		debug_hexdump(stdout, "plaintext expected:",
7234 				tdata->plaintext.data,
7235 				tdata->plaintext.len_bits >> 3);
7236 	} else {
7237 		if (ut_params->obuf)
7238 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7239 					uint8_t *);
7240 		else
7241 			ciphertext = plaintext;
7242 
7243 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7244 				ciphertext_len);
7245 		debug_hexdump(stdout, "ciphertext expected:",
7246 				tdata->ciphertext.data,
7247 				tdata->ciphertext.len_bits >> 3);
7248 
7249 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7250 				+ (tdata->digest_enc.offset == 0 ?
7251 		plaintext_pad_len : tdata->digest_enc.offset);
7252 
7253 		debug_hexdump(stdout, "digest:", ut_params->digest,
7254 				tdata->digest_enc.len);
7255 		debug_hexdump(stdout, "digest expected:",
7256 				tdata->digest_enc.data,
7257 				tdata->digest_enc.len);
7258 	}
7259 
7260 	/* Validate obuf */
7261 	if (verify) {
7262 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7263 				plaintext,
7264 				tdata->plaintext.data,
7265 				tdata->plaintext.len_bits >> 3,
7266 				"Plaintext data not as expected");
7267 	} else {
7268 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7269 				ciphertext,
7270 				tdata->ciphertext.data,
7271 				tdata->validDataLen.len_bits,
7272 				"Ciphertext data not as expected");
7273 
7274 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7275 				ut_params->digest,
7276 				tdata->digest_enc.data,
7277 				DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
7278 				"Generated auth tag not as expected");
7279 	}
7280 
7281 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7282 			"crypto op processing failed");
7283 
7284 	return 0;
7285 }
7286 
7287 static int
7288 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7289 	uint8_t op_mode, uint8_t verify)
7290 {
7291 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7292 	struct crypto_unittest_params *ut_params = &unittest_params;
7293 
7294 	int retval;
7295 
7296 	const uint8_t *plaintext = NULL;
7297 	const uint8_t *ciphertext = NULL;
7298 	const uint8_t *digest = NULL;
7299 	unsigned int plaintext_pad_len;
7300 	unsigned int plaintext_len;
7301 	unsigned int ciphertext_pad_len;
7302 	unsigned int ciphertext_len;
7303 	uint8_t buffer[10000];
7304 	uint8_t digest_buffer[10000];
7305 
7306 	struct rte_cryptodev_info dev_info;
7307 	struct rte_crypto_op *op;
7308 
7309 	/* Check if device supports particular algorithms */
7310 	if (test_mixed_check_if_unsupported(tdata))
7311 		return TEST_SKIPPED;
7312 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7313 		return TEST_SKIPPED;
7314 
7315 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7316 
7317 	uint64_t feat_flags = dev_info.feature_flags;
7318 
7319 	if (op_mode == IN_PLACE) {
7320 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7321 			printf("Device doesn't support in-place scatter-gather "
7322 					"in both input and output mbufs.\n");
7323 			return TEST_SKIPPED;
7324 		}
7325 	} else {
7326 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7327 			printf("Device doesn't support out-of-place scatter-gather "
7328 					"in both input and output mbufs.\n");
7329 			return TEST_SKIPPED;
7330 		}
7331 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7332 			printf("Device doesn't support digest encrypted.\n");
7333 			return TEST_SKIPPED;
7334 		}
7335 	}
7336 
7337 	/* Create the session */
7338 	if (verify)
7339 		retval = create_wireless_algo_cipher_auth_session(
7340 				ts_params->valid_devs[0],
7341 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7342 				RTE_CRYPTO_AUTH_OP_VERIFY,
7343 				tdata->auth_algo,
7344 				tdata->cipher_algo,
7345 				tdata->auth_key.data, tdata->auth_key.len,
7346 				tdata->auth_iv.len, tdata->digest_enc.len,
7347 				tdata->cipher_iv.len);
7348 	else
7349 		retval = create_wireless_algo_auth_cipher_session(
7350 				ts_params->valid_devs[0],
7351 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7352 				RTE_CRYPTO_AUTH_OP_GENERATE,
7353 				tdata->auth_algo,
7354 				tdata->cipher_algo,
7355 				tdata->auth_key.data, tdata->auth_key.len,
7356 				tdata->auth_iv.len, tdata->digest_enc.len,
7357 				tdata->cipher_iv.len);
7358 	if (retval != 0)
7359 		return retval;
7360 
7361 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7362 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7363 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7364 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7365 
7366 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7367 			ciphertext_pad_len, 15, 0);
7368 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7369 			"Failed to allocate input buffer in mempool");
7370 
7371 	if (op_mode == OUT_OF_PLACE) {
7372 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7373 				plaintext_pad_len, 15, 0);
7374 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
7375 				"Failed to allocate output buffer in mempool");
7376 	}
7377 
7378 	if (verify) {
7379 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7380 			tdata->ciphertext.data);
7381 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7382 					ciphertext_len, buffer);
7383 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7384 			ciphertext_len);
7385 	} else {
7386 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7387 			tdata->plaintext.data);
7388 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7389 					plaintext_len, buffer);
7390 		debug_hexdump(stdout, "plaintext:", plaintext,
7391 			plaintext_len);
7392 	}
7393 	memset(buffer, 0, sizeof(buffer));
7394 
7395 	/* Create the operation */
7396 	retval = create_wireless_algo_auth_cipher_operation(
7397 			tdata->digest_enc.data, tdata->digest_enc.len,
7398 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7399 			tdata->auth_iv.data, tdata->auth_iv.len,
7400 			(tdata->digest_enc.offset == 0 ?
7401 				plaintext_pad_len
7402 				: tdata->digest_enc.offset),
7403 			tdata->validCipherLen.len_bits,
7404 			tdata->cipher.offset_bits,
7405 			tdata->validAuthLen.len_bits,
7406 			tdata->auth.offset_bits,
7407 			op_mode, 1, verify);
7408 
7409 	if (retval < 0)
7410 		return retval;
7411 
7412 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7413 
7414 	/* Check if the op failed because the device doesn't */
7415 	/* support this particular combination of algorithms */
7416 	if (op == NULL && ut_params->op->status ==
7417 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7418 		printf("Device doesn't support this mixed combination. "
7419 				"Test Skipped.\n");
7420 		return TEST_SKIPPED;
7421 	}
7422 	ut_params->op = op;
7423 
7424 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7425 
7426 	ut_params->obuf = (op_mode == IN_PLACE ?
7427 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7428 
7429 	if (verify) {
7430 		if (ut_params->obuf)
7431 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7432 					plaintext_len, buffer);
7433 		else
7434 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7435 					plaintext_len, buffer);
7436 
7437 		debug_hexdump(stdout, "plaintext:", plaintext,
7438 				(tdata->plaintext.len_bits >> 3) -
7439 				tdata->digest_enc.len);
7440 		debug_hexdump(stdout, "plaintext expected:",
7441 				tdata->plaintext.data,
7442 				(tdata->plaintext.len_bits >> 3) -
7443 				tdata->digest_enc.len);
7444 	} else {
7445 		if (ut_params->obuf)
7446 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7447 					ciphertext_len, buffer);
7448 		else
7449 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7450 					ciphertext_len, buffer);
7451 
7452 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7453 			ciphertext_len);
7454 		debug_hexdump(stdout, "ciphertext expected:",
7455 			tdata->ciphertext.data,
7456 			tdata->ciphertext.len_bits >> 3);
7457 
7458 		if (ut_params->obuf)
7459 			digest = rte_pktmbuf_read(ut_params->obuf,
7460 					(tdata->digest_enc.offset == 0 ?
7461 						plaintext_pad_len :
7462 						tdata->digest_enc.offset),
7463 					tdata->digest_enc.len, digest_buffer);
7464 		else
7465 			digest = rte_pktmbuf_read(ut_params->ibuf,
7466 					(tdata->digest_enc.offset == 0 ?
7467 						plaintext_pad_len :
7468 						tdata->digest_enc.offset),
7469 					tdata->digest_enc.len, digest_buffer);
7470 
7471 		debug_hexdump(stdout, "digest:", digest,
7472 				tdata->digest_enc.len);
7473 		debug_hexdump(stdout, "digest expected:",
7474 				tdata->digest_enc.data, tdata->digest_enc.len);
7475 	}
7476 
7477 	/* Validate obuf */
7478 	if (verify) {
7479 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7480 				plaintext,
7481 				tdata->plaintext.data,
7482 				tdata->plaintext.len_bits >> 3,
7483 				"Plaintext data not as expected");
7484 	} else {
7485 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7486 				ciphertext,
7487 				tdata->ciphertext.data,
7488 				tdata->validDataLen.len_bits,
7489 				"Ciphertext data not as expected");
7490 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7491 				digest,
7492 				tdata->digest_enc.data,
7493 				tdata->digest_enc.len,
7494 				"Generated auth tag not as expected");
7495 	}
7496 
7497 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7498 			"crypto op processing failed");
7499 
7500 	return 0;
7501 }
7502 
7503 /** AUTH AES CMAC + CIPHER AES CTR */
7504 
7505 static int
7506 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7507 {
7508 	return test_mixed_auth_cipher(
7509 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7510 }
7511 
7512 static int
7513 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7514 {
7515 	return test_mixed_auth_cipher(
7516 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7517 }
7518 
7519 static int
7520 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7521 {
7522 	return test_mixed_auth_cipher_sgl(
7523 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7524 }
7525 
7526 static int
7527 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7528 {
7529 	return test_mixed_auth_cipher_sgl(
7530 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7531 }
7532 
7533 static int
7534 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7535 {
7536 	return test_mixed_auth_cipher(
7537 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7538 }
7539 
7540 static int
7541 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7542 {
7543 	return test_mixed_auth_cipher(
7544 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7545 }
7546 
7547 static int
7548 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7549 {
7550 	return test_mixed_auth_cipher_sgl(
7551 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7552 }
7553 
7554 static int
7555 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7556 {
7557 	return test_mixed_auth_cipher_sgl(
7558 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7559 }
7560 
7561 /** MIXED AUTH + CIPHER */
7562 
7563 static int
7564 test_auth_zuc_cipher_snow_test_case_1(void)
7565 {
7566 	return test_mixed_auth_cipher(
7567 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7568 }
7569 
7570 static int
7571 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7572 {
7573 	return test_mixed_auth_cipher(
7574 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7575 }
7576 
7577 static int
7578 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7579 {
7580 	return test_mixed_auth_cipher(
7581 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7582 }
7583 
7584 static int
7585 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7586 {
7587 	return test_mixed_auth_cipher(
7588 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7589 }
7590 
7591 static int
7592 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7593 {
7594 	return test_mixed_auth_cipher(
7595 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7596 }
7597 
7598 static int
7599 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7600 {
7601 	return test_mixed_auth_cipher(
7602 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7603 }
7604 
7605 static int
7606 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7607 {
7608 	return test_mixed_auth_cipher(
7609 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7610 }
7611 
7612 static int
7613 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7614 {
7615 	return test_mixed_auth_cipher(
7616 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7617 }
7618 
7619 static int
7620 test_auth_snow_cipher_zuc_test_case_1(void)
7621 {
7622 	return test_mixed_auth_cipher(
7623 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7624 }
7625 
7626 static int
7627 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7628 {
7629 	return test_mixed_auth_cipher(
7630 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7631 }
7632 
7633 static int
7634 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7635 {
7636 	return test_mixed_auth_cipher(
7637 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7638 }
7639 
7640 static int
7641 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7642 {
7643 	return test_mixed_auth_cipher(
7644 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7645 }
7646 
7647 static int
7648 test_auth_null_cipher_snow_test_case_1(void)
7649 {
7650 	return test_mixed_auth_cipher(
7651 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7652 }
7653 
7654 static int
7655 test_verify_auth_null_cipher_snow_test_case_1(void)
7656 {
7657 	return test_mixed_auth_cipher(
7658 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7659 }
7660 
7661 static int
7662 test_auth_null_cipher_zuc_test_case_1(void)
7663 {
7664 	return test_mixed_auth_cipher(
7665 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7666 }
7667 
7668 static int
7669 test_verify_auth_null_cipher_zuc_test_case_1(void)
7670 {
7671 	return test_mixed_auth_cipher(
7672 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7673 }
7674 
7675 static int
7676 test_auth_snow_cipher_null_test_case_1(void)
7677 {
7678 	return test_mixed_auth_cipher(
7679 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7680 }
7681 
7682 static int
7683 test_verify_auth_snow_cipher_null_test_case_1(void)
7684 {
7685 	return test_mixed_auth_cipher(
7686 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7687 }
7688 
7689 static int
7690 test_auth_zuc_cipher_null_test_case_1(void)
7691 {
7692 	return test_mixed_auth_cipher(
7693 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7694 }
7695 
7696 static int
7697 test_verify_auth_zuc_cipher_null_test_case_1(void)
7698 {
7699 	return test_mixed_auth_cipher(
7700 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7701 }
7702 
7703 static int
7704 test_auth_null_cipher_aes_ctr_test_case_1(void)
7705 {
7706 	return test_mixed_auth_cipher(
7707 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7708 }
7709 
7710 static int
7711 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7712 {
7713 	return test_mixed_auth_cipher(
7714 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7715 }
7716 
7717 static int
7718 test_auth_aes_cmac_cipher_null_test_case_1(void)
7719 {
7720 	return test_mixed_auth_cipher(
7721 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7722 }
7723 
7724 static int
7725 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7726 {
7727 	return test_mixed_auth_cipher(
7728 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7729 }
7730 
7731 /* ***** AEAD algorithm Tests ***** */
7732 
7733 static int
7734 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7735 		enum rte_crypto_aead_operation op,
7736 		const uint8_t *key, const uint8_t key_len,
7737 		const uint16_t aad_len, const uint8_t auth_len,
7738 		uint8_t iv_len)
7739 {
7740 	uint8_t aead_key[key_len];
7741 
7742 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7743 	struct crypto_unittest_params *ut_params = &unittest_params;
7744 
7745 	memcpy(aead_key, key, key_len);
7746 
7747 	/* Setup AEAD Parameters */
7748 	ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7749 	ut_params->aead_xform.next = NULL;
7750 	ut_params->aead_xform.aead.algo = algo;
7751 	ut_params->aead_xform.aead.op = op;
7752 	ut_params->aead_xform.aead.key.data = aead_key;
7753 	ut_params->aead_xform.aead.key.length = key_len;
7754 	ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7755 	ut_params->aead_xform.aead.iv.length = iv_len;
7756 	ut_params->aead_xform.aead.digest_length = auth_len;
7757 	ut_params->aead_xform.aead.aad_length = aad_len;
7758 
7759 	debug_hexdump(stdout, "key:", key, key_len);
7760 
7761 	/* Create Crypto session*/
7762 	ut_params->sess = rte_cryptodev_sym_session_create(
7763 			ts_params->session_mpool);
7764 
7765 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7766 			&ut_params->aead_xform,
7767 			ts_params->session_priv_mpool);
7768 
7769 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7770 
7771 	return 0;
7772 }
7773 
7774 static int
7775 create_aead_xform(struct rte_crypto_op *op,
7776 		enum rte_crypto_aead_algorithm algo,
7777 		enum rte_crypto_aead_operation aead_op,
7778 		uint8_t *key, const uint8_t key_len,
7779 		const uint8_t aad_len, const uint8_t auth_len,
7780 		uint8_t iv_len)
7781 {
7782 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7783 			"failed to allocate space for crypto transform");
7784 
7785 	struct rte_crypto_sym_op *sym_op = op->sym;
7786 
7787 	/* Setup AEAD Parameters */
7788 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7789 	sym_op->xform->next = NULL;
7790 	sym_op->xform->aead.algo = algo;
7791 	sym_op->xform->aead.op = aead_op;
7792 	sym_op->xform->aead.key.data = key;
7793 	sym_op->xform->aead.key.length = key_len;
7794 	sym_op->xform->aead.iv.offset = IV_OFFSET;
7795 	sym_op->xform->aead.iv.length = iv_len;
7796 	sym_op->xform->aead.digest_length = auth_len;
7797 	sym_op->xform->aead.aad_length = aad_len;
7798 
7799 	debug_hexdump(stdout, "key:", key, key_len);
7800 
7801 	return 0;
7802 }
7803 
7804 static int
7805 create_aead_operation(enum rte_crypto_aead_operation op,
7806 		const struct aead_test_data *tdata)
7807 {
7808 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7809 	struct crypto_unittest_params *ut_params = &unittest_params;
7810 
7811 	uint8_t *plaintext, *ciphertext;
7812 	unsigned int aad_pad_len, plaintext_pad_len;
7813 
7814 	/* Generate Crypto op data structure */
7815 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7816 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7817 	TEST_ASSERT_NOT_NULL(ut_params->op,
7818 			"Failed to allocate symmetric crypto operation struct");
7819 
7820 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7821 
7822 	/* Append aad data */
7823 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
7824 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
7825 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7826 				aad_pad_len);
7827 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7828 				"no room to append aad");
7829 
7830 		sym_op->aead.aad.phys_addr =
7831 				rte_pktmbuf_iova(ut_params->ibuf);
7832 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
7833 		memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
7834 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7835 			tdata->aad.len);
7836 
7837 		/* Append IV at the end of the crypto operation*/
7838 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7839 				uint8_t *, IV_OFFSET);
7840 
7841 		/* Copy IV 1 byte after the IV pointer, according to the API */
7842 		rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
7843 		debug_hexdump(stdout, "iv:", iv_ptr,
7844 			tdata->iv.len);
7845 	} else {
7846 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
7847 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7848 				aad_pad_len);
7849 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7850 				"no room to append aad");
7851 
7852 		sym_op->aead.aad.phys_addr =
7853 				rte_pktmbuf_iova(ut_params->ibuf);
7854 		memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
7855 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7856 			tdata->aad.len);
7857 
7858 		/* Append IV at the end of the crypto operation*/
7859 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7860 				uint8_t *, IV_OFFSET);
7861 
7862 		if (tdata->iv.len == 0) {
7863 			rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
7864 			debug_hexdump(stdout, "iv:", iv_ptr,
7865 				AES_GCM_J0_LENGTH);
7866 		} else {
7867 			rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
7868 			debug_hexdump(stdout, "iv:", iv_ptr,
7869 				tdata->iv.len);
7870 		}
7871 	}
7872 
7873 	/* Append plaintext/ciphertext */
7874 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7875 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7876 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7877 				plaintext_pad_len);
7878 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7879 
7880 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
7881 		debug_hexdump(stdout, "plaintext:", plaintext,
7882 				tdata->plaintext.len);
7883 
7884 		if (ut_params->obuf) {
7885 			ciphertext = (uint8_t *)rte_pktmbuf_append(
7886 					ut_params->obuf,
7887 					plaintext_pad_len + aad_pad_len);
7888 			TEST_ASSERT_NOT_NULL(ciphertext,
7889 					"no room to append ciphertext");
7890 
7891 			memset(ciphertext + aad_pad_len, 0,
7892 					tdata->ciphertext.len);
7893 		}
7894 	} else {
7895 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
7896 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7897 				plaintext_pad_len);
7898 		TEST_ASSERT_NOT_NULL(ciphertext,
7899 				"no room to append ciphertext");
7900 
7901 		memcpy(ciphertext, tdata->ciphertext.data,
7902 				tdata->ciphertext.len);
7903 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7904 				tdata->ciphertext.len);
7905 
7906 		if (ut_params->obuf) {
7907 			plaintext = (uint8_t *)rte_pktmbuf_append(
7908 					ut_params->obuf,
7909 					plaintext_pad_len + aad_pad_len);
7910 			TEST_ASSERT_NOT_NULL(plaintext,
7911 					"no room to append plaintext");
7912 
7913 			memset(plaintext + aad_pad_len, 0,
7914 					tdata->plaintext.len);
7915 		}
7916 	}
7917 
7918 	/* Append digest data */
7919 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7920 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7921 				ut_params->obuf ? ut_params->obuf :
7922 						ut_params->ibuf,
7923 						tdata->auth_tag.len);
7924 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7925 				"no room to append digest");
7926 		memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
7927 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7928 				ut_params->obuf ? ut_params->obuf :
7929 						ut_params->ibuf,
7930 						plaintext_pad_len +
7931 						aad_pad_len);
7932 	} else {
7933 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7934 				ut_params->ibuf, tdata->auth_tag.len);
7935 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7936 				"no room to append digest");
7937 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7938 				ut_params->ibuf,
7939 				plaintext_pad_len + aad_pad_len);
7940 
7941 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
7942 			tdata->auth_tag.len);
7943 		debug_hexdump(stdout, "digest:",
7944 			sym_op->aead.digest.data,
7945 			tdata->auth_tag.len);
7946 	}
7947 
7948 	sym_op->aead.data.length = tdata->plaintext.len;
7949 	sym_op->aead.data.offset = aad_pad_len;
7950 
7951 	return 0;
7952 }
7953 
7954 static int
7955 test_authenticated_encryption(const struct aead_test_data *tdata)
7956 {
7957 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7958 	struct crypto_unittest_params *ut_params = &unittest_params;
7959 
7960 	int retval;
7961 	uint8_t *ciphertext, *auth_tag;
7962 	uint16_t plaintext_pad_len;
7963 	uint32_t i;
7964 	struct rte_cryptodev_info dev_info;
7965 
7966 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7967 	uint64_t feat_flags = dev_info.feature_flags;
7968 
7969 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
7970 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
7971 		printf("Device doesn't support RAW data-path APIs.\n");
7972 		return TEST_SKIPPED;
7973 	}
7974 
7975 	/* Verify the capabilities */
7976 	struct rte_cryptodev_sym_capability_idx cap_idx;
7977 	const struct rte_cryptodev_symmetric_capability *capability;
7978 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7979 	cap_idx.algo.aead = tdata->algo;
7980 	capability = rte_cryptodev_sym_capability_get(
7981 			ts_params->valid_devs[0], &cap_idx);
7982 	if (capability == NULL)
7983 		return TEST_SKIPPED;
7984 	if (rte_cryptodev_sym_capability_check_aead(
7985 			capability, tdata->key.len, tdata->auth_tag.len,
7986 			tdata->aad.len, tdata->iv.len))
7987 		return TEST_SKIPPED;
7988 
7989 	/* Create AEAD session */
7990 	retval = create_aead_session(ts_params->valid_devs[0],
7991 			tdata->algo,
7992 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
7993 			tdata->key.data, tdata->key.len,
7994 			tdata->aad.len, tdata->auth_tag.len,
7995 			tdata->iv.len);
7996 	if (retval < 0)
7997 		return retval;
7998 
7999 	if (tdata->aad.len > MBUF_SIZE) {
8000 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8001 		/* Populate full size of add data */
8002 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8003 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8004 	} else
8005 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8006 
8007 	/* clear mbuf payload */
8008 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8009 			rte_pktmbuf_tailroom(ut_params->ibuf));
8010 
8011 	/* Create AEAD operation */
8012 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8013 	if (retval < 0)
8014 		return retval;
8015 
8016 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8017 
8018 	ut_params->op->sym->m_src = ut_params->ibuf;
8019 
8020 	/* Process crypto operation */
8021 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8022 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8023 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8024 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8025 				ut_params->op, 0, 0, 0, 0);
8026 	else
8027 		TEST_ASSERT_NOT_NULL(
8028 			process_crypto_request(ts_params->valid_devs[0],
8029 			ut_params->op), "failed to process sym crypto op");
8030 
8031 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8032 			"crypto op processing failed");
8033 
8034 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8035 
8036 	if (ut_params->op->sym->m_dst) {
8037 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8038 				uint8_t *);
8039 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8040 				uint8_t *, plaintext_pad_len);
8041 	} else {
8042 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8043 				uint8_t *,
8044 				ut_params->op->sym->cipher.data.offset);
8045 		auth_tag = ciphertext + plaintext_pad_len;
8046 	}
8047 
8048 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8049 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8050 
8051 	/* Validate obuf */
8052 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8053 			ciphertext,
8054 			tdata->ciphertext.data,
8055 			tdata->ciphertext.len,
8056 			"Ciphertext data not as expected");
8057 
8058 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8059 			auth_tag,
8060 			tdata->auth_tag.data,
8061 			tdata->auth_tag.len,
8062 			"Generated auth tag not as expected");
8063 
8064 	return 0;
8065 
8066 }
8067 
8068 #ifdef RTE_LIB_SECURITY
8069 static int
8070 security_proto_supported(enum rte_security_session_action_type action,
8071 	enum rte_security_session_protocol proto)
8072 {
8073 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8074 
8075 	const struct rte_security_capability *capabilities;
8076 	const struct rte_security_capability *capability;
8077 	uint16_t i = 0;
8078 
8079 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8080 				rte_cryptodev_get_sec_ctx(
8081 				ts_params->valid_devs[0]);
8082 
8083 
8084 	capabilities = rte_security_capabilities_get(ctx);
8085 
8086 	if (capabilities == NULL)
8087 		return -ENOTSUP;
8088 
8089 	while ((capability = &capabilities[i++])->action !=
8090 			RTE_SECURITY_ACTION_TYPE_NONE) {
8091 		if (capability->action == action &&
8092 				capability->protocol == proto)
8093 			return 0;
8094 	}
8095 
8096 	return -ENOTSUP;
8097 }
8098 
8099 /* Basic algorithm run function for async inplace mode.
8100  * Creates a session from input parameters and runs one operation
8101  * on input_vec. Checks the output of the crypto operation against
8102  * output_vec.
8103  */
8104 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8105 			   enum rte_crypto_auth_operation opa,
8106 			   const uint8_t *input_vec, unsigned int input_vec_len,
8107 			   const uint8_t *output_vec,
8108 			   unsigned int output_vec_len,
8109 			   enum rte_crypto_cipher_algorithm cipher_alg,
8110 			   const uint8_t *cipher_key, uint32_t cipher_key_len,
8111 			   enum rte_crypto_auth_algorithm auth_alg,
8112 			   const uint8_t *auth_key, uint32_t auth_key_len,
8113 			   uint8_t bearer, enum rte_security_pdcp_domain domain,
8114 			   uint8_t packet_direction, uint8_t sn_size,
8115 			   uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8116 {
8117 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8118 	struct crypto_unittest_params *ut_params = &unittest_params;
8119 	uint8_t *plaintext;
8120 	int ret = TEST_SUCCESS;
8121 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8122 				rte_cryptodev_get_sec_ctx(
8123 				ts_params->valid_devs[0]);
8124 
8125 	/* Verify the capabilities */
8126 	struct rte_security_capability_idx sec_cap_idx;
8127 
8128 	sec_cap_idx.action = ut_params->type;
8129 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8130 	sec_cap_idx.pdcp.domain = domain;
8131 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8132 		return TEST_SKIPPED;
8133 
8134 	/* Generate test mbuf data */
8135 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8136 
8137 	/* clear mbuf payload */
8138 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8139 			rte_pktmbuf_tailroom(ut_params->ibuf));
8140 
8141 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8142 						  input_vec_len);
8143 	memcpy(plaintext, input_vec, input_vec_len);
8144 
8145 	/* Out of place support */
8146 	if (oop) {
8147 		/*
8148 		 * For out-op-place we need to alloc another mbuf
8149 		 */
8150 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8151 		rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8152 	}
8153 
8154 	/* Setup Cipher Parameters */
8155 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8156 	ut_params->cipher_xform.cipher.algo = cipher_alg;
8157 	ut_params->cipher_xform.cipher.op = opc;
8158 	ut_params->cipher_xform.cipher.key.data = cipher_key;
8159 	ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8160 	ut_params->cipher_xform.cipher.iv.length =
8161 				packet_direction ? 4 : 0;
8162 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8163 
8164 	/* Setup HMAC Parameters if ICV header is required */
8165 	if (auth_alg != 0) {
8166 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8167 		ut_params->auth_xform.next = NULL;
8168 		ut_params->auth_xform.auth.algo = auth_alg;
8169 		ut_params->auth_xform.auth.op = opa;
8170 		ut_params->auth_xform.auth.key.data = auth_key;
8171 		ut_params->auth_xform.auth.key.length = auth_key_len;
8172 
8173 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8174 	} else {
8175 		ut_params->cipher_xform.next = NULL;
8176 	}
8177 
8178 	struct rte_security_session_conf sess_conf = {
8179 		.action_type = ut_params->type,
8180 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8181 		{.pdcp = {
8182 			.bearer = bearer,
8183 			.domain = domain,
8184 			.pkt_dir = packet_direction,
8185 			.sn_size = sn_size,
8186 			.hfn = packet_direction ? 0 : hfn,
8187 			/**
8188 			 * hfn can be set as pdcp_test_hfn[i]
8189 			 * if hfn_ovrd is not set. Here, PDCP
8190 			 * packet direction is just used to
8191 			 * run half of the cases with session
8192 			 * HFN and other half with per packet
8193 			 * HFN.
8194 			 */
8195 			.hfn_threshold = hfn_threshold,
8196 			.hfn_ovrd = packet_direction ? 1 : 0,
8197 			.sdap_enabled = sdap,
8198 		} },
8199 		.crypto_xform = &ut_params->cipher_xform
8200 	};
8201 
8202 	/* Create security session */
8203 	ut_params->sec_session = rte_security_session_create(ctx,
8204 				&sess_conf, ts_params->session_mpool,
8205 				ts_params->session_priv_mpool);
8206 
8207 	if (!ut_params->sec_session) {
8208 		printf("TestCase %s()-%d line %d failed %s: ",
8209 			__func__, i, __LINE__, "Failed to allocate session");
8210 		ret = TEST_FAILED;
8211 		goto on_err;
8212 	}
8213 
8214 	/* Generate crypto op data structure */
8215 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8216 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8217 	if (!ut_params->op) {
8218 		printf("TestCase %s()-%d line %d failed %s: ",
8219 			__func__, i, __LINE__,
8220 			"Failed to allocate symmetric crypto operation struct");
8221 		ret = TEST_FAILED;
8222 		goto on_err;
8223 	}
8224 
8225 	uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8226 					uint32_t *, IV_OFFSET);
8227 	*per_pkt_hfn = packet_direction ? hfn : 0;
8228 
8229 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8230 
8231 	/* set crypto operation source mbuf */
8232 	ut_params->op->sym->m_src = ut_params->ibuf;
8233 	if (oop)
8234 		ut_params->op->sym->m_dst = ut_params->obuf;
8235 
8236 	/* Process crypto operation */
8237 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8238 		== NULL) {
8239 		printf("TestCase %s()-%d line %d failed %s: ",
8240 			__func__, i, __LINE__,
8241 			"failed to process sym crypto op");
8242 		ret = TEST_FAILED;
8243 		goto on_err;
8244 	}
8245 
8246 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8247 		printf("TestCase %s()-%d line %d failed %s: ",
8248 			__func__, i, __LINE__, "crypto op processing failed");
8249 		ret = TEST_FAILED;
8250 		goto on_err;
8251 	}
8252 
8253 	/* Validate obuf */
8254 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8255 			uint8_t *);
8256 	if (oop) {
8257 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8258 				uint8_t *);
8259 	}
8260 
8261 	if (memcmp(ciphertext, output_vec, output_vec_len)) {
8262 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8263 		rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8264 		rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8265 		ret = TEST_FAILED;
8266 		goto on_err;
8267 	}
8268 
8269 on_err:
8270 	rte_crypto_op_free(ut_params->op);
8271 	ut_params->op = NULL;
8272 
8273 	if (ut_params->sec_session)
8274 		rte_security_session_destroy(ctx, ut_params->sec_session);
8275 	ut_params->sec_session = NULL;
8276 
8277 	rte_pktmbuf_free(ut_params->ibuf);
8278 	ut_params->ibuf = NULL;
8279 	if (oop) {
8280 		rte_pktmbuf_free(ut_params->obuf);
8281 		ut_params->obuf = NULL;
8282 	}
8283 
8284 	return ret;
8285 }
8286 
8287 static int
8288 test_pdcp_proto_SGL(int i, int oop,
8289 	enum rte_crypto_cipher_operation opc,
8290 	enum rte_crypto_auth_operation opa,
8291 	uint8_t *input_vec,
8292 	unsigned int input_vec_len,
8293 	uint8_t *output_vec,
8294 	unsigned int output_vec_len,
8295 	uint32_t fragsz,
8296 	uint32_t fragsz_oop)
8297 {
8298 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8299 	struct crypto_unittest_params *ut_params = &unittest_params;
8300 	uint8_t *plaintext;
8301 	struct rte_mbuf *buf, *buf_oop = NULL;
8302 	int ret = TEST_SUCCESS;
8303 	int to_trn = 0;
8304 	int to_trn_tbl[16];
8305 	int segs = 1;
8306 	unsigned int trn_data = 0;
8307 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8308 				rte_cryptodev_get_sec_ctx(
8309 				ts_params->valid_devs[0]);
8310 
8311 	/* Verify the capabilities */
8312 	struct rte_security_capability_idx sec_cap_idx;
8313 
8314 	sec_cap_idx.action = ut_params->type;
8315 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8316 	sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8317 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8318 		return TEST_SKIPPED;
8319 
8320 	if (fragsz > input_vec_len)
8321 		fragsz = input_vec_len;
8322 
8323 	uint16_t plaintext_len = fragsz;
8324 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8325 
8326 	if (fragsz_oop > output_vec_len)
8327 		frag_size_oop = output_vec_len;
8328 
8329 	int ecx = 0;
8330 	if (input_vec_len % fragsz != 0) {
8331 		if (input_vec_len / fragsz + 1 > 16)
8332 			return 1;
8333 	} else if (input_vec_len / fragsz > 16)
8334 		return 1;
8335 
8336 	/* Out of place support */
8337 	if (oop) {
8338 		/*
8339 		 * For out-op-place we need to alloc another mbuf
8340 		 */
8341 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8342 		rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8343 		buf_oop = ut_params->obuf;
8344 	}
8345 
8346 	/* Generate test mbuf data */
8347 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8348 
8349 	/* clear mbuf payload */
8350 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8351 			rte_pktmbuf_tailroom(ut_params->ibuf));
8352 
8353 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8354 						  plaintext_len);
8355 	memcpy(plaintext, input_vec, plaintext_len);
8356 	trn_data += plaintext_len;
8357 
8358 	buf = ut_params->ibuf;
8359 
8360 	/*
8361 	 * Loop until no more fragments
8362 	 */
8363 
8364 	while (trn_data < input_vec_len) {
8365 		++segs;
8366 		to_trn = (input_vec_len - trn_data < fragsz) ?
8367 				(input_vec_len - trn_data) : fragsz;
8368 
8369 		to_trn_tbl[ecx++] = to_trn;
8370 
8371 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8372 		buf = buf->next;
8373 
8374 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8375 				rte_pktmbuf_tailroom(buf));
8376 
8377 		/* OOP */
8378 		if (oop && !fragsz_oop) {
8379 			buf_oop->next =
8380 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
8381 			buf_oop = buf_oop->next;
8382 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8383 					0, rte_pktmbuf_tailroom(buf_oop));
8384 			rte_pktmbuf_append(buf_oop, to_trn);
8385 		}
8386 
8387 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8388 				to_trn);
8389 
8390 		memcpy(plaintext, input_vec + trn_data, to_trn);
8391 		trn_data += to_trn;
8392 	}
8393 
8394 	ut_params->ibuf->nb_segs = segs;
8395 
8396 	segs = 1;
8397 	if (fragsz_oop && oop) {
8398 		to_trn = 0;
8399 		ecx = 0;
8400 
8401 		trn_data = frag_size_oop;
8402 		while (trn_data < output_vec_len) {
8403 			++segs;
8404 			to_trn =
8405 				(output_vec_len - trn_data <
8406 						frag_size_oop) ?
8407 				(output_vec_len - trn_data) :
8408 						frag_size_oop;
8409 
8410 			to_trn_tbl[ecx++] = to_trn;
8411 
8412 			buf_oop->next =
8413 				rte_pktmbuf_alloc(ts_params->mbuf_pool);
8414 			buf_oop = buf_oop->next;
8415 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8416 					0, rte_pktmbuf_tailroom(buf_oop));
8417 			rte_pktmbuf_append(buf_oop, to_trn);
8418 
8419 			trn_data += to_trn;
8420 		}
8421 		ut_params->obuf->nb_segs = segs;
8422 	}
8423 
8424 	/* Setup Cipher Parameters */
8425 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8426 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8427 	ut_params->cipher_xform.cipher.op = opc;
8428 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8429 	ut_params->cipher_xform.cipher.key.length =
8430 					pdcp_test_params[i].cipher_key_len;
8431 	ut_params->cipher_xform.cipher.iv.length = 0;
8432 
8433 	/* Setup HMAC Parameters if ICV header is required */
8434 	if (pdcp_test_params[i].auth_alg != 0) {
8435 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8436 		ut_params->auth_xform.next = NULL;
8437 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8438 		ut_params->auth_xform.auth.op = opa;
8439 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8440 		ut_params->auth_xform.auth.key.length =
8441 					pdcp_test_params[i].auth_key_len;
8442 
8443 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8444 	} else {
8445 		ut_params->cipher_xform.next = NULL;
8446 	}
8447 
8448 	struct rte_security_session_conf sess_conf = {
8449 		.action_type = ut_params->type,
8450 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8451 		{.pdcp = {
8452 			.bearer = pdcp_test_bearer[i],
8453 			.domain = pdcp_test_params[i].domain,
8454 			.pkt_dir = pdcp_test_packet_direction[i],
8455 			.sn_size = pdcp_test_data_sn_size[i],
8456 			.hfn = pdcp_test_hfn[i],
8457 			.hfn_threshold = pdcp_test_hfn_threshold[i],
8458 			.hfn_ovrd = 0,
8459 		} },
8460 		.crypto_xform = &ut_params->cipher_xform
8461 	};
8462 
8463 	/* Create security session */
8464 	ut_params->sec_session = rte_security_session_create(ctx,
8465 				&sess_conf, ts_params->session_mpool,
8466 				ts_params->session_priv_mpool);
8467 
8468 	if (!ut_params->sec_session) {
8469 		printf("TestCase %s()-%d line %d failed %s: ",
8470 			__func__, i, __LINE__, "Failed to allocate session");
8471 		ret = TEST_FAILED;
8472 		goto on_err;
8473 	}
8474 
8475 	/* Generate crypto op data structure */
8476 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8477 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8478 	if (!ut_params->op) {
8479 		printf("TestCase %s()-%d line %d failed %s: ",
8480 			__func__, i, __LINE__,
8481 			"Failed to allocate symmetric crypto operation struct");
8482 		ret = TEST_FAILED;
8483 		goto on_err;
8484 	}
8485 
8486 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8487 
8488 	/* set crypto operation source mbuf */
8489 	ut_params->op->sym->m_src = ut_params->ibuf;
8490 	if (oop)
8491 		ut_params->op->sym->m_dst = ut_params->obuf;
8492 
8493 	/* Process crypto operation */
8494 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8495 		== NULL) {
8496 		printf("TestCase %s()-%d line %d failed %s: ",
8497 			__func__, i, __LINE__,
8498 			"failed to process sym crypto op");
8499 		ret = TEST_FAILED;
8500 		goto on_err;
8501 	}
8502 
8503 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8504 		printf("TestCase %s()-%d line %d failed %s: ",
8505 			__func__, i, __LINE__, "crypto op processing failed");
8506 		ret = TEST_FAILED;
8507 		goto on_err;
8508 	}
8509 
8510 	/* Validate obuf */
8511 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8512 			uint8_t *);
8513 	if (oop) {
8514 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8515 				uint8_t *);
8516 	}
8517 	if (fragsz_oop)
8518 		fragsz = frag_size_oop;
8519 	if (memcmp(ciphertext, output_vec, fragsz)) {
8520 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8521 		rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8522 		rte_hexdump(stdout, "reference", output_vec, fragsz);
8523 		ret = TEST_FAILED;
8524 		goto on_err;
8525 	}
8526 
8527 	buf = ut_params->op->sym->m_src->next;
8528 	if (oop)
8529 		buf = ut_params->op->sym->m_dst->next;
8530 
8531 	unsigned int off = fragsz;
8532 
8533 	ecx = 0;
8534 	while (buf) {
8535 		ciphertext = rte_pktmbuf_mtod(buf,
8536 				uint8_t *);
8537 		if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8538 			printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8539 			rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8540 			rte_hexdump(stdout, "reference", output_vec + off,
8541 					to_trn_tbl[ecx]);
8542 			ret = TEST_FAILED;
8543 			goto on_err;
8544 		}
8545 		off += to_trn_tbl[ecx++];
8546 		buf = buf->next;
8547 	}
8548 on_err:
8549 	rte_crypto_op_free(ut_params->op);
8550 	ut_params->op = NULL;
8551 
8552 	if (ut_params->sec_session)
8553 		rte_security_session_destroy(ctx, ut_params->sec_session);
8554 	ut_params->sec_session = NULL;
8555 
8556 	rte_pktmbuf_free(ut_params->ibuf);
8557 	ut_params->ibuf = NULL;
8558 	if (oop) {
8559 		rte_pktmbuf_free(ut_params->obuf);
8560 		ut_params->obuf = NULL;
8561 	}
8562 
8563 	return ret;
8564 }
8565 
8566 int
8567 test_pdcp_proto_cplane_encap(int i)
8568 {
8569 	return test_pdcp_proto(
8570 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8571 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8572 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8573 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8574 		pdcp_test_params[i].cipher_key_len,
8575 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8576 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8577 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8578 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8579 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8580 }
8581 
8582 int
8583 test_pdcp_proto_uplane_encap(int i)
8584 {
8585 	return test_pdcp_proto(
8586 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8587 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8588 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8589 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8590 		pdcp_test_params[i].cipher_key_len,
8591 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8592 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8593 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8594 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8595 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8596 }
8597 
8598 int
8599 test_pdcp_proto_uplane_encap_with_int(int i)
8600 {
8601 	return test_pdcp_proto(
8602 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8603 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8604 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8605 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8606 		pdcp_test_params[i].cipher_key_len,
8607 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8608 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8609 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8610 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8611 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8612 }
8613 
8614 int
8615 test_pdcp_proto_cplane_decap(int i)
8616 {
8617 	return test_pdcp_proto(
8618 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8619 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8620 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8621 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8622 		pdcp_test_params[i].cipher_key_len,
8623 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8624 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8625 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8626 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8627 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8628 }
8629 
8630 int
8631 test_pdcp_proto_uplane_decap(int i)
8632 {
8633 	return test_pdcp_proto(
8634 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8635 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8636 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8637 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8638 		pdcp_test_params[i].cipher_key_len,
8639 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8640 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8641 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8642 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8643 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8644 }
8645 
8646 int
8647 test_pdcp_proto_uplane_decap_with_int(int i)
8648 {
8649 	return test_pdcp_proto(
8650 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8651 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8652 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8653 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8654 		pdcp_test_params[i].cipher_key_len,
8655 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8656 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8657 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8658 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8659 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8660 }
8661 
8662 static int
8663 test_PDCP_PROTO_SGL_in_place_32B(void)
8664 {
8665 	/* i can be used for running any PDCP case
8666 	 * In this case it is uplane 12-bit AES-SNOW DL encap
8667 	 */
8668 	int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8669 	return test_pdcp_proto_SGL(i, IN_PLACE,
8670 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8671 			RTE_CRYPTO_AUTH_OP_GENERATE,
8672 			pdcp_test_data_in[i],
8673 			pdcp_test_data_in_len[i],
8674 			pdcp_test_data_out[i],
8675 			pdcp_test_data_in_len[i]+4,
8676 			32, 0);
8677 }
8678 static int
8679 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8680 {
8681 	/* i can be used for running any PDCP case
8682 	 * In this case it is uplane 18-bit NULL-NULL DL encap
8683 	 */
8684 	int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8685 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8686 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8687 			RTE_CRYPTO_AUTH_OP_GENERATE,
8688 			pdcp_test_data_in[i],
8689 			pdcp_test_data_in_len[i],
8690 			pdcp_test_data_out[i],
8691 			pdcp_test_data_in_len[i]+4,
8692 			32, 128);
8693 }
8694 static int
8695 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8696 {
8697 	/* i can be used for running any PDCP case
8698 	 * In this case it is uplane 18-bit AES DL encap
8699 	 */
8700 	int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8701 			+ DOWNLINK;
8702 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8703 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8704 			RTE_CRYPTO_AUTH_OP_GENERATE,
8705 			pdcp_test_data_in[i],
8706 			pdcp_test_data_in_len[i],
8707 			pdcp_test_data_out[i],
8708 			pdcp_test_data_in_len[i],
8709 			32, 40);
8710 }
8711 static int
8712 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8713 {
8714 	/* i can be used for running any PDCP case
8715 	 * In this case it is cplane 12-bit AES-ZUC DL encap
8716 	 */
8717 	int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8718 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8719 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8720 			RTE_CRYPTO_AUTH_OP_GENERATE,
8721 			pdcp_test_data_in[i],
8722 			pdcp_test_data_in_len[i],
8723 			pdcp_test_data_out[i],
8724 			pdcp_test_data_in_len[i]+4,
8725 			128, 32);
8726 }
8727 
8728 static int
8729 test_PDCP_SDAP_PROTO_encap_all(void)
8730 {
8731 	int i = 0, size = 0;
8732 	int err, all_err = TEST_SUCCESS;
8733 	const struct pdcp_sdap_test *cur_test;
8734 
8735 	size = RTE_DIM(list_pdcp_sdap_tests);
8736 
8737 	for (i = 0; i < size; i++) {
8738 		cur_test = &list_pdcp_sdap_tests[i];
8739 		err = test_pdcp_proto(
8740 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8741 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8742 			cur_test->in_len, cur_test->data_out,
8743 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8744 			cur_test->param.cipher_alg, cur_test->cipher_key,
8745 			cur_test->param.cipher_key_len,
8746 			cur_test->param.auth_alg,
8747 			cur_test->auth_key, cur_test->param.auth_key_len,
8748 			cur_test->bearer, cur_test->param.domain,
8749 			cur_test->packet_direction, cur_test->sn_size,
8750 			cur_test->hfn,
8751 			cur_test->hfn_threshold, SDAP_ENABLED);
8752 		if (err) {
8753 			printf("\t%d) %s: Encapsulation failed\n",
8754 					cur_test->test_idx,
8755 					cur_test->param.name);
8756 			err = TEST_FAILED;
8757 		} else {
8758 			printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
8759 					cur_test->param.name);
8760 			err = TEST_SUCCESS;
8761 		}
8762 		all_err += err;
8763 	}
8764 
8765 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8766 
8767 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8768 }
8769 
8770 static int
8771 test_PDCP_PROTO_short_mac(void)
8772 {
8773 	int i = 0, size = 0;
8774 	int err, all_err = TEST_SUCCESS;
8775 	const struct pdcp_short_mac_test *cur_test;
8776 
8777 	size = RTE_DIM(list_pdcp_smac_tests);
8778 
8779 	for (i = 0; i < size; i++) {
8780 		cur_test = &list_pdcp_smac_tests[i];
8781 		err = test_pdcp_proto(
8782 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8783 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8784 			cur_test->in_len, cur_test->data_out,
8785 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8786 			RTE_CRYPTO_CIPHER_NULL, NULL,
8787 			0, cur_test->param.auth_alg,
8788 			cur_test->auth_key, cur_test->param.auth_key_len,
8789 			0, cur_test->param.domain, 0, 0,
8790 			0, 0, 0);
8791 		if (err) {
8792 			printf("\t%d) %s: Short MAC test failed\n",
8793 					cur_test->test_idx,
8794 					cur_test->param.name);
8795 			err = TEST_FAILED;
8796 		} else {
8797 			printf("\t%d) %s: Short MAC test PASS\n",
8798 					cur_test->test_idx,
8799 					cur_test->param.name);
8800 			rte_hexdump(stdout, "MAC I",
8801 				    cur_test->data_out + cur_test->in_len + 2,
8802 				    2);
8803 			err = TEST_SUCCESS;
8804 		}
8805 		all_err += err;
8806 	}
8807 
8808 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8809 
8810 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8811 
8812 }
8813 
8814 static int
8815 test_PDCP_SDAP_PROTO_decap_all(void)
8816 {
8817 	int i = 0, size = 0;
8818 	int err, all_err = TEST_SUCCESS;
8819 	const struct pdcp_sdap_test *cur_test;
8820 
8821 	size = RTE_DIM(list_pdcp_sdap_tests);
8822 
8823 	for (i = 0; i < size; i++) {
8824 		cur_test = &list_pdcp_sdap_tests[i];
8825 		err = test_pdcp_proto(
8826 			i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
8827 			RTE_CRYPTO_AUTH_OP_VERIFY,
8828 			cur_test->data_out,
8829 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8830 			cur_test->data_in, cur_test->in_len,
8831 			cur_test->param.cipher_alg,
8832 			cur_test->cipher_key, cur_test->param.cipher_key_len,
8833 			cur_test->param.auth_alg, cur_test->auth_key,
8834 			cur_test->param.auth_key_len, cur_test->bearer,
8835 			cur_test->param.domain, cur_test->packet_direction,
8836 			cur_test->sn_size, cur_test->hfn,
8837 			cur_test->hfn_threshold, SDAP_ENABLED);
8838 		if (err) {
8839 			printf("\t%d) %s: Decapsulation failed\n",
8840 					cur_test->test_idx,
8841 					cur_test->param.name);
8842 			err = TEST_FAILED;
8843 		} else {
8844 			printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
8845 					cur_test->param.name);
8846 			err = TEST_SUCCESS;
8847 		}
8848 		all_err += err;
8849 	}
8850 
8851 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8852 
8853 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8854 }
8855 
8856 static int
8857 test_PDCP_PROTO_all(void)
8858 {
8859 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8860 	struct crypto_unittest_params *ut_params = &unittest_params;
8861 	struct rte_cryptodev_info dev_info;
8862 	int status;
8863 
8864 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8865 	uint64_t feat_flags = dev_info.feature_flags;
8866 
8867 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8868 		return TEST_SKIPPED;
8869 
8870 	/* Set action type */
8871 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8872 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8873 		gbl_action_type;
8874 
8875 	if (security_proto_supported(ut_params->type,
8876 			RTE_SECURITY_PROTOCOL_PDCP) < 0)
8877 		return TEST_SKIPPED;
8878 
8879 	status = test_PDCP_PROTO_cplane_encap_all();
8880 	status += test_PDCP_PROTO_cplane_decap_all();
8881 	status += test_PDCP_PROTO_uplane_encap_all();
8882 	status += test_PDCP_PROTO_uplane_decap_all();
8883 	status += test_PDCP_PROTO_SGL_in_place_32B();
8884 	status += test_PDCP_PROTO_SGL_oop_32B_128B();
8885 	status += test_PDCP_PROTO_SGL_oop_32B_40B();
8886 	status += test_PDCP_PROTO_SGL_oop_128B_32B();
8887 	status += test_PDCP_SDAP_PROTO_encap_all();
8888 	status += test_PDCP_SDAP_PROTO_decap_all();
8889 
8890 	if (status)
8891 		return TEST_FAILED;
8892 	else
8893 		return TEST_SUCCESS;
8894 }
8895 
8896 static int
8897 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td)
8898 {
8899 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8900 	struct crypto_unittest_params *ut_params = &unittest_params;
8901 	uint8_t *plaintext, *ciphertext;
8902 	uint8_t *iv_ptr;
8903 	int32_t cipher_len, crc_len;
8904 	uint32_t crc_data_len;
8905 	int ret = TEST_SUCCESS;
8906 
8907 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8908 					rte_cryptodev_get_sec_ctx(
8909 						ts_params->valid_devs[0]);
8910 
8911 	/* Verify the capabilities */
8912 	struct rte_security_capability_idx sec_cap_idx;
8913 	const struct rte_security_capability *sec_cap;
8914 	const struct rte_cryptodev_capabilities *crypto_cap;
8915 	const struct rte_cryptodev_symmetric_capability *sym_cap;
8916 	int j = 0;
8917 
8918 	sec_cap_idx.action = ut_params->type;
8919 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8920 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
8921 
8922 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8923 	if (sec_cap == NULL)
8924 		return TEST_SKIPPED;
8925 
8926 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8927 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8928 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8929 				crypto_cap->sym.xform_type ==
8930 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
8931 				crypto_cap->sym.cipher.algo ==
8932 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8933 			sym_cap = &crypto_cap->sym;
8934 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8935 						d_td->key.len,
8936 						d_td->iv.len) == 0)
8937 				break;
8938 		}
8939 	}
8940 
8941 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8942 		return TEST_SKIPPED;
8943 
8944 	/* Setup source mbuf payload */
8945 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8946 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8947 			rte_pktmbuf_tailroom(ut_params->ibuf));
8948 
8949 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8950 			d_td->ciphertext.len);
8951 
8952 	memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
8953 
8954 	/* Setup cipher session parameters */
8955 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8956 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8957 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
8958 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8959 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8960 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8961 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8962 	ut_params->cipher_xform.next = NULL;
8963 
8964 	/* Setup DOCSIS session parameters */
8965 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
8966 
8967 	struct rte_security_session_conf sess_conf = {
8968 		.action_type = ut_params->type,
8969 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8970 		.docsis = ut_params->docsis_xform,
8971 		.crypto_xform = &ut_params->cipher_xform,
8972 	};
8973 
8974 	/* Create security session */
8975 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8976 					ts_params->session_mpool,
8977 					ts_params->session_priv_mpool);
8978 
8979 	if (!ut_params->sec_session) {
8980 		printf("TestCase %s(%d) line %d: %s\n",
8981 			__func__, i, __LINE__, "failed to allocate session");
8982 		ret = TEST_FAILED;
8983 		goto on_err;
8984 	}
8985 
8986 	/* Generate crypto op data structure */
8987 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8988 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8989 	if (!ut_params->op) {
8990 		printf("TestCase %s(%d) line %d: %s\n",
8991 			__func__, i, __LINE__,
8992 			"failed to allocate symmetric crypto operation");
8993 		ret = TEST_FAILED;
8994 		goto on_err;
8995 	}
8996 
8997 	/* Setup CRC operation parameters */
8998 	crc_len = d_td->ciphertext.no_crc == false ?
8999 			(d_td->ciphertext.len -
9000 				d_td->ciphertext.crc_offset -
9001 				RTE_ETHER_CRC_LEN) :
9002 			0;
9003 	crc_len = crc_len > 0 ? crc_len : 0;
9004 	crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
9005 	ut_params->op->sym->auth.data.length = crc_len;
9006 	ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
9007 
9008 	/* Setup cipher operation parameters */
9009 	cipher_len = d_td->ciphertext.no_cipher == false ?
9010 			(d_td->ciphertext.len -
9011 				d_td->ciphertext.cipher_offset) :
9012 			0;
9013 	cipher_len = cipher_len > 0 ? cipher_len : 0;
9014 	ut_params->op->sym->cipher.data.length = cipher_len;
9015 	ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
9016 
9017 	/* Setup cipher IV */
9018 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9019 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9020 
9021 	/* Attach session to operation */
9022 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
9023 
9024 	/* Set crypto operation mbufs */
9025 	ut_params->op->sym->m_src = ut_params->ibuf;
9026 	ut_params->op->sym->m_dst = NULL;
9027 
9028 	/* Process crypto operation */
9029 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9030 			NULL) {
9031 		printf("TestCase %s(%d) line %d: %s\n",
9032 			__func__, i, __LINE__,
9033 			"failed to process security crypto op");
9034 		ret = TEST_FAILED;
9035 		goto on_err;
9036 	}
9037 
9038 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9039 		printf("TestCase %s(%d) line %d: %s\n",
9040 			__func__, i, __LINE__, "crypto op processing failed");
9041 		ret = TEST_FAILED;
9042 		goto on_err;
9043 	}
9044 
9045 	/* Validate plaintext */
9046 	plaintext = ciphertext;
9047 
9048 	if (memcmp(plaintext, d_td->plaintext.data,
9049 			d_td->plaintext.len - crc_data_len)) {
9050 		printf("TestCase %s(%d) line %d: %s\n",
9051 			__func__, i, __LINE__, "plaintext not as expected\n");
9052 		rte_hexdump(stdout, "expected", d_td->plaintext.data,
9053 				d_td->plaintext.len);
9054 		rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
9055 		ret = TEST_FAILED;
9056 		goto on_err;
9057 	}
9058 
9059 on_err:
9060 	rte_crypto_op_free(ut_params->op);
9061 	ut_params->op = NULL;
9062 
9063 	if (ut_params->sec_session)
9064 		rte_security_session_destroy(ctx, ut_params->sec_session);
9065 	ut_params->sec_session = NULL;
9066 
9067 	rte_pktmbuf_free(ut_params->ibuf);
9068 	ut_params->ibuf = NULL;
9069 
9070 	return ret;
9071 }
9072 
9073 static int
9074 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td)
9075 {
9076 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9077 	struct crypto_unittest_params *ut_params = &unittest_params;
9078 	uint8_t *plaintext, *ciphertext;
9079 	uint8_t *iv_ptr;
9080 	int32_t cipher_len, crc_len;
9081 	int ret = TEST_SUCCESS;
9082 
9083 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9084 					rte_cryptodev_get_sec_ctx(
9085 						ts_params->valid_devs[0]);
9086 
9087 	/* Verify the capabilities */
9088 	struct rte_security_capability_idx sec_cap_idx;
9089 	const struct rte_security_capability *sec_cap;
9090 	const struct rte_cryptodev_capabilities *crypto_cap;
9091 	const struct rte_cryptodev_symmetric_capability *sym_cap;
9092 	int j = 0;
9093 
9094 	sec_cap_idx.action = ut_params->type;
9095 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9096 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9097 
9098 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9099 	if (sec_cap == NULL)
9100 		return TEST_SKIPPED;
9101 
9102 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9103 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9104 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9105 				crypto_cap->sym.xform_type ==
9106 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
9107 				crypto_cap->sym.cipher.algo ==
9108 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9109 			sym_cap = &crypto_cap->sym;
9110 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9111 						d_td->key.len,
9112 						d_td->iv.len) == 0)
9113 				break;
9114 		}
9115 	}
9116 
9117 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9118 		return TEST_SKIPPED;
9119 
9120 	/* Setup source mbuf payload */
9121 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9122 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9123 			rte_pktmbuf_tailroom(ut_params->ibuf));
9124 
9125 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9126 			d_td->plaintext.len);
9127 
9128 	memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
9129 
9130 	/* Setup cipher session parameters */
9131 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9132 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9133 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9134 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9135 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9136 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9137 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9138 	ut_params->cipher_xform.next = NULL;
9139 
9140 	/* Setup DOCSIS session parameters */
9141 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9142 
9143 	struct rte_security_session_conf sess_conf = {
9144 		.action_type = ut_params->type,
9145 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9146 		.docsis = ut_params->docsis_xform,
9147 		.crypto_xform = &ut_params->cipher_xform,
9148 	};
9149 
9150 	/* Create security session */
9151 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9152 					ts_params->session_mpool,
9153 					ts_params->session_priv_mpool);
9154 
9155 	if (!ut_params->sec_session) {
9156 		printf("TestCase %s(%d) line %d: %s\n",
9157 			__func__, i, __LINE__, "failed to allocate session");
9158 		ret = TEST_FAILED;
9159 		goto on_err;
9160 	}
9161 
9162 	/* Generate crypto op data structure */
9163 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9164 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9165 	if (!ut_params->op) {
9166 		printf("TestCase %s(%d) line %d: %s\n",
9167 			__func__, i, __LINE__,
9168 			"failed to allocate security crypto operation");
9169 		ret = TEST_FAILED;
9170 		goto on_err;
9171 	}
9172 
9173 	/* Setup CRC operation parameters */
9174 	crc_len = d_td->plaintext.no_crc == false ?
9175 			(d_td->plaintext.len -
9176 				d_td->plaintext.crc_offset -
9177 				RTE_ETHER_CRC_LEN) :
9178 			0;
9179 	crc_len = crc_len > 0 ? crc_len : 0;
9180 	ut_params->op->sym->auth.data.length = crc_len;
9181 	ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
9182 
9183 	/* Setup cipher operation parameters */
9184 	cipher_len = d_td->plaintext.no_cipher == false ?
9185 			(d_td->plaintext.len -
9186 				d_td->plaintext.cipher_offset) :
9187 			0;
9188 	cipher_len = cipher_len > 0 ? cipher_len : 0;
9189 	ut_params->op->sym->cipher.data.length = cipher_len;
9190 	ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
9191 
9192 	/* Setup cipher IV */
9193 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9194 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9195 
9196 	/* Attach session to operation */
9197 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
9198 
9199 	/* Set crypto operation mbufs */
9200 	ut_params->op->sym->m_src = ut_params->ibuf;
9201 	ut_params->op->sym->m_dst = NULL;
9202 
9203 	/* Process crypto operation */
9204 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9205 			NULL) {
9206 		printf("TestCase %s(%d) line %d: %s\n",
9207 			__func__, i, __LINE__,
9208 			"failed to process security crypto op");
9209 		ret = TEST_FAILED;
9210 		goto on_err;
9211 	}
9212 
9213 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9214 		printf("TestCase %s(%d) line %d: %s\n",
9215 			__func__, i, __LINE__, "crypto op processing failed");
9216 		ret = TEST_FAILED;
9217 		goto on_err;
9218 	}
9219 
9220 	/* Validate ciphertext */
9221 	ciphertext = plaintext;
9222 
9223 	if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
9224 		printf("TestCase %s(%d) line %d: %s\n",
9225 			__func__, i, __LINE__, "ciphertext not as expected\n");
9226 		rte_hexdump(stdout, "expected", d_td->ciphertext.data,
9227 				d_td->ciphertext.len);
9228 		rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
9229 		ret = TEST_FAILED;
9230 		goto on_err;
9231 	}
9232 
9233 on_err:
9234 	rte_crypto_op_free(ut_params->op);
9235 	ut_params->op = NULL;
9236 
9237 	if (ut_params->sec_session)
9238 		rte_security_session_destroy(ctx, ut_params->sec_session);
9239 	ut_params->sec_session = NULL;
9240 
9241 	rte_pktmbuf_free(ut_params->ibuf);
9242 	ut_params->ibuf = NULL;
9243 
9244 	return ret;
9245 }
9246 
9247 #define TEST_DOCSIS_COUNT(func) do {			\
9248 	int ret = func;					\
9249 	if (ret == TEST_SUCCESS)  {			\
9250 		printf("\t%2d)", n++);			\
9251 		printf("+++++ PASSED:" #func"\n");	\
9252 		p++;					\
9253 	} else if (ret == TEST_SKIPPED) {		\
9254 		printf("\t%2d)", n++);			\
9255 		printf("~~~~~ SKIPPED:" #func"\n");	\
9256 		s++;					\
9257 	} else {					\
9258 		printf("\t%2d)", n++);			\
9259 		printf("----- FAILED:" #func"\n");	\
9260 		f++;					\
9261 	}						\
9262 } while (0)
9263 
9264 static int
9265 test_DOCSIS_PROTO_uplink_all(void)
9266 {
9267 	int p = 0, s = 0, f = 0, n = 0;
9268 
9269 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1));
9270 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2));
9271 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3));
9272 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4));
9273 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5));
9274 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6));
9275 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7));
9276 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8));
9277 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9));
9278 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10));
9279 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11));
9280 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12));
9281 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13));
9282 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14));
9283 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15));
9284 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16));
9285 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17));
9286 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18));
9287 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19));
9288 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20));
9289 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21));
9290 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22));
9291 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23));
9292 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24));
9293 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25));
9294 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26));
9295 
9296 	if (f)
9297 		printf("## %s: %d passed out of %d (%d skipped)\n",
9298 			__func__, p, n, s);
9299 
9300 	return f;
9301 };
9302 
9303 static int
9304 test_DOCSIS_PROTO_downlink_all(void)
9305 {
9306 	int p = 0, s = 0, f = 0, n = 0;
9307 
9308 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1));
9309 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2));
9310 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3));
9311 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4));
9312 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5));
9313 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6));
9314 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7));
9315 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8));
9316 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9));
9317 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10));
9318 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11));
9319 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12));
9320 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13));
9321 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14));
9322 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15));
9323 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16));
9324 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17));
9325 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18));
9326 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19));
9327 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20));
9328 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21));
9329 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22));
9330 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23));
9331 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24));
9332 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25));
9333 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26));
9334 
9335 	if (f)
9336 		printf("## %s: %d passed out of %d (%d skipped)\n",
9337 			__func__, p, n, s);
9338 
9339 	return f;
9340 };
9341 
9342 static int
9343 test_DOCSIS_PROTO_all(void)
9344 {
9345 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9346 	struct crypto_unittest_params *ut_params = &unittest_params;
9347 	struct rte_cryptodev_info dev_info;
9348 	int status;
9349 
9350 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9351 	uint64_t feat_flags = dev_info.feature_flags;
9352 
9353 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9354 		return TEST_SKIPPED;
9355 
9356 	/* Set action type */
9357 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9358 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9359 		gbl_action_type;
9360 
9361 	if (security_proto_supported(ut_params->type,
9362 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
9363 		return TEST_SKIPPED;
9364 
9365 	status = test_DOCSIS_PROTO_uplink_all();
9366 	status += test_DOCSIS_PROTO_downlink_all();
9367 
9368 	if (status)
9369 		return TEST_FAILED;
9370 	else
9371 		return TEST_SUCCESS;
9372 }
9373 #endif
9374 
9375 static int
9376 test_AES_GCM_authenticated_encryption_test_case_1(void)
9377 {
9378 	return test_authenticated_encryption(&gcm_test_case_1);
9379 }
9380 
9381 static int
9382 test_AES_GCM_authenticated_encryption_test_case_2(void)
9383 {
9384 	return test_authenticated_encryption(&gcm_test_case_2);
9385 }
9386 
9387 static int
9388 test_AES_GCM_authenticated_encryption_test_case_3(void)
9389 {
9390 	return test_authenticated_encryption(&gcm_test_case_3);
9391 }
9392 
9393 static int
9394 test_AES_GCM_authenticated_encryption_test_case_4(void)
9395 {
9396 	return test_authenticated_encryption(&gcm_test_case_4);
9397 }
9398 
9399 static int
9400 test_AES_GCM_authenticated_encryption_test_case_5(void)
9401 {
9402 	return test_authenticated_encryption(&gcm_test_case_5);
9403 }
9404 
9405 static int
9406 test_AES_GCM_authenticated_encryption_test_case_6(void)
9407 {
9408 	return test_authenticated_encryption(&gcm_test_case_6);
9409 }
9410 
9411 static int
9412 test_AES_GCM_authenticated_encryption_test_case_7(void)
9413 {
9414 	return test_authenticated_encryption(&gcm_test_case_7);
9415 }
9416 
9417 static int
9418 test_AES_GCM_authenticated_encryption_test_case_8(void)
9419 {
9420 	return test_authenticated_encryption(&gcm_test_case_8);
9421 }
9422 
9423 static int
9424 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
9425 {
9426 	return test_authenticated_encryption(&gcm_J0_test_case_1);
9427 }
9428 
9429 static int
9430 test_AES_GCM_auth_encryption_test_case_192_1(void)
9431 {
9432 	return test_authenticated_encryption(&gcm_test_case_192_1);
9433 }
9434 
9435 static int
9436 test_AES_GCM_auth_encryption_test_case_192_2(void)
9437 {
9438 	return test_authenticated_encryption(&gcm_test_case_192_2);
9439 }
9440 
9441 static int
9442 test_AES_GCM_auth_encryption_test_case_192_3(void)
9443 {
9444 	return test_authenticated_encryption(&gcm_test_case_192_3);
9445 }
9446 
9447 static int
9448 test_AES_GCM_auth_encryption_test_case_192_4(void)
9449 {
9450 	return test_authenticated_encryption(&gcm_test_case_192_4);
9451 }
9452 
9453 static int
9454 test_AES_GCM_auth_encryption_test_case_192_5(void)
9455 {
9456 	return test_authenticated_encryption(&gcm_test_case_192_5);
9457 }
9458 
9459 static int
9460 test_AES_GCM_auth_encryption_test_case_192_6(void)
9461 {
9462 	return test_authenticated_encryption(&gcm_test_case_192_6);
9463 }
9464 
9465 static int
9466 test_AES_GCM_auth_encryption_test_case_192_7(void)
9467 {
9468 	return test_authenticated_encryption(&gcm_test_case_192_7);
9469 }
9470 
9471 static int
9472 test_AES_GCM_auth_encryption_test_case_256_1(void)
9473 {
9474 	return test_authenticated_encryption(&gcm_test_case_256_1);
9475 }
9476 
9477 static int
9478 test_AES_GCM_auth_encryption_test_case_256_2(void)
9479 {
9480 	return test_authenticated_encryption(&gcm_test_case_256_2);
9481 }
9482 
9483 static int
9484 test_AES_GCM_auth_encryption_test_case_256_3(void)
9485 {
9486 	return test_authenticated_encryption(&gcm_test_case_256_3);
9487 }
9488 
9489 static int
9490 test_AES_GCM_auth_encryption_test_case_256_4(void)
9491 {
9492 	return test_authenticated_encryption(&gcm_test_case_256_4);
9493 }
9494 
9495 static int
9496 test_AES_GCM_auth_encryption_test_case_256_5(void)
9497 {
9498 	return test_authenticated_encryption(&gcm_test_case_256_5);
9499 }
9500 
9501 static int
9502 test_AES_GCM_auth_encryption_test_case_256_6(void)
9503 {
9504 	return test_authenticated_encryption(&gcm_test_case_256_6);
9505 }
9506 
9507 static int
9508 test_AES_GCM_auth_encryption_test_case_256_7(void)
9509 {
9510 	return test_authenticated_encryption(&gcm_test_case_256_7);
9511 }
9512 
9513 static int
9514 test_AES_GCM_auth_encryption_test_case_aad_1(void)
9515 {
9516 	return test_authenticated_encryption(&gcm_test_case_aad_1);
9517 }
9518 
9519 static int
9520 test_AES_GCM_auth_encryption_test_case_aad_2(void)
9521 {
9522 	return test_authenticated_encryption(&gcm_test_case_aad_2);
9523 }
9524 
9525 static int
9526 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
9527 {
9528 	struct aead_test_data tdata;
9529 	int res;
9530 
9531 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9532 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9533 	tdata.iv.data[0] += 1;
9534 	res = test_authenticated_encryption(&tdata);
9535 	if (res == TEST_SKIPPED)
9536 		return res;
9537 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9538 	return TEST_SUCCESS;
9539 }
9540 
9541 static int
9542 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
9543 {
9544 	struct aead_test_data tdata;
9545 	int res;
9546 
9547 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9548 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9549 	tdata.plaintext.data[0] += 1;
9550 	res = test_authenticated_encryption(&tdata);
9551 	if (res == TEST_SKIPPED)
9552 		return res;
9553 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9554 	return TEST_SUCCESS;
9555 }
9556 
9557 static int
9558 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
9559 {
9560 	struct aead_test_data tdata;
9561 	int res;
9562 
9563 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9564 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9565 	tdata.ciphertext.data[0] += 1;
9566 	res = test_authenticated_encryption(&tdata);
9567 	if (res == TEST_SKIPPED)
9568 		return res;
9569 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9570 	return TEST_SUCCESS;
9571 }
9572 
9573 static int
9574 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
9575 {
9576 	struct aead_test_data tdata;
9577 	int res;
9578 
9579 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9580 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9581 	tdata.aad.len += 1;
9582 	res = test_authenticated_encryption(&tdata);
9583 	if (res == TEST_SKIPPED)
9584 		return res;
9585 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9586 	return TEST_SUCCESS;
9587 }
9588 
9589 static int
9590 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
9591 {
9592 	struct aead_test_data tdata;
9593 	uint8_t aad[gcm_test_case_7.aad.len];
9594 	int res;
9595 
9596 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9597 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9598 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9599 	aad[0] += 1;
9600 	tdata.aad.data = aad;
9601 	res = test_authenticated_encryption(&tdata);
9602 	if (res == TEST_SKIPPED)
9603 		return res;
9604 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9605 	return TEST_SUCCESS;
9606 }
9607 
9608 static int
9609 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
9610 {
9611 	struct aead_test_data tdata;
9612 	int res;
9613 
9614 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9615 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9616 	tdata.auth_tag.data[0] += 1;
9617 	res = test_authenticated_encryption(&tdata);
9618 	if (res == TEST_SKIPPED)
9619 		return res;
9620 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9621 	return TEST_SUCCESS;
9622 }
9623 
9624 static int
9625 test_authenticated_decryption(const struct aead_test_data *tdata)
9626 {
9627 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9628 	struct crypto_unittest_params *ut_params = &unittest_params;
9629 
9630 	int retval;
9631 	uint8_t *plaintext;
9632 	uint32_t i;
9633 	struct rte_cryptodev_info dev_info;
9634 
9635 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9636 	uint64_t feat_flags = dev_info.feature_flags;
9637 
9638 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9639 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9640 		printf("Device doesn't support RAW data-path APIs.\n");
9641 		return TEST_SKIPPED;
9642 	}
9643 
9644 	/* Verify the capabilities */
9645 	struct rte_cryptodev_sym_capability_idx cap_idx;
9646 	const struct rte_cryptodev_symmetric_capability *capability;
9647 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9648 	cap_idx.algo.aead = tdata->algo;
9649 	capability = rte_cryptodev_sym_capability_get(
9650 			ts_params->valid_devs[0], &cap_idx);
9651 	if (capability == NULL)
9652 		return TEST_SKIPPED;
9653 	if (rte_cryptodev_sym_capability_check_aead(
9654 			capability, tdata->key.len, tdata->auth_tag.len,
9655 			tdata->aad.len, tdata->iv.len))
9656 		return TEST_SKIPPED;
9657 
9658 	/* Create AEAD session */
9659 	retval = create_aead_session(ts_params->valid_devs[0],
9660 			tdata->algo,
9661 			RTE_CRYPTO_AEAD_OP_DECRYPT,
9662 			tdata->key.data, tdata->key.len,
9663 			tdata->aad.len, tdata->auth_tag.len,
9664 			tdata->iv.len);
9665 	if (retval < 0)
9666 		return retval;
9667 
9668 	/* alloc mbuf and set payload */
9669 	if (tdata->aad.len > MBUF_SIZE) {
9670 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
9671 		/* Populate full size of add data */
9672 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
9673 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
9674 	} else
9675 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9676 
9677 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9678 			rte_pktmbuf_tailroom(ut_params->ibuf));
9679 
9680 	/* Create AEAD operation */
9681 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9682 	if (retval < 0)
9683 		return retval;
9684 
9685 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9686 
9687 	ut_params->op->sym->m_src = ut_params->ibuf;
9688 
9689 	/* Process crypto operation */
9690 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9691 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
9692 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9693 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9694 				ut_params->op, 0, 0, 0, 0);
9695 	else
9696 		TEST_ASSERT_NOT_NULL(
9697 			process_crypto_request(ts_params->valid_devs[0],
9698 			ut_params->op), "failed to process sym crypto op");
9699 
9700 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9701 			"crypto op processing failed");
9702 
9703 	if (ut_params->op->sym->m_dst)
9704 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
9705 				uint8_t *);
9706 	else
9707 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
9708 				uint8_t *,
9709 				ut_params->op->sym->cipher.data.offset);
9710 
9711 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9712 
9713 	/* Validate obuf */
9714 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9715 			plaintext,
9716 			tdata->plaintext.data,
9717 			tdata->plaintext.len,
9718 			"Plaintext data not as expected");
9719 
9720 	TEST_ASSERT_EQUAL(ut_params->op->status,
9721 			RTE_CRYPTO_OP_STATUS_SUCCESS,
9722 			"Authentication failed");
9723 
9724 	return 0;
9725 }
9726 
9727 static int
9728 test_AES_GCM_authenticated_decryption_test_case_1(void)
9729 {
9730 	return test_authenticated_decryption(&gcm_test_case_1);
9731 }
9732 
9733 static int
9734 test_AES_GCM_authenticated_decryption_test_case_2(void)
9735 {
9736 	return test_authenticated_decryption(&gcm_test_case_2);
9737 }
9738 
9739 static int
9740 test_AES_GCM_authenticated_decryption_test_case_3(void)
9741 {
9742 	return test_authenticated_decryption(&gcm_test_case_3);
9743 }
9744 
9745 static int
9746 test_AES_GCM_authenticated_decryption_test_case_4(void)
9747 {
9748 	return test_authenticated_decryption(&gcm_test_case_4);
9749 }
9750 
9751 static int
9752 test_AES_GCM_authenticated_decryption_test_case_5(void)
9753 {
9754 	return test_authenticated_decryption(&gcm_test_case_5);
9755 }
9756 
9757 static int
9758 test_AES_GCM_authenticated_decryption_test_case_6(void)
9759 {
9760 	return test_authenticated_decryption(&gcm_test_case_6);
9761 }
9762 
9763 static int
9764 test_AES_GCM_authenticated_decryption_test_case_7(void)
9765 {
9766 	return test_authenticated_decryption(&gcm_test_case_7);
9767 }
9768 
9769 static int
9770 test_AES_GCM_authenticated_decryption_test_case_8(void)
9771 {
9772 	return test_authenticated_decryption(&gcm_test_case_8);
9773 }
9774 
9775 static int
9776 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
9777 {
9778 	return test_authenticated_decryption(&gcm_J0_test_case_1);
9779 }
9780 
9781 static int
9782 test_AES_GCM_auth_decryption_test_case_192_1(void)
9783 {
9784 	return test_authenticated_decryption(&gcm_test_case_192_1);
9785 }
9786 
9787 static int
9788 test_AES_GCM_auth_decryption_test_case_192_2(void)
9789 {
9790 	return test_authenticated_decryption(&gcm_test_case_192_2);
9791 }
9792 
9793 static int
9794 test_AES_GCM_auth_decryption_test_case_192_3(void)
9795 {
9796 	return test_authenticated_decryption(&gcm_test_case_192_3);
9797 }
9798 
9799 static int
9800 test_AES_GCM_auth_decryption_test_case_192_4(void)
9801 {
9802 	return test_authenticated_decryption(&gcm_test_case_192_4);
9803 }
9804 
9805 static int
9806 test_AES_GCM_auth_decryption_test_case_192_5(void)
9807 {
9808 	return test_authenticated_decryption(&gcm_test_case_192_5);
9809 }
9810 
9811 static int
9812 test_AES_GCM_auth_decryption_test_case_192_6(void)
9813 {
9814 	return test_authenticated_decryption(&gcm_test_case_192_6);
9815 }
9816 
9817 static int
9818 test_AES_GCM_auth_decryption_test_case_192_7(void)
9819 {
9820 	return test_authenticated_decryption(&gcm_test_case_192_7);
9821 }
9822 
9823 static int
9824 test_AES_GCM_auth_decryption_test_case_256_1(void)
9825 {
9826 	return test_authenticated_decryption(&gcm_test_case_256_1);
9827 }
9828 
9829 static int
9830 test_AES_GCM_auth_decryption_test_case_256_2(void)
9831 {
9832 	return test_authenticated_decryption(&gcm_test_case_256_2);
9833 }
9834 
9835 static int
9836 test_AES_GCM_auth_decryption_test_case_256_3(void)
9837 {
9838 	return test_authenticated_decryption(&gcm_test_case_256_3);
9839 }
9840 
9841 static int
9842 test_AES_GCM_auth_decryption_test_case_256_4(void)
9843 {
9844 	return test_authenticated_decryption(&gcm_test_case_256_4);
9845 }
9846 
9847 static int
9848 test_AES_GCM_auth_decryption_test_case_256_5(void)
9849 {
9850 	return test_authenticated_decryption(&gcm_test_case_256_5);
9851 }
9852 
9853 static int
9854 test_AES_GCM_auth_decryption_test_case_256_6(void)
9855 {
9856 	return test_authenticated_decryption(&gcm_test_case_256_6);
9857 }
9858 
9859 static int
9860 test_AES_GCM_auth_decryption_test_case_256_7(void)
9861 {
9862 	return test_authenticated_decryption(&gcm_test_case_256_7);
9863 }
9864 
9865 static int
9866 test_AES_GCM_auth_decryption_test_case_aad_1(void)
9867 {
9868 	return test_authenticated_decryption(&gcm_test_case_aad_1);
9869 }
9870 
9871 static int
9872 test_AES_GCM_auth_decryption_test_case_aad_2(void)
9873 {
9874 	return test_authenticated_decryption(&gcm_test_case_aad_2);
9875 }
9876 
9877 static int
9878 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
9879 {
9880 	struct aead_test_data tdata;
9881 	int res;
9882 
9883 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9884 	tdata.iv.data[0] += 1;
9885 	res = test_authenticated_decryption(&tdata);
9886 	if (res == TEST_SKIPPED)
9887 		return res;
9888 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9889 	return TEST_SUCCESS;
9890 }
9891 
9892 static int
9893 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
9894 {
9895 	struct aead_test_data tdata;
9896 	int res;
9897 
9898 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9899 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9900 	tdata.plaintext.data[0] += 1;
9901 	res = test_authenticated_decryption(&tdata);
9902 	if (res == TEST_SKIPPED)
9903 		return res;
9904 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9905 	return TEST_SUCCESS;
9906 }
9907 
9908 static int
9909 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
9910 {
9911 	struct aead_test_data tdata;
9912 	int res;
9913 
9914 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9915 	tdata.ciphertext.data[0] += 1;
9916 	res = test_authenticated_decryption(&tdata);
9917 	if (res == TEST_SKIPPED)
9918 		return res;
9919 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9920 	return TEST_SUCCESS;
9921 }
9922 
9923 static int
9924 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
9925 {
9926 	struct aead_test_data tdata;
9927 	int res;
9928 
9929 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9930 	tdata.aad.len += 1;
9931 	res = test_authenticated_decryption(&tdata);
9932 	if (res == TEST_SKIPPED)
9933 		return res;
9934 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9935 	return TEST_SUCCESS;
9936 }
9937 
9938 static int
9939 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
9940 {
9941 	struct aead_test_data tdata;
9942 	uint8_t aad[gcm_test_case_7.aad.len];
9943 	int res;
9944 
9945 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9946 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9947 	aad[0] += 1;
9948 	tdata.aad.data = aad;
9949 	res = test_authenticated_decryption(&tdata);
9950 	if (res == TEST_SKIPPED)
9951 		return res;
9952 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9953 	return TEST_SUCCESS;
9954 }
9955 
9956 static int
9957 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
9958 {
9959 	struct aead_test_data tdata;
9960 	int res;
9961 
9962 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9963 	tdata.auth_tag.data[0] += 1;
9964 	res = test_authenticated_decryption(&tdata);
9965 	if (res == TEST_SKIPPED)
9966 		return res;
9967 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
9968 	return TEST_SUCCESS;
9969 }
9970 
9971 static int
9972 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
9973 {
9974 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9975 	struct crypto_unittest_params *ut_params = &unittest_params;
9976 
9977 	int retval;
9978 	uint8_t *ciphertext, *auth_tag;
9979 	uint16_t plaintext_pad_len;
9980 
9981 	/* Verify the capabilities */
9982 	struct rte_cryptodev_sym_capability_idx cap_idx;
9983 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9984 	cap_idx.algo.aead = tdata->algo;
9985 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9986 			&cap_idx) == NULL)
9987 		return TEST_SKIPPED;
9988 
9989 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9990 		return TEST_SKIPPED;
9991 
9992 	/* not supported with CPU crypto */
9993 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9994 		return TEST_SKIPPED;
9995 
9996 	/* Create AEAD session */
9997 	retval = create_aead_session(ts_params->valid_devs[0],
9998 			tdata->algo,
9999 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
10000 			tdata->key.data, tdata->key.len,
10001 			tdata->aad.len, tdata->auth_tag.len,
10002 			tdata->iv.len);
10003 	if (retval < 0)
10004 		return retval;
10005 
10006 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10007 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10008 
10009 	/* clear mbuf payload */
10010 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10011 			rte_pktmbuf_tailroom(ut_params->ibuf));
10012 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10013 			rte_pktmbuf_tailroom(ut_params->obuf));
10014 
10015 	/* Create AEAD operation */
10016 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10017 	if (retval < 0)
10018 		return retval;
10019 
10020 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10021 
10022 	ut_params->op->sym->m_src = ut_params->ibuf;
10023 	ut_params->op->sym->m_dst = ut_params->obuf;
10024 
10025 	/* Process crypto operation */
10026 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10027 			ut_params->op), "failed to process sym crypto op");
10028 
10029 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10030 			"crypto op processing failed");
10031 
10032 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10033 
10034 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10035 			ut_params->op->sym->cipher.data.offset);
10036 	auth_tag = ciphertext + plaintext_pad_len;
10037 
10038 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10039 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10040 
10041 	/* Validate obuf */
10042 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10043 			ciphertext,
10044 			tdata->ciphertext.data,
10045 			tdata->ciphertext.len,
10046 			"Ciphertext data not as expected");
10047 
10048 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10049 			auth_tag,
10050 			tdata->auth_tag.data,
10051 			tdata->auth_tag.len,
10052 			"Generated auth tag not as expected");
10053 
10054 	return 0;
10055 
10056 }
10057 
10058 static int
10059 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
10060 {
10061 	return test_authenticated_encryption_oop(&gcm_test_case_5);
10062 }
10063 
10064 static int
10065 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
10066 {
10067 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10068 	struct crypto_unittest_params *ut_params = &unittest_params;
10069 
10070 	int retval;
10071 	uint8_t *plaintext;
10072 
10073 	/* Verify the capabilities */
10074 	struct rte_cryptodev_sym_capability_idx cap_idx;
10075 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10076 	cap_idx.algo.aead = tdata->algo;
10077 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10078 			&cap_idx) == NULL)
10079 		return TEST_SKIPPED;
10080 
10081 	/* not supported with CPU crypto and raw data-path APIs*/
10082 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
10083 			global_api_test_type == CRYPTODEV_RAW_API_TEST)
10084 		return TEST_SKIPPED;
10085 
10086 	/* Create AEAD session */
10087 	retval = create_aead_session(ts_params->valid_devs[0],
10088 			tdata->algo,
10089 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10090 			tdata->key.data, tdata->key.len,
10091 			tdata->aad.len, tdata->auth_tag.len,
10092 			tdata->iv.len);
10093 	if (retval < 0)
10094 		return retval;
10095 
10096 	/* alloc mbuf and set payload */
10097 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10098 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10099 
10100 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10101 			rte_pktmbuf_tailroom(ut_params->ibuf));
10102 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10103 			rte_pktmbuf_tailroom(ut_params->obuf));
10104 
10105 	/* Create AEAD operation */
10106 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10107 	if (retval < 0)
10108 		return retval;
10109 
10110 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10111 
10112 	ut_params->op->sym->m_src = ut_params->ibuf;
10113 	ut_params->op->sym->m_dst = ut_params->obuf;
10114 
10115 	/* Process crypto operation */
10116 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10117 			ut_params->op), "failed to process sym crypto op");
10118 
10119 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10120 			"crypto op processing failed");
10121 
10122 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10123 			ut_params->op->sym->cipher.data.offset);
10124 
10125 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10126 
10127 	/* Validate obuf */
10128 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10129 			plaintext,
10130 			tdata->plaintext.data,
10131 			tdata->plaintext.len,
10132 			"Plaintext data not as expected");
10133 
10134 	TEST_ASSERT_EQUAL(ut_params->op->status,
10135 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10136 			"Authentication failed");
10137 	return 0;
10138 }
10139 
10140 static int
10141 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
10142 {
10143 	return test_authenticated_decryption_oop(&gcm_test_case_5);
10144 }
10145 
10146 static int
10147 test_authenticated_encryption_sessionless(
10148 		const struct aead_test_data *tdata)
10149 {
10150 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10151 	struct crypto_unittest_params *ut_params = &unittest_params;
10152 
10153 	int retval;
10154 	uint8_t *ciphertext, *auth_tag;
10155 	uint16_t plaintext_pad_len;
10156 	uint8_t key[tdata->key.len + 1];
10157 	struct rte_cryptodev_info dev_info;
10158 
10159 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10160 	uint64_t feat_flags = dev_info.feature_flags;
10161 
10162 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10163 		printf("Device doesn't support Sessionless ops.\n");
10164 		return TEST_SKIPPED;
10165 	}
10166 
10167 	/* not supported with CPU crypto */
10168 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10169 		return TEST_SKIPPED;
10170 
10171 	/* Verify the capabilities */
10172 	struct rte_cryptodev_sym_capability_idx cap_idx;
10173 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10174 	cap_idx.algo.aead = tdata->algo;
10175 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10176 			&cap_idx) == NULL)
10177 		return TEST_SKIPPED;
10178 
10179 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10180 
10181 	/* clear mbuf payload */
10182 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10183 			rte_pktmbuf_tailroom(ut_params->ibuf));
10184 
10185 	/* Create AEAD operation */
10186 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10187 	if (retval < 0)
10188 		return retval;
10189 
10190 	/* Create GCM xform */
10191 	memcpy(key, tdata->key.data, tdata->key.len);
10192 	retval = create_aead_xform(ut_params->op,
10193 			tdata->algo,
10194 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
10195 			key, tdata->key.len,
10196 			tdata->aad.len, tdata->auth_tag.len,
10197 			tdata->iv.len);
10198 	if (retval < 0)
10199 		return retval;
10200 
10201 	ut_params->op->sym->m_src = ut_params->ibuf;
10202 
10203 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10204 			RTE_CRYPTO_OP_SESSIONLESS,
10205 			"crypto op session type not sessionless");
10206 
10207 	/* Process crypto operation */
10208 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10209 			ut_params->op), "failed to process sym crypto op");
10210 
10211 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10212 
10213 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10214 			"crypto op status not success");
10215 
10216 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10217 
10218 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10219 			ut_params->op->sym->cipher.data.offset);
10220 	auth_tag = ciphertext + plaintext_pad_len;
10221 
10222 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10223 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10224 
10225 	/* Validate obuf */
10226 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10227 			ciphertext,
10228 			tdata->ciphertext.data,
10229 			tdata->ciphertext.len,
10230 			"Ciphertext data not as expected");
10231 
10232 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10233 			auth_tag,
10234 			tdata->auth_tag.data,
10235 			tdata->auth_tag.len,
10236 			"Generated auth tag not as expected");
10237 
10238 	return 0;
10239 
10240 }
10241 
10242 static int
10243 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
10244 {
10245 	return test_authenticated_encryption_sessionless(
10246 			&gcm_test_case_5);
10247 }
10248 
10249 static int
10250 test_authenticated_decryption_sessionless(
10251 		const struct aead_test_data *tdata)
10252 {
10253 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10254 	struct crypto_unittest_params *ut_params = &unittest_params;
10255 
10256 	int retval;
10257 	uint8_t *plaintext;
10258 	uint8_t key[tdata->key.len + 1];
10259 	struct rte_cryptodev_info dev_info;
10260 
10261 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10262 	uint64_t feat_flags = dev_info.feature_flags;
10263 
10264 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10265 		printf("Device doesn't support Sessionless ops.\n");
10266 		return TEST_SKIPPED;
10267 	}
10268 
10269 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10270 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10271 		printf("Device doesn't support RAW data-path APIs.\n");
10272 		return TEST_SKIPPED;
10273 	}
10274 
10275 	/* not supported with CPU crypto */
10276 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10277 		return TEST_SKIPPED;
10278 
10279 	/* Verify the capabilities */
10280 	struct rte_cryptodev_sym_capability_idx cap_idx;
10281 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10282 	cap_idx.algo.aead = tdata->algo;
10283 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10284 			&cap_idx) == NULL)
10285 		return TEST_SKIPPED;
10286 
10287 	/* alloc mbuf and set payload */
10288 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10289 
10290 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10291 			rte_pktmbuf_tailroom(ut_params->ibuf));
10292 
10293 	/* Create AEAD operation */
10294 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10295 	if (retval < 0)
10296 		return retval;
10297 
10298 	/* Create AEAD xform */
10299 	memcpy(key, tdata->key.data, tdata->key.len);
10300 	retval = create_aead_xform(ut_params->op,
10301 			tdata->algo,
10302 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10303 			key, tdata->key.len,
10304 			tdata->aad.len, tdata->auth_tag.len,
10305 			tdata->iv.len);
10306 	if (retval < 0)
10307 		return retval;
10308 
10309 	ut_params->op->sym->m_src = ut_params->ibuf;
10310 
10311 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10312 			RTE_CRYPTO_OP_SESSIONLESS,
10313 			"crypto op session type not sessionless");
10314 
10315 	/* Process crypto operation */
10316 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10317 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10318 				ut_params->op, 0, 0, 0, 0);
10319 	else
10320 		TEST_ASSERT_NOT_NULL(process_crypto_request(
10321 			ts_params->valid_devs[0], ut_params->op),
10322 				"failed to process sym crypto op");
10323 
10324 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10325 
10326 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10327 			"crypto op status not success");
10328 
10329 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10330 			ut_params->op->sym->cipher.data.offset);
10331 
10332 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10333 
10334 	/* Validate obuf */
10335 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10336 			plaintext,
10337 			tdata->plaintext.data,
10338 			tdata->plaintext.len,
10339 			"Plaintext data not as expected");
10340 
10341 	TEST_ASSERT_EQUAL(ut_params->op->status,
10342 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10343 			"Authentication failed");
10344 	return 0;
10345 }
10346 
10347 static int
10348 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
10349 {
10350 	return test_authenticated_decryption_sessionless(
10351 			&gcm_test_case_5);
10352 }
10353 
10354 static int
10355 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
10356 {
10357 	return test_authenticated_encryption(&ccm_test_case_128_1);
10358 }
10359 
10360 static int
10361 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
10362 {
10363 	return test_authenticated_encryption(&ccm_test_case_128_2);
10364 }
10365 
10366 static int
10367 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
10368 {
10369 	return test_authenticated_encryption(&ccm_test_case_128_3);
10370 }
10371 
10372 static int
10373 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
10374 {
10375 	return test_authenticated_decryption(&ccm_test_case_128_1);
10376 }
10377 
10378 static int
10379 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
10380 {
10381 	return test_authenticated_decryption(&ccm_test_case_128_2);
10382 }
10383 
10384 static int
10385 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
10386 {
10387 	return test_authenticated_decryption(&ccm_test_case_128_3);
10388 }
10389 
10390 static int
10391 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
10392 {
10393 	return test_authenticated_encryption(&ccm_test_case_192_1);
10394 }
10395 
10396 static int
10397 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
10398 {
10399 	return test_authenticated_encryption(&ccm_test_case_192_2);
10400 }
10401 
10402 static int
10403 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
10404 {
10405 	return test_authenticated_encryption(&ccm_test_case_192_3);
10406 }
10407 
10408 static int
10409 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
10410 {
10411 	return test_authenticated_decryption(&ccm_test_case_192_1);
10412 }
10413 
10414 static int
10415 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
10416 {
10417 	return test_authenticated_decryption(&ccm_test_case_192_2);
10418 }
10419 
10420 static int
10421 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
10422 {
10423 	return test_authenticated_decryption(&ccm_test_case_192_3);
10424 }
10425 
10426 static int
10427 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
10428 {
10429 	return test_authenticated_encryption(&ccm_test_case_256_1);
10430 }
10431 
10432 static int
10433 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
10434 {
10435 	return test_authenticated_encryption(&ccm_test_case_256_2);
10436 }
10437 
10438 static int
10439 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
10440 {
10441 	return test_authenticated_encryption(&ccm_test_case_256_3);
10442 }
10443 
10444 static int
10445 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
10446 {
10447 	return test_authenticated_decryption(&ccm_test_case_256_1);
10448 }
10449 
10450 static int
10451 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
10452 {
10453 	return test_authenticated_decryption(&ccm_test_case_256_2);
10454 }
10455 
10456 static int
10457 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
10458 {
10459 	return test_authenticated_decryption(&ccm_test_case_256_3);
10460 }
10461 
10462 static int
10463 test_stats(void)
10464 {
10465 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10466 	struct rte_cryptodev_stats stats;
10467 
10468 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10469 		return TEST_SKIPPED;
10470 
10471 	/* Verify the capabilities */
10472 	struct rte_cryptodev_sym_capability_idx cap_idx;
10473 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10474 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
10475 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10476 			&cap_idx) == NULL)
10477 		return TEST_SKIPPED;
10478 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10479 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10480 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10481 			&cap_idx) == NULL)
10482 		return TEST_SKIPPED;
10483 
10484 	if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
10485 			== -ENOTSUP)
10486 		return TEST_SKIPPED;
10487 
10488 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10489 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
10490 			&stats) == -ENODEV),
10491 		"rte_cryptodev_stats_get invalid dev failed");
10492 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
10493 		"rte_cryptodev_stats_get invalid Param failed");
10494 
10495 	/* Test expected values */
10496 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
10497 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10498 			&stats),
10499 		"rte_cryptodev_stats_get failed");
10500 	TEST_ASSERT((stats.enqueued_count == 1),
10501 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10502 	TEST_ASSERT((stats.dequeued_count == 1),
10503 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10504 	TEST_ASSERT((stats.enqueue_err_count == 0),
10505 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10506 	TEST_ASSERT((stats.dequeue_err_count == 0),
10507 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10508 
10509 	/* invalid device but should ignore and not reset device stats*/
10510 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
10511 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10512 			&stats),
10513 		"rte_cryptodev_stats_get failed");
10514 	TEST_ASSERT((stats.enqueued_count == 1),
10515 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10516 
10517 	/* check that a valid reset clears stats */
10518 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10519 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10520 			&stats),
10521 					  "rte_cryptodev_stats_get failed");
10522 	TEST_ASSERT((stats.enqueued_count == 0),
10523 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10524 	TEST_ASSERT((stats.dequeued_count == 0),
10525 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10526 
10527 	return TEST_SUCCESS;
10528 }
10529 
10530 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
10531 				   struct crypto_unittest_params *ut_params,
10532 				   enum rte_crypto_auth_operation op,
10533 				   const struct HMAC_MD5_vector *test_case)
10534 {
10535 	uint8_t key[64];
10536 
10537 	memcpy(key, test_case->key.data, test_case->key.len);
10538 
10539 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10540 	ut_params->auth_xform.next = NULL;
10541 	ut_params->auth_xform.auth.op = op;
10542 
10543 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
10544 
10545 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
10546 	ut_params->auth_xform.auth.key.length = test_case->key.len;
10547 	ut_params->auth_xform.auth.key.data = key;
10548 
10549 	ut_params->sess = rte_cryptodev_sym_session_create(
10550 			ts_params->session_mpool);
10551 
10552 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10553 			ut_params->sess, &ut_params->auth_xform,
10554 			ts_params->session_priv_mpool);
10555 
10556 	if (ut_params->sess == NULL)
10557 		return TEST_FAILED;
10558 
10559 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10560 
10561 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10562 			rte_pktmbuf_tailroom(ut_params->ibuf));
10563 
10564 	return 0;
10565 }
10566 
10567 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
10568 			      const struct HMAC_MD5_vector *test_case,
10569 			      uint8_t **plaintext)
10570 {
10571 	uint16_t plaintext_pad_len;
10572 
10573 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10574 
10575 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10576 				16);
10577 
10578 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10579 			plaintext_pad_len);
10580 	memcpy(*plaintext, test_case->plaintext.data,
10581 			test_case->plaintext.len);
10582 
10583 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10584 			ut_params->ibuf, MD5_DIGEST_LEN);
10585 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10586 			"no room to append digest");
10587 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10588 			ut_params->ibuf, plaintext_pad_len);
10589 
10590 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10591 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
10592 			   test_case->auth_tag.len);
10593 	}
10594 
10595 	sym_op->auth.data.offset = 0;
10596 	sym_op->auth.data.length = test_case->plaintext.len;
10597 
10598 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10599 	ut_params->op->sym->m_src = ut_params->ibuf;
10600 
10601 	return 0;
10602 }
10603 
10604 static int
10605 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
10606 {
10607 	uint16_t plaintext_pad_len;
10608 	uint8_t *plaintext, *auth_tag;
10609 
10610 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10611 	struct crypto_unittest_params *ut_params = &unittest_params;
10612 	struct rte_cryptodev_info dev_info;
10613 
10614 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10615 	uint64_t feat_flags = dev_info.feature_flags;
10616 
10617 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10618 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10619 		printf("Device doesn't support RAW data-path APIs.\n");
10620 		return TEST_SKIPPED;
10621 	}
10622 
10623 	/* Verify the capabilities */
10624 	struct rte_cryptodev_sym_capability_idx cap_idx;
10625 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10626 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10627 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10628 			&cap_idx) == NULL)
10629 		return TEST_SKIPPED;
10630 
10631 	if (MD5_HMAC_create_session(ts_params, ut_params,
10632 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
10633 		return TEST_FAILED;
10634 
10635 	/* Generate Crypto op data structure */
10636 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10637 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10638 	TEST_ASSERT_NOT_NULL(ut_params->op,
10639 			"Failed to allocate symmetric crypto operation struct");
10640 
10641 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10642 				16);
10643 
10644 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10645 		return TEST_FAILED;
10646 
10647 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10648 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10649 			ut_params->op);
10650 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10651 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10652 				ut_params->op, 0, 1, 0, 0);
10653 	else
10654 		TEST_ASSERT_NOT_NULL(
10655 			process_crypto_request(ts_params->valid_devs[0],
10656 				ut_params->op),
10657 				"failed to process sym crypto op");
10658 
10659 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10660 			"crypto op processing failed");
10661 
10662 	if (ut_params->op->sym->m_dst) {
10663 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
10664 				uint8_t *, plaintext_pad_len);
10665 	} else {
10666 		auth_tag = plaintext + plaintext_pad_len;
10667 	}
10668 
10669 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10670 			auth_tag,
10671 			test_case->auth_tag.data,
10672 			test_case->auth_tag.len,
10673 			"HMAC_MD5 generated tag not as expected");
10674 
10675 	return TEST_SUCCESS;
10676 }
10677 
10678 static int
10679 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
10680 {
10681 	uint8_t *plaintext;
10682 
10683 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10684 	struct crypto_unittest_params *ut_params = &unittest_params;
10685 	struct rte_cryptodev_info dev_info;
10686 
10687 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10688 	uint64_t feat_flags = dev_info.feature_flags;
10689 
10690 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10691 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10692 		printf("Device doesn't support RAW data-path APIs.\n");
10693 		return TEST_SKIPPED;
10694 	}
10695 
10696 	/* Verify the capabilities */
10697 	struct rte_cryptodev_sym_capability_idx cap_idx;
10698 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10699 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10700 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10701 			&cap_idx) == NULL)
10702 		return TEST_SKIPPED;
10703 
10704 	if (MD5_HMAC_create_session(ts_params, ut_params,
10705 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
10706 		return TEST_FAILED;
10707 	}
10708 
10709 	/* Generate Crypto op data structure */
10710 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10711 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10712 	TEST_ASSERT_NOT_NULL(ut_params->op,
10713 			"Failed to allocate symmetric crypto operation struct");
10714 
10715 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10716 		return TEST_FAILED;
10717 
10718 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10719 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10720 			ut_params->op);
10721 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10722 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10723 				ut_params->op, 0, 1, 0, 0);
10724 	else
10725 		TEST_ASSERT_NOT_NULL(
10726 			process_crypto_request(ts_params->valid_devs[0],
10727 				ut_params->op),
10728 				"failed to process sym crypto op");
10729 
10730 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10731 			"HMAC_MD5 crypto op processing failed");
10732 
10733 	return TEST_SUCCESS;
10734 }
10735 
10736 static int
10737 test_MD5_HMAC_generate_case_1(void)
10738 {
10739 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
10740 }
10741 
10742 static int
10743 test_MD5_HMAC_verify_case_1(void)
10744 {
10745 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
10746 }
10747 
10748 static int
10749 test_MD5_HMAC_generate_case_2(void)
10750 {
10751 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
10752 }
10753 
10754 static int
10755 test_MD5_HMAC_verify_case_2(void)
10756 {
10757 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
10758 }
10759 
10760 static int
10761 test_multi_session(void)
10762 {
10763 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10764 	struct crypto_unittest_params *ut_params = &unittest_params;
10765 
10766 	struct rte_cryptodev_info dev_info;
10767 	struct rte_cryptodev_sym_session **sessions;
10768 
10769 	uint16_t i;
10770 
10771 	/* Verify the capabilities */
10772 	struct rte_cryptodev_sym_capability_idx cap_idx;
10773 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10774 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10775 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10776 			&cap_idx) == NULL)
10777 		return TEST_SKIPPED;
10778 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10779 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10780 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10781 			&cap_idx) == NULL)
10782 		return TEST_SKIPPED;
10783 
10784 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
10785 			aes_cbc_key, hmac_sha512_key);
10786 
10787 
10788 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10789 
10790 	sessions = rte_malloc(NULL,
10791 			sizeof(struct rte_cryptodev_sym_session *) *
10792 			(MAX_NB_SESSIONS + 1), 0);
10793 
10794 	/* Create multiple crypto sessions*/
10795 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
10796 
10797 		sessions[i] = rte_cryptodev_sym_session_create(
10798 				ts_params->session_mpool);
10799 
10800 		rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10801 				sessions[i], &ut_params->auth_xform,
10802 				ts_params->session_priv_mpool);
10803 		TEST_ASSERT_NOT_NULL(sessions[i],
10804 				"Session creation failed at session number %u",
10805 				i);
10806 
10807 		/* Attempt to send a request on each session */
10808 		TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
10809 			sessions[i],
10810 			ut_params,
10811 			ts_params,
10812 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
10813 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
10814 			aes_cbc_iv),
10815 			"Failed to perform decrypt on request number %u.", i);
10816 		/* free crypto operation structure */
10817 		if (ut_params->op)
10818 			rte_crypto_op_free(ut_params->op);
10819 
10820 		/*
10821 		 * free mbuf - both obuf and ibuf are usually the same,
10822 		 * so check if they point at the same address is necessary,
10823 		 * to avoid freeing the mbuf twice.
10824 		 */
10825 		if (ut_params->obuf) {
10826 			rte_pktmbuf_free(ut_params->obuf);
10827 			if (ut_params->ibuf == ut_params->obuf)
10828 				ut_params->ibuf = 0;
10829 			ut_params->obuf = 0;
10830 		}
10831 		if (ut_params->ibuf) {
10832 			rte_pktmbuf_free(ut_params->ibuf);
10833 			ut_params->ibuf = 0;
10834 		}
10835 	}
10836 
10837 	sessions[i] = NULL;
10838 	/* Next session create should fail */
10839 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10840 			sessions[i], &ut_params->auth_xform,
10841 			ts_params->session_priv_mpool);
10842 	TEST_ASSERT_NULL(sessions[i],
10843 			"Session creation succeeded unexpectedly!");
10844 
10845 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
10846 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10847 				sessions[i]);
10848 		rte_cryptodev_sym_session_free(sessions[i]);
10849 	}
10850 
10851 	rte_free(sessions);
10852 
10853 	return TEST_SUCCESS;
10854 }
10855 
10856 struct multi_session_params {
10857 	struct crypto_unittest_params ut_params;
10858 	uint8_t *cipher_key;
10859 	uint8_t *hmac_key;
10860 	const uint8_t *cipher;
10861 	const uint8_t *digest;
10862 	uint8_t *iv;
10863 };
10864 
10865 #define MB_SESSION_NUMBER 3
10866 
10867 static int
10868 test_multi_session_random_usage(void)
10869 {
10870 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10871 	struct rte_cryptodev_info dev_info;
10872 	struct rte_cryptodev_sym_session **sessions;
10873 	uint32_t i, j;
10874 	struct multi_session_params ut_paramz[] = {
10875 
10876 		{
10877 			.cipher_key = ms_aes_cbc_key0,
10878 			.hmac_key = ms_hmac_key0,
10879 			.cipher = ms_aes_cbc_cipher0,
10880 			.digest = ms_hmac_digest0,
10881 			.iv = ms_aes_cbc_iv0
10882 		},
10883 		{
10884 			.cipher_key = ms_aes_cbc_key1,
10885 			.hmac_key = ms_hmac_key1,
10886 			.cipher = ms_aes_cbc_cipher1,
10887 			.digest = ms_hmac_digest1,
10888 			.iv = ms_aes_cbc_iv1
10889 		},
10890 		{
10891 			.cipher_key = ms_aes_cbc_key2,
10892 			.hmac_key = ms_hmac_key2,
10893 			.cipher = ms_aes_cbc_cipher2,
10894 			.digest = ms_hmac_digest2,
10895 			.iv = ms_aes_cbc_iv2
10896 		},
10897 
10898 	};
10899 
10900 	/* Verify the capabilities */
10901 	struct rte_cryptodev_sym_capability_idx cap_idx;
10902 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10903 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10904 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10905 			&cap_idx) == NULL)
10906 		return TEST_SKIPPED;
10907 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10908 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10909 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10910 			&cap_idx) == NULL)
10911 		return TEST_SKIPPED;
10912 
10913 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10914 
10915 	sessions = rte_malloc(NULL,
10916 			(sizeof(struct rte_cryptodev_sym_session *)
10917 					* MAX_NB_SESSIONS) + 1, 0);
10918 
10919 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
10920 		sessions[i] = rte_cryptodev_sym_session_create(
10921 				ts_params->session_mpool);
10922 
10923 		rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
10924 				sizeof(struct crypto_unittest_params));
10925 
10926 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
10927 				&ut_paramz[i].ut_params,
10928 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
10929 
10930 		/* Create multiple crypto sessions*/
10931 		rte_cryptodev_sym_session_init(
10932 				ts_params->valid_devs[0],
10933 				sessions[i],
10934 				&ut_paramz[i].ut_params.auth_xform,
10935 				ts_params->session_priv_mpool);
10936 
10937 		TEST_ASSERT_NOT_NULL(sessions[i],
10938 				"Session creation failed at session number %u",
10939 				i);
10940 
10941 	}
10942 
10943 	srand(time(NULL));
10944 	for (i = 0; i < 40000; i++) {
10945 
10946 		j = rand() % MB_SESSION_NUMBER;
10947 
10948 		TEST_ASSERT_SUCCESS(
10949 			test_AES_CBC_HMAC_SHA512_decrypt_perform(
10950 					sessions[j],
10951 					&ut_paramz[j].ut_params,
10952 					ts_params, ut_paramz[j].cipher,
10953 					ut_paramz[j].digest,
10954 					ut_paramz[j].iv),
10955 			"Failed to perform decrypt on request number %u.", i);
10956 
10957 		if (ut_paramz[j].ut_params.op)
10958 			rte_crypto_op_free(ut_paramz[j].ut_params.op);
10959 
10960 		/*
10961 		 * free mbuf - both obuf and ibuf are usually the same,
10962 		 * so check if they point at the same address is necessary,
10963 		 * to avoid freeing the mbuf twice.
10964 		 */
10965 		if (ut_paramz[j].ut_params.obuf) {
10966 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
10967 			if (ut_paramz[j].ut_params.ibuf
10968 					== ut_paramz[j].ut_params.obuf)
10969 				ut_paramz[j].ut_params.ibuf = 0;
10970 			ut_paramz[j].ut_params.obuf = 0;
10971 		}
10972 		if (ut_paramz[j].ut_params.ibuf) {
10973 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
10974 			ut_paramz[j].ut_params.ibuf = 0;
10975 		}
10976 	}
10977 
10978 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
10979 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10980 				sessions[i]);
10981 		rte_cryptodev_sym_session_free(sessions[i]);
10982 	}
10983 
10984 	rte_free(sessions);
10985 
10986 	return TEST_SUCCESS;
10987 }
10988 
10989 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
10990 			0xab, 0xab, 0xab, 0xab,
10991 			0xab, 0xab, 0xab, 0xab,
10992 			0xab, 0xab, 0xab, 0xab};
10993 
10994 static int
10995 test_null_invalid_operation(void)
10996 {
10997 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10998 	struct crypto_unittest_params *ut_params = &unittest_params;
10999 	int ret;
11000 
11001 	/* This test is for NULL PMD only */
11002 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
11003 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11004 		return TEST_SKIPPED;
11005 
11006 	/* Setup Cipher Parameters */
11007 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11008 	ut_params->cipher_xform.next = NULL;
11009 
11010 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
11011 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11012 
11013 	ut_params->sess = rte_cryptodev_sym_session_create(
11014 			ts_params->session_mpool);
11015 
11016 	/* Create Crypto session*/
11017 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11018 			ut_params->sess, &ut_params->cipher_xform,
11019 			ts_params->session_priv_mpool);
11020 	TEST_ASSERT(ret < 0,
11021 			"Session creation succeeded unexpectedly");
11022 
11023 
11024 	/* Setup HMAC Parameters */
11025 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11026 	ut_params->auth_xform.next = NULL;
11027 
11028 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
11029 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11030 
11031 	ut_params->sess = rte_cryptodev_sym_session_create(
11032 			ts_params->session_mpool);
11033 
11034 	/* Create Crypto session*/
11035 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11036 			ut_params->sess, &ut_params->auth_xform,
11037 			ts_params->session_priv_mpool);
11038 	TEST_ASSERT(ret < 0,
11039 			"Session creation succeeded unexpectedly");
11040 
11041 	return TEST_SUCCESS;
11042 }
11043 
11044 
11045 #define NULL_BURST_LENGTH (32)
11046 
11047 static int
11048 test_null_burst_operation(void)
11049 {
11050 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11051 	struct crypto_unittest_params *ut_params = &unittest_params;
11052 
11053 	unsigned i, burst_len = NULL_BURST_LENGTH;
11054 
11055 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
11056 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
11057 
11058 	/* This test is for NULL PMD only */
11059 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
11060 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11061 		return TEST_SKIPPED;
11062 
11063 	/* Setup Cipher Parameters */
11064 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11065 	ut_params->cipher_xform.next = &ut_params->auth_xform;
11066 
11067 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
11068 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11069 
11070 	/* Setup HMAC Parameters */
11071 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11072 	ut_params->auth_xform.next = NULL;
11073 
11074 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
11075 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11076 
11077 	ut_params->sess = rte_cryptodev_sym_session_create(
11078 			ts_params->session_mpool);
11079 
11080 	/* Create Crypto session*/
11081 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11082 			ut_params->sess, &ut_params->cipher_xform,
11083 			ts_params->session_priv_mpool);
11084 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11085 
11086 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
11087 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
11088 			burst_len, "failed to generate burst of crypto ops");
11089 
11090 	/* Generate an operation for each mbuf in burst */
11091 	for (i = 0; i < burst_len; i++) {
11092 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11093 
11094 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
11095 
11096 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
11097 				sizeof(unsigned));
11098 		*data = i;
11099 
11100 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
11101 
11102 		burst[i]->sym->m_src = m;
11103 	}
11104 
11105 	/* Process crypto operation */
11106 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
11107 			0, burst, burst_len),
11108 			burst_len,
11109 			"Error enqueuing burst");
11110 
11111 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
11112 			0, burst_dequeued, burst_len),
11113 			burst_len,
11114 			"Error dequeuing burst");
11115 
11116 
11117 	for (i = 0; i < burst_len; i++) {
11118 		TEST_ASSERT_EQUAL(
11119 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
11120 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
11121 					uint32_t *),
11122 			"data not as expected");
11123 
11124 		rte_pktmbuf_free(burst[i]->sym->m_src);
11125 		rte_crypto_op_free(burst[i]);
11126 	}
11127 
11128 	return TEST_SUCCESS;
11129 }
11130 
11131 static uint16_t
11132 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11133 		  uint16_t nb_ops, void *user_param)
11134 {
11135 	RTE_SET_USED(dev_id);
11136 	RTE_SET_USED(qp_id);
11137 	RTE_SET_USED(ops);
11138 	RTE_SET_USED(user_param);
11139 
11140 	printf("crypto enqueue callback called\n");
11141 	return nb_ops;
11142 }
11143 
11144 static uint16_t
11145 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11146 		  uint16_t nb_ops, void *user_param)
11147 {
11148 	RTE_SET_USED(dev_id);
11149 	RTE_SET_USED(qp_id);
11150 	RTE_SET_USED(ops);
11151 	RTE_SET_USED(user_param);
11152 
11153 	printf("crypto dequeue callback called\n");
11154 	return nb_ops;
11155 }
11156 
11157 /*
11158  * Thread using enqueue/dequeue callback with RCU.
11159  */
11160 static int
11161 test_enqdeq_callback_thread(void *arg)
11162 {
11163 	RTE_SET_USED(arg);
11164 	/* DP thread calls rte_cryptodev_enqueue_burst()/
11165 	 * rte_cryptodev_dequeue_burst() and invokes callback.
11166 	 */
11167 	test_null_burst_operation();
11168 	return 0;
11169 }
11170 
11171 static int
11172 test_enq_callback_setup(void)
11173 {
11174 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11175 	struct rte_cryptodev_info dev_info;
11176 	struct rte_cryptodev_qp_conf qp_conf = {
11177 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
11178 	};
11179 
11180 	struct rte_cryptodev_cb *cb;
11181 	uint16_t qp_id = 0;
11182 
11183 	/* Stop the device in case it's started so it can be configured */
11184 	rte_cryptodev_stop(ts_params->valid_devs[0]);
11185 
11186 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11187 
11188 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11189 			&ts_params->conf),
11190 			"Failed to configure cryptodev %u",
11191 			ts_params->valid_devs[0]);
11192 
11193 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11194 	qp_conf.mp_session = ts_params->session_mpool;
11195 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
11196 
11197 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11198 			ts_params->valid_devs[0], qp_id, &qp_conf,
11199 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11200 			"Failed test for "
11201 			"rte_cryptodev_queue_pair_setup: num_inflights "
11202 			"%u on qp %u on cryptodev %u",
11203 			qp_conf.nb_descriptors, qp_id,
11204 			ts_params->valid_devs[0]);
11205 
11206 	/* Test with invalid crypto device */
11207 	cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
11208 			qp_id, test_enq_callback, NULL);
11209 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11210 			"cryptodev %u did not fail",
11211 			qp_id, RTE_CRYPTO_MAX_DEVS);
11212 
11213 	/* Test with invalid queue pair */
11214 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11215 			dev_info.max_nb_queue_pairs + 1,
11216 			test_enq_callback, NULL);
11217 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11218 			"cryptodev %u did not fail",
11219 			dev_info.max_nb_queue_pairs + 1,
11220 			ts_params->valid_devs[0]);
11221 
11222 	/* Test with NULL callback */
11223 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11224 			qp_id, NULL, NULL);
11225 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11226 			"cryptodev %u did not fail",
11227 			qp_id, ts_params->valid_devs[0]);
11228 
11229 	/* Test with valid configuration */
11230 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11231 			qp_id, test_enq_callback, NULL);
11232 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11233 			"qp %u on cryptodev %u",
11234 			qp_id, ts_params->valid_devs[0]);
11235 
11236 	rte_cryptodev_start(ts_params->valid_devs[0]);
11237 
11238 	/* Launch a thread */
11239 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11240 				rte_get_next_lcore(-1, 1, 0));
11241 
11242 	/* Wait until reader exited. */
11243 	rte_eal_mp_wait_lcore();
11244 
11245 	/* Test with invalid crypto device */
11246 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11247 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11248 			"Expected call to fail as crypto device is invalid");
11249 
11250 	/* Test with invalid queue pair */
11251 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11252 			ts_params->valid_devs[0],
11253 			dev_info.max_nb_queue_pairs + 1, cb),
11254 			"Expected call to fail as queue pair is invalid");
11255 
11256 	/* Test with NULL callback */
11257 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11258 			ts_params->valid_devs[0], qp_id, NULL),
11259 			"Expected call to fail as callback is NULL");
11260 
11261 	/* Test with valid configuration */
11262 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
11263 			ts_params->valid_devs[0], qp_id, cb),
11264 			"Failed test to remove callback on "
11265 			"qp %u on cryptodev %u",
11266 			qp_id, ts_params->valid_devs[0]);
11267 
11268 	return TEST_SUCCESS;
11269 }
11270 
11271 static int
11272 test_deq_callback_setup(void)
11273 {
11274 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11275 	struct rte_cryptodev_info dev_info;
11276 	struct rte_cryptodev_qp_conf qp_conf = {
11277 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
11278 	};
11279 
11280 	struct rte_cryptodev_cb *cb;
11281 	uint16_t qp_id = 0;
11282 
11283 	/* Stop the device in case it's started so it can be configured */
11284 	rte_cryptodev_stop(ts_params->valid_devs[0]);
11285 
11286 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11287 
11288 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11289 			&ts_params->conf),
11290 			"Failed to configure cryptodev %u",
11291 			ts_params->valid_devs[0]);
11292 
11293 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11294 	qp_conf.mp_session = ts_params->session_mpool;
11295 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
11296 
11297 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11298 			ts_params->valid_devs[0], qp_id, &qp_conf,
11299 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11300 			"Failed test for "
11301 			"rte_cryptodev_queue_pair_setup: num_inflights "
11302 			"%u on qp %u on cryptodev %u",
11303 			qp_conf.nb_descriptors, qp_id,
11304 			ts_params->valid_devs[0]);
11305 
11306 	/* Test with invalid crypto device */
11307 	cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
11308 			qp_id, test_deq_callback, NULL);
11309 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11310 			"cryptodev %u did not fail",
11311 			qp_id, RTE_CRYPTO_MAX_DEVS);
11312 
11313 	/* Test with invalid queue pair */
11314 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11315 			dev_info.max_nb_queue_pairs + 1,
11316 			test_deq_callback, NULL);
11317 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11318 			"cryptodev %u did not fail",
11319 			dev_info.max_nb_queue_pairs + 1,
11320 			ts_params->valid_devs[0]);
11321 
11322 	/* Test with NULL callback */
11323 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11324 			qp_id, NULL, NULL);
11325 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11326 			"cryptodev %u did not fail",
11327 			qp_id, ts_params->valid_devs[0]);
11328 
11329 	/* Test with valid configuration */
11330 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11331 			qp_id, test_deq_callback, NULL);
11332 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11333 			"qp %u on cryptodev %u",
11334 			qp_id, ts_params->valid_devs[0]);
11335 
11336 	rte_cryptodev_start(ts_params->valid_devs[0]);
11337 
11338 	/* Launch a thread */
11339 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11340 				rte_get_next_lcore(-1, 1, 0));
11341 
11342 	/* Wait until reader exited. */
11343 	rte_eal_mp_wait_lcore();
11344 
11345 	/* Test with invalid crypto device */
11346 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11347 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11348 			"Expected call to fail as crypto device is invalid");
11349 
11350 	/* Test with invalid queue pair */
11351 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11352 			ts_params->valid_devs[0],
11353 			dev_info.max_nb_queue_pairs + 1, cb),
11354 			"Expected call to fail as queue pair is invalid");
11355 
11356 	/* Test with NULL callback */
11357 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11358 			ts_params->valid_devs[0], qp_id, NULL),
11359 			"Expected call to fail as callback is NULL");
11360 
11361 	/* Test with valid configuration */
11362 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
11363 			ts_params->valid_devs[0], qp_id, cb),
11364 			"Failed test to remove callback on "
11365 			"qp %u on cryptodev %u",
11366 			qp_id, ts_params->valid_devs[0]);
11367 
11368 	return TEST_SUCCESS;
11369 }
11370 
11371 static void
11372 generate_gmac_large_plaintext(uint8_t *data)
11373 {
11374 	uint16_t i;
11375 
11376 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
11377 		memcpy(&data[i], &data[0], 32);
11378 }
11379 
11380 static int
11381 create_gmac_operation(enum rte_crypto_auth_operation op,
11382 		const struct gmac_test_data *tdata)
11383 {
11384 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11385 	struct crypto_unittest_params *ut_params = &unittest_params;
11386 	struct rte_crypto_sym_op *sym_op;
11387 
11388 	uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11389 
11390 	/* Generate Crypto op data structure */
11391 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11392 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11393 	TEST_ASSERT_NOT_NULL(ut_params->op,
11394 			"Failed to allocate symmetric crypto operation struct");
11395 
11396 	sym_op = ut_params->op->sym;
11397 
11398 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11399 			ut_params->ibuf, tdata->gmac_tag.len);
11400 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11401 			"no room to append digest");
11402 
11403 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11404 			ut_params->ibuf, plaintext_pad_len);
11405 
11406 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11407 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11408 				tdata->gmac_tag.len);
11409 		debug_hexdump(stdout, "digest:",
11410 				sym_op->auth.digest.data,
11411 				tdata->gmac_tag.len);
11412 	}
11413 
11414 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11415 			uint8_t *, IV_OFFSET);
11416 
11417 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11418 
11419 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11420 
11421 	sym_op->cipher.data.length = 0;
11422 	sym_op->cipher.data.offset = 0;
11423 
11424 	sym_op->auth.data.offset = 0;
11425 	sym_op->auth.data.length = tdata->plaintext.len;
11426 
11427 	return 0;
11428 }
11429 
11430 static int
11431 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
11432 		const struct gmac_test_data *tdata,
11433 		void *digest_mem, uint64_t digest_phys)
11434 {
11435 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11436 	struct crypto_unittest_params *ut_params = &unittest_params;
11437 	struct rte_crypto_sym_op *sym_op;
11438 
11439 	/* Generate Crypto op data structure */
11440 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11441 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11442 	TEST_ASSERT_NOT_NULL(ut_params->op,
11443 			"Failed to allocate symmetric crypto operation struct");
11444 
11445 	sym_op = ut_params->op->sym;
11446 
11447 	sym_op->auth.digest.data = digest_mem;
11448 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11449 			"no room to append digest");
11450 
11451 	sym_op->auth.digest.phys_addr = digest_phys;
11452 
11453 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11454 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11455 				tdata->gmac_tag.len);
11456 		debug_hexdump(stdout, "digest:",
11457 				sym_op->auth.digest.data,
11458 				tdata->gmac_tag.len);
11459 	}
11460 
11461 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11462 			uint8_t *, IV_OFFSET);
11463 
11464 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11465 
11466 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11467 
11468 	sym_op->cipher.data.length = 0;
11469 	sym_op->cipher.data.offset = 0;
11470 
11471 	sym_op->auth.data.offset = 0;
11472 	sym_op->auth.data.length = tdata->plaintext.len;
11473 
11474 	return 0;
11475 }
11476 
11477 static int create_gmac_session(uint8_t dev_id,
11478 		const struct gmac_test_data *tdata,
11479 		enum rte_crypto_auth_operation auth_op)
11480 {
11481 	uint8_t auth_key[tdata->key.len];
11482 
11483 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11484 	struct crypto_unittest_params *ut_params = &unittest_params;
11485 
11486 	memcpy(auth_key, tdata->key.data, tdata->key.len);
11487 
11488 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11489 	ut_params->auth_xform.next = NULL;
11490 
11491 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
11492 	ut_params->auth_xform.auth.op = auth_op;
11493 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
11494 	ut_params->auth_xform.auth.key.length = tdata->key.len;
11495 	ut_params->auth_xform.auth.key.data = auth_key;
11496 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11497 	ut_params->auth_xform.auth.iv.length = tdata->iv.len;
11498 
11499 
11500 	ut_params->sess = rte_cryptodev_sym_session_create(
11501 			ts_params->session_mpool);
11502 
11503 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11504 			&ut_params->auth_xform,
11505 			ts_params->session_priv_mpool);
11506 
11507 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11508 
11509 	return 0;
11510 }
11511 
11512 static int
11513 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
11514 {
11515 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11516 	struct crypto_unittest_params *ut_params = &unittest_params;
11517 	struct rte_cryptodev_info dev_info;
11518 
11519 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11520 	uint64_t feat_flags = dev_info.feature_flags;
11521 
11522 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11523 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11524 		printf("Device doesn't support RAW data-path APIs.\n");
11525 		return TEST_SKIPPED;
11526 	}
11527 
11528 	int retval;
11529 
11530 	uint8_t *auth_tag, *plaintext;
11531 	uint16_t plaintext_pad_len;
11532 
11533 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11534 			      "No GMAC length in the source data");
11535 
11536 	/* Verify the capabilities */
11537 	struct rte_cryptodev_sym_capability_idx cap_idx;
11538 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11539 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11540 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11541 			&cap_idx) == NULL)
11542 		return TEST_SKIPPED;
11543 
11544 	retval = create_gmac_session(ts_params->valid_devs[0],
11545 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11546 
11547 	if (retval < 0)
11548 		return retval;
11549 
11550 	if (tdata->plaintext.len > MBUF_SIZE)
11551 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11552 	else
11553 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11554 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11555 			"Failed to allocate input buffer in mempool");
11556 
11557 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11558 			rte_pktmbuf_tailroom(ut_params->ibuf));
11559 
11560 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11561 	/*
11562 	 * Runtime generate the large plain text instead of use hard code
11563 	 * plain text vector. It is done to avoid create huge source file
11564 	 * with the test vector.
11565 	 */
11566 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11567 		generate_gmac_large_plaintext(tdata->plaintext.data);
11568 
11569 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11570 				plaintext_pad_len);
11571 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11572 
11573 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11574 	debug_hexdump(stdout, "plaintext:", plaintext,
11575 			tdata->plaintext.len);
11576 
11577 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
11578 			tdata);
11579 
11580 	if (retval < 0)
11581 		return retval;
11582 
11583 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11584 
11585 	ut_params->op->sym->m_src = ut_params->ibuf;
11586 
11587 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11588 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11589 			ut_params->op);
11590 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11591 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11592 				ut_params->op, 0, 1, 0, 0);
11593 	else
11594 		TEST_ASSERT_NOT_NULL(
11595 			process_crypto_request(ts_params->valid_devs[0],
11596 			ut_params->op), "failed to process sym crypto op");
11597 
11598 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11599 			"crypto op processing failed");
11600 
11601 	if (ut_params->op->sym->m_dst) {
11602 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11603 				uint8_t *, plaintext_pad_len);
11604 	} else {
11605 		auth_tag = plaintext + plaintext_pad_len;
11606 	}
11607 
11608 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11609 
11610 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11611 			auth_tag,
11612 			tdata->gmac_tag.data,
11613 			tdata->gmac_tag.len,
11614 			"GMAC Generated auth tag not as expected");
11615 
11616 	return 0;
11617 }
11618 
11619 static int
11620 test_AES_GMAC_authentication_test_case_1(void)
11621 {
11622 	return test_AES_GMAC_authentication(&gmac_test_case_1);
11623 }
11624 
11625 static int
11626 test_AES_GMAC_authentication_test_case_2(void)
11627 {
11628 	return test_AES_GMAC_authentication(&gmac_test_case_2);
11629 }
11630 
11631 static int
11632 test_AES_GMAC_authentication_test_case_3(void)
11633 {
11634 	return test_AES_GMAC_authentication(&gmac_test_case_3);
11635 }
11636 
11637 static int
11638 test_AES_GMAC_authentication_test_case_4(void)
11639 {
11640 	return test_AES_GMAC_authentication(&gmac_test_case_4);
11641 }
11642 
11643 static int
11644 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
11645 {
11646 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11647 	struct crypto_unittest_params *ut_params = &unittest_params;
11648 	int retval;
11649 	uint32_t plaintext_pad_len;
11650 	uint8_t *plaintext;
11651 	struct rte_cryptodev_info dev_info;
11652 
11653 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11654 	uint64_t feat_flags = dev_info.feature_flags;
11655 
11656 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11657 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11658 		printf("Device doesn't support RAW data-path APIs.\n");
11659 		return TEST_SKIPPED;
11660 	}
11661 
11662 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11663 			      "No GMAC length in the source data");
11664 
11665 	/* Verify the capabilities */
11666 	struct rte_cryptodev_sym_capability_idx cap_idx;
11667 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11668 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11669 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11670 			&cap_idx) == NULL)
11671 		return TEST_SKIPPED;
11672 
11673 	retval = create_gmac_session(ts_params->valid_devs[0],
11674 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
11675 
11676 	if (retval < 0)
11677 		return retval;
11678 
11679 	if (tdata->plaintext.len > MBUF_SIZE)
11680 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11681 	else
11682 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11683 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11684 			"Failed to allocate input buffer in mempool");
11685 
11686 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11687 			rte_pktmbuf_tailroom(ut_params->ibuf));
11688 
11689 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11690 
11691 	/*
11692 	 * Runtime generate the large plain text instead of use hard code
11693 	 * plain text vector. It is done to avoid create huge source file
11694 	 * with the test vector.
11695 	 */
11696 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11697 		generate_gmac_large_plaintext(tdata->plaintext.data);
11698 
11699 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11700 				plaintext_pad_len);
11701 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11702 
11703 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11704 	debug_hexdump(stdout, "plaintext:", plaintext,
11705 			tdata->plaintext.len);
11706 
11707 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
11708 			tdata);
11709 
11710 	if (retval < 0)
11711 		return retval;
11712 
11713 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11714 
11715 	ut_params->op->sym->m_src = ut_params->ibuf;
11716 
11717 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11718 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11719 			ut_params->op);
11720 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11721 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11722 				ut_params->op, 0, 1, 0, 0);
11723 	else
11724 		TEST_ASSERT_NOT_NULL(
11725 			process_crypto_request(ts_params->valid_devs[0],
11726 			ut_params->op), "failed to process sym crypto op");
11727 
11728 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11729 			"crypto op processing failed");
11730 
11731 	return 0;
11732 
11733 }
11734 
11735 static int
11736 test_AES_GMAC_authentication_verify_test_case_1(void)
11737 {
11738 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
11739 }
11740 
11741 static int
11742 test_AES_GMAC_authentication_verify_test_case_2(void)
11743 {
11744 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
11745 }
11746 
11747 static int
11748 test_AES_GMAC_authentication_verify_test_case_3(void)
11749 {
11750 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
11751 }
11752 
11753 static int
11754 test_AES_GMAC_authentication_verify_test_case_4(void)
11755 {
11756 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
11757 }
11758 
11759 static int
11760 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
11761 				uint32_t fragsz)
11762 {
11763 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11764 	struct crypto_unittest_params *ut_params = &unittest_params;
11765 	struct rte_cryptodev_info dev_info;
11766 	uint64_t feature_flags;
11767 	unsigned int trn_data = 0;
11768 	void *digest_mem = NULL;
11769 	uint32_t segs = 1;
11770 	unsigned int to_trn = 0;
11771 	struct rte_mbuf *buf = NULL;
11772 	uint8_t *auth_tag, *plaintext;
11773 	int retval;
11774 
11775 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11776 			      "No GMAC length in the source data");
11777 
11778 	/* Verify the capabilities */
11779 	struct rte_cryptodev_sym_capability_idx cap_idx;
11780 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11781 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11782 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11783 			&cap_idx) == NULL)
11784 		return TEST_SKIPPED;
11785 
11786 	/* Check for any input SGL support */
11787 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11788 	feature_flags = dev_info.feature_flags;
11789 
11790 	if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
11791 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
11792 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
11793 		return TEST_SKIPPED;
11794 
11795 	if (fragsz > tdata->plaintext.len)
11796 		fragsz = tdata->plaintext.len;
11797 
11798 	uint16_t plaintext_len = fragsz;
11799 
11800 	retval = create_gmac_session(ts_params->valid_devs[0],
11801 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11802 
11803 	if (retval < 0)
11804 		return retval;
11805 
11806 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11807 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11808 			"Failed to allocate input buffer in mempool");
11809 
11810 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11811 			rte_pktmbuf_tailroom(ut_params->ibuf));
11812 
11813 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11814 				plaintext_len);
11815 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11816 
11817 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
11818 
11819 	trn_data += plaintext_len;
11820 
11821 	buf = ut_params->ibuf;
11822 
11823 	/*
11824 	 * Loop until no more fragments
11825 	 */
11826 
11827 	while (trn_data < tdata->plaintext.len) {
11828 		++segs;
11829 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
11830 				(tdata->plaintext.len - trn_data) : fragsz;
11831 
11832 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11833 		buf = buf->next;
11834 
11835 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
11836 				rte_pktmbuf_tailroom(buf));
11837 
11838 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
11839 				to_trn);
11840 
11841 		memcpy(plaintext, tdata->plaintext.data + trn_data,
11842 				to_trn);
11843 		trn_data += to_trn;
11844 		if (trn_data  == tdata->plaintext.len)
11845 			digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
11846 					tdata->gmac_tag.len);
11847 	}
11848 	ut_params->ibuf->nb_segs = segs;
11849 
11850 	/*
11851 	 * Place digest at the end of the last buffer
11852 	 */
11853 	uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
11854 
11855 	if (!digest_mem) {
11856 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11857 				+ tdata->gmac_tag.len);
11858 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
11859 				tdata->plaintext.len);
11860 	}
11861 
11862 	retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
11863 			tdata, digest_mem, digest_phys);
11864 
11865 	if (retval < 0)
11866 		return retval;
11867 
11868 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11869 
11870 	ut_params->op->sym->m_src = ut_params->ibuf;
11871 
11872 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11873 		return TEST_SKIPPED;
11874 
11875 	TEST_ASSERT_NOT_NULL(
11876 		process_crypto_request(ts_params->valid_devs[0],
11877 		ut_params->op), "failed to process sym crypto op");
11878 
11879 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11880 			"crypto op processing failed");
11881 
11882 	auth_tag = digest_mem;
11883 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11884 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11885 			auth_tag,
11886 			tdata->gmac_tag.data,
11887 			tdata->gmac_tag.len,
11888 			"GMAC Generated auth tag not as expected");
11889 
11890 	return 0;
11891 }
11892 
11893 /* Segment size not multiple of block size (16B) */
11894 static int
11895 test_AES_GMAC_authentication_SGL_40B(void)
11896 {
11897 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
11898 }
11899 
11900 static int
11901 test_AES_GMAC_authentication_SGL_80B(void)
11902 {
11903 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
11904 }
11905 
11906 static int
11907 test_AES_GMAC_authentication_SGL_2048B(void)
11908 {
11909 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
11910 }
11911 
11912 /* Segment size not multiple of block size (16B) */
11913 static int
11914 test_AES_GMAC_authentication_SGL_2047B(void)
11915 {
11916 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
11917 }
11918 
11919 struct test_crypto_vector {
11920 	enum rte_crypto_cipher_algorithm crypto_algo;
11921 	unsigned int cipher_offset;
11922 	unsigned int cipher_len;
11923 
11924 	struct {
11925 		uint8_t data[64];
11926 		unsigned int len;
11927 	} cipher_key;
11928 
11929 	struct {
11930 		uint8_t data[64];
11931 		unsigned int len;
11932 	} iv;
11933 
11934 	struct {
11935 		const uint8_t *data;
11936 		unsigned int len;
11937 	} plaintext;
11938 
11939 	struct {
11940 		const uint8_t *data;
11941 		unsigned int len;
11942 	} ciphertext;
11943 
11944 	enum rte_crypto_auth_algorithm auth_algo;
11945 	unsigned int auth_offset;
11946 
11947 	struct {
11948 		uint8_t data[128];
11949 		unsigned int len;
11950 	} auth_key;
11951 
11952 	struct {
11953 		const uint8_t *data;
11954 		unsigned int len;
11955 	} aad;
11956 
11957 	struct {
11958 		uint8_t data[128];
11959 		unsigned int len;
11960 	} digest;
11961 };
11962 
11963 static const struct test_crypto_vector
11964 hmac_sha1_test_crypto_vector = {
11965 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11966 	.plaintext = {
11967 		.data = plaintext_hash,
11968 		.len = 512
11969 	},
11970 	.auth_key = {
11971 		.data = {
11972 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11973 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11974 			0xDE, 0xF4, 0xDE, 0xAD
11975 		},
11976 		.len = 20
11977 	},
11978 	.digest = {
11979 		.data = {
11980 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
11981 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
11982 			0x3F, 0x91, 0x64, 0x59
11983 		},
11984 		.len = 20
11985 	}
11986 };
11987 
11988 static const struct test_crypto_vector
11989 aes128_gmac_test_vector = {
11990 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
11991 	.plaintext = {
11992 		.data = plaintext_hash,
11993 		.len = 512
11994 	},
11995 	.iv = {
11996 		.data = {
11997 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11998 			0x08, 0x09, 0x0A, 0x0B
11999 		},
12000 		.len = 12
12001 	},
12002 	.auth_key = {
12003 		.data = {
12004 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12005 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
12006 		},
12007 		.len = 16
12008 	},
12009 	.digest = {
12010 		.data = {
12011 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
12012 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
12013 		},
12014 		.len = 16
12015 	}
12016 };
12017 
12018 static const struct test_crypto_vector
12019 aes128cbc_hmac_sha1_test_vector = {
12020 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12021 	.cipher_offset = 0,
12022 	.cipher_len = 512,
12023 	.cipher_key = {
12024 		.data = {
12025 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12026 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12027 		},
12028 		.len = 16
12029 	},
12030 	.iv = {
12031 		.data = {
12032 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12033 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12034 		},
12035 		.len = 16
12036 	},
12037 	.plaintext = {
12038 		.data = plaintext_hash,
12039 		.len = 512
12040 	},
12041 	.ciphertext = {
12042 		.data = ciphertext512_aes128cbc,
12043 		.len = 512
12044 	},
12045 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12046 	.auth_offset = 0,
12047 	.auth_key = {
12048 		.data = {
12049 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12050 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12051 			0xDE, 0xF4, 0xDE, 0xAD
12052 		},
12053 		.len = 20
12054 	},
12055 	.digest = {
12056 		.data = {
12057 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
12058 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12059 			0x18, 0x8C, 0x1D, 0x32
12060 		},
12061 		.len = 20
12062 	}
12063 };
12064 
12065 static const struct test_crypto_vector
12066 aes128cbc_hmac_sha1_aad_test_vector = {
12067 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12068 	.cipher_offset = 8,
12069 	.cipher_len = 496,
12070 	.cipher_key = {
12071 		.data = {
12072 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12073 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12074 		},
12075 		.len = 16
12076 	},
12077 	.iv = {
12078 		.data = {
12079 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12080 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12081 		},
12082 		.len = 16
12083 	},
12084 	.plaintext = {
12085 		.data = plaintext_hash,
12086 		.len = 512
12087 	},
12088 	.ciphertext = {
12089 		.data = ciphertext512_aes128cbc_aad,
12090 		.len = 512
12091 	},
12092 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12093 	.auth_offset = 0,
12094 	.auth_key = {
12095 		.data = {
12096 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12097 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12098 			0xDE, 0xF4, 0xDE, 0xAD
12099 		},
12100 		.len = 20
12101 	},
12102 	.digest = {
12103 		.data = {
12104 			0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
12105 			0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
12106 			0x62, 0x0F, 0xFB, 0x10
12107 		},
12108 		.len = 20
12109 	}
12110 };
12111 
12112 static void
12113 data_corruption(uint8_t *data)
12114 {
12115 	data[0] += 1;
12116 }
12117 
12118 static void
12119 tag_corruption(uint8_t *data, unsigned int tag_offset)
12120 {
12121 	data[tag_offset] += 1;
12122 }
12123 
12124 static int
12125 create_auth_session(struct crypto_unittest_params *ut_params,
12126 		uint8_t dev_id,
12127 		const struct test_crypto_vector *reference,
12128 		enum rte_crypto_auth_operation auth_op)
12129 {
12130 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12131 	uint8_t auth_key[reference->auth_key.len + 1];
12132 
12133 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12134 
12135 	/* Setup Authentication Parameters */
12136 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12137 	ut_params->auth_xform.auth.op = auth_op;
12138 	ut_params->auth_xform.next = NULL;
12139 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12140 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12141 	ut_params->auth_xform.auth.key.data = auth_key;
12142 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12143 
12144 	/* Create Crypto session*/
12145 	ut_params->sess = rte_cryptodev_sym_session_create(
12146 			ts_params->session_mpool);
12147 
12148 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12149 				&ut_params->auth_xform,
12150 				ts_params->session_priv_mpool);
12151 
12152 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12153 
12154 	return 0;
12155 }
12156 
12157 static int
12158 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
12159 		uint8_t dev_id,
12160 		const struct test_crypto_vector *reference,
12161 		enum rte_crypto_auth_operation auth_op,
12162 		enum rte_crypto_cipher_operation cipher_op)
12163 {
12164 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12165 	uint8_t cipher_key[reference->cipher_key.len + 1];
12166 	uint8_t auth_key[reference->auth_key.len + 1];
12167 
12168 	memcpy(cipher_key, reference->cipher_key.data,
12169 			reference->cipher_key.len);
12170 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12171 
12172 	/* Setup Authentication Parameters */
12173 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12174 	ut_params->auth_xform.auth.op = auth_op;
12175 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12176 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12177 	ut_params->auth_xform.auth.key.data = auth_key;
12178 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12179 
12180 	if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
12181 		ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12182 		ut_params->auth_xform.auth.iv.length = reference->iv.len;
12183 	} else {
12184 		ut_params->auth_xform.next = &ut_params->cipher_xform;
12185 
12186 		/* Setup Cipher Parameters */
12187 		ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12188 		ut_params->cipher_xform.next = NULL;
12189 		ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12190 		ut_params->cipher_xform.cipher.op = cipher_op;
12191 		ut_params->cipher_xform.cipher.key.data = cipher_key;
12192 		ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12193 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12194 		ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12195 	}
12196 
12197 	/* Create Crypto session*/
12198 	ut_params->sess = rte_cryptodev_sym_session_create(
12199 			ts_params->session_mpool);
12200 
12201 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12202 				&ut_params->auth_xform,
12203 				ts_params->session_priv_mpool);
12204 
12205 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12206 
12207 	return 0;
12208 }
12209 
12210 static int
12211 create_auth_operation(struct crypto_testsuite_params *ts_params,
12212 		struct crypto_unittest_params *ut_params,
12213 		const struct test_crypto_vector *reference,
12214 		unsigned int auth_generate)
12215 {
12216 	/* Generate Crypto op data structure */
12217 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12218 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12219 	TEST_ASSERT_NOT_NULL(ut_params->op,
12220 			"Failed to allocate pktmbuf offload");
12221 
12222 	/* Set crypto operation data parameters */
12223 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12224 
12225 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12226 
12227 	/* set crypto operation source mbuf */
12228 	sym_op->m_src = ut_params->ibuf;
12229 
12230 	/* digest */
12231 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12232 			ut_params->ibuf, reference->digest.len);
12233 
12234 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12235 			"no room to append auth tag");
12236 
12237 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12238 			ut_params->ibuf, reference->plaintext.len);
12239 
12240 	if (auth_generate)
12241 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12242 	else
12243 		memcpy(sym_op->auth.digest.data,
12244 				reference->digest.data,
12245 				reference->digest.len);
12246 
12247 	debug_hexdump(stdout, "digest:",
12248 			sym_op->auth.digest.data,
12249 			reference->digest.len);
12250 
12251 	sym_op->auth.data.length = reference->plaintext.len;
12252 	sym_op->auth.data.offset = 0;
12253 
12254 	return 0;
12255 }
12256 
12257 static int
12258 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
12259 		struct crypto_unittest_params *ut_params,
12260 		const struct test_crypto_vector *reference,
12261 		unsigned int auth_generate)
12262 {
12263 	/* Generate Crypto op data structure */
12264 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12265 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12266 	TEST_ASSERT_NOT_NULL(ut_params->op,
12267 			"Failed to allocate pktmbuf offload");
12268 
12269 	/* Set crypto operation data parameters */
12270 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12271 
12272 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12273 
12274 	/* set crypto operation source mbuf */
12275 	sym_op->m_src = ut_params->ibuf;
12276 
12277 	/* digest */
12278 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12279 			ut_params->ibuf, reference->digest.len);
12280 
12281 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12282 			"no room to append auth tag");
12283 
12284 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12285 			ut_params->ibuf, reference->ciphertext.len);
12286 
12287 	if (auth_generate)
12288 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12289 	else
12290 		memcpy(sym_op->auth.digest.data,
12291 				reference->digest.data,
12292 				reference->digest.len);
12293 
12294 	debug_hexdump(stdout, "digest:",
12295 			sym_op->auth.digest.data,
12296 			reference->digest.len);
12297 
12298 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12299 			reference->iv.data, reference->iv.len);
12300 
12301 	sym_op->cipher.data.length = 0;
12302 	sym_op->cipher.data.offset = 0;
12303 
12304 	sym_op->auth.data.length = reference->plaintext.len;
12305 	sym_op->auth.data.offset = 0;
12306 
12307 	return 0;
12308 }
12309 
12310 static int
12311 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
12312 		struct crypto_unittest_params *ut_params,
12313 		const struct test_crypto_vector *reference,
12314 		unsigned int auth_generate)
12315 {
12316 	/* Generate Crypto op data structure */
12317 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12318 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12319 	TEST_ASSERT_NOT_NULL(ut_params->op,
12320 			"Failed to allocate pktmbuf offload");
12321 
12322 	/* Set crypto operation data parameters */
12323 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12324 
12325 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12326 
12327 	/* set crypto operation source mbuf */
12328 	sym_op->m_src = ut_params->ibuf;
12329 
12330 	/* digest */
12331 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12332 			ut_params->ibuf, reference->digest.len);
12333 
12334 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12335 			"no room to append auth tag");
12336 
12337 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12338 			ut_params->ibuf, reference->ciphertext.len);
12339 
12340 	if (auth_generate)
12341 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12342 	else
12343 		memcpy(sym_op->auth.digest.data,
12344 				reference->digest.data,
12345 				reference->digest.len);
12346 
12347 	debug_hexdump(stdout, "digest:",
12348 			sym_op->auth.digest.data,
12349 			reference->digest.len);
12350 
12351 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12352 			reference->iv.data, reference->iv.len);
12353 
12354 	sym_op->cipher.data.length = reference->cipher_len;
12355 	sym_op->cipher.data.offset = reference->cipher_offset;
12356 
12357 	sym_op->auth.data.length = reference->plaintext.len;
12358 	sym_op->auth.data.offset = reference->auth_offset;
12359 
12360 	return 0;
12361 }
12362 
12363 static int
12364 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12365 		struct crypto_unittest_params *ut_params,
12366 		const struct test_crypto_vector *reference)
12367 {
12368 	return create_auth_operation(ts_params, ut_params, reference, 0);
12369 }
12370 
12371 static int
12372 create_auth_verify_GMAC_operation(
12373 		struct crypto_testsuite_params *ts_params,
12374 		struct crypto_unittest_params *ut_params,
12375 		const struct test_crypto_vector *reference)
12376 {
12377 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
12378 }
12379 
12380 static int
12381 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12382 		struct crypto_unittest_params *ut_params,
12383 		const struct test_crypto_vector *reference)
12384 {
12385 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
12386 }
12387 
12388 static int
12389 test_authentication_verify_fail_when_data_corruption(
12390 		struct crypto_testsuite_params *ts_params,
12391 		struct crypto_unittest_params *ut_params,
12392 		const struct test_crypto_vector *reference,
12393 		unsigned int data_corrupted)
12394 {
12395 	int retval;
12396 
12397 	uint8_t *plaintext;
12398 	struct rte_cryptodev_info dev_info;
12399 
12400 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12401 	uint64_t feat_flags = dev_info.feature_flags;
12402 
12403 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12404 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12405 		printf("Device doesn't support RAW data-path APIs.\n");
12406 		return TEST_SKIPPED;
12407 	}
12408 
12409 	/* Verify the capabilities */
12410 	struct rte_cryptodev_sym_capability_idx cap_idx;
12411 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12412 	cap_idx.algo.auth = reference->auth_algo;
12413 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12414 			&cap_idx) == NULL)
12415 		return TEST_SKIPPED;
12416 
12417 
12418 	/* Create session */
12419 	retval = create_auth_session(ut_params,
12420 			ts_params->valid_devs[0],
12421 			reference,
12422 			RTE_CRYPTO_AUTH_OP_VERIFY);
12423 	if (retval < 0)
12424 		return retval;
12425 
12426 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12427 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12428 			"Failed to allocate input buffer in mempool");
12429 
12430 	/* clear mbuf payload */
12431 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12432 			rte_pktmbuf_tailroom(ut_params->ibuf));
12433 
12434 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12435 			reference->plaintext.len);
12436 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12437 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12438 
12439 	debug_hexdump(stdout, "plaintext:", plaintext,
12440 		reference->plaintext.len);
12441 
12442 	/* Create operation */
12443 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
12444 
12445 	if (retval < 0)
12446 		return retval;
12447 
12448 	if (data_corrupted)
12449 		data_corruption(plaintext);
12450 	else
12451 		tag_corruption(plaintext, reference->plaintext.len);
12452 
12453 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12454 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12455 			ut_params->op);
12456 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12457 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12458 			"authentication not failed");
12459 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12460 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12461 				ut_params->op, 0, 1, 0, 0);
12462 	else {
12463 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12464 			ut_params->op);
12465 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12466 	}
12467 
12468 	return 0;
12469 }
12470 
12471 static int
12472 test_authentication_verify_GMAC_fail_when_corruption(
12473 		struct crypto_testsuite_params *ts_params,
12474 		struct crypto_unittest_params *ut_params,
12475 		const struct test_crypto_vector *reference,
12476 		unsigned int data_corrupted)
12477 {
12478 	int retval;
12479 	uint8_t *plaintext;
12480 	struct rte_cryptodev_info dev_info;
12481 
12482 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12483 	uint64_t feat_flags = dev_info.feature_flags;
12484 
12485 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12486 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12487 		printf("Device doesn't support RAW data-path APIs.\n");
12488 		return TEST_SKIPPED;
12489 	}
12490 
12491 	/* Verify the capabilities */
12492 	struct rte_cryptodev_sym_capability_idx cap_idx;
12493 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12494 	cap_idx.algo.auth = reference->auth_algo;
12495 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12496 			&cap_idx) == NULL)
12497 		return TEST_SKIPPED;
12498 
12499 	/* Create session */
12500 	retval = create_auth_cipher_session(ut_params,
12501 			ts_params->valid_devs[0],
12502 			reference,
12503 			RTE_CRYPTO_AUTH_OP_VERIFY,
12504 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
12505 	if (retval < 0)
12506 		return retval;
12507 
12508 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12509 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12510 			"Failed to allocate input buffer in mempool");
12511 
12512 	/* clear mbuf payload */
12513 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12514 			rte_pktmbuf_tailroom(ut_params->ibuf));
12515 
12516 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12517 			reference->plaintext.len);
12518 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12519 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12520 
12521 	debug_hexdump(stdout, "plaintext:", plaintext,
12522 		reference->plaintext.len);
12523 
12524 	/* Create operation */
12525 	retval = create_auth_verify_GMAC_operation(ts_params,
12526 			ut_params,
12527 			reference);
12528 
12529 	if (retval < 0)
12530 		return retval;
12531 
12532 	if (data_corrupted)
12533 		data_corruption(plaintext);
12534 	else
12535 		tag_corruption(plaintext, reference->aad.len);
12536 
12537 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12538 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12539 			ut_params->op);
12540 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12541 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12542 			"authentication not failed");
12543 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12544 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12545 				ut_params->op, 0, 1, 0, 0);
12546 	else {
12547 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12548 			ut_params->op);
12549 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12550 	}
12551 
12552 	return 0;
12553 }
12554 
12555 static int
12556 test_authenticated_decryption_fail_when_corruption(
12557 		struct crypto_testsuite_params *ts_params,
12558 		struct crypto_unittest_params *ut_params,
12559 		const struct test_crypto_vector *reference,
12560 		unsigned int data_corrupted)
12561 {
12562 	int retval;
12563 
12564 	uint8_t *ciphertext;
12565 	struct rte_cryptodev_info dev_info;
12566 
12567 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12568 	uint64_t feat_flags = dev_info.feature_flags;
12569 
12570 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12571 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12572 		printf("Device doesn't support RAW data-path APIs.\n");
12573 		return TEST_SKIPPED;
12574 	}
12575 
12576 	/* Verify the capabilities */
12577 	struct rte_cryptodev_sym_capability_idx cap_idx;
12578 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12579 	cap_idx.algo.auth = reference->auth_algo;
12580 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12581 			&cap_idx) == NULL)
12582 		return TEST_SKIPPED;
12583 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12584 	cap_idx.algo.cipher = reference->crypto_algo;
12585 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12586 			&cap_idx) == NULL)
12587 		return TEST_SKIPPED;
12588 
12589 	/* Create session */
12590 	retval = create_auth_cipher_session(ut_params,
12591 			ts_params->valid_devs[0],
12592 			reference,
12593 			RTE_CRYPTO_AUTH_OP_VERIFY,
12594 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
12595 	if (retval < 0)
12596 		return retval;
12597 
12598 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12599 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12600 			"Failed to allocate input buffer in mempool");
12601 
12602 	/* clear mbuf payload */
12603 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12604 			rte_pktmbuf_tailroom(ut_params->ibuf));
12605 
12606 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12607 			reference->ciphertext.len);
12608 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12609 	memcpy(ciphertext, reference->ciphertext.data,
12610 			reference->ciphertext.len);
12611 
12612 	/* Create operation */
12613 	retval = create_cipher_auth_verify_operation(ts_params,
12614 			ut_params,
12615 			reference);
12616 
12617 	if (retval < 0)
12618 		return retval;
12619 
12620 	if (data_corrupted)
12621 		data_corruption(ciphertext);
12622 	else
12623 		tag_corruption(ciphertext, reference->ciphertext.len);
12624 
12625 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12626 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12627 			ut_params->op);
12628 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12629 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12630 			"authentication not failed");
12631 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12632 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12633 				ut_params->op, 1, 1, 0, 0);
12634 	else {
12635 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12636 			ut_params->op);
12637 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12638 	}
12639 
12640 	return 0;
12641 }
12642 
12643 static int
12644 test_authenticated_encrypt_with_esn(
12645 		struct crypto_testsuite_params *ts_params,
12646 		struct crypto_unittest_params *ut_params,
12647 		const struct test_crypto_vector *reference)
12648 {
12649 	int retval;
12650 
12651 	uint8_t *authciphertext, *plaintext, *auth_tag;
12652 	uint16_t plaintext_pad_len;
12653 	uint8_t cipher_key[reference->cipher_key.len + 1];
12654 	uint8_t auth_key[reference->auth_key.len + 1];
12655 	struct rte_cryptodev_info dev_info;
12656 
12657 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12658 	uint64_t feat_flags = dev_info.feature_flags;
12659 
12660 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12661 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12662 		printf("Device doesn't support RAW data-path APIs.\n");
12663 		return TEST_SKIPPED;
12664 	}
12665 
12666 	/* Verify the capabilities */
12667 	struct rte_cryptodev_sym_capability_idx cap_idx;
12668 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12669 	cap_idx.algo.auth = reference->auth_algo;
12670 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12671 			&cap_idx) == NULL)
12672 		return TEST_SKIPPED;
12673 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12674 	cap_idx.algo.cipher = reference->crypto_algo;
12675 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12676 			&cap_idx) == NULL)
12677 		return TEST_SKIPPED;
12678 
12679 	/* Create session */
12680 	memcpy(cipher_key, reference->cipher_key.data,
12681 			reference->cipher_key.len);
12682 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12683 
12684 	/* Setup Cipher Parameters */
12685 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12686 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12687 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12688 	ut_params->cipher_xform.cipher.key.data = cipher_key;
12689 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12690 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12691 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12692 
12693 	ut_params->cipher_xform.next = &ut_params->auth_xform;
12694 
12695 	/* Setup Authentication Parameters */
12696 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12697 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12698 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12699 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12700 	ut_params->auth_xform.auth.key.data = auth_key;
12701 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12702 	ut_params->auth_xform.next = NULL;
12703 
12704 	/* Create Crypto session*/
12705 	ut_params->sess = rte_cryptodev_sym_session_create(
12706 			ts_params->session_mpool);
12707 
12708 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12709 				ut_params->sess,
12710 				&ut_params->cipher_xform,
12711 				ts_params->session_priv_mpool);
12712 
12713 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12714 
12715 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12716 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12717 			"Failed to allocate input buffer in mempool");
12718 
12719 	/* clear mbuf payload */
12720 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12721 			rte_pktmbuf_tailroom(ut_params->ibuf));
12722 
12723 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12724 			reference->plaintext.len);
12725 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12726 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12727 
12728 	/* Create operation */
12729 	retval = create_cipher_auth_operation(ts_params,
12730 			ut_params,
12731 			reference, 0);
12732 
12733 	if (retval < 0)
12734 		return retval;
12735 
12736 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12737 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12738 			ut_params->op);
12739 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12740 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12741 				ut_params->op, 1, 1, 0, 0);
12742 	else
12743 		ut_params->op = process_crypto_request(
12744 			ts_params->valid_devs[0], ut_params->op);
12745 
12746 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
12747 
12748 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12749 			"crypto op processing failed");
12750 
12751 	plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
12752 
12753 	authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
12754 			ut_params->op->sym->auth.data.offset);
12755 	auth_tag = authciphertext + plaintext_pad_len;
12756 	debug_hexdump(stdout, "ciphertext:", authciphertext,
12757 			reference->ciphertext.len);
12758 	debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
12759 
12760 	/* Validate obuf */
12761 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12762 			authciphertext,
12763 			reference->ciphertext.data,
12764 			reference->ciphertext.len,
12765 			"Ciphertext data not as expected");
12766 
12767 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12768 			auth_tag,
12769 			reference->digest.data,
12770 			reference->digest.len,
12771 			"Generated digest not as expected");
12772 
12773 	return TEST_SUCCESS;
12774 
12775 }
12776 
12777 static int
12778 test_authenticated_decrypt_with_esn(
12779 		struct crypto_testsuite_params *ts_params,
12780 		struct crypto_unittest_params *ut_params,
12781 		const struct test_crypto_vector *reference)
12782 {
12783 	int retval;
12784 
12785 	uint8_t *ciphertext;
12786 	uint8_t cipher_key[reference->cipher_key.len + 1];
12787 	uint8_t auth_key[reference->auth_key.len + 1];
12788 	struct rte_cryptodev_info dev_info;
12789 
12790 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12791 	uint64_t feat_flags = dev_info.feature_flags;
12792 
12793 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12794 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12795 		printf("Device doesn't support RAW data-path APIs.\n");
12796 		return TEST_SKIPPED;
12797 	}
12798 
12799 	/* Verify the capabilities */
12800 	struct rte_cryptodev_sym_capability_idx cap_idx;
12801 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12802 	cap_idx.algo.auth = reference->auth_algo;
12803 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12804 			&cap_idx) == NULL)
12805 		return TEST_SKIPPED;
12806 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12807 	cap_idx.algo.cipher = reference->crypto_algo;
12808 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12809 			&cap_idx) == NULL)
12810 		return TEST_SKIPPED;
12811 
12812 	/* Create session */
12813 	memcpy(cipher_key, reference->cipher_key.data,
12814 			reference->cipher_key.len);
12815 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12816 
12817 	/* Setup Authentication Parameters */
12818 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12819 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
12820 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12821 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12822 	ut_params->auth_xform.auth.key.data = auth_key;
12823 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12824 	ut_params->auth_xform.next = &ut_params->cipher_xform;
12825 
12826 	/* Setup Cipher Parameters */
12827 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12828 	ut_params->cipher_xform.next = NULL;
12829 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12830 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
12831 	ut_params->cipher_xform.cipher.key.data = cipher_key;
12832 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12833 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12834 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12835 
12836 	/* Create Crypto session*/
12837 	ut_params->sess = rte_cryptodev_sym_session_create(
12838 			ts_params->session_mpool);
12839 
12840 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12841 				ut_params->sess,
12842 				&ut_params->auth_xform,
12843 				ts_params->session_priv_mpool);
12844 
12845 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12846 
12847 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12848 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12849 			"Failed to allocate input buffer in mempool");
12850 
12851 	/* clear mbuf payload */
12852 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12853 			rte_pktmbuf_tailroom(ut_params->ibuf));
12854 
12855 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12856 			reference->ciphertext.len);
12857 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12858 	memcpy(ciphertext, reference->ciphertext.data,
12859 			reference->ciphertext.len);
12860 
12861 	/* Create operation */
12862 	retval = create_cipher_auth_verify_operation(ts_params,
12863 			ut_params,
12864 			reference);
12865 
12866 	if (retval < 0)
12867 		return retval;
12868 
12869 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12870 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12871 			ut_params->op);
12872 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12873 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12874 				ut_params->op, 1, 1, 0, 0);
12875 	else
12876 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12877 			ut_params->op);
12878 
12879 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
12880 	TEST_ASSERT_EQUAL(ut_params->op->status,
12881 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12882 			"crypto op processing passed");
12883 
12884 	ut_params->obuf = ut_params->op->sym->m_src;
12885 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
12886 
12887 	return 0;
12888 }
12889 
12890 static int
12891 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
12892 		const struct aead_test_data *tdata,
12893 		void *digest_mem, uint64_t digest_phys)
12894 {
12895 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12896 	struct crypto_unittest_params *ut_params = &unittest_params;
12897 
12898 	const unsigned int auth_tag_len = tdata->auth_tag.len;
12899 	const unsigned int iv_len = tdata->iv.len;
12900 	unsigned int aad_len = tdata->aad.len;
12901 	unsigned int aad_len_pad = 0;
12902 
12903 	/* Generate Crypto op data structure */
12904 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12905 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12906 	TEST_ASSERT_NOT_NULL(ut_params->op,
12907 		"Failed to allocate symmetric crypto operation struct");
12908 
12909 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12910 
12911 	sym_op->aead.digest.data = digest_mem;
12912 
12913 	TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
12914 			"no room to append digest");
12915 
12916 	sym_op->aead.digest.phys_addr = digest_phys;
12917 
12918 	if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
12919 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
12920 				auth_tag_len);
12921 		debug_hexdump(stdout, "digest:",
12922 				sym_op->aead.digest.data,
12923 				auth_tag_len);
12924 	}
12925 
12926 	/* Append aad data */
12927 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
12928 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12929 				uint8_t *, IV_OFFSET);
12930 
12931 		/* Copy IV 1 byte after the IV pointer, according to the API */
12932 		rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
12933 
12934 		aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
12935 
12936 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12937 				ut_params->ibuf, aad_len);
12938 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12939 				"no room to prepend aad");
12940 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12941 				ut_params->ibuf);
12942 
12943 		memset(sym_op->aead.aad.data, 0, aad_len);
12944 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
12945 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12946 
12947 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12948 		debug_hexdump(stdout, "aad:",
12949 				sym_op->aead.aad.data, aad_len);
12950 	} else {
12951 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12952 				uint8_t *, IV_OFFSET);
12953 
12954 		rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
12955 
12956 		aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
12957 
12958 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12959 				ut_params->ibuf, aad_len_pad);
12960 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12961 				"no room to prepend aad");
12962 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12963 				ut_params->ibuf);
12964 
12965 		memset(sym_op->aead.aad.data, 0, aad_len);
12966 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12967 
12968 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12969 		debug_hexdump(stdout, "aad:",
12970 				sym_op->aead.aad.data, aad_len);
12971 	}
12972 
12973 	sym_op->aead.data.length = tdata->plaintext.len;
12974 	sym_op->aead.data.offset = aad_len_pad;
12975 
12976 	return 0;
12977 }
12978 
12979 #define SGL_MAX_NO	16
12980 
12981 static int
12982 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
12983 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
12984 {
12985 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12986 	struct crypto_unittest_params *ut_params = &unittest_params;
12987 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
12988 	int retval;
12989 	int to_trn = 0;
12990 	int to_trn_tbl[SGL_MAX_NO];
12991 	int segs = 1;
12992 	unsigned int trn_data = 0;
12993 	uint8_t *plaintext, *ciphertext, *auth_tag;
12994 	struct rte_cryptodev_info dev_info;
12995 
12996 	/* Verify the capabilities */
12997 	struct rte_cryptodev_sym_capability_idx cap_idx;
12998 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12999 	cap_idx.algo.aead = tdata->algo;
13000 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13001 			&cap_idx) == NULL)
13002 		return TEST_SKIPPED;
13003 
13004 	/* OOP not supported with CPU crypto */
13005 	if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13006 		return TEST_SKIPPED;
13007 
13008 	/* Detailed check for the particular SGL support flag */
13009 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13010 	if (!oop) {
13011 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
13012 		if (sgl_in && (!(dev_info.feature_flags &
13013 				RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
13014 			return TEST_SKIPPED;
13015 
13016 		uint64_t feat_flags = dev_info.feature_flags;
13017 
13018 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13019 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13020 			printf("Device doesn't support RAW data-path APIs.\n");
13021 			return TEST_SKIPPED;
13022 		}
13023 	} else {
13024 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
13025 		unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
13026 				tdata->plaintext.len;
13027 		/* Raw data path API does not support OOP */
13028 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13029 			return TEST_SKIPPED;
13030 		if (sgl_in && !sgl_out) {
13031 			if (!(dev_info.feature_flags &
13032 					RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
13033 				return TEST_SKIPPED;
13034 		} else if (!sgl_in && sgl_out) {
13035 			if (!(dev_info.feature_flags &
13036 					RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
13037 				return TEST_SKIPPED;
13038 		} else if (sgl_in && sgl_out) {
13039 			if (!(dev_info.feature_flags &
13040 					RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
13041 				return TEST_SKIPPED;
13042 		}
13043 	}
13044 
13045 	if (fragsz > tdata->plaintext.len)
13046 		fragsz = tdata->plaintext.len;
13047 
13048 	uint16_t plaintext_len = fragsz;
13049 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
13050 
13051 	if (fragsz_oop > tdata->plaintext.len)
13052 		frag_size_oop = tdata->plaintext.len;
13053 
13054 	int ecx = 0;
13055 	void *digest_mem = NULL;
13056 
13057 	uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
13058 
13059 	if (tdata->plaintext.len % fragsz != 0) {
13060 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
13061 			return 1;
13062 	}	else {
13063 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
13064 			return 1;
13065 	}
13066 
13067 	/*
13068 	 * For out-op-place we need to alloc another mbuf
13069 	 */
13070 	if (oop) {
13071 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13072 		rte_pktmbuf_append(ut_params->obuf,
13073 				frag_size_oop + prepend_len);
13074 		buf_oop = ut_params->obuf;
13075 	}
13076 
13077 	/* Create AEAD session */
13078 	retval = create_aead_session(ts_params->valid_devs[0],
13079 			tdata->algo,
13080 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
13081 			tdata->key.data, tdata->key.len,
13082 			tdata->aad.len, tdata->auth_tag.len,
13083 			tdata->iv.len);
13084 	if (retval < 0)
13085 		return retval;
13086 
13087 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13088 
13089 	/* clear mbuf payload */
13090 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13091 			rte_pktmbuf_tailroom(ut_params->ibuf));
13092 
13093 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13094 			plaintext_len);
13095 
13096 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13097 
13098 	trn_data += plaintext_len;
13099 
13100 	buf = ut_params->ibuf;
13101 
13102 	/*
13103 	 * Loop until no more fragments
13104 	 */
13105 
13106 	while (trn_data < tdata->plaintext.len) {
13107 		++segs;
13108 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13109 				(tdata->plaintext.len - trn_data) : fragsz;
13110 
13111 		to_trn_tbl[ecx++] = to_trn;
13112 
13113 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13114 		buf = buf->next;
13115 
13116 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13117 				rte_pktmbuf_tailroom(buf));
13118 
13119 		/* OOP */
13120 		if (oop && !fragsz_oop) {
13121 			buf_last_oop = buf_oop->next =
13122 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
13123 			buf_oop = buf_oop->next;
13124 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13125 					0, rte_pktmbuf_tailroom(buf_oop));
13126 			rte_pktmbuf_append(buf_oop, to_trn);
13127 		}
13128 
13129 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
13130 				to_trn);
13131 
13132 		memcpy(plaintext, tdata->plaintext.data + trn_data,
13133 				to_trn);
13134 		trn_data += to_trn;
13135 		if (trn_data  == tdata->plaintext.len) {
13136 			if (oop) {
13137 				if (!fragsz_oop)
13138 					digest_mem = rte_pktmbuf_append(buf_oop,
13139 						tdata->auth_tag.len);
13140 			} else
13141 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
13142 					tdata->auth_tag.len);
13143 		}
13144 	}
13145 
13146 	uint64_t digest_phys = 0;
13147 
13148 	ut_params->ibuf->nb_segs = segs;
13149 
13150 	segs = 1;
13151 	if (fragsz_oop && oop) {
13152 		to_trn = 0;
13153 		ecx = 0;
13154 
13155 		if (frag_size_oop == tdata->plaintext.len) {
13156 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
13157 				tdata->auth_tag.len);
13158 
13159 			digest_phys = rte_pktmbuf_iova_offset(
13160 					ut_params->obuf,
13161 					tdata->plaintext.len + prepend_len);
13162 		}
13163 
13164 		trn_data = frag_size_oop;
13165 		while (trn_data < tdata->plaintext.len) {
13166 			++segs;
13167 			to_trn =
13168 				(tdata->plaintext.len - trn_data <
13169 						frag_size_oop) ?
13170 				(tdata->plaintext.len - trn_data) :
13171 						frag_size_oop;
13172 
13173 			to_trn_tbl[ecx++] = to_trn;
13174 
13175 			buf_last_oop = buf_oop->next =
13176 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
13177 			buf_oop = buf_oop->next;
13178 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13179 					0, rte_pktmbuf_tailroom(buf_oop));
13180 			rte_pktmbuf_append(buf_oop, to_trn);
13181 
13182 			trn_data += to_trn;
13183 
13184 			if (trn_data  == tdata->plaintext.len) {
13185 				digest_mem = rte_pktmbuf_append(buf_oop,
13186 					tdata->auth_tag.len);
13187 			}
13188 		}
13189 
13190 		ut_params->obuf->nb_segs = segs;
13191 	}
13192 
13193 	/*
13194 	 * Place digest at the end of the last buffer
13195 	 */
13196 	if (!digest_phys)
13197 		digest_phys = rte_pktmbuf_iova(buf) + to_trn;
13198 	if (oop && buf_last_oop)
13199 		digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
13200 
13201 	if (!digest_mem && !oop) {
13202 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13203 				+ tdata->auth_tag.len);
13204 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
13205 				tdata->plaintext.len);
13206 	}
13207 
13208 	/* Create AEAD operation */
13209 	retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
13210 			tdata, digest_mem, digest_phys);
13211 
13212 	if (retval < 0)
13213 		return retval;
13214 
13215 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13216 
13217 	ut_params->op->sym->m_src = ut_params->ibuf;
13218 	if (oop)
13219 		ut_params->op->sym->m_dst = ut_params->obuf;
13220 
13221 	/* Process crypto operation */
13222 	if (oop == IN_PLACE &&
13223 			gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13224 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
13225 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13226 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13227 				ut_params->op, 0, 0, 0, 0);
13228 	else
13229 		TEST_ASSERT_NOT_NULL(
13230 			process_crypto_request(ts_params->valid_devs[0],
13231 			ut_params->op), "failed to process sym crypto op");
13232 
13233 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13234 			"crypto op processing failed");
13235 
13236 
13237 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
13238 			uint8_t *, prepend_len);
13239 	if (oop) {
13240 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
13241 				uint8_t *, prepend_len);
13242 	}
13243 
13244 	if (fragsz_oop)
13245 		fragsz = fragsz_oop;
13246 
13247 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13248 			ciphertext,
13249 			tdata->ciphertext.data,
13250 			fragsz,
13251 			"Ciphertext data not as expected");
13252 
13253 	buf = ut_params->op->sym->m_src->next;
13254 	if (oop)
13255 		buf = ut_params->op->sym->m_dst->next;
13256 
13257 	unsigned int off = fragsz;
13258 
13259 	ecx = 0;
13260 	while (buf) {
13261 		ciphertext = rte_pktmbuf_mtod(buf,
13262 				uint8_t *);
13263 
13264 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
13265 				ciphertext,
13266 				tdata->ciphertext.data + off,
13267 				to_trn_tbl[ecx],
13268 				"Ciphertext data not as expected");
13269 
13270 		off += to_trn_tbl[ecx++];
13271 		buf = buf->next;
13272 	}
13273 
13274 	auth_tag = digest_mem;
13275 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13276 			auth_tag,
13277 			tdata->auth_tag.data,
13278 			tdata->auth_tag.len,
13279 			"Generated auth tag not as expected");
13280 
13281 	return 0;
13282 }
13283 
13284 static int
13285 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
13286 {
13287 	return test_authenticated_encryption_SGL(
13288 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
13289 }
13290 
13291 static int
13292 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
13293 {
13294 	return test_authenticated_encryption_SGL(
13295 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
13296 }
13297 
13298 static int
13299 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
13300 {
13301 	return test_authenticated_encryption_SGL(
13302 			&gcm_test_case_8, OUT_OF_PLACE, 400,
13303 			gcm_test_case_8.plaintext.len);
13304 }
13305 
13306 static int
13307 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
13308 {
13309 	/* This test is not for OPENSSL PMD */
13310 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
13311 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
13312 		return TEST_SKIPPED;
13313 
13314 	return test_authenticated_encryption_SGL(
13315 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
13316 }
13317 
13318 static int
13319 test_authentication_verify_fail_when_data_corrupted(
13320 		struct crypto_testsuite_params *ts_params,
13321 		struct crypto_unittest_params *ut_params,
13322 		const struct test_crypto_vector *reference)
13323 {
13324 	return test_authentication_verify_fail_when_data_corruption(
13325 			ts_params, ut_params, reference, 1);
13326 }
13327 
13328 static int
13329 test_authentication_verify_fail_when_tag_corrupted(
13330 		struct crypto_testsuite_params *ts_params,
13331 		struct crypto_unittest_params *ut_params,
13332 		const struct test_crypto_vector *reference)
13333 {
13334 	return test_authentication_verify_fail_when_data_corruption(
13335 			ts_params, ut_params, reference, 0);
13336 }
13337 
13338 static int
13339 test_authentication_verify_GMAC_fail_when_data_corrupted(
13340 		struct crypto_testsuite_params *ts_params,
13341 		struct crypto_unittest_params *ut_params,
13342 		const struct test_crypto_vector *reference)
13343 {
13344 	return test_authentication_verify_GMAC_fail_when_corruption(
13345 			ts_params, ut_params, reference, 1);
13346 }
13347 
13348 static int
13349 test_authentication_verify_GMAC_fail_when_tag_corrupted(
13350 		struct crypto_testsuite_params *ts_params,
13351 		struct crypto_unittest_params *ut_params,
13352 		const struct test_crypto_vector *reference)
13353 {
13354 	return test_authentication_verify_GMAC_fail_when_corruption(
13355 			ts_params, ut_params, reference, 0);
13356 }
13357 
13358 static int
13359 test_authenticated_decryption_fail_when_data_corrupted(
13360 		struct crypto_testsuite_params *ts_params,
13361 		struct crypto_unittest_params *ut_params,
13362 		const struct test_crypto_vector *reference)
13363 {
13364 	return test_authenticated_decryption_fail_when_corruption(
13365 			ts_params, ut_params, reference, 1);
13366 }
13367 
13368 static int
13369 test_authenticated_decryption_fail_when_tag_corrupted(
13370 		struct crypto_testsuite_params *ts_params,
13371 		struct crypto_unittest_params *ut_params,
13372 		const struct test_crypto_vector *reference)
13373 {
13374 	return test_authenticated_decryption_fail_when_corruption(
13375 			ts_params, ut_params, reference, 0);
13376 }
13377 
13378 static int
13379 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
13380 {
13381 	return test_authentication_verify_fail_when_data_corrupted(
13382 			&testsuite_params, &unittest_params,
13383 			&hmac_sha1_test_crypto_vector);
13384 }
13385 
13386 static int
13387 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
13388 {
13389 	return test_authentication_verify_fail_when_tag_corrupted(
13390 			&testsuite_params, &unittest_params,
13391 			&hmac_sha1_test_crypto_vector);
13392 }
13393 
13394 static int
13395 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
13396 {
13397 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
13398 			&testsuite_params, &unittest_params,
13399 			&aes128_gmac_test_vector);
13400 }
13401 
13402 static int
13403 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
13404 {
13405 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
13406 			&testsuite_params, &unittest_params,
13407 			&aes128_gmac_test_vector);
13408 }
13409 
13410 static int
13411 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
13412 {
13413 	return test_authenticated_decryption_fail_when_data_corrupted(
13414 			&testsuite_params,
13415 			&unittest_params,
13416 			&aes128cbc_hmac_sha1_test_vector);
13417 }
13418 
13419 static int
13420 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
13421 {
13422 	return test_authenticated_decryption_fail_when_tag_corrupted(
13423 			&testsuite_params,
13424 			&unittest_params,
13425 			&aes128cbc_hmac_sha1_test_vector);
13426 }
13427 
13428 static int
13429 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13430 {
13431 	return test_authenticated_encrypt_with_esn(
13432 			&testsuite_params,
13433 			&unittest_params,
13434 			&aes128cbc_hmac_sha1_aad_test_vector);
13435 }
13436 
13437 static int
13438 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13439 {
13440 	return test_authenticated_decrypt_with_esn(
13441 			&testsuite_params,
13442 			&unittest_params,
13443 			&aes128cbc_hmac_sha1_aad_test_vector);
13444 }
13445 
13446 static int
13447 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
13448 {
13449 	return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
13450 }
13451 
13452 static int
13453 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
13454 {
13455 	return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
13456 }
13457 
13458 #ifdef RTE_CRYPTO_SCHEDULER
13459 
13460 /* global AESNI worker IDs for the scheduler test */
13461 uint8_t aesni_ids[2];
13462 
13463 static int
13464 scheduler_testsuite_setup(void)
13465 {
13466 	uint32_t i = 0;
13467 	int32_t nb_devs, ret;
13468 	char vdev_args[VDEV_ARGS_SIZE] = {""};
13469 	char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
13470 		"ordering=enable,name=cryptodev_test_scheduler,corelist="};
13471 	uint16_t worker_core_count = 0;
13472 	uint16_t socket_id = 0;
13473 
13474 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
13475 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
13476 
13477 		/* Identify the Worker Cores
13478 		 * Use 2 worker cores for the device args
13479 		 */
13480 		RTE_LCORE_FOREACH_WORKER(i) {
13481 			if (worker_core_count > 1)
13482 				break;
13483 			snprintf(vdev_args, sizeof(vdev_args),
13484 					"%s%d", temp_str, i);
13485 			strcpy(temp_str, vdev_args);
13486 			strlcat(temp_str, ";", sizeof(temp_str));
13487 			worker_core_count++;
13488 			socket_id = rte_lcore_to_socket_id(i);
13489 		}
13490 		if (worker_core_count != 2) {
13491 			RTE_LOG(ERR, USER1,
13492 				"Cryptodev scheduler test require at least "
13493 				"two worker cores to run. "
13494 				"Please use the correct coremask.\n");
13495 			return TEST_FAILED;
13496 		}
13497 		strcpy(temp_str, vdev_args);
13498 		snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
13499 				temp_str, socket_id);
13500 		RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
13501 		nb_devs = rte_cryptodev_device_count_by_driver(
13502 				rte_cryptodev_driver_id_get(
13503 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
13504 		if (nb_devs < 1) {
13505 			ret = rte_vdev_init(
13506 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
13507 					vdev_args);
13508 			TEST_ASSERT(ret == 0,
13509 				"Failed to create instance %u of pmd : %s",
13510 				i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
13511 		}
13512 	}
13513 	return testsuite_setup();
13514 }
13515 
13516 static int
13517 test_scheduler_attach_worker_op(void)
13518 {
13519 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13520 	uint8_t sched_id = ts_params->valid_devs[0];
13521 	uint32_t i, nb_devs_attached = 0;
13522 	int ret;
13523 	char vdev_name[32];
13524 	unsigned int count = rte_cryptodev_count();
13525 
13526 	/* create 2 AESNI_MB vdevs on top of existing devices */
13527 	for (i = count; i < count + 2; i++) {
13528 		snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
13529 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
13530 				i);
13531 		ret = rte_vdev_init(vdev_name, NULL);
13532 
13533 		TEST_ASSERT(ret == 0,
13534 			"Failed to create instance %u of"
13535 			" pmd : %s",
13536 			i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13537 
13538 		if (ret < 0) {
13539 			RTE_LOG(ERR, USER1,
13540 				"Failed to create 2 AESNI MB PMDs.\n");
13541 			return TEST_SKIPPED;
13542 		}
13543 	}
13544 
13545 	/* attach 2 AESNI_MB cdevs */
13546 	for (i = count; i < count + 2; i++) {
13547 		struct rte_cryptodev_info info;
13548 		unsigned int session_size;
13549 
13550 		rte_cryptodev_info_get(i, &info);
13551 		if (info.driver_id != rte_cryptodev_driver_id_get(
13552 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
13553 			continue;
13554 
13555 		session_size = rte_cryptodev_sym_get_private_session_size(i);
13556 		/*
13557 		 * Create the session mempool again, since now there are new devices
13558 		 * to use the mempool.
13559 		 */
13560 		if (ts_params->session_mpool) {
13561 			rte_mempool_free(ts_params->session_mpool);
13562 			ts_params->session_mpool = NULL;
13563 		}
13564 		if (ts_params->session_priv_mpool) {
13565 			rte_mempool_free(ts_params->session_priv_mpool);
13566 			ts_params->session_priv_mpool = NULL;
13567 		}
13568 
13569 		if (info.sym.max_nb_sessions != 0 &&
13570 				info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
13571 			RTE_LOG(ERR, USER1,
13572 					"Device does not support "
13573 					"at least %u sessions\n",
13574 					MAX_NB_SESSIONS);
13575 			return TEST_FAILED;
13576 		}
13577 		/*
13578 		 * Create mempool with maximum number of sessions,
13579 		 * to include the session headers
13580 		 */
13581 		if (ts_params->session_mpool == NULL) {
13582 			ts_params->session_mpool =
13583 				rte_cryptodev_sym_session_pool_create(
13584 						"test_sess_mp",
13585 						MAX_NB_SESSIONS, 0, 0, 0,
13586 						SOCKET_ID_ANY);
13587 			TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
13588 					"session mempool allocation failed");
13589 		}
13590 
13591 		/*
13592 		 * Create mempool with maximum number of sessions,
13593 		 * to include device specific session private data
13594 		 */
13595 		if (ts_params->session_priv_mpool == NULL) {
13596 			ts_params->session_priv_mpool = rte_mempool_create(
13597 					"test_sess_mp_priv",
13598 					MAX_NB_SESSIONS,
13599 					session_size,
13600 					0, 0, NULL, NULL, NULL,
13601 					NULL, SOCKET_ID_ANY,
13602 					0);
13603 
13604 			TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
13605 					"session mempool allocation failed");
13606 		}
13607 
13608 		ts_params->qp_conf.mp_session = ts_params->session_mpool;
13609 		ts_params->qp_conf.mp_session_private =
13610 				ts_params->session_priv_mpool;
13611 
13612 		ret = rte_cryptodev_scheduler_worker_attach(sched_id,
13613 				(uint8_t)i);
13614 
13615 		TEST_ASSERT(ret == 0,
13616 			"Failed to attach device %u of pmd : %s", i,
13617 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13618 
13619 		aesni_ids[nb_devs_attached] = (uint8_t)i;
13620 
13621 		nb_devs_attached++;
13622 	}
13623 
13624 	return 0;
13625 }
13626 
13627 static int
13628 test_scheduler_detach_worker_op(void)
13629 {
13630 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13631 	uint8_t sched_id = ts_params->valid_devs[0];
13632 	uint32_t i;
13633 	int ret;
13634 
13635 	for (i = 0; i < 2; i++) {
13636 		ret = rte_cryptodev_scheduler_worker_detach(sched_id,
13637 				aesni_ids[i]);
13638 		TEST_ASSERT(ret == 0,
13639 			"Failed to detach device %u", aesni_ids[i]);
13640 	}
13641 
13642 	return 0;
13643 }
13644 
13645 static int
13646 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
13647 {
13648 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13649 	uint8_t sched_id = ts_params->valid_devs[0];
13650 	/* set mode */
13651 	return rte_cryptodev_scheduler_mode_set(sched_id,
13652 		scheduler_mode);
13653 }
13654 
13655 static int
13656 test_scheduler_mode_roundrobin_op(void)
13657 {
13658 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
13659 			0, "Failed to set roundrobin mode");
13660 	return 0;
13661 
13662 }
13663 
13664 static int
13665 test_scheduler_mode_multicore_op(void)
13666 {
13667 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
13668 			0, "Failed to set multicore mode");
13669 
13670 	return 0;
13671 }
13672 
13673 static int
13674 test_scheduler_mode_failover_op(void)
13675 {
13676 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
13677 			0, "Failed to set failover mode");
13678 
13679 	return 0;
13680 }
13681 
13682 static int
13683 test_scheduler_mode_pkt_size_distr_op(void)
13684 {
13685 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
13686 			0, "Failed to set pktsize mode");
13687 
13688 	return 0;
13689 }
13690 
13691 static int
13692 scheduler_multicore_testsuite_setup(void)
13693 {
13694 	if (test_scheduler_attach_worker_op() < 0)
13695 		return TEST_SKIPPED;
13696 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
13697 		return TEST_SKIPPED;
13698 	return 0;
13699 }
13700 
13701 static int
13702 scheduler_roundrobin_testsuite_setup(void)
13703 {
13704 	if (test_scheduler_attach_worker_op() < 0)
13705 		return TEST_SKIPPED;
13706 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
13707 		return TEST_SKIPPED;
13708 	return 0;
13709 }
13710 
13711 static int
13712 scheduler_failover_testsuite_setup(void)
13713 {
13714 	if (test_scheduler_attach_worker_op() < 0)
13715 		return TEST_SKIPPED;
13716 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
13717 		return TEST_SKIPPED;
13718 	return 0;
13719 }
13720 
13721 static int
13722 scheduler_pkt_size_distr_testsuite_setup(void)
13723 {
13724 	if (test_scheduler_attach_worker_op() < 0)
13725 		return TEST_SKIPPED;
13726 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
13727 		return TEST_SKIPPED;
13728 	return 0;
13729 }
13730 
13731 static void
13732 scheduler_mode_testsuite_teardown(void)
13733 {
13734 	test_scheduler_detach_worker_op();
13735 }
13736 
13737 #endif /* RTE_CRYPTO_SCHEDULER */
13738 
13739 static struct unit_test_suite end_testsuite = {
13740 	.suite_name = NULL,
13741 	.setup = NULL,
13742 	.teardown = NULL,
13743 	.unit_test_suites = NULL
13744 };
13745 
13746 #ifdef RTE_LIB_SECURITY
13747 static struct unit_test_suite pdcp_proto_testsuite  = {
13748 	.suite_name = "PDCP Proto Unit Test Suite",
13749 	.setup = pdcp_proto_testsuite_setup,
13750 	.unit_test_cases = {
13751 		TEST_CASE_ST(ut_setup_security, ut_teardown,
13752 			test_PDCP_PROTO_all),
13753 		TEST_CASES_END() /**< NULL terminate unit test array */
13754 	}
13755 };
13756 
13757 static struct unit_test_suite docsis_proto_testsuite  = {
13758 	.suite_name = "Docsis Proto Unit Test Suite",
13759 	.setup = docsis_proto_testsuite_setup,
13760 	.unit_test_cases = {
13761 		TEST_CASE_ST(ut_setup_security, ut_teardown,
13762 			test_DOCSIS_PROTO_all),
13763 		TEST_CASES_END() /**< NULL terminate unit test array */
13764 	}
13765 };
13766 #endif
13767 
13768 static struct unit_test_suite cryptodev_gen_testsuite  = {
13769 	.suite_name = "Crypto General Unit Test Suite",
13770 	.setup = crypto_gen_testsuite_setup,
13771 	.unit_test_cases = {
13772 		TEST_CASE_ST(ut_setup, ut_teardown,
13773 				test_device_configure_invalid_dev_id),
13774 		TEST_CASE_ST(ut_setup, ut_teardown,
13775 				test_queue_pair_descriptor_setup),
13776 		TEST_CASE_ST(ut_setup, ut_teardown,
13777 				test_device_configure_invalid_queue_pair_ids),
13778 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
13779 		TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
13780 		TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
13781 		TEST_CASES_END() /**< NULL terminate unit test array */
13782 	}
13783 };
13784 
13785 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
13786 	.suite_name = "Negative HMAC SHA1 Unit Test Suite",
13787 	.setup = negative_hmac_sha1_testsuite_setup,
13788 	.unit_test_cases = {
13789 		/** Negative tests */
13790 		TEST_CASE_ST(ut_setup, ut_teardown,
13791 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13792 		TEST_CASE_ST(ut_setup, ut_teardown,
13793 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13794 		TEST_CASE_ST(ut_setup, ut_teardown,
13795 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13796 		TEST_CASE_ST(ut_setup, ut_teardown,
13797 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13798 
13799 		TEST_CASES_END() /**< NULL terminate unit test array */
13800 	}
13801 };
13802 
13803 static struct unit_test_suite cryptodev_multi_session_testsuite = {
13804 	.suite_name = "Multi Session Unit Test Suite",
13805 	.setup = multi_session_testsuite_setup,
13806 	.unit_test_cases = {
13807 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13808 		TEST_CASE_ST(ut_setup, ut_teardown,
13809 				test_multi_session_random_usage),
13810 
13811 		TEST_CASES_END() /**< NULL terminate unit test array */
13812 	}
13813 };
13814 
13815 static struct unit_test_suite cryptodev_null_testsuite  = {
13816 	.suite_name = "NULL Test Suite",
13817 	.setup = null_testsuite_setup,
13818 	.unit_test_cases = {
13819 		TEST_CASE_ST(ut_setup, ut_teardown,
13820 			test_null_invalid_operation),
13821 		TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
13822 		TEST_CASES_END()
13823 	}
13824 };
13825 
13826 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
13827 	.suite_name = "AES CCM Authenticated Test Suite",
13828 	.setup = aes_ccm_auth_testsuite_setup,
13829 	.unit_test_cases = {
13830 		/** AES CCM Authenticated Encryption 128 bits key*/
13831 		TEST_CASE_ST(ut_setup, ut_teardown,
13832 			test_AES_CCM_authenticated_encryption_test_case_128_1),
13833 		TEST_CASE_ST(ut_setup, ut_teardown,
13834 			test_AES_CCM_authenticated_encryption_test_case_128_2),
13835 		TEST_CASE_ST(ut_setup, ut_teardown,
13836 			test_AES_CCM_authenticated_encryption_test_case_128_3),
13837 
13838 		/** AES CCM Authenticated Decryption 128 bits key*/
13839 		TEST_CASE_ST(ut_setup, ut_teardown,
13840 			test_AES_CCM_authenticated_decryption_test_case_128_1),
13841 		TEST_CASE_ST(ut_setup, ut_teardown,
13842 			test_AES_CCM_authenticated_decryption_test_case_128_2),
13843 		TEST_CASE_ST(ut_setup, ut_teardown,
13844 			test_AES_CCM_authenticated_decryption_test_case_128_3),
13845 
13846 		/** AES CCM Authenticated Encryption 192 bits key */
13847 		TEST_CASE_ST(ut_setup, ut_teardown,
13848 			test_AES_CCM_authenticated_encryption_test_case_192_1),
13849 		TEST_CASE_ST(ut_setup, ut_teardown,
13850 			test_AES_CCM_authenticated_encryption_test_case_192_2),
13851 		TEST_CASE_ST(ut_setup, ut_teardown,
13852 			test_AES_CCM_authenticated_encryption_test_case_192_3),
13853 
13854 		/** AES CCM Authenticated Decryption 192 bits key*/
13855 		TEST_CASE_ST(ut_setup, ut_teardown,
13856 			test_AES_CCM_authenticated_decryption_test_case_192_1),
13857 		TEST_CASE_ST(ut_setup, ut_teardown,
13858 			test_AES_CCM_authenticated_decryption_test_case_192_2),
13859 		TEST_CASE_ST(ut_setup, ut_teardown,
13860 			test_AES_CCM_authenticated_decryption_test_case_192_3),
13861 
13862 		/** AES CCM Authenticated Encryption 256 bits key */
13863 		TEST_CASE_ST(ut_setup, ut_teardown,
13864 			test_AES_CCM_authenticated_encryption_test_case_256_1),
13865 		TEST_CASE_ST(ut_setup, ut_teardown,
13866 			test_AES_CCM_authenticated_encryption_test_case_256_2),
13867 		TEST_CASE_ST(ut_setup, ut_teardown,
13868 			test_AES_CCM_authenticated_encryption_test_case_256_3),
13869 
13870 		/** AES CCM Authenticated Decryption 256 bits key*/
13871 		TEST_CASE_ST(ut_setup, ut_teardown,
13872 			test_AES_CCM_authenticated_decryption_test_case_256_1),
13873 		TEST_CASE_ST(ut_setup, ut_teardown,
13874 			test_AES_CCM_authenticated_decryption_test_case_256_2),
13875 		TEST_CASE_ST(ut_setup, ut_teardown,
13876 			test_AES_CCM_authenticated_decryption_test_case_256_3),
13877 		TEST_CASES_END()
13878 	}
13879 };
13880 
13881 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
13882 	.suite_name = "AES GCM Authenticated Test Suite",
13883 	.setup = aes_gcm_auth_testsuite_setup,
13884 	.unit_test_cases = {
13885 		/** AES GCM Authenticated Encryption */
13886 		TEST_CASE_ST(ut_setup, ut_teardown,
13887 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
13888 		TEST_CASE_ST(ut_setup, ut_teardown,
13889 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
13890 		TEST_CASE_ST(ut_setup, ut_teardown,
13891 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
13892 		TEST_CASE_ST(ut_setup, ut_teardown,
13893 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
13894 		TEST_CASE_ST(ut_setup, ut_teardown,
13895 			test_AES_GCM_authenticated_encryption_test_case_1),
13896 		TEST_CASE_ST(ut_setup, ut_teardown,
13897 			test_AES_GCM_authenticated_encryption_test_case_2),
13898 		TEST_CASE_ST(ut_setup, ut_teardown,
13899 			test_AES_GCM_authenticated_encryption_test_case_3),
13900 		TEST_CASE_ST(ut_setup, ut_teardown,
13901 			test_AES_GCM_authenticated_encryption_test_case_4),
13902 		TEST_CASE_ST(ut_setup, ut_teardown,
13903 			test_AES_GCM_authenticated_encryption_test_case_5),
13904 		TEST_CASE_ST(ut_setup, ut_teardown,
13905 			test_AES_GCM_authenticated_encryption_test_case_6),
13906 		TEST_CASE_ST(ut_setup, ut_teardown,
13907 			test_AES_GCM_authenticated_encryption_test_case_7),
13908 		TEST_CASE_ST(ut_setup, ut_teardown,
13909 			test_AES_GCM_authenticated_encryption_test_case_8),
13910 		TEST_CASE_ST(ut_setup, ut_teardown,
13911 			test_AES_GCM_J0_authenticated_encryption_test_case_1),
13912 
13913 		/** AES GCM Authenticated Decryption */
13914 		TEST_CASE_ST(ut_setup, ut_teardown,
13915 			test_AES_GCM_authenticated_decryption_test_case_1),
13916 		TEST_CASE_ST(ut_setup, ut_teardown,
13917 			test_AES_GCM_authenticated_decryption_test_case_2),
13918 		TEST_CASE_ST(ut_setup, ut_teardown,
13919 			test_AES_GCM_authenticated_decryption_test_case_3),
13920 		TEST_CASE_ST(ut_setup, ut_teardown,
13921 			test_AES_GCM_authenticated_decryption_test_case_4),
13922 		TEST_CASE_ST(ut_setup, ut_teardown,
13923 			test_AES_GCM_authenticated_decryption_test_case_5),
13924 		TEST_CASE_ST(ut_setup, ut_teardown,
13925 			test_AES_GCM_authenticated_decryption_test_case_6),
13926 		TEST_CASE_ST(ut_setup, ut_teardown,
13927 			test_AES_GCM_authenticated_decryption_test_case_7),
13928 		TEST_CASE_ST(ut_setup, ut_teardown,
13929 			test_AES_GCM_authenticated_decryption_test_case_8),
13930 		TEST_CASE_ST(ut_setup, ut_teardown,
13931 			test_AES_GCM_J0_authenticated_decryption_test_case_1),
13932 
13933 		/** AES GCM Authenticated Encryption 192 bits key */
13934 		TEST_CASE_ST(ut_setup, ut_teardown,
13935 			test_AES_GCM_auth_encryption_test_case_192_1),
13936 		TEST_CASE_ST(ut_setup, ut_teardown,
13937 			test_AES_GCM_auth_encryption_test_case_192_2),
13938 		TEST_CASE_ST(ut_setup, ut_teardown,
13939 			test_AES_GCM_auth_encryption_test_case_192_3),
13940 		TEST_CASE_ST(ut_setup, ut_teardown,
13941 			test_AES_GCM_auth_encryption_test_case_192_4),
13942 		TEST_CASE_ST(ut_setup, ut_teardown,
13943 			test_AES_GCM_auth_encryption_test_case_192_5),
13944 		TEST_CASE_ST(ut_setup, ut_teardown,
13945 			test_AES_GCM_auth_encryption_test_case_192_6),
13946 		TEST_CASE_ST(ut_setup, ut_teardown,
13947 			test_AES_GCM_auth_encryption_test_case_192_7),
13948 
13949 		/** AES GCM Authenticated Decryption 192 bits key */
13950 		TEST_CASE_ST(ut_setup, ut_teardown,
13951 			test_AES_GCM_auth_decryption_test_case_192_1),
13952 		TEST_CASE_ST(ut_setup, ut_teardown,
13953 			test_AES_GCM_auth_decryption_test_case_192_2),
13954 		TEST_CASE_ST(ut_setup, ut_teardown,
13955 			test_AES_GCM_auth_decryption_test_case_192_3),
13956 		TEST_CASE_ST(ut_setup, ut_teardown,
13957 			test_AES_GCM_auth_decryption_test_case_192_4),
13958 		TEST_CASE_ST(ut_setup, ut_teardown,
13959 			test_AES_GCM_auth_decryption_test_case_192_5),
13960 		TEST_CASE_ST(ut_setup, ut_teardown,
13961 			test_AES_GCM_auth_decryption_test_case_192_6),
13962 		TEST_CASE_ST(ut_setup, ut_teardown,
13963 			test_AES_GCM_auth_decryption_test_case_192_7),
13964 
13965 		/** AES GCM Authenticated Encryption 256 bits key */
13966 		TEST_CASE_ST(ut_setup, ut_teardown,
13967 			test_AES_GCM_auth_encryption_test_case_256_1),
13968 		TEST_CASE_ST(ut_setup, ut_teardown,
13969 			test_AES_GCM_auth_encryption_test_case_256_2),
13970 		TEST_CASE_ST(ut_setup, ut_teardown,
13971 			test_AES_GCM_auth_encryption_test_case_256_3),
13972 		TEST_CASE_ST(ut_setup, ut_teardown,
13973 			test_AES_GCM_auth_encryption_test_case_256_4),
13974 		TEST_CASE_ST(ut_setup, ut_teardown,
13975 			test_AES_GCM_auth_encryption_test_case_256_5),
13976 		TEST_CASE_ST(ut_setup, ut_teardown,
13977 			test_AES_GCM_auth_encryption_test_case_256_6),
13978 		TEST_CASE_ST(ut_setup, ut_teardown,
13979 			test_AES_GCM_auth_encryption_test_case_256_7),
13980 
13981 		/** AES GCM Authenticated Decryption 256 bits key */
13982 		TEST_CASE_ST(ut_setup, ut_teardown,
13983 			test_AES_GCM_auth_decryption_test_case_256_1),
13984 		TEST_CASE_ST(ut_setup, ut_teardown,
13985 			test_AES_GCM_auth_decryption_test_case_256_2),
13986 		TEST_CASE_ST(ut_setup, ut_teardown,
13987 			test_AES_GCM_auth_decryption_test_case_256_3),
13988 		TEST_CASE_ST(ut_setup, ut_teardown,
13989 			test_AES_GCM_auth_decryption_test_case_256_4),
13990 		TEST_CASE_ST(ut_setup, ut_teardown,
13991 			test_AES_GCM_auth_decryption_test_case_256_5),
13992 		TEST_CASE_ST(ut_setup, ut_teardown,
13993 			test_AES_GCM_auth_decryption_test_case_256_6),
13994 		TEST_CASE_ST(ut_setup, ut_teardown,
13995 			test_AES_GCM_auth_decryption_test_case_256_7),
13996 
13997 		/** AES GCM Authenticated Encryption big aad size */
13998 		TEST_CASE_ST(ut_setup, ut_teardown,
13999 			test_AES_GCM_auth_encryption_test_case_aad_1),
14000 		TEST_CASE_ST(ut_setup, ut_teardown,
14001 			test_AES_GCM_auth_encryption_test_case_aad_2),
14002 
14003 		/** AES GCM Authenticated Decryption big aad size */
14004 		TEST_CASE_ST(ut_setup, ut_teardown,
14005 			test_AES_GCM_auth_decryption_test_case_aad_1),
14006 		TEST_CASE_ST(ut_setup, ut_teardown,
14007 			test_AES_GCM_auth_decryption_test_case_aad_2),
14008 
14009 		/** Out of place tests */
14010 		TEST_CASE_ST(ut_setup, ut_teardown,
14011 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
14012 		TEST_CASE_ST(ut_setup, ut_teardown,
14013 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
14014 
14015 		/** Session-less tests */
14016 		TEST_CASE_ST(ut_setup, ut_teardown,
14017 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
14018 		TEST_CASE_ST(ut_setup, ut_teardown,
14019 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
14020 
14021 		TEST_CASES_END()
14022 	}
14023 };
14024 
14025 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
14026 	.suite_name = "AES GMAC Authentication Test Suite",
14027 	.setup = aes_gmac_auth_testsuite_setup,
14028 	.unit_test_cases = {
14029 		TEST_CASE_ST(ut_setup, ut_teardown,
14030 			test_AES_GMAC_authentication_test_case_1),
14031 		TEST_CASE_ST(ut_setup, ut_teardown,
14032 			test_AES_GMAC_authentication_verify_test_case_1),
14033 		TEST_CASE_ST(ut_setup, ut_teardown,
14034 			test_AES_GMAC_authentication_test_case_2),
14035 		TEST_CASE_ST(ut_setup, ut_teardown,
14036 			test_AES_GMAC_authentication_verify_test_case_2),
14037 		TEST_CASE_ST(ut_setup, ut_teardown,
14038 			test_AES_GMAC_authentication_test_case_3),
14039 		TEST_CASE_ST(ut_setup, ut_teardown,
14040 			test_AES_GMAC_authentication_verify_test_case_3),
14041 		TEST_CASE_ST(ut_setup, ut_teardown,
14042 			test_AES_GMAC_authentication_test_case_4),
14043 		TEST_CASE_ST(ut_setup, ut_teardown,
14044 			test_AES_GMAC_authentication_verify_test_case_4),
14045 		TEST_CASE_ST(ut_setup, ut_teardown,
14046 			test_AES_GMAC_authentication_SGL_40B),
14047 		TEST_CASE_ST(ut_setup, ut_teardown,
14048 			test_AES_GMAC_authentication_SGL_80B),
14049 		TEST_CASE_ST(ut_setup, ut_teardown,
14050 			test_AES_GMAC_authentication_SGL_2048B),
14051 		TEST_CASE_ST(ut_setup, ut_teardown,
14052 			test_AES_GMAC_authentication_SGL_2047B),
14053 
14054 		TEST_CASES_END()
14055 	}
14056 };
14057 
14058 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
14059 	.suite_name = "Chacha20-Poly1305 Test Suite",
14060 	.setup = chacha20_poly1305_testsuite_setup,
14061 	.unit_test_cases = {
14062 		TEST_CASE_ST(ut_setup, ut_teardown,
14063 			test_chacha20_poly1305_encrypt_test_case_rfc8439),
14064 		TEST_CASE_ST(ut_setup, ut_teardown,
14065 			test_chacha20_poly1305_decrypt_test_case_rfc8439),
14066 		TEST_CASES_END()
14067 	}
14068 };
14069 
14070 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
14071 	.suite_name = "SNOW 3G Test Suite",
14072 	.setup = snow3g_testsuite_setup,
14073 	.unit_test_cases = {
14074 		/** SNOW 3G encrypt only (UEA2) */
14075 		TEST_CASE_ST(ut_setup, ut_teardown,
14076 			test_snow3g_encryption_test_case_1),
14077 		TEST_CASE_ST(ut_setup, ut_teardown,
14078 			test_snow3g_encryption_test_case_2),
14079 		TEST_CASE_ST(ut_setup, ut_teardown,
14080 			test_snow3g_encryption_test_case_3),
14081 		TEST_CASE_ST(ut_setup, ut_teardown,
14082 			test_snow3g_encryption_test_case_4),
14083 		TEST_CASE_ST(ut_setup, ut_teardown,
14084 			test_snow3g_encryption_test_case_5),
14085 
14086 		TEST_CASE_ST(ut_setup, ut_teardown,
14087 			test_PDCP_PROTO_short_mac),
14088 		TEST_CASE_ST(ut_setup, ut_teardown,
14089 			test_snow3g_encryption_test_case_1_oop),
14090 		TEST_CASE_ST(ut_setup, ut_teardown,
14091 			test_snow3g_encryption_test_case_1_oop_sgl),
14092 		TEST_CASE_ST(ut_setup, ut_teardown,
14093 			test_snow3g_encryption_test_case_1_offset_oop),
14094 		TEST_CASE_ST(ut_setup, ut_teardown,
14095 			test_snow3g_decryption_test_case_1_oop),
14096 
14097 		/** SNOW 3G generate auth, then encrypt (UEA2) */
14098 		TEST_CASE_ST(ut_setup, ut_teardown,
14099 			test_snow3g_auth_cipher_test_case_1),
14100 		TEST_CASE_ST(ut_setup, ut_teardown,
14101 			test_snow3g_auth_cipher_test_case_2),
14102 		TEST_CASE_ST(ut_setup, ut_teardown,
14103 			test_snow3g_auth_cipher_test_case_2_oop),
14104 		TEST_CASE_ST(ut_setup, ut_teardown,
14105 			test_snow3g_auth_cipher_part_digest_enc),
14106 		TEST_CASE_ST(ut_setup, ut_teardown,
14107 			test_snow3g_auth_cipher_part_digest_enc_oop),
14108 		TEST_CASE_ST(ut_setup, ut_teardown,
14109 			test_snow3g_auth_cipher_test_case_3_sgl),
14110 		TEST_CASE_ST(ut_setup, ut_teardown,
14111 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
14112 		TEST_CASE_ST(ut_setup, ut_teardown,
14113 			test_snow3g_auth_cipher_part_digest_enc_sgl),
14114 		TEST_CASE_ST(ut_setup, ut_teardown,
14115 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
14116 
14117 		/** SNOW 3G decrypt (UEA2), then verify auth */
14118 		TEST_CASE_ST(ut_setup, ut_teardown,
14119 			test_snow3g_auth_cipher_verify_test_case_1),
14120 		TEST_CASE_ST(ut_setup, ut_teardown,
14121 			test_snow3g_auth_cipher_verify_test_case_2),
14122 		TEST_CASE_ST(ut_setup, ut_teardown,
14123 			test_snow3g_auth_cipher_verify_test_case_2_oop),
14124 		TEST_CASE_ST(ut_setup, ut_teardown,
14125 			test_snow3g_auth_cipher_verify_part_digest_enc),
14126 		TEST_CASE_ST(ut_setup, ut_teardown,
14127 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
14128 		TEST_CASE_ST(ut_setup, ut_teardown,
14129 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
14130 		TEST_CASE_ST(ut_setup, ut_teardown,
14131 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
14132 		TEST_CASE_ST(ut_setup, ut_teardown,
14133 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
14134 		TEST_CASE_ST(ut_setup, ut_teardown,
14135 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
14136 
14137 		/** SNOW 3G decrypt only (UEA2) */
14138 		TEST_CASE_ST(ut_setup, ut_teardown,
14139 			test_snow3g_decryption_test_case_1),
14140 		TEST_CASE_ST(ut_setup, ut_teardown,
14141 			test_snow3g_decryption_test_case_2),
14142 		TEST_CASE_ST(ut_setup, ut_teardown,
14143 			test_snow3g_decryption_test_case_3),
14144 		TEST_CASE_ST(ut_setup, ut_teardown,
14145 			test_snow3g_decryption_test_case_4),
14146 		TEST_CASE_ST(ut_setup, ut_teardown,
14147 			test_snow3g_decryption_test_case_5),
14148 		TEST_CASE_ST(ut_setup, ut_teardown,
14149 			test_snow3g_decryption_with_digest_test_case_1),
14150 		TEST_CASE_ST(ut_setup, ut_teardown,
14151 			test_snow3g_hash_generate_test_case_1),
14152 		TEST_CASE_ST(ut_setup, ut_teardown,
14153 			test_snow3g_hash_generate_test_case_2),
14154 		TEST_CASE_ST(ut_setup, ut_teardown,
14155 			test_snow3g_hash_generate_test_case_3),
14156 
14157 		/* Tests with buffers which length is not byte-aligned */
14158 		TEST_CASE_ST(ut_setup, ut_teardown,
14159 			test_snow3g_hash_generate_test_case_4),
14160 		TEST_CASE_ST(ut_setup, ut_teardown,
14161 			test_snow3g_hash_generate_test_case_5),
14162 		TEST_CASE_ST(ut_setup, ut_teardown,
14163 			test_snow3g_hash_generate_test_case_6),
14164 		TEST_CASE_ST(ut_setup, ut_teardown,
14165 			test_snow3g_hash_verify_test_case_1),
14166 		TEST_CASE_ST(ut_setup, ut_teardown,
14167 			test_snow3g_hash_verify_test_case_2),
14168 		TEST_CASE_ST(ut_setup, ut_teardown,
14169 			test_snow3g_hash_verify_test_case_3),
14170 
14171 		/* Tests with buffers which length is not byte-aligned */
14172 		TEST_CASE_ST(ut_setup, ut_teardown,
14173 			test_snow3g_hash_verify_test_case_4),
14174 		TEST_CASE_ST(ut_setup, ut_teardown,
14175 			test_snow3g_hash_verify_test_case_5),
14176 		TEST_CASE_ST(ut_setup, ut_teardown,
14177 			test_snow3g_hash_verify_test_case_6),
14178 		TEST_CASE_ST(ut_setup, ut_teardown,
14179 			test_snow3g_cipher_auth_test_case_1),
14180 		TEST_CASE_ST(ut_setup, ut_teardown,
14181 			test_snow3g_auth_cipher_with_digest_test_case_1),
14182 		TEST_CASES_END()
14183 	}
14184 };
14185 
14186 static struct unit_test_suite cryptodev_zuc_testsuite  = {
14187 	.suite_name = "ZUC Test Suite",
14188 	.setup = zuc_testsuite_setup,
14189 	.unit_test_cases = {
14190 		/** ZUC encrypt only (EEA3) */
14191 		TEST_CASE_ST(ut_setup, ut_teardown,
14192 			test_zuc_encryption_test_case_1),
14193 		TEST_CASE_ST(ut_setup, ut_teardown,
14194 			test_zuc_encryption_test_case_2),
14195 		TEST_CASE_ST(ut_setup, ut_teardown,
14196 			test_zuc_encryption_test_case_3),
14197 		TEST_CASE_ST(ut_setup, ut_teardown,
14198 			test_zuc_encryption_test_case_4),
14199 		TEST_CASE_ST(ut_setup, ut_teardown,
14200 			test_zuc_encryption_test_case_5),
14201 		TEST_CASE_ST(ut_setup, ut_teardown,
14202 			test_zuc_encryption_test_case_6_sgl),
14203 
14204 		/** ZUC authenticate (EIA3) */
14205 		TEST_CASE_ST(ut_setup, ut_teardown,
14206 			test_zuc_hash_generate_test_case_1),
14207 		TEST_CASE_ST(ut_setup, ut_teardown,
14208 			test_zuc_hash_generate_test_case_2),
14209 		TEST_CASE_ST(ut_setup, ut_teardown,
14210 			test_zuc_hash_generate_test_case_3),
14211 		TEST_CASE_ST(ut_setup, ut_teardown,
14212 			test_zuc_hash_generate_test_case_4),
14213 		TEST_CASE_ST(ut_setup, ut_teardown,
14214 			test_zuc_hash_generate_test_case_5),
14215 		TEST_CASE_ST(ut_setup, ut_teardown,
14216 			test_zuc_hash_generate_test_case_6),
14217 		TEST_CASE_ST(ut_setup, ut_teardown,
14218 			test_zuc_hash_generate_test_case_7),
14219 		TEST_CASE_ST(ut_setup, ut_teardown,
14220 			test_zuc_hash_generate_test_case_8),
14221 
14222 		/** ZUC alg-chain (EEA3/EIA3) */
14223 		TEST_CASE_ST(ut_setup, ut_teardown,
14224 			test_zuc_cipher_auth_test_case_1),
14225 		TEST_CASE_ST(ut_setup, ut_teardown,
14226 			test_zuc_cipher_auth_test_case_2),
14227 
14228 		/** ZUC generate auth, then encrypt (EEA3) */
14229 		TEST_CASE_ST(ut_setup, ut_teardown,
14230 			test_zuc_auth_cipher_test_case_1),
14231 		TEST_CASE_ST(ut_setup, ut_teardown,
14232 			test_zuc_auth_cipher_test_case_1_oop),
14233 		TEST_CASE_ST(ut_setup, ut_teardown,
14234 			test_zuc_auth_cipher_test_case_1_sgl),
14235 		TEST_CASE_ST(ut_setup, ut_teardown,
14236 			test_zuc_auth_cipher_test_case_1_oop_sgl),
14237 
14238 		/** ZUC decrypt (EEA3), then verify auth */
14239 		TEST_CASE_ST(ut_setup, ut_teardown,
14240 			test_zuc_auth_cipher_verify_test_case_1),
14241 		TEST_CASE_ST(ut_setup, ut_teardown,
14242 			test_zuc_auth_cipher_verify_test_case_1_oop),
14243 		TEST_CASE_ST(ut_setup, ut_teardown,
14244 			test_zuc_auth_cipher_verify_test_case_1_sgl),
14245 		TEST_CASE_ST(ut_setup, ut_teardown,
14246 			test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
14247 		TEST_CASES_END()
14248 	}
14249 };
14250 
14251 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
14252 	.suite_name = "HMAC_MD5 Authentication Test Suite",
14253 	.setup = hmac_md5_auth_testsuite_setup,
14254 	.unit_test_cases = {
14255 		TEST_CASE_ST(ut_setup, ut_teardown,
14256 			test_MD5_HMAC_generate_case_1),
14257 		TEST_CASE_ST(ut_setup, ut_teardown,
14258 			test_MD5_HMAC_verify_case_1),
14259 		TEST_CASE_ST(ut_setup, ut_teardown,
14260 			test_MD5_HMAC_generate_case_2),
14261 		TEST_CASE_ST(ut_setup, ut_teardown,
14262 			test_MD5_HMAC_verify_case_2),
14263 		TEST_CASES_END()
14264 	}
14265 };
14266 
14267 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
14268 	.suite_name = "Kasumi Test Suite",
14269 	.setup = kasumi_testsuite_setup,
14270 	.unit_test_cases = {
14271 		/** KASUMI hash only (UIA1) */
14272 		TEST_CASE_ST(ut_setup, ut_teardown,
14273 			test_kasumi_hash_generate_test_case_1),
14274 		TEST_CASE_ST(ut_setup, ut_teardown,
14275 			test_kasumi_hash_generate_test_case_2),
14276 		TEST_CASE_ST(ut_setup, ut_teardown,
14277 			test_kasumi_hash_generate_test_case_3),
14278 		TEST_CASE_ST(ut_setup, ut_teardown,
14279 			test_kasumi_hash_generate_test_case_4),
14280 		TEST_CASE_ST(ut_setup, ut_teardown,
14281 			test_kasumi_hash_generate_test_case_5),
14282 		TEST_CASE_ST(ut_setup, ut_teardown,
14283 			test_kasumi_hash_generate_test_case_6),
14284 
14285 		TEST_CASE_ST(ut_setup, ut_teardown,
14286 			test_kasumi_hash_verify_test_case_1),
14287 		TEST_CASE_ST(ut_setup, ut_teardown,
14288 			test_kasumi_hash_verify_test_case_2),
14289 		TEST_CASE_ST(ut_setup, ut_teardown,
14290 			test_kasumi_hash_verify_test_case_3),
14291 		TEST_CASE_ST(ut_setup, ut_teardown,
14292 			test_kasumi_hash_verify_test_case_4),
14293 		TEST_CASE_ST(ut_setup, ut_teardown,
14294 			test_kasumi_hash_verify_test_case_5),
14295 
14296 		/** KASUMI encrypt only (UEA1) */
14297 		TEST_CASE_ST(ut_setup, ut_teardown,
14298 			test_kasumi_encryption_test_case_1),
14299 		TEST_CASE_ST(ut_setup, ut_teardown,
14300 			test_kasumi_encryption_test_case_1_sgl),
14301 		TEST_CASE_ST(ut_setup, ut_teardown,
14302 			test_kasumi_encryption_test_case_1_oop),
14303 		TEST_CASE_ST(ut_setup, ut_teardown,
14304 			test_kasumi_encryption_test_case_1_oop_sgl),
14305 		TEST_CASE_ST(ut_setup, ut_teardown,
14306 			test_kasumi_encryption_test_case_2),
14307 		TEST_CASE_ST(ut_setup, ut_teardown,
14308 			test_kasumi_encryption_test_case_3),
14309 		TEST_CASE_ST(ut_setup, ut_teardown,
14310 			test_kasumi_encryption_test_case_4),
14311 		TEST_CASE_ST(ut_setup, ut_teardown,
14312 			test_kasumi_encryption_test_case_5),
14313 
14314 		/** KASUMI decrypt only (UEA1) */
14315 		TEST_CASE_ST(ut_setup, ut_teardown,
14316 			test_kasumi_decryption_test_case_1),
14317 		TEST_CASE_ST(ut_setup, ut_teardown,
14318 			test_kasumi_decryption_test_case_2),
14319 		TEST_CASE_ST(ut_setup, ut_teardown,
14320 			test_kasumi_decryption_test_case_3),
14321 		TEST_CASE_ST(ut_setup, ut_teardown,
14322 			test_kasumi_decryption_test_case_4),
14323 		TEST_CASE_ST(ut_setup, ut_teardown,
14324 			test_kasumi_decryption_test_case_5),
14325 		TEST_CASE_ST(ut_setup, ut_teardown,
14326 			test_kasumi_decryption_test_case_1_oop),
14327 
14328 		TEST_CASE_ST(ut_setup, ut_teardown,
14329 			test_PDCP_PROTO_short_mac),
14330 		TEST_CASE_ST(ut_setup, ut_teardown,
14331 			test_kasumi_cipher_auth_test_case_1),
14332 
14333 		/** KASUMI generate auth, then encrypt (F8) */
14334 		TEST_CASE_ST(ut_setup, ut_teardown,
14335 			test_kasumi_auth_cipher_test_case_1),
14336 		TEST_CASE_ST(ut_setup, ut_teardown,
14337 			test_kasumi_auth_cipher_test_case_2),
14338 		TEST_CASE_ST(ut_setup, ut_teardown,
14339 			test_kasumi_auth_cipher_test_case_2_oop),
14340 		TEST_CASE_ST(ut_setup, ut_teardown,
14341 			test_kasumi_auth_cipher_test_case_2_sgl),
14342 		TEST_CASE_ST(ut_setup, ut_teardown,
14343 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
14344 
14345 		/** KASUMI decrypt (F8), then verify auth */
14346 		TEST_CASE_ST(ut_setup, ut_teardown,
14347 			test_kasumi_auth_cipher_verify_test_case_1),
14348 		TEST_CASE_ST(ut_setup, ut_teardown,
14349 			test_kasumi_auth_cipher_verify_test_case_2),
14350 		TEST_CASE_ST(ut_setup, ut_teardown,
14351 			test_kasumi_auth_cipher_verify_test_case_2_oop),
14352 		TEST_CASE_ST(ut_setup, ut_teardown,
14353 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
14354 		TEST_CASE_ST(ut_setup, ut_teardown,
14355 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
14356 
14357 		TEST_CASES_END()
14358 	}
14359 };
14360 
14361 static struct unit_test_suite cryptodev_esn_testsuite  = {
14362 	.suite_name = "ESN Test Suite",
14363 	.setup = esn_testsuite_setup,
14364 	.unit_test_cases = {
14365 		TEST_CASE_ST(ut_setup, ut_teardown,
14366 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
14367 		TEST_CASE_ST(ut_setup, ut_teardown,
14368 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
14369 		TEST_CASES_END()
14370 	}
14371 };
14372 
14373 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
14374 	.suite_name = "Negative AES GCM Test Suite",
14375 	.setup = negative_aes_gcm_testsuite_setup,
14376 	.unit_test_cases = {
14377 		TEST_CASE_ST(ut_setup, ut_teardown,
14378 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
14379 		TEST_CASE_ST(ut_setup, ut_teardown,
14380 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
14381 		TEST_CASE_ST(ut_setup, ut_teardown,
14382 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
14383 		TEST_CASE_ST(ut_setup, ut_teardown,
14384 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
14385 		TEST_CASE_ST(ut_setup, ut_teardown,
14386 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
14387 		TEST_CASE_ST(ut_setup, ut_teardown,
14388 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
14389 		TEST_CASE_ST(ut_setup, ut_teardown,
14390 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
14391 		TEST_CASE_ST(ut_setup, ut_teardown,
14392 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
14393 		TEST_CASE_ST(ut_setup, ut_teardown,
14394 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
14395 		TEST_CASE_ST(ut_setup, ut_teardown,
14396 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
14397 		TEST_CASE_ST(ut_setup, ut_teardown,
14398 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
14399 		TEST_CASE_ST(ut_setup, ut_teardown,
14400 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
14401 
14402 		TEST_CASES_END()
14403 	}
14404 };
14405 
14406 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
14407 	.suite_name = "Negative AES GMAC Test Suite",
14408 	.setup = negative_aes_gmac_testsuite_setup,
14409 	.unit_test_cases = {
14410 		TEST_CASE_ST(ut_setup, ut_teardown,
14411 			authentication_verify_AES128_GMAC_fail_data_corrupt),
14412 		TEST_CASE_ST(ut_setup, ut_teardown,
14413 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
14414 
14415 		TEST_CASES_END()
14416 	}
14417 };
14418 
14419 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
14420 	.suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
14421 	.setup = mixed_cipher_hash_testsuite_setup,
14422 	.unit_test_cases = {
14423 		/** AUTH AES CMAC + CIPHER AES CTR */
14424 		TEST_CASE_ST(ut_setup, ut_teardown,
14425 			test_aes_cmac_aes_ctr_digest_enc_test_case_1),
14426 		TEST_CASE_ST(ut_setup, ut_teardown,
14427 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
14428 		TEST_CASE_ST(ut_setup, ut_teardown,
14429 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
14430 		TEST_CASE_ST(ut_setup, ut_teardown,
14431 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
14432 		TEST_CASE_ST(ut_setup, ut_teardown,
14433 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
14434 		TEST_CASE_ST(ut_setup, ut_teardown,
14435 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
14436 		TEST_CASE_ST(ut_setup, ut_teardown,
14437 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
14438 		TEST_CASE_ST(ut_setup, ut_teardown,
14439 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
14440 
14441 		/** AUTH ZUC + CIPHER SNOW3G */
14442 		TEST_CASE_ST(ut_setup, ut_teardown,
14443 			test_auth_zuc_cipher_snow_test_case_1),
14444 		TEST_CASE_ST(ut_setup, ut_teardown,
14445 			test_verify_auth_zuc_cipher_snow_test_case_1),
14446 		/** AUTH AES CMAC + CIPHER SNOW3G */
14447 		TEST_CASE_ST(ut_setup, ut_teardown,
14448 			test_auth_aes_cmac_cipher_snow_test_case_1),
14449 		TEST_CASE_ST(ut_setup, ut_teardown,
14450 			test_verify_auth_aes_cmac_cipher_snow_test_case_1),
14451 		/** AUTH ZUC + CIPHER AES CTR */
14452 		TEST_CASE_ST(ut_setup, ut_teardown,
14453 			test_auth_zuc_cipher_aes_ctr_test_case_1),
14454 		TEST_CASE_ST(ut_setup, ut_teardown,
14455 			test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
14456 		/** AUTH SNOW3G + CIPHER AES CTR */
14457 		TEST_CASE_ST(ut_setup, ut_teardown,
14458 			test_auth_snow_cipher_aes_ctr_test_case_1),
14459 		TEST_CASE_ST(ut_setup, ut_teardown,
14460 			test_verify_auth_snow_cipher_aes_ctr_test_case_1),
14461 		/** AUTH SNOW3G + CIPHER ZUC */
14462 		TEST_CASE_ST(ut_setup, ut_teardown,
14463 			test_auth_snow_cipher_zuc_test_case_1),
14464 		TEST_CASE_ST(ut_setup, ut_teardown,
14465 			test_verify_auth_snow_cipher_zuc_test_case_1),
14466 		/** AUTH AES CMAC + CIPHER ZUC */
14467 		TEST_CASE_ST(ut_setup, ut_teardown,
14468 			test_auth_aes_cmac_cipher_zuc_test_case_1),
14469 		TEST_CASE_ST(ut_setup, ut_teardown,
14470 			test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
14471 
14472 		/** AUTH NULL + CIPHER SNOW3G */
14473 		TEST_CASE_ST(ut_setup, ut_teardown,
14474 			test_auth_null_cipher_snow_test_case_1),
14475 		TEST_CASE_ST(ut_setup, ut_teardown,
14476 			test_verify_auth_null_cipher_snow_test_case_1),
14477 		/** AUTH NULL + CIPHER ZUC */
14478 		TEST_CASE_ST(ut_setup, ut_teardown,
14479 			test_auth_null_cipher_zuc_test_case_1),
14480 		TEST_CASE_ST(ut_setup, ut_teardown,
14481 			test_verify_auth_null_cipher_zuc_test_case_1),
14482 		/** AUTH SNOW3G + CIPHER NULL */
14483 		TEST_CASE_ST(ut_setup, ut_teardown,
14484 			test_auth_snow_cipher_null_test_case_1),
14485 		TEST_CASE_ST(ut_setup, ut_teardown,
14486 			test_verify_auth_snow_cipher_null_test_case_1),
14487 		/** AUTH ZUC + CIPHER NULL */
14488 		TEST_CASE_ST(ut_setup, ut_teardown,
14489 			test_auth_zuc_cipher_null_test_case_1),
14490 		TEST_CASE_ST(ut_setup, ut_teardown,
14491 			test_verify_auth_zuc_cipher_null_test_case_1),
14492 		/** AUTH NULL + CIPHER AES CTR */
14493 		TEST_CASE_ST(ut_setup, ut_teardown,
14494 			test_auth_null_cipher_aes_ctr_test_case_1),
14495 		TEST_CASE_ST(ut_setup, ut_teardown,
14496 			test_verify_auth_null_cipher_aes_ctr_test_case_1),
14497 		/** AUTH AES CMAC + CIPHER NULL */
14498 		TEST_CASE_ST(ut_setup, ut_teardown,
14499 			test_auth_aes_cmac_cipher_null_test_case_1),
14500 		TEST_CASE_ST(ut_setup, ut_teardown,
14501 			test_verify_auth_aes_cmac_cipher_null_test_case_1),
14502 		TEST_CASES_END()
14503 	}
14504 };
14505 
14506 static int
14507 run_cryptodev_testsuite(const char *pmd_name)
14508 {
14509 	uint8_t ret, j, i = 0, blk_start_idx = 0;
14510 	const enum blockcipher_test_type blk_suites[] = {
14511 		BLKCIPHER_AES_CHAIN_TYPE,
14512 		BLKCIPHER_AES_CIPHERONLY_TYPE,
14513 		BLKCIPHER_AES_DOCSIS_TYPE,
14514 		BLKCIPHER_3DES_CHAIN_TYPE,
14515 		BLKCIPHER_3DES_CIPHERONLY_TYPE,
14516 		BLKCIPHER_DES_CIPHERONLY_TYPE,
14517 		BLKCIPHER_DES_DOCSIS_TYPE,
14518 		BLKCIPHER_AUTHONLY_TYPE};
14519 	struct unit_test_suite *static_suites[] = {
14520 		&cryptodev_multi_session_testsuite,
14521 		&cryptodev_null_testsuite,
14522 		&cryptodev_aes_ccm_auth_testsuite,
14523 		&cryptodev_aes_gcm_auth_testsuite,
14524 		&cryptodev_aes_gmac_auth_testsuite,
14525 		&cryptodev_snow3g_testsuite,
14526 		&cryptodev_chacha20_poly1305_testsuite,
14527 		&cryptodev_zuc_testsuite,
14528 		&cryptodev_hmac_md5_auth_testsuite,
14529 		&cryptodev_kasumi_testsuite,
14530 		&cryptodev_esn_testsuite,
14531 		&cryptodev_negative_aes_gcm_testsuite,
14532 		&cryptodev_negative_aes_gmac_testsuite,
14533 		&cryptodev_mixed_cipher_hash_testsuite,
14534 		&cryptodev_negative_hmac_sha1_testsuite,
14535 		&cryptodev_gen_testsuite,
14536 #ifdef RTE_LIB_SECURITY
14537 		&pdcp_proto_testsuite,
14538 		&docsis_proto_testsuite,
14539 #endif
14540 		&end_testsuite
14541 	};
14542 	static struct unit_test_suite ts = {
14543 		.suite_name = "Cryptodev Unit Test Suite",
14544 		.setup = testsuite_setup,
14545 		.teardown = testsuite_teardown,
14546 		.unit_test_cases = {TEST_CASES_END()}
14547 	};
14548 
14549 	gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
14550 
14551 	if (gbl_driver_id == -1) {
14552 		RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
14553 		return TEST_SKIPPED;
14554 	}
14555 
14556 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
14557 			(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
14558 
14559 	ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
14560 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
14561 	ret = unit_test_suite_runner(&ts);
14562 
14563 	FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
14564 	free(ts.unit_test_suites);
14565 	return ret;
14566 }
14567 
14568 static int
14569 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
14570 {
14571 	struct rte_cryptodev_info dev_info;
14572 	uint8_t i, nb_devs;
14573 	int driver_id;
14574 
14575 	driver_id = rte_cryptodev_driver_id_get(pmd_name);
14576 	if (driver_id == -1) {
14577 		RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
14578 		return TEST_SKIPPED;
14579 	}
14580 
14581 	nb_devs = rte_cryptodev_count();
14582 	if (nb_devs < 1) {
14583 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
14584 		return TEST_SKIPPED;
14585 	}
14586 
14587 	for (i = 0; i < nb_devs; i++) {
14588 		rte_cryptodev_info_get(i, &dev_info);
14589 		if (dev_info.driver_id == driver_id) {
14590 			if (!(dev_info.feature_flags & flag)) {
14591 				RTE_LOG(INFO, USER1, "%s not supported\n",
14592 						flag_name);
14593 				return TEST_SKIPPED;
14594 			}
14595 			return 0; /* found */
14596 		}
14597 	}
14598 
14599 	RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
14600 	return TEST_SKIPPED;
14601 }
14602 
14603 static int
14604 test_cryptodev_qat(void)
14605 {
14606 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14607 }
14608 
14609 static int
14610 test_cryptodev_virtio(void)
14611 {
14612 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
14613 }
14614 
14615 static int
14616 test_cryptodev_aesni_mb(void)
14617 {
14618 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14619 }
14620 
14621 static int
14622 test_cryptodev_cpu_aesni_mb(void)
14623 {
14624 	int32_t rc;
14625 	enum rte_security_session_action_type at = gbl_action_type;
14626 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14627 	rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14628 	gbl_action_type = at;
14629 	return rc;
14630 }
14631 
14632 static int
14633 test_cryptodev_openssl(void)
14634 {
14635 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
14636 }
14637 
14638 static int
14639 test_cryptodev_aesni_gcm(void)
14640 {
14641 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14642 }
14643 
14644 static int
14645 test_cryptodev_cpu_aesni_gcm(void)
14646 {
14647 	int32_t rc;
14648 	enum rte_security_session_action_type at = gbl_action_type;
14649 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14650 	rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14651 	gbl_action_type = at;
14652 	return rc;
14653 }
14654 
14655 static int
14656 test_cryptodev_mlx5(void)
14657 {
14658 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
14659 }
14660 
14661 static int
14662 test_cryptodev_null(void)
14663 {
14664 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
14665 }
14666 
14667 static int
14668 test_cryptodev_sw_snow3g(void)
14669 {
14670 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
14671 }
14672 
14673 static int
14674 test_cryptodev_sw_kasumi(void)
14675 {
14676 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
14677 }
14678 
14679 static int
14680 test_cryptodev_sw_zuc(void)
14681 {
14682 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
14683 }
14684 
14685 static int
14686 test_cryptodev_armv8(void)
14687 {
14688 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
14689 }
14690 
14691 static int
14692 test_cryptodev_mrvl(void)
14693 {
14694 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
14695 }
14696 
14697 #ifdef RTE_CRYPTO_SCHEDULER
14698 
14699 static int
14700 test_cryptodev_scheduler(void)
14701 {
14702 	uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
14703 	const enum blockcipher_test_type blk_suites[] = {
14704 		BLKCIPHER_AES_CHAIN_TYPE,
14705 		BLKCIPHER_AES_CIPHERONLY_TYPE,
14706 		BLKCIPHER_AUTHONLY_TYPE
14707 	};
14708 	static struct unit_test_suite scheduler_multicore = {
14709 		.suite_name = "Scheduler Multicore Unit Test Suite",
14710 		.setup = scheduler_multicore_testsuite_setup,
14711 		.teardown = scheduler_mode_testsuite_teardown,
14712 		.unit_test_cases = {TEST_CASES_END()}
14713 	};
14714 	static struct unit_test_suite scheduler_round_robin = {
14715 		.suite_name = "Scheduler Round Robin Unit Test Suite",
14716 		.setup = scheduler_roundrobin_testsuite_setup,
14717 		.teardown = scheduler_mode_testsuite_teardown,
14718 		.unit_test_cases = {TEST_CASES_END()}
14719 	};
14720 	static struct unit_test_suite scheduler_failover = {
14721 		.suite_name = "Scheduler Failover Unit Test Suite",
14722 		.setup = scheduler_failover_testsuite_setup,
14723 		.teardown = scheduler_mode_testsuite_teardown,
14724 		.unit_test_cases = {TEST_CASES_END()}
14725 	};
14726 	static struct unit_test_suite scheduler_pkt_size_distr = {
14727 		.suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
14728 		.setup = scheduler_pkt_size_distr_testsuite_setup,
14729 		.teardown = scheduler_mode_testsuite_teardown,
14730 		.unit_test_cases = {TEST_CASES_END()}
14731 	};
14732 	struct unit_test_suite *sched_mode_suites[] = {
14733 		&scheduler_multicore,
14734 		&scheduler_round_robin,
14735 		&scheduler_failover,
14736 		&scheduler_pkt_size_distr
14737 	};
14738 	static struct unit_test_suite scheduler_config = {
14739 		.suite_name = "Crypto Device Scheduler Config Unit Test Suite",
14740 		.unit_test_cases = {
14741 			TEST_CASE(test_scheduler_attach_worker_op),
14742 			TEST_CASE(test_scheduler_mode_multicore_op),
14743 			TEST_CASE(test_scheduler_mode_roundrobin_op),
14744 			TEST_CASE(test_scheduler_mode_failover_op),
14745 			TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
14746 			TEST_CASE(test_scheduler_detach_worker_op),
14747 
14748 			TEST_CASES_END() /**< NULL terminate array */
14749 		}
14750 	};
14751 	struct unit_test_suite *static_suites[] = {
14752 		&scheduler_config,
14753 		&end_testsuite
14754 	};
14755 	static struct unit_test_suite ts = {
14756 		.suite_name = "Scheduler Unit Test Suite",
14757 		.setup = scheduler_testsuite_setup,
14758 		.teardown = testsuite_teardown,
14759 		.unit_test_cases = {TEST_CASES_END()}
14760 	};
14761 
14762 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14763 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14764 
14765 	if (gbl_driver_id == -1) {
14766 		RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
14767 		return TEST_SKIPPED;
14768 	}
14769 
14770 	if (rte_cryptodev_driver_id_get(
14771 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
14772 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14773 		return TEST_SKIPPED;
14774 	}
14775 
14776 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
14777 		uint8_t blk_i = 0;
14778 		sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
14779 				(struct unit_test_suite *) *
14780 				(RTE_DIM(blk_suites) + 1));
14781 		ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
14782 				blk_suites, RTE_DIM(blk_suites));
14783 		sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
14784 	}
14785 
14786 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
14787 			(RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
14788 	ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
14789 			RTE_DIM(sched_mode_suites));
14790 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
14791 	ret = unit_test_suite_runner(&ts);
14792 
14793 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
14794 		FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
14795 				(*sched_mode_suites[sched_i]),
14796 				RTE_DIM(blk_suites));
14797 		free(sched_mode_suites[sched_i]->unit_test_suites);
14798 	}
14799 	free(ts.unit_test_suites);
14800 	return ret;
14801 }
14802 
14803 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
14804 
14805 #endif
14806 
14807 static int
14808 test_cryptodev_dpaa2_sec(void)
14809 {
14810 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
14811 }
14812 
14813 static int
14814 test_cryptodev_dpaa_sec(void)
14815 {
14816 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
14817 }
14818 
14819 static int
14820 test_cryptodev_ccp(void)
14821 {
14822 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
14823 }
14824 
14825 static int
14826 test_cryptodev_octeontx(void)
14827 {
14828 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
14829 }
14830 
14831 static int
14832 test_cryptodev_octeontx2(void)
14833 {
14834 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
14835 }
14836 
14837 static int
14838 test_cryptodev_caam_jr(void)
14839 {
14840 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
14841 }
14842 
14843 static int
14844 test_cryptodev_nitrox(void)
14845 {
14846 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
14847 }
14848 
14849 static int
14850 test_cryptodev_bcmfs(void)
14851 {
14852 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
14853 }
14854 
14855 static int
14856 test_cryptodev_qat_raw_api(void)
14857 {
14858 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
14859 	int ret;
14860 
14861 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
14862 			"RAW API");
14863 	if (ret)
14864 		return ret;
14865 
14866 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
14867 	ret = run_cryptodev_testsuite(pmd_name);
14868 	global_api_test_type = CRYPTODEV_API_TEST;
14869 
14870 	return ret;
14871 }
14872 
14873 static int
14874 test_cryptodev_cn9k(void)
14875 {
14876 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
14877 }
14878 
14879 static int
14880 test_cryptodev_cn10k(void)
14881 {
14882 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
14883 }
14884 
14885 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
14886 		test_cryptodev_qat_raw_api);
14887 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
14888 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
14889 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
14890 	test_cryptodev_cpu_aesni_mb);
14891 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
14892 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
14893 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
14894 	test_cryptodev_cpu_aesni_gcm);
14895 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
14896 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
14897 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
14898 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
14899 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
14900 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
14901 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
14902 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
14903 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
14904 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
14905 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
14906 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
14907 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
14908 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
14909 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
14910 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
14911 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
14912 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);
14913