xref: /dpdk/app/test/test_cryptodev.c (revision 0532f50c0e8a0e46fa98c36b53ce2b5989eb9054)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2015-2020 Intel Corporation
3  * Copyright 2020 NXP
4  */
5 
6 #include <time.h>
7 
8 #include <rte_common.h>
9 #include <rte_hexdump.h>
10 #include <rte_mbuf.h>
11 #include <rte_malloc.h>
12 #include <rte_memcpy.h>
13 #include <rte_pause.h>
14 #include <rte_bus_vdev.h>
15 #include <rte_ether.h>
16 
17 #include <rte_crypto.h>
18 #include <rte_cryptodev.h>
19 #include <rte_ip.h>
20 #include <rte_string_fns.h>
21 
22 #ifdef RTE_CRYPTO_SCHEDULER
23 #include <rte_cryptodev_scheduler.h>
24 #include <rte_cryptodev_scheduler_operations.h>
25 #endif
26 
27 #include <rte_lcore.h>
28 
29 #include "test.h"
30 #include "test_cryptodev.h"
31 
32 #include "test_cryptodev_blockcipher.h"
33 #include "test_cryptodev_aes_test_vectors.h"
34 #include "test_cryptodev_des_test_vectors.h"
35 #include "test_cryptodev_hash_test_vectors.h"
36 #include "test_cryptodev_kasumi_test_vectors.h"
37 #include "test_cryptodev_kasumi_hash_test_vectors.h"
38 #include "test_cryptodev_snow3g_test_vectors.h"
39 #include "test_cryptodev_snow3g_hash_test_vectors.h"
40 #include "test_cryptodev_zuc_test_vectors.h"
41 #include "test_cryptodev_aead_test_vectors.h"
42 #include "test_cryptodev_hmac_test_vectors.h"
43 #include "test_cryptodev_mixed_test_vectors.h"
44 #ifdef RTE_LIB_SECURITY
45 #include "test_cryptodev_security_ipsec.h"
46 #include "test_cryptodev_security_ipsec_test_vectors.h"
47 #include "test_cryptodev_security_pdcp_test_vectors.h"
48 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
49 #include "test_cryptodev_security_pdcp_test_func.h"
50 #include "test_cryptodev_security_docsis_test_vectors.h"
51 
52 #define SDAP_DISABLED	0
53 #define SDAP_ENABLED	1
54 #endif
55 
56 #define VDEV_ARGS_SIZE 100
57 #define MAX_NB_SESSIONS 4
58 
59 #define MAX_DRV_SERVICE_CTX_SIZE 256
60 
61 #define MAX_RAW_DEQUEUE_COUNT	65535
62 
63 #define IN_PLACE 0
64 #define OUT_OF_PLACE 1
65 
66 static int gbl_driver_id;
67 
68 static enum rte_security_session_action_type gbl_action_type =
69 	RTE_SECURITY_ACTION_TYPE_NONE;
70 
71 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
72 
73 struct crypto_unittest_params {
74 	struct rte_crypto_sym_xform cipher_xform;
75 	struct rte_crypto_sym_xform auth_xform;
76 	struct rte_crypto_sym_xform aead_xform;
77 #ifdef RTE_LIB_SECURITY
78 	struct rte_security_docsis_xform docsis_xform;
79 #endif
80 
81 	union {
82 		struct rte_cryptodev_sym_session *sess;
83 #ifdef RTE_LIB_SECURITY
84 		struct rte_security_session *sec_session;
85 #endif
86 	};
87 #ifdef RTE_LIB_SECURITY
88 	enum rte_security_session_action_type type;
89 #endif
90 	struct rte_crypto_op *op;
91 
92 	struct rte_mbuf *obuf, *ibuf;
93 
94 	uint8_t *digest;
95 };
96 
97 #define ALIGN_POW2_ROUNDUP(num, align) \
98 	(((num) + (align) - 1) & ~((align) - 1))
99 
100 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts)	\
101 	for (j = 0; j < num_child_ts; index++, j++)			\
102 		parent_ts.unit_test_suites[index] = child_ts[j]
103 
104 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types)	\
105 	for (j = 0; j < num_blk_types; index++, j++)				\
106 		parent_ts.unit_test_suites[index] =				\
107 				build_blockcipher_test_suite(blk_types[j])
108 
109 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types)		\
110 	for (j = index; j < index + num_blk_types; j++)				\
111 		free_blockcipher_test_suite(parent_ts.unit_test_suites[j])
112 
113 /*
114  * Forward declarations.
115  */
116 static int
117 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
118 		struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
119 		uint8_t *hmac_key);
120 
121 static int
122 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
123 		struct crypto_unittest_params *ut_params,
124 		struct crypto_testsuite_params *ts_param,
125 		const uint8_t *cipher,
126 		const uint8_t *digest,
127 		const uint8_t *iv);
128 
129 static int
130 security_proto_supported(enum rte_security_session_action_type action,
131 	enum rte_security_session_protocol proto);
132 
133 static int
134 dev_configure_and_start(uint64_t ff_disable);
135 
136 static struct rte_mbuf *
137 setup_test_string(struct rte_mempool *mpool,
138 		const char *string, size_t len, uint8_t blocksize)
139 {
140 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
141 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
142 
143 	if (m) {
144 		char *dst;
145 
146 		memset(m->buf_addr, 0, m->buf_len);
147 		dst = rte_pktmbuf_append(m, t_len);
148 		if (!dst) {
149 			rte_pktmbuf_free(m);
150 			return NULL;
151 		}
152 		if (string != NULL)
153 			rte_memcpy(dst, string, t_len);
154 		else
155 			memset(dst, 0, t_len);
156 	}
157 
158 	return m;
159 }
160 
161 /* Get number of bytes in X bits (rounding up) */
162 static uint32_t
163 ceil_byte_length(uint32_t num_bits)
164 {
165 	if (num_bits % 8)
166 		return ((num_bits >> 3) + 1);
167 	else
168 		return (num_bits >> 3);
169 }
170 
171 static void
172 post_process_raw_dp_op(void *user_data,	uint32_t index __rte_unused,
173 		uint8_t is_op_success)
174 {
175 	struct rte_crypto_op *op = user_data;
176 	op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
177 			RTE_CRYPTO_OP_STATUS_ERROR;
178 }
179 
180 void
181 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
182 		struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
183 		uint8_t len_in_bits, uint8_t cipher_iv_len)
184 {
185 	struct rte_crypto_sym_op *sop = op->sym;
186 	struct rte_crypto_op *ret_op = NULL;
187 	struct rte_crypto_vec data_vec[UINT8_MAX];
188 	struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
189 	union rte_crypto_sym_ofs ofs;
190 	struct rte_crypto_sym_vec vec;
191 	struct rte_crypto_sgl sgl;
192 	uint32_t max_len;
193 	union rte_cryptodev_session_ctx sess;
194 	uint32_t count = 0;
195 	struct rte_crypto_raw_dp_ctx *ctx;
196 	uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
197 			auth_len = 0;
198 	int32_t n;
199 	uint32_t n_success;
200 	int ctx_service_size;
201 	int32_t status = 0;
202 	int enqueue_status, dequeue_status;
203 
204 	ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
205 	if (ctx_service_size < 0) {
206 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
207 		return;
208 	}
209 
210 	ctx = malloc(ctx_service_size);
211 	if (!ctx) {
212 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
213 		return;
214 	}
215 
216 	/* Both are enums, setting crypto_sess will suit any session type */
217 	sess.crypto_sess = op->sym->session;
218 
219 	if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
220 			op->sess_type, sess, 0) < 0) {
221 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
222 		goto exit;
223 	}
224 
225 	cipher_iv.iova = 0;
226 	cipher_iv.va = NULL;
227 	aad_auth_iv.iova = 0;
228 	aad_auth_iv.va = NULL;
229 	digest.iova = 0;
230 	digest.va = NULL;
231 	sgl.vec = data_vec;
232 	vec.num = 1;
233 	vec.sgl = &sgl;
234 	vec.iv = &cipher_iv;
235 	vec.digest = &digest;
236 	vec.aad = &aad_auth_iv;
237 	vec.status = &status;
238 
239 	ofs.raw = 0;
240 
241 	if (is_cipher && is_auth) {
242 		cipher_offset = sop->cipher.data.offset;
243 		cipher_len = sop->cipher.data.length;
244 		auth_offset = sop->auth.data.offset;
245 		auth_len = sop->auth.data.length;
246 		max_len = RTE_MAX(cipher_offset + cipher_len,
247 				auth_offset + auth_len);
248 		if (len_in_bits) {
249 			max_len = max_len >> 3;
250 			cipher_offset = cipher_offset >> 3;
251 			auth_offset = auth_offset >> 3;
252 			cipher_len = cipher_len >> 3;
253 			auth_len = auth_len >> 3;
254 		}
255 		ofs.ofs.cipher.head = cipher_offset;
256 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
257 		ofs.ofs.auth.head = auth_offset;
258 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
259 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
260 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
261 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
262 				op, void *, IV_OFFSET + cipher_iv_len);
263 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
264 				cipher_iv_len);
265 		digest.va = (void *)sop->auth.digest.data;
266 		digest.iova = sop->auth.digest.phys_addr;
267 
268 	} else if (is_cipher) {
269 		cipher_offset = sop->cipher.data.offset;
270 		cipher_len = sop->cipher.data.length;
271 		max_len = cipher_len + cipher_offset;
272 		if (len_in_bits) {
273 			max_len = max_len >> 3;
274 			cipher_offset = cipher_offset >> 3;
275 			cipher_len = cipher_len >> 3;
276 		}
277 		ofs.ofs.cipher.head = cipher_offset;
278 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
279 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
280 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
281 
282 	} else if (is_auth) {
283 		auth_offset = sop->auth.data.offset;
284 		auth_len = sop->auth.data.length;
285 		max_len = auth_len + auth_offset;
286 		if (len_in_bits) {
287 			max_len = max_len >> 3;
288 			auth_offset = auth_offset >> 3;
289 			auth_len = auth_len >> 3;
290 		}
291 		ofs.ofs.auth.head = auth_offset;
292 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
293 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
294 				op, void *, IV_OFFSET + cipher_iv_len);
295 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
296 				cipher_iv_len);
297 		digest.va = (void *)sop->auth.digest.data;
298 		digest.iova = sop->auth.digest.phys_addr;
299 
300 	} else { /* aead */
301 		cipher_offset = sop->aead.data.offset;
302 		cipher_len = sop->aead.data.length;
303 		max_len = cipher_len + cipher_offset;
304 		if (len_in_bits) {
305 			max_len = max_len >> 3;
306 			cipher_offset = cipher_offset >> 3;
307 			cipher_len = cipher_len >> 3;
308 		}
309 		ofs.ofs.cipher.head = cipher_offset;
310 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
311 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
312 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
313 		aad_auth_iv.va = (void *)sop->aead.aad.data;
314 		aad_auth_iv.iova = sop->aead.aad.phys_addr;
315 		digest.va = (void *)sop->aead.digest.data;
316 		digest.iova = sop->aead.digest.phys_addr;
317 	}
318 
319 	n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
320 			data_vec, RTE_DIM(data_vec));
321 	if (n < 0 || n > sop->m_src->nb_segs) {
322 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
323 		goto exit;
324 	}
325 
326 	sgl.num = n;
327 
328 	if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
329 			&enqueue_status) < 1) {
330 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
331 		goto exit;
332 	}
333 
334 	if (enqueue_status == 0) {
335 		status = rte_cryptodev_raw_enqueue_done(ctx, 1);
336 		if (status < 0) {
337 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
338 			goto exit;
339 		}
340 	} else if (enqueue_status < 0) {
341 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
342 		goto exit;
343 	}
344 
345 	n = n_success = 0;
346 	while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
347 		n = rte_cryptodev_raw_dequeue_burst(ctx,
348 			NULL, 1, post_process_raw_dp_op,
349 				(void **)&ret_op, 0, &n_success,
350 				&dequeue_status);
351 		if (dequeue_status < 0) {
352 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
353 			goto exit;
354 		}
355 		if (n == 0)
356 			rte_pause();
357 	}
358 
359 	if (n == 1 && dequeue_status == 0) {
360 		if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
361 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
362 			goto exit;
363 		}
364 	}
365 
366 	op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
367 			n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
368 					RTE_CRYPTO_OP_STATUS_SUCCESS;
369 
370 exit:
371 	free(ctx);
372 }
373 
374 static void
375 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
376 {
377 	int32_t n, st;
378 	struct rte_crypto_sym_op *sop;
379 	union rte_crypto_sym_ofs ofs;
380 	struct rte_crypto_sgl sgl;
381 	struct rte_crypto_sym_vec symvec;
382 	struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
383 	struct rte_crypto_vec vec[UINT8_MAX];
384 
385 	sop = op->sym;
386 
387 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
388 		sop->aead.data.length, vec, RTE_DIM(vec));
389 
390 	if (n < 0 || n != sop->m_src->nb_segs) {
391 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
392 		return;
393 	}
394 
395 	sgl.vec = vec;
396 	sgl.num = n;
397 	symvec.sgl = &sgl;
398 	symvec.iv = &iv_ptr;
399 	symvec.digest = &digest_ptr;
400 	symvec.aad = &aad_ptr;
401 	symvec.status = &st;
402 	symvec.num = 1;
403 
404 	/* for CPU crypto the IOVA address is not required */
405 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
406 	digest_ptr.va = (void *)sop->aead.digest.data;
407 	aad_ptr.va = (void *)sop->aead.aad.data;
408 
409 	ofs.raw = 0;
410 
411 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
412 		&symvec);
413 
414 	if (n != 1)
415 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
416 	else
417 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
418 }
419 
420 static void
421 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
422 {
423 	int32_t n, st;
424 	struct rte_crypto_sym_op *sop;
425 	union rte_crypto_sym_ofs ofs;
426 	struct rte_crypto_sgl sgl;
427 	struct rte_crypto_sym_vec symvec;
428 	struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
429 	struct rte_crypto_vec vec[UINT8_MAX];
430 
431 	sop = op->sym;
432 
433 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
434 		sop->auth.data.length, vec, RTE_DIM(vec));
435 
436 	if (n < 0 || n != sop->m_src->nb_segs) {
437 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
438 		return;
439 	}
440 
441 	sgl.vec = vec;
442 	sgl.num = n;
443 	symvec.sgl = &sgl;
444 	symvec.iv = &iv_ptr;
445 	symvec.digest = &digest_ptr;
446 	symvec.status = &st;
447 	symvec.num = 1;
448 
449 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
450 	digest_ptr.va = (void *)sop->auth.digest.data;
451 
452 	ofs.raw = 0;
453 	ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
454 	ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
455 		(sop->cipher.data.offset + sop->cipher.data.length);
456 
457 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
458 		&symvec);
459 
460 	if (n != 1)
461 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
462 	else
463 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
464 }
465 
466 static struct rte_crypto_op *
467 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
468 {
469 
470 	RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
471 
472 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
473 		RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
474 		return NULL;
475 	}
476 
477 	op = NULL;
478 
479 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
480 		rte_pause();
481 
482 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
483 		RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
484 		return NULL;
485 	}
486 
487 	return op;
488 }
489 
490 static struct crypto_testsuite_params testsuite_params = { NULL };
491 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
492 static struct crypto_unittest_params unittest_params;
493 
494 static int
495 testsuite_setup(void)
496 {
497 	struct crypto_testsuite_params *ts_params = &testsuite_params;
498 	struct rte_cryptodev_info info;
499 	uint32_t i = 0, nb_devs, dev_id;
500 	uint16_t qp_id;
501 
502 	memset(ts_params, 0, sizeof(*ts_params));
503 
504 	ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
505 	if (ts_params->mbuf_pool == NULL) {
506 		/* Not already created so create */
507 		ts_params->mbuf_pool = rte_pktmbuf_pool_create(
508 				"CRYPTO_MBUFPOOL",
509 				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
510 				rte_socket_id());
511 		if (ts_params->mbuf_pool == NULL) {
512 			RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
513 			return TEST_FAILED;
514 		}
515 	}
516 
517 	ts_params->large_mbuf_pool = rte_mempool_lookup(
518 			"CRYPTO_LARGE_MBUFPOOL");
519 	if (ts_params->large_mbuf_pool == NULL) {
520 		/* Not already created so create */
521 		ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
522 				"CRYPTO_LARGE_MBUFPOOL",
523 				1, 0, 0, UINT16_MAX,
524 				rte_socket_id());
525 		if (ts_params->large_mbuf_pool == NULL) {
526 			RTE_LOG(ERR, USER1,
527 				"Can't create CRYPTO_LARGE_MBUFPOOL\n");
528 			return TEST_FAILED;
529 		}
530 	}
531 
532 	ts_params->op_mpool = rte_crypto_op_pool_create(
533 			"MBUF_CRYPTO_SYM_OP_POOL",
534 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
535 			NUM_MBUFS, MBUF_CACHE_SIZE,
536 			DEFAULT_NUM_XFORMS *
537 			sizeof(struct rte_crypto_sym_xform) +
538 			MAXIMUM_IV_LENGTH,
539 			rte_socket_id());
540 	if (ts_params->op_mpool == NULL) {
541 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
542 		return TEST_FAILED;
543 	}
544 
545 	nb_devs = rte_cryptodev_count();
546 	if (nb_devs < 1) {
547 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
548 		return TEST_SKIPPED;
549 	}
550 
551 	if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
552 		RTE_LOG(WARNING, USER1, "No %s devices found?\n",
553 				rte_cryptodev_driver_name_get(gbl_driver_id));
554 		return TEST_SKIPPED;
555 	}
556 
557 	/* Create list of valid crypto devs */
558 	for (i = 0; i < nb_devs; i++) {
559 		rte_cryptodev_info_get(i, &info);
560 		if (info.driver_id == gbl_driver_id)
561 			ts_params->valid_devs[ts_params->valid_dev_count++] = i;
562 	}
563 
564 	if (ts_params->valid_dev_count < 1)
565 		return TEST_FAILED;
566 
567 	/* Set up all the qps on the first of the valid devices found */
568 
569 	dev_id = ts_params->valid_devs[0];
570 
571 	rte_cryptodev_info_get(dev_id, &info);
572 
573 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
574 	ts_params->conf.socket_id = SOCKET_ID_ANY;
575 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
576 
577 	unsigned int session_size =
578 		rte_cryptodev_sym_get_private_session_size(dev_id);
579 
580 #ifdef RTE_LIB_SECURITY
581 	unsigned int security_session_size = rte_security_session_get_size(
582 			rte_cryptodev_get_sec_ctx(dev_id));
583 
584 	if (session_size < security_session_size)
585 		session_size = security_session_size;
586 #endif
587 	/*
588 	 * Create mempool with maximum number of sessions.
589 	 */
590 	if (info.sym.max_nb_sessions != 0 &&
591 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
592 		RTE_LOG(ERR, USER1, "Device does not support "
593 				"at least %u sessions\n",
594 				MAX_NB_SESSIONS);
595 		return TEST_FAILED;
596 	}
597 
598 	ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
599 			"test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
600 			SOCKET_ID_ANY);
601 	TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
602 			"session mempool allocation failed");
603 
604 	ts_params->session_priv_mpool = rte_mempool_create(
605 			"test_sess_mp_priv",
606 			MAX_NB_SESSIONS,
607 			session_size,
608 			0, 0, NULL, NULL, NULL,
609 			NULL, SOCKET_ID_ANY,
610 			0);
611 	TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
612 			"session mempool allocation failed");
613 
614 
615 
616 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
617 			&ts_params->conf),
618 			"Failed to configure cryptodev %u with %u qps",
619 			dev_id, ts_params->conf.nb_queue_pairs);
620 
621 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
622 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
623 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
624 
625 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
626 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
627 			dev_id, qp_id, &ts_params->qp_conf,
628 			rte_cryptodev_socket_id(dev_id)),
629 			"Failed to setup queue pair %u on cryptodev %u",
630 			qp_id, dev_id);
631 	}
632 
633 	return TEST_SUCCESS;
634 }
635 
636 static void
637 testsuite_teardown(void)
638 {
639 	struct crypto_testsuite_params *ts_params = &testsuite_params;
640 	int res;
641 
642 	if (ts_params->mbuf_pool != NULL) {
643 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
644 		rte_mempool_avail_count(ts_params->mbuf_pool));
645 	}
646 
647 	if (ts_params->op_mpool != NULL) {
648 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
649 		rte_mempool_avail_count(ts_params->op_mpool));
650 	}
651 
652 	/* Free session mempools */
653 	if (ts_params->session_priv_mpool != NULL) {
654 		rte_mempool_free(ts_params->session_priv_mpool);
655 		ts_params->session_priv_mpool = NULL;
656 	}
657 
658 	if (ts_params->session_mpool != NULL) {
659 		rte_mempool_free(ts_params->session_mpool);
660 		ts_params->session_mpool = NULL;
661 	}
662 
663 	res = rte_cryptodev_close(ts_params->valid_devs[0]);
664 	if (res)
665 		RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
666 }
667 
668 static int
669 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
670 		const int *algs, uint16_t num_algs)
671 {
672 	uint8_t dev_id = testsuite_params.valid_devs[0];
673 	bool some_alg_supported = FALSE;
674 	uint16_t i;
675 
676 	for (i = 0; i < num_algs && !some_alg_supported; i++) {
677 		struct rte_cryptodev_sym_capability_idx alg = {
678 			type, {algs[i]}
679 		};
680 		if (rte_cryptodev_sym_capability_get(dev_id,
681 				&alg) != NULL)
682 			some_alg_supported = TRUE;
683 	}
684 	if (!some_alg_supported)
685 		return TEST_SKIPPED;
686 
687 	return 0;
688 }
689 
690 int
691 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
692 		uint16_t num_ciphers)
693 {
694 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
695 			(const int *) ciphers, num_ciphers);
696 }
697 
698 int
699 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
700 		uint16_t num_auths)
701 {
702 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
703 			(const int *) auths, num_auths);
704 }
705 
706 int
707 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
708 		uint16_t num_aeads)
709 {
710 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
711 			(const int *) aeads, num_aeads);
712 }
713 
714 static int
715 null_testsuite_setup(void)
716 {
717 	struct crypto_testsuite_params *ts_params = &testsuite_params;
718 	uint8_t dev_id = ts_params->valid_devs[0];
719 	struct rte_cryptodev_info dev_info;
720 	const enum rte_crypto_cipher_algorithm ciphers[] = {
721 		RTE_CRYPTO_CIPHER_NULL
722 	};
723 	const enum rte_crypto_auth_algorithm auths[] = {
724 		RTE_CRYPTO_AUTH_NULL
725 	};
726 
727 	rte_cryptodev_info_get(dev_id, &dev_info);
728 
729 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
730 		RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
731 				"testsuite not met\n");
732 		return TEST_SKIPPED;
733 	}
734 
735 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
736 			&& check_auth_capabilities_supported(auths,
737 			RTE_DIM(auths)) != 0) {
738 		RTE_LOG(INFO, USER1, "Capability requirements for NULL "
739 				"testsuite not met\n");
740 		return TEST_SKIPPED;
741 	}
742 
743 	return 0;
744 }
745 
746 static int
747 crypto_gen_testsuite_setup(void)
748 {
749 	struct crypto_testsuite_params *ts_params = &testsuite_params;
750 	uint8_t dev_id = ts_params->valid_devs[0];
751 	struct rte_cryptodev_info dev_info;
752 
753 	rte_cryptodev_info_get(dev_id, &dev_info);
754 
755 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
756 		RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
757 				"testsuite not met\n");
758 		return TEST_SKIPPED;
759 	}
760 
761 	return 0;
762 }
763 
764 #ifdef RTE_LIB_SECURITY
765 static int
766 ipsec_proto_testsuite_setup(void)
767 {
768 	struct crypto_testsuite_params *ts_params = &testsuite_params;
769 	struct crypto_unittest_params *ut_params = &unittest_params;
770 	struct rte_cryptodev_info dev_info;
771 	int ret = 0;
772 
773 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
774 
775 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
776 		RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto "
777 				"testsuite not met\n");
778 		return TEST_SKIPPED;
779 	}
780 
781 	/* Reconfigure to enable security */
782 	ret = dev_configure_and_start(0);
783 	if (ret != TEST_SUCCESS)
784 		return ret;
785 
786 	/* Set action type */
787 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
788 
789 	if (security_proto_supported(
790 			RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
791 			RTE_SECURITY_PROTOCOL_IPSEC) < 0) {
792 		RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto "
793 				"test not met\n");
794 		ret = TEST_SKIPPED;
795 	}
796 
797 	/*
798 	 * Stop the device. Device would be started again by individual test
799 	 * case setup routine.
800 	 */
801 	rte_cryptodev_stop(ts_params->valid_devs[0]);
802 
803 	return ret;
804 }
805 
806 static int
807 pdcp_proto_testsuite_setup(void)
808 {
809 	struct crypto_testsuite_params *ts_params = &testsuite_params;
810 	uint8_t dev_id = ts_params->valid_devs[0];
811 	struct rte_cryptodev_info dev_info;
812 	const enum rte_crypto_cipher_algorithm ciphers[] = {
813 		RTE_CRYPTO_CIPHER_NULL,
814 		RTE_CRYPTO_CIPHER_AES_CTR,
815 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
816 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
817 	};
818 	const enum rte_crypto_auth_algorithm auths[] = {
819 		RTE_CRYPTO_AUTH_NULL,
820 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
821 		RTE_CRYPTO_AUTH_AES_CMAC,
822 		RTE_CRYPTO_AUTH_ZUC_EIA3
823 	};
824 
825 	rte_cryptodev_info_get(dev_id, &dev_info);
826 
827 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
828 			!(dev_info.feature_flags &
829 			RTE_CRYPTODEV_FF_SECURITY)) {
830 		RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
831 				"testsuite not met\n");
832 		return TEST_SKIPPED;
833 	}
834 
835 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
836 			&& check_auth_capabilities_supported(auths,
837 			RTE_DIM(auths)) != 0) {
838 		RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
839 				"testsuite not met\n");
840 		return TEST_SKIPPED;
841 	}
842 
843 	return 0;
844 }
845 
846 static int
847 docsis_proto_testsuite_setup(void)
848 {
849 	struct crypto_testsuite_params *ts_params = &testsuite_params;
850 	uint8_t dev_id = ts_params->valid_devs[0];
851 	struct rte_cryptodev_info dev_info;
852 	const enum rte_crypto_cipher_algorithm ciphers[] = {
853 		RTE_CRYPTO_CIPHER_AES_DOCSISBPI
854 	};
855 
856 	rte_cryptodev_info_get(dev_id, &dev_info);
857 
858 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
859 			!(dev_info.feature_flags &
860 			RTE_CRYPTODEV_FF_SECURITY)) {
861 		RTE_LOG(INFO, USER1, "Feature flag requirements for Docsis "
862 				"Proto testsuite not met\n");
863 		return TEST_SKIPPED;
864 	}
865 
866 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
867 		RTE_LOG(INFO, USER1, "Capability requirements for Docsis Proto "
868 				"testsuite not met\n");
869 		return TEST_SKIPPED;
870 	}
871 
872 	return 0;
873 }
874 #endif
875 
876 static int
877 aes_ccm_auth_testsuite_setup(void)
878 {
879 	struct crypto_testsuite_params *ts_params = &testsuite_params;
880 	uint8_t dev_id = ts_params->valid_devs[0];
881 	struct rte_cryptodev_info dev_info;
882 	const enum rte_crypto_aead_algorithm aeads[] = {
883 		RTE_CRYPTO_AEAD_AES_CCM
884 	};
885 
886 	rte_cryptodev_info_get(dev_id, &dev_info);
887 
888 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
889 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
890 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
891 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
892 				"testsuite not met\n");
893 		return TEST_SKIPPED;
894 	}
895 
896 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
897 		RTE_LOG(INFO, USER1, "Capability requirements for AES CCM "
898 				"testsuite not met\n");
899 		return TEST_SKIPPED;
900 	}
901 
902 	return 0;
903 }
904 
905 static int
906 aes_gcm_auth_testsuite_setup(void)
907 {
908 	struct crypto_testsuite_params *ts_params = &testsuite_params;
909 	uint8_t dev_id = ts_params->valid_devs[0];
910 	struct rte_cryptodev_info dev_info;
911 	const enum rte_crypto_aead_algorithm aeads[] = {
912 		RTE_CRYPTO_AEAD_AES_GCM
913 	};
914 
915 	rte_cryptodev_info_get(dev_id, &dev_info);
916 
917 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
918 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
919 				"testsuite not met\n");
920 		return TEST_SKIPPED;
921 	}
922 
923 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
924 		RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
925 				"testsuite not met\n");
926 		return TEST_SKIPPED;
927 	}
928 
929 	return 0;
930 }
931 
932 static int
933 aes_gmac_auth_testsuite_setup(void)
934 {
935 	struct crypto_testsuite_params *ts_params = &testsuite_params;
936 	uint8_t dev_id = ts_params->valid_devs[0];
937 	struct rte_cryptodev_info dev_info;
938 	const enum rte_crypto_auth_algorithm auths[] = {
939 		RTE_CRYPTO_AUTH_AES_GMAC
940 	};
941 
942 	rte_cryptodev_info_get(dev_id, &dev_info);
943 
944 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
945 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
946 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
947 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
948 				"testsuite not met\n");
949 		return TEST_SKIPPED;
950 	}
951 
952 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
953 		RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
954 				"testsuite not met\n");
955 		return TEST_SKIPPED;
956 	}
957 
958 	return 0;
959 }
960 
961 static int
962 chacha20_poly1305_testsuite_setup(void)
963 {
964 	struct crypto_testsuite_params *ts_params = &testsuite_params;
965 	uint8_t dev_id = ts_params->valid_devs[0];
966 	struct rte_cryptodev_info dev_info;
967 	const enum rte_crypto_aead_algorithm aeads[] = {
968 		RTE_CRYPTO_AEAD_CHACHA20_POLY1305
969 	};
970 
971 	rte_cryptodev_info_get(dev_id, &dev_info);
972 
973 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
974 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
975 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
976 		RTE_LOG(INFO, USER1, "Feature flag requirements for "
977 				"Chacha20-Poly1305 testsuite not met\n");
978 		return TEST_SKIPPED;
979 	}
980 
981 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
982 		RTE_LOG(INFO, USER1, "Capability requirements for "
983 				"Chacha20-Poly1305 testsuite not met\n");
984 		return TEST_SKIPPED;
985 	}
986 
987 	return 0;
988 }
989 
990 static int
991 snow3g_testsuite_setup(void)
992 {
993 	struct crypto_testsuite_params *ts_params = &testsuite_params;
994 	uint8_t dev_id = ts_params->valid_devs[0];
995 	struct rte_cryptodev_info dev_info;
996 	const enum rte_crypto_cipher_algorithm ciphers[] = {
997 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
998 
999 	};
1000 	const enum rte_crypto_auth_algorithm auths[] = {
1001 		RTE_CRYPTO_AUTH_SNOW3G_UIA2
1002 	};
1003 
1004 	rte_cryptodev_info_get(dev_id, &dev_info);
1005 
1006 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1007 		RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
1008 				"testsuite not met\n");
1009 		return TEST_SKIPPED;
1010 	}
1011 
1012 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1013 			&& check_auth_capabilities_supported(auths,
1014 			RTE_DIM(auths)) != 0) {
1015 		RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
1016 				"testsuite not met\n");
1017 		return TEST_SKIPPED;
1018 	}
1019 
1020 	return 0;
1021 }
1022 
1023 static int
1024 zuc_testsuite_setup(void)
1025 {
1026 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1027 	uint8_t dev_id = ts_params->valid_devs[0];
1028 	struct rte_cryptodev_info dev_info;
1029 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1030 		RTE_CRYPTO_CIPHER_ZUC_EEA3
1031 	};
1032 	const enum rte_crypto_auth_algorithm auths[] = {
1033 		RTE_CRYPTO_AUTH_ZUC_EIA3
1034 	};
1035 
1036 	rte_cryptodev_info_get(dev_id, &dev_info);
1037 
1038 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1039 		RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
1040 				"testsuite not met\n");
1041 		return TEST_SKIPPED;
1042 	}
1043 
1044 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1045 			&& check_auth_capabilities_supported(auths,
1046 			RTE_DIM(auths)) != 0) {
1047 		RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
1048 				"testsuite not met\n");
1049 		return TEST_SKIPPED;
1050 	}
1051 
1052 	return 0;
1053 }
1054 
1055 static int
1056 hmac_md5_auth_testsuite_setup(void)
1057 {
1058 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1059 	uint8_t dev_id = ts_params->valid_devs[0];
1060 	struct rte_cryptodev_info dev_info;
1061 	const enum rte_crypto_auth_algorithm auths[] = {
1062 		RTE_CRYPTO_AUTH_MD5_HMAC
1063 	};
1064 
1065 	rte_cryptodev_info_get(dev_id, &dev_info);
1066 
1067 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1068 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1069 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1070 		RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1071 				"Auth testsuite not met\n");
1072 		return TEST_SKIPPED;
1073 	}
1074 
1075 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1076 		RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1077 				"testsuite not met\n");
1078 		return TEST_SKIPPED;
1079 	}
1080 
1081 	return 0;
1082 }
1083 
1084 static int
1085 kasumi_testsuite_setup(void)
1086 {
1087 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1088 	uint8_t dev_id = ts_params->valid_devs[0];
1089 	struct rte_cryptodev_info dev_info;
1090 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1091 		RTE_CRYPTO_CIPHER_KASUMI_F8
1092 	};
1093 	const enum rte_crypto_auth_algorithm auths[] = {
1094 		RTE_CRYPTO_AUTH_KASUMI_F9
1095 	};
1096 
1097 	rte_cryptodev_info_get(dev_id, &dev_info);
1098 
1099 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1100 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1101 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1102 		RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1103 				"testsuite not met\n");
1104 		return TEST_SKIPPED;
1105 	}
1106 
1107 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1108 			&& check_auth_capabilities_supported(auths,
1109 			RTE_DIM(auths)) != 0) {
1110 		RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1111 				"testsuite not met\n");
1112 		return TEST_SKIPPED;
1113 	}
1114 
1115 	return 0;
1116 }
1117 
1118 static int
1119 negative_aes_gcm_testsuite_setup(void)
1120 {
1121 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1122 	uint8_t dev_id = ts_params->valid_devs[0];
1123 	struct rte_cryptodev_info dev_info;
1124 	const enum rte_crypto_aead_algorithm aeads[] = {
1125 		RTE_CRYPTO_AEAD_AES_GCM
1126 	};
1127 
1128 	rte_cryptodev_info_get(dev_id, &dev_info);
1129 
1130 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1131 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1132 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1133 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1134 				"AES GCM testsuite not met\n");
1135 		return TEST_SKIPPED;
1136 	}
1137 
1138 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1139 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1140 				"AES GCM testsuite not met\n");
1141 		return TEST_SKIPPED;
1142 	}
1143 
1144 	return 0;
1145 }
1146 
1147 static int
1148 negative_aes_gmac_testsuite_setup(void)
1149 {
1150 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1151 	uint8_t dev_id = ts_params->valid_devs[0];
1152 	struct rte_cryptodev_info dev_info;
1153 	const enum rte_crypto_auth_algorithm auths[] = {
1154 		RTE_CRYPTO_AUTH_AES_GMAC
1155 	};
1156 
1157 	rte_cryptodev_info_get(dev_id, &dev_info);
1158 
1159 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1160 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1161 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1162 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1163 				"AES GMAC testsuite not met\n");
1164 		return TEST_SKIPPED;
1165 	}
1166 
1167 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1168 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1169 				"AES GMAC testsuite not met\n");
1170 		return TEST_SKIPPED;
1171 	}
1172 
1173 	return 0;
1174 }
1175 
1176 static int
1177 mixed_cipher_hash_testsuite_setup(void)
1178 {
1179 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1180 	uint8_t dev_id = ts_params->valid_devs[0];
1181 	struct rte_cryptodev_info dev_info;
1182 	uint64_t feat_flags;
1183 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1184 		RTE_CRYPTO_CIPHER_NULL,
1185 		RTE_CRYPTO_CIPHER_AES_CTR,
1186 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
1187 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1188 	};
1189 	const enum rte_crypto_auth_algorithm auths[] = {
1190 		RTE_CRYPTO_AUTH_NULL,
1191 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1192 		RTE_CRYPTO_AUTH_AES_CMAC,
1193 		RTE_CRYPTO_AUTH_ZUC_EIA3
1194 	};
1195 
1196 	rte_cryptodev_info_get(dev_id, &dev_info);
1197 	feat_flags = dev_info.feature_flags;
1198 
1199 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1200 			(global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1201 		RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1202 				"Cipher Hash testsuite not met\n");
1203 		return TEST_SKIPPED;
1204 	}
1205 
1206 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1207 			&& check_auth_capabilities_supported(auths,
1208 			RTE_DIM(auths)) != 0) {
1209 		RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1210 				"Cipher Hash testsuite not met\n");
1211 		return TEST_SKIPPED;
1212 	}
1213 
1214 	return 0;
1215 }
1216 
1217 static int
1218 esn_testsuite_setup(void)
1219 {
1220 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1221 	uint8_t dev_id = ts_params->valid_devs[0];
1222 	struct rte_cryptodev_info dev_info;
1223 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1224 		RTE_CRYPTO_CIPHER_AES_CBC
1225 	};
1226 	const enum rte_crypto_auth_algorithm auths[] = {
1227 		RTE_CRYPTO_AUTH_SHA1_HMAC
1228 	};
1229 
1230 	rte_cryptodev_info_get(dev_id, &dev_info);
1231 
1232 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1233 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1234 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1235 		RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1236 				"testsuite not met\n");
1237 		return TEST_SKIPPED;
1238 	}
1239 
1240 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1241 			&& check_auth_capabilities_supported(auths,
1242 			RTE_DIM(auths)) != 0) {
1243 		RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1244 				"testsuite not met\n");
1245 		return TEST_SKIPPED;
1246 	}
1247 
1248 	return 0;
1249 }
1250 
1251 static int
1252 multi_session_testsuite_setup(void)
1253 {
1254 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1255 	uint8_t dev_id = ts_params->valid_devs[0];
1256 	struct rte_cryptodev_info dev_info;
1257 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1258 		RTE_CRYPTO_CIPHER_AES_CBC
1259 	};
1260 	const enum rte_crypto_auth_algorithm auths[] = {
1261 		RTE_CRYPTO_AUTH_SHA512_HMAC
1262 	};
1263 
1264 	rte_cryptodev_info_get(dev_id, &dev_info);
1265 
1266 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1267 		RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1268 				"Session testsuite not met\n");
1269 		return TEST_SKIPPED;
1270 	}
1271 
1272 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1273 			&& check_auth_capabilities_supported(auths,
1274 			RTE_DIM(auths)) != 0) {
1275 		RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1276 				"Session testsuite not met\n");
1277 		return TEST_SKIPPED;
1278 	}
1279 
1280 	return 0;
1281 }
1282 
1283 static int
1284 negative_hmac_sha1_testsuite_setup(void)
1285 {
1286 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1287 	uint8_t dev_id = ts_params->valid_devs[0];
1288 	struct rte_cryptodev_info dev_info;
1289 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1290 		RTE_CRYPTO_CIPHER_AES_CBC
1291 	};
1292 	const enum rte_crypto_auth_algorithm auths[] = {
1293 		RTE_CRYPTO_AUTH_SHA1_HMAC
1294 	};
1295 
1296 	rte_cryptodev_info_get(dev_id, &dev_info);
1297 
1298 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1299 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1300 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1301 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1302 				"HMAC SHA1 testsuite not met\n");
1303 		return TEST_SKIPPED;
1304 	}
1305 
1306 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1307 			&& check_auth_capabilities_supported(auths,
1308 			RTE_DIM(auths)) != 0) {
1309 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1310 				"HMAC SHA1 testsuite not met\n");
1311 		return TEST_SKIPPED;
1312 	}
1313 
1314 	return 0;
1315 }
1316 
1317 static int
1318 dev_configure_and_start(uint64_t ff_disable)
1319 {
1320 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1321 	struct crypto_unittest_params *ut_params = &unittest_params;
1322 
1323 	uint16_t qp_id;
1324 
1325 	/* Clear unit test parameters before running test */
1326 	memset(ut_params, 0, sizeof(*ut_params));
1327 
1328 	/* Reconfigure device to default parameters */
1329 	ts_params->conf.socket_id = SOCKET_ID_ANY;
1330 	ts_params->conf.ff_disable = ff_disable;
1331 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1332 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
1333 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
1334 
1335 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1336 			&ts_params->conf),
1337 			"Failed to configure cryptodev %u",
1338 			ts_params->valid_devs[0]);
1339 
1340 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1341 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1342 			ts_params->valid_devs[0], qp_id,
1343 			&ts_params->qp_conf,
1344 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1345 			"Failed to setup queue pair %u on cryptodev %u",
1346 			qp_id, ts_params->valid_devs[0]);
1347 	}
1348 
1349 
1350 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1351 
1352 	/* Start the device */
1353 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1354 			"Failed to start cryptodev %u",
1355 			ts_params->valid_devs[0]);
1356 
1357 	return TEST_SUCCESS;
1358 }
1359 
1360 int
1361 ut_setup(void)
1362 {
1363 	/* Configure and start the device with security feature disabled */
1364 	return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1365 }
1366 
1367 static int
1368 ut_setup_security(void)
1369 {
1370 	/* Configure and start the device with no features disabled */
1371 	return dev_configure_and_start(0);
1372 }
1373 
1374 void
1375 ut_teardown(void)
1376 {
1377 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1378 	struct crypto_unittest_params *ut_params = &unittest_params;
1379 	struct rte_cryptodev_stats stats;
1380 
1381 	/* free crypto session structure */
1382 #ifdef RTE_LIB_SECURITY
1383 	if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1384 		if (ut_params->sec_session) {
1385 			rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1386 						(ts_params->valid_devs[0]),
1387 						ut_params->sec_session);
1388 			ut_params->sec_session = NULL;
1389 		}
1390 	} else
1391 #endif
1392 	{
1393 		if (ut_params->sess) {
1394 			rte_cryptodev_sym_session_clear(
1395 					ts_params->valid_devs[0],
1396 					ut_params->sess);
1397 			rte_cryptodev_sym_session_free(ut_params->sess);
1398 			ut_params->sess = NULL;
1399 		}
1400 	}
1401 
1402 	/* free crypto operation structure */
1403 	if (ut_params->op)
1404 		rte_crypto_op_free(ut_params->op);
1405 
1406 	/*
1407 	 * free mbuf - both obuf and ibuf are usually the same,
1408 	 * so check if they point at the same address is necessary,
1409 	 * to avoid freeing the mbuf twice.
1410 	 */
1411 	if (ut_params->obuf) {
1412 		rte_pktmbuf_free(ut_params->obuf);
1413 		if (ut_params->ibuf == ut_params->obuf)
1414 			ut_params->ibuf = 0;
1415 		ut_params->obuf = 0;
1416 	}
1417 	if (ut_params->ibuf) {
1418 		rte_pktmbuf_free(ut_params->ibuf);
1419 		ut_params->ibuf = 0;
1420 	}
1421 
1422 	if (ts_params->mbuf_pool != NULL)
1423 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1424 			rte_mempool_avail_count(ts_params->mbuf_pool));
1425 
1426 	rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
1427 
1428 	/* Stop the device */
1429 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1430 }
1431 
1432 static int
1433 test_device_configure_invalid_dev_id(void)
1434 {
1435 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1436 	uint16_t dev_id, num_devs = 0;
1437 
1438 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1439 			"Need at least %d devices for test", 1);
1440 
1441 	/* valid dev_id values */
1442 	dev_id = ts_params->valid_devs[0];
1443 
1444 	/* Stop the device in case it's started so it can be configured */
1445 	rte_cryptodev_stop(dev_id);
1446 
1447 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1448 			"Failed test for rte_cryptodev_configure: "
1449 			"invalid dev_num %u", dev_id);
1450 
1451 	/* invalid dev_id values */
1452 	dev_id = num_devs;
1453 
1454 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1455 			"Failed test for rte_cryptodev_configure: "
1456 			"invalid dev_num %u", dev_id);
1457 
1458 	dev_id = 0xff;
1459 
1460 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1461 			"Failed test for rte_cryptodev_configure:"
1462 			"invalid dev_num %u", dev_id);
1463 
1464 	return TEST_SUCCESS;
1465 }
1466 
1467 static int
1468 test_device_configure_invalid_queue_pair_ids(void)
1469 {
1470 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1471 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1472 
1473 	/* Stop the device in case it's started so it can be configured */
1474 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1475 
1476 	/* valid - max value queue pairs */
1477 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1478 
1479 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1480 			&ts_params->conf),
1481 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1482 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1483 
1484 	/* valid - one queue pairs */
1485 	ts_params->conf.nb_queue_pairs = 1;
1486 
1487 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1488 			&ts_params->conf),
1489 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1490 			ts_params->valid_devs[0],
1491 			ts_params->conf.nb_queue_pairs);
1492 
1493 
1494 	/* invalid - zero queue pairs */
1495 	ts_params->conf.nb_queue_pairs = 0;
1496 
1497 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1498 			&ts_params->conf),
1499 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1500 			" invalid qps: %u",
1501 			ts_params->valid_devs[0],
1502 			ts_params->conf.nb_queue_pairs);
1503 
1504 
1505 	/* invalid - max value supported by field queue pairs */
1506 	ts_params->conf.nb_queue_pairs = UINT16_MAX;
1507 
1508 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1509 			&ts_params->conf),
1510 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1511 			" invalid qps: %u",
1512 			ts_params->valid_devs[0],
1513 			ts_params->conf.nb_queue_pairs);
1514 
1515 
1516 	/* invalid - max value + 1 queue pairs */
1517 	ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1518 
1519 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1520 			&ts_params->conf),
1521 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1522 			" invalid qps: %u",
1523 			ts_params->valid_devs[0],
1524 			ts_params->conf.nb_queue_pairs);
1525 
1526 	/* revert to original testsuite value */
1527 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1528 
1529 	return TEST_SUCCESS;
1530 }
1531 
1532 static int
1533 test_queue_pair_descriptor_setup(void)
1534 {
1535 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1536 	struct rte_cryptodev_qp_conf qp_conf = {
1537 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
1538 	};
1539 	uint16_t qp_id;
1540 
1541 	/* Stop the device in case it's started so it can be configured */
1542 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1543 
1544 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1545 			&ts_params->conf),
1546 			"Failed to configure cryptodev %u",
1547 			ts_params->valid_devs[0]);
1548 
1549 	/*
1550 	 * Test various ring sizes on this device. memzones can't be
1551 	 * freed so are re-used if ring is released and re-created.
1552 	 */
1553 	qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1554 	qp_conf.mp_session = ts_params->session_mpool;
1555 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
1556 
1557 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1558 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1559 				ts_params->valid_devs[0], qp_id, &qp_conf,
1560 				rte_cryptodev_socket_id(
1561 						ts_params->valid_devs[0])),
1562 				"Failed test for "
1563 				"rte_cryptodev_queue_pair_setup: num_inflights "
1564 				"%u on qp %u on cryptodev %u",
1565 				qp_conf.nb_descriptors, qp_id,
1566 				ts_params->valid_devs[0]);
1567 	}
1568 
1569 	qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1570 
1571 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1572 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1573 				ts_params->valid_devs[0], qp_id, &qp_conf,
1574 				rte_cryptodev_socket_id(
1575 						ts_params->valid_devs[0])),
1576 				"Failed test for"
1577 				" rte_cryptodev_queue_pair_setup: num_inflights"
1578 				" %u on qp %u on cryptodev %u",
1579 				qp_conf.nb_descriptors, qp_id,
1580 				ts_params->valid_devs[0]);
1581 	}
1582 
1583 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1584 
1585 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1586 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1587 				ts_params->valid_devs[0], qp_id, &qp_conf,
1588 				rte_cryptodev_socket_id(
1589 						ts_params->valid_devs[0])),
1590 				"Failed test for "
1591 				"rte_cryptodev_queue_pair_setup: num_inflights"
1592 				" %u on qp %u on cryptodev %u",
1593 				qp_conf.nb_descriptors, qp_id,
1594 				ts_params->valid_devs[0]);
1595 	}
1596 
1597 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1598 
1599 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1600 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1601 				ts_params->valid_devs[0], qp_id, &qp_conf,
1602 				rte_cryptodev_socket_id(
1603 						ts_params->valid_devs[0])),
1604 				"Failed test for"
1605 				" rte_cryptodev_queue_pair_setup:"
1606 				"num_inflights %u on qp %u on cryptodev %u",
1607 				qp_conf.nb_descriptors, qp_id,
1608 				ts_params->valid_devs[0]);
1609 	}
1610 
1611 	/* test invalid queue pair id */
1612 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;	/*valid */
1613 
1614 	qp_id = ts_params->conf.nb_queue_pairs;		/*invalid */
1615 
1616 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1617 			ts_params->valid_devs[0],
1618 			qp_id, &qp_conf,
1619 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1620 			"Failed test for rte_cryptodev_queue_pair_setup:"
1621 			"invalid qp %u on cryptodev %u",
1622 			qp_id, ts_params->valid_devs[0]);
1623 
1624 	qp_id = 0xffff; /*invalid*/
1625 
1626 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1627 			ts_params->valid_devs[0],
1628 			qp_id, &qp_conf,
1629 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1630 			"Failed test for rte_cryptodev_queue_pair_setup:"
1631 			"invalid qp %u on cryptodev %u",
1632 			qp_id, ts_params->valid_devs[0]);
1633 
1634 	return TEST_SUCCESS;
1635 }
1636 
1637 /* ***** Plaintext data for tests ***** */
1638 
1639 const char catch_22_quote_1[] =
1640 		"There was only one catch and that was Catch-22, which "
1641 		"specified that a concern for one's safety in the face of "
1642 		"dangers that were real and immediate was the process of a "
1643 		"rational mind. Orr was crazy and could be grounded. All he "
1644 		"had to do was ask; and as soon as he did, he would no longer "
1645 		"be crazy and would have to fly more missions. Orr would be "
1646 		"crazy to fly more missions and sane if he didn't, but if he "
1647 		"was sane he had to fly them. If he flew them he was crazy "
1648 		"and didn't have to; but if he didn't want to he was sane and "
1649 		"had to. Yossarian was moved very deeply by the absolute "
1650 		"simplicity of this clause of Catch-22 and let out a "
1651 		"respectful whistle. \"That's some catch, that Catch-22\", he "
1652 		"observed. \"It's the best there is,\" Doc Daneeka agreed.";
1653 
1654 const char catch_22_quote[] =
1655 		"What a lousy earth! He wondered how many people were "
1656 		"destitute that same night even in his own prosperous country, "
1657 		"how many homes were shanties, how many husbands were drunk "
1658 		"and wives socked, and how many children were bullied, abused, "
1659 		"or abandoned. How many families hungered for food they could "
1660 		"not afford to buy? How many hearts were broken? How many "
1661 		"suicides would take place that same night, how many people "
1662 		"would go insane? How many cockroaches and landlords would "
1663 		"triumph? How many winners were losers, successes failures, "
1664 		"and rich men poor men? How many wise guys were stupid? How "
1665 		"many happy endings were unhappy endings? How many honest men "
1666 		"were liars, brave men cowards, loyal men traitors, how many "
1667 		"sainted men were corrupt, how many people in positions of "
1668 		"trust had sold their souls to bodyguards, how many had never "
1669 		"had souls? How many straight-and-narrow paths were crooked "
1670 		"paths? How many best families were worst families and how "
1671 		"many good people were bad people? When you added them all up "
1672 		"and then subtracted, you might be left with only the children, "
1673 		"and perhaps with Albert Einstein and an old violinist or "
1674 		"sculptor somewhere.";
1675 
1676 #define QUOTE_480_BYTES		(480)
1677 #define QUOTE_512_BYTES		(512)
1678 #define QUOTE_768_BYTES		(768)
1679 #define QUOTE_1024_BYTES	(1024)
1680 
1681 
1682 
1683 /* ***** SHA1 Hash Tests ***** */
1684 
1685 #define HMAC_KEY_LENGTH_SHA1	(DIGEST_BYTE_LENGTH_SHA1)
1686 
1687 static uint8_t hmac_sha1_key[] = {
1688 	0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1689 	0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1690 	0xDE, 0xF4, 0xDE, 0xAD };
1691 
1692 /* ***** SHA224 Hash Tests ***** */
1693 
1694 #define HMAC_KEY_LENGTH_SHA224	(DIGEST_BYTE_LENGTH_SHA224)
1695 
1696 
1697 /* ***** AES-CBC Cipher Tests ***** */
1698 
1699 #define CIPHER_KEY_LENGTH_AES_CBC	(16)
1700 #define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
1701 
1702 static uint8_t aes_cbc_key[] = {
1703 	0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1704 	0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1705 
1706 static uint8_t aes_cbc_iv[] = {
1707 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1708 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1709 
1710 
1711 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1712 
1713 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1714 	0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1715 	0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1716 	0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1717 	0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1718 	0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1719 	0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1720 	0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1721 	0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1722 	0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1723 	0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1724 	0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1725 	0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1726 	0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1727 	0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1728 	0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1729 	0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1730 	0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1731 	0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1732 	0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1733 	0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1734 	0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1735 	0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1736 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1737 	0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1738 	0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1739 	0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1740 	0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1741 	0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1742 	0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1743 	0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1744 	0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1745 	0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1746 	0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1747 	0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1748 	0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1749 	0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1750 	0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1751 	0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1752 	0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1753 	0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1754 	0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1755 	0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1756 	0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1757 	0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1758 	0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1759 	0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1760 	0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1761 	0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1762 	0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1763 	0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1764 	0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1765 	0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1766 	0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1767 	0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1768 	0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1769 	0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1770 	0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1771 	0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1772 	0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1773 	0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1774 	0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1775 	0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1776 	0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1777 	0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1778 };
1779 
1780 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1781 	0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1782 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1783 	0x18, 0x8c, 0x1d, 0x32
1784 };
1785 
1786 
1787 /* Multisession Vector context Test */
1788 /*Begin Session 0 */
1789 static uint8_t ms_aes_cbc_key0[] = {
1790 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1791 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1792 };
1793 
1794 static uint8_t ms_aes_cbc_iv0[] = {
1795 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1796 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1797 };
1798 
1799 static const uint8_t ms_aes_cbc_cipher0[] = {
1800 		0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1801 		0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1802 		0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1803 		0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1804 		0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1805 		0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1806 		0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1807 		0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1808 		0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1809 		0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1810 		0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1811 		0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1812 		0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1813 		0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1814 		0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1815 		0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1816 		0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1817 		0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1818 		0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1819 		0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1820 		0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1821 		0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1822 		0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1823 		0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1824 		0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1825 		0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1826 		0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1827 		0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1828 		0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1829 		0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1830 		0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1831 		0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1832 		0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1833 		0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1834 		0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1835 		0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1836 		0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1837 		0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1838 		0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1839 		0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1840 		0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1841 		0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1842 		0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1843 		0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1844 		0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1845 		0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1846 		0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1847 		0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1848 		0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1849 		0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1850 		0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1851 		0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1852 		0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1853 		0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1854 		0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1855 		0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1856 		0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1857 		0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1858 		0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1859 		0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1860 		0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1861 		0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1862 		0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1863 		0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1864 };
1865 
1866 
1867 static  uint8_t ms_hmac_key0[] = {
1868 		0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1869 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1870 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1871 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1872 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1873 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1874 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1875 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1876 };
1877 
1878 static const uint8_t ms_hmac_digest0[] = {
1879 		0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1880 		0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1881 		0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1882 		0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1883 		0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1884 		0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1885 		0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1886 		0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1887 		};
1888 
1889 /* End Session 0 */
1890 /* Begin session 1 */
1891 
1892 static  uint8_t ms_aes_cbc_key1[] = {
1893 		0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1894 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1895 };
1896 
1897 static  uint8_t ms_aes_cbc_iv1[] = {
1898 	0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1899 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1900 };
1901 
1902 static const uint8_t ms_aes_cbc_cipher1[] = {
1903 		0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1904 		0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1905 		0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1906 		0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1907 		0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1908 		0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1909 		0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1910 		0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1911 		0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1912 		0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1913 		0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1914 		0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1915 		0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1916 		0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1917 		0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1918 		0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1919 		0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1920 		0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1921 		0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1922 		0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1923 		0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1924 		0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1925 		0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1926 		0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1927 		0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1928 		0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1929 		0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1930 		0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1931 		0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1932 		0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1933 		0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1934 		0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1935 		0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1936 		0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1937 		0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1938 		0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1939 		0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1940 		0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1941 		0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1942 		0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1943 		0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1944 		0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1945 		0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1946 		0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1947 		0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1948 		0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1949 		0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1950 		0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1951 		0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1952 		0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1953 		0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1954 		0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1955 		0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1956 		0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1957 		0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1958 		0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1959 		0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1960 		0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1961 		0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1962 		0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1963 		0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1964 		0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1965 		0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1966 		0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1967 
1968 };
1969 
1970 static uint8_t ms_hmac_key1[] = {
1971 		0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1972 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1973 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1974 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1975 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1976 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1977 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1978 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1979 };
1980 
1981 static const uint8_t ms_hmac_digest1[] = {
1982 		0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1983 		0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
1984 		0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
1985 		0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
1986 		0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
1987 		0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
1988 		0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
1989 		0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
1990 };
1991 /* End Session 1  */
1992 /* Begin Session 2 */
1993 static  uint8_t ms_aes_cbc_key2[] = {
1994 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1995 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1996 };
1997 
1998 static  uint8_t ms_aes_cbc_iv2[] = {
1999 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2000 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2001 };
2002 
2003 static const uint8_t ms_aes_cbc_cipher2[] = {
2004 		0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
2005 		0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
2006 		0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
2007 		0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
2008 		0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
2009 		0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
2010 		0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
2011 		0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
2012 		0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
2013 		0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
2014 		0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
2015 		0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
2016 		0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
2017 		0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
2018 		0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
2019 		0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
2020 		0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
2021 		0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
2022 		0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
2023 		0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
2024 		0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
2025 		0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
2026 		0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
2027 		0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
2028 		0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
2029 		0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
2030 		0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
2031 		0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
2032 		0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
2033 		0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
2034 		0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
2035 		0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
2036 		0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
2037 		0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
2038 		0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
2039 		0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
2040 		0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
2041 		0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
2042 		0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
2043 		0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
2044 		0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
2045 		0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
2046 		0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
2047 		0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
2048 		0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
2049 		0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
2050 		0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2051 		0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2052 		0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2053 		0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2054 		0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2055 		0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2056 		0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2057 		0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2058 		0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2059 		0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2060 		0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2061 		0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2062 		0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2063 		0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2064 		0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2065 		0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2066 		0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2067 		0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2068 };
2069 
2070 static  uint8_t ms_hmac_key2[] = {
2071 		0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2072 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2073 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2074 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2075 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2076 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2077 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2078 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2079 };
2080 
2081 static const uint8_t ms_hmac_digest2[] = {
2082 		0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2083 		0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2084 		0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2085 		0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2086 		0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2087 		0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2088 		0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2089 		0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2090 };
2091 
2092 /* End Session 2 */
2093 
2094 
2095 static int
2096 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2097 {
2098 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2099 	struct crypto_unittest_params *ut_params = &unittest_params;
2100 
2101 	/* Verify the capabilities */
2102 	struct rte_cryptodev_sym_capability_idx cap_idx;
2103 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2104 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2105 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2106 			&cap_idx) == NULL)
2107 		return TEST_SKIPPED;
2108 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2109 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2110 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2111 			&cap_idx) == NULL)
2112 		return TEST_SKIPPED;
2113 
2114 	/* Generate test mbuf data and space for digest */
2115 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2116 			catch_22_quote,	QUOTE_512_BYTES, 0);
2117 
2118 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2119 			DIGEST_BYTE_LENGTH_SHA1);
2120 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2121 
2122 	/* Setup Cipher Parameters */
2123 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2124 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2125 
2126 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2127 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2128 	ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2129 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2130 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2131 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2132 
2133 	/* Setup HMAC Parameters */
2134 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2135 
2136 	ut_params->auth_xform.next = NULL;
2137 
2138 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2139 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2140 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2141 	ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2142 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2143 
2144 	ut_params->sess = rte_cryptodev_sym_session_create(
2145 			ts_params->session_mpool);
2146 
2147 	/* Create crypto session*/
2148 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
2149 			ut_params->sess, &ut_params->cipher_xform,
2150 			ts_params->session_priv_mpool);
2151 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2152 
2153 	/* Generate crypto op data structure */
2154 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2155 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2156 	TEST_ASSERT_NOT_NULL(ut_params->op,
2157 			"Failed to allocate symmetric crypto operation struct");
2158 
2159 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2160 
2161 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2162 
2163 	/* set crypto operation source mbuf */
2164 	sym_op->m_src = ut_params->ibuf;
2165 
2166 	/* Set crypto operation authentication parameters */
2167 	sym_op->auth.digest.data = ut_params->digest;
2168 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2169 			ut_params->ibuf, QUOTE_512_BYTES);
2170 
2171 	sym_op->auth.data.offset = 0;
2172 	sym_op->auth.data.length = QUOTE_512_BYTES;
2173 
2174 	/* Copy IV at the end of the crypto operation */
2175 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2176 			aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2177 
2178 	/* Set crypto operation cipher parameters */
2179 	sym_op->cipher.data.offset = 0;
2180 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2181 
2182 	/* Process crypto operation */
2183 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2184 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2185 			ut_params->op);
2186 	else
2187 		TEST_ASSERT_NOT_NULL(
2188 			process_crypto_request(ts_params->valid_devs[0],
2189 				ut_params->op),
2190 				"failed to process sym crypto op");
2191 
2192 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2193 			"crypto op processing failed");
2194 
2195 	/* Validate obuf */
2196 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2197 			uint8_t *);
2198 
2199 	TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2200 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2201 			QUOTE_512_BYTES,
2202 			"ciphertext data not as expected");
2203 
2204 	uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2205 
2206 	TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2207 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2208 			gbl_driver_id == rte_cryptodev_driver_id_get(
2209 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2210 					TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2211 					DIGEST_BYTE_LENGTH_SHA1,
2212 			"Generated digest data not as expected");
2213 
2214 	return TEST_SUCCESS;
2215 }
2216 
2217 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2218 
2219 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
2220 
2221 static uint8_t hmac_sha512_key[] = {
2222 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2223 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2224 	0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2225 	0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2226 	0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2227 	0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2228 	0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2229 	0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2230 
2231 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2232 	0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2233 	0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2234 	0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2235 	0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2236 	0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2237 	0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2238 	0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2239 	0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2240 
2241 
2242 
2243 static int
2244 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2245 		struct crypto_unittest_params *ut_params,
2246 		uint8_t *cipher_key,
2247 		uint8_t *hmac_key);
2248 
2249 static int
2250 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2251 		struct crypto_unittest_params *ut_params,
2252 		struct crypto_testsuite_params *ts_params,
2253 		const uint8_t *cipher,
2254 		const uint8_t *digest,
2255 		const uint8_t *iv);
2256 
2257 
2258 static int
2259 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2260 		struct crypto_unittest_params *ut_params,
2261 		uint8_t *cipher_key,
2262 		uint8_t *hmac_key)
2263 {
2264 
2265 	/* Setup Cipher Parameters */
2266 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2267 	ut_params->cipher_xform.next = NULL;
2268 
2269 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2270 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2271 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2272 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2273 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2274 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2275 
2276 	/* Setup HMAC Parameters */
2277 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2278 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2279 
2280 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2281 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2282 	ut_params->auth_xform.auth.key.data = hmac_key;
2283 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2284 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2285 
2286 	return TEST_SUCCESS;
2287 }
2288 
2289 
2290 static int
2291 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2292 		struct crypto_unittest_params *ut_params,
2293 		struct crypto_testsuite_params *ts_params,
2294 		const uint8_t *cipher,
2295 		const uint8_t *digest,
2296 		const uint8_t *iv)
2297 {
2298 	/* Generate test mbuf data and digest */
2299 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2300 			(const char *)
2301 			cipher,
2302 			QUOTE_512_BYTES, 0);
2303 
2304 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2305 			DIGEST_BYTE_LENGTH_SHA512);
2306 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2307 
2308 	rte_memcpy(ut_params->digest,
2309 			digest,
2310 			DIGEST_BYTE_LENGTH_SHA512);
2311 
2312 	/* Generate Crypto op data structure */
2313 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2314 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2315 	TEST_ASSERT_NOT_NULL(ut_params->op,
2316 			"Failed to allocate symmetric crypto operation struct");
2317 
2318 	rte_crypto_op_attach_sym_session(ut_params->op, sess);
2319 
2320 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2321 
2322 	/* set crypto operation source mbuf */
2323 	sym_op->m_src = ut_params->ibuf;
2324 
2325 	sym_op->auth.digest.data = ut_params->digest;
2326 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2327 			ut_params->ibuf, QUOTE_512_BYTES);
2328 
2329 	sym_op->auth.data.offset = 0;
2330 	sym_op->auth.data.length = QUOTE_512_BYTES;
2331 
2332 	/* Copy IV at the end of the crypto operation */
2333 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2334 			iv, CIPHER_IV_LENGTH_AES_CBC);
2335 
2336 	sym_op->cipher.data.offset = 0;
2337 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2338 
2339 	/* Process crypto operation */
2340 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2341 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2342 			ut_params->op);
2343 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2344 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2345 				ut_params->op, 1, 1, 0, 0);
2346 	else
2347 		TEST_ASSERT_NOT_NULL(
2348 				process_crypto_request(ts_params->valid_devs[0],
2349 					ut_params->op),
2350 					"failed to process sym crypto op");
2351 
2352 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2353 			"crypto op processing failed");
2354 
2355 	ut_params->obuf = ut_params->op->sym->m_src;
2356 
2357 	/* Validate obuf */
2358 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2359 			rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2360 			catch_22_quote,
2361 			QUOTE_512_BYTES,
2362 			"Plaintext data not as expected");
2363 
2364 	/* Validate obuf */
2365 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2366 			"Digest verification failed");
2367 
2368 	return TEST_SUCCESS;
2369 }
2370 
2371 /* ***** SNOW 3G Tests ***** */
2372 static int
2373 create_wireless_algo_hash_session(uint8_t dev_id,
2374 	const uint8_t *key, const uint8_t key_len,
2375 	const uint8_t iv_len, const uint8_t auth_len,
2376 	enum rte_crypto_auth_operation op,
2377 	enum rte_crypto_auth_algorithm algo)
2378 {
2379 	uint8_t hash_key[key_len];
2380 	int status;
2381 
2382 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2383 	struct crypto_unittest_params *ut_params = &unittest_params;
2384 
2385 	memcpy(hash_key, key, key_len);
2386 
2387 	debug_hexdump(stdout, "key:", key, key_len);
2388 
2389 	/* Setup Authentication Parameters */
2390 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2391 	ut_params->auth_xform.next = NULL;
2392 
2393 	ut_params->auth_xform.auth.op = op;
2394 	ut_params->auth_xform.auth.algo = algo;
2395 	ut_params->auth_xform.auth.key.length = key_len;
2396 	ut_params->auth_xform.auth.key.data = hash_key;
2397 	ut_params->auth_xform.auth.digest_length = auth_len;
2398 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2399 	ut_params->auth_xform.auth.iv.length = iv_len;
2400 	ut_params->sess = rte_cryptodev_sym_session_create(
2401 			ts_params->session_mpool);
2402 
2403 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2404 			&ut_params->auth_xform,
2405 			ts_params->session_priv_mpool);
2406 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2407 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2408 	return 0;
2409 }
2410 
2411 static int
2412 create_wireless_algo_cipher_session(uint8_t dev_id,
2413 			enum rte_crypto_cipher_operation op,
2414 			enum rte_crypto_cipher_algorithm algo,
2415 			const uint8_t *key, const uint8_t key_len,
2416 			uint8_t iv_len)
2417 {
2418 	uint8_t cipher_key[key_len];
2419 	int status;
2420 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2421 	struct crypto_unittest_params *ut_params = &unittest_params;
2422 
2423 	memcpy(cipher_key, key, key_len);
2424 
2425 	/* Setup Cipher Parameters */
2426 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2427 	ut_params->cipher_xform.next = NULL;
2428 
2429 	ut_params->cipher_xform.cipher.algo = algo;
2430 	ut_params->cipher_xform.cipher.op = op;
2431 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2432 	ut_params->cipher_xform.cipher.key.length = key_len;
2433 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2434 	ut_params->cipher_xform.cipher.iv.length = iv_len;
2435 
2436 	debug_hexdump(stdout, "key:", key, key_len);
2437 
2438 	/* Create Crypto session */
2439 	ut_params->sess = rte_cryptodev_sym_session_create(
2440 			ts_params->session_mpool);
2441 
2442 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2443 			&ut_params->cipher_xform,
2444 			ts_params->session_priv_mpool);
2445 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2446 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2447 	return 0;
2448 }
2449 
2450 static int
2451 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2452 			unsigned int cipher_len,
2453 			unsigned int cipher_offset)
2454 {
2455 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2456 	struct crypto_unittest_params *ut_params = &unittest_params;
2457 
2458 	/* Generate Crypto op data structure */
2459 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2460 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2461 	TEST_ASSERT_NOT_NULL(ut_params->op,
2462 				"Failed to allocate pktmbuf offload");
2463 
2464 	/* Set crypto operation data parameters */
2465 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2466 
2467 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2468 
2469 	/* set crypto operation source mbuf */
2470 	sym_op->m_src = ut_params->ibuf;
2471 
2472 	/* iv */
2473 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2474 			iv, iv_len);
2475 	sym_op->cipher.data.length = cipher_len;
2476 	sym_op->cipher.data.offset = cipher_offset;
2477 	return 0;
2478 }
2479 
2480 static int
2481 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2482 			unsigned int cipher_len,
2483 			unsigned int cipher_offset)
2484 {
2485 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2486 	struct crypto_unittest_params *ut_params = &unittest_params;
2487 
2488 	/* Generate Crypto op data structure */
2489 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2490 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2491 	TEST_ASSERT_NOT_NULL(ut_params->op,
2492 				"Failed to allocate pktmbuf offload");
2493 
2494 	/* Set crypto operation data parameters */
2495 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2496 
2497 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2498 
2499 	/* set crypto operation source mbuf */
2500 	sym_op->m_src = ut_params->ibuf;
2501 	sym_op->m_dst = ut_params->obuf;
2502 
2503 	/* iv */
2504 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2505 			iv, iv_len);
2506 	sym_op->cipher.data.length = cipher_len;
2507 	sym_op->cipher.data.offset = cipher_offset;
2508 	return 0;
2509 }
2510 
2511 static int
2512 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2513 		enum rte_crypto_cipher_operation cipher_op,
2514 		enum rte_crypto_auth_operation auth_op,
2515 		enum rte_crypto_auth_algorithm auth_algo,
2516 		enum rte_crypto_cipher_algorithm cipher_algo,
2517 		const uint8_t *key, uint8_t key_len,
2518 		uint8_t auth_iv_len, uint8_t auth_len,
2519 		uint8_t cipher_iv_len)
2520 
2521 {
2522 	uint8_t cipher_auth_key[key_len];
2523 	int status;
2524 
2525 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2526 	struct crypto_unittest_params *ut_params = &unittest_params;
2527 
2528 	memcpy(cipher_auth_key, key, key_len);
2529 
2530 	/* Setup Authentication Parameters */
2531 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2532 	ut_params->auth_xform.next = NULL;
2533 
2534 	ut_params->auth_xform.auth.op = auth_op;
2535 	ut_params->auth_xform.auth.algo = auth_algo;
2536 	ut_params->auth_xform.auth.key.length = key_len;
2537 	/* Hash key = cipher key */
2538 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2539 	ut_params->auth_xform.auth.digest_length = auth_len;
2540 	/* Auth IV will be after cipher IV */
2541 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2542 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2543 
2544 	/* Setup Cipher Parameters */
2545 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2546 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2547 
2548 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2549 	ut_params->cipher_xform.cipher.op = cipher_op;
2550 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2551 	ut_params->cipher_xform.cipher.key.length = key_len;
2552 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2553 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2554 
2555 	debug_hexdump(stdout, "key:", key, key_len);
2556 
2557 	/* Create Crypto session*/
2558 	ut_params->sess = rte_cryptodev_sym_session_create(
2559 			ts_params->session_mpool);
2560 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2561 
2562 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2563 			&ut_params->cipher_xform,
2564 			ts_params->session_priv_mpool);
2565 	if (status == -ENOTSUP)
2566 		return TEST_SKIPPED;
2567 
2568 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2569 	return 0;
2570 }
2571 
2572 static int
2573 create_wireless_cipher_auth_session(uint8_t dev_id,
2574 		enum rte_crypto_cipher_operation cipher_op,
2575 		enum rte_crypto_auth_operation auth_op,
2576 		enum rte_crypto_auth_algorithm auth_algo,
2577 		enum rte_crypto_cipher_algorithm cipher_algo,
2578 		const struct wireless_test_data *tdata)
2579 {
2580 	const uint8_t key_len = tdata->key.len;
2581 	uint8_t cipher_auth_key[key_len];
2582 	int status;
2583 
2584 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2585 	struct crypto_unittest_params *ut_params = &unittest_params;
2586 	const uint8_t *key = tdata->key.data;
2587 	const uint8_t auth_len = tdata->digest.len;
2588 	uint8_t cipher_iv_len = tdata->cipher_iv.len;
2589 	uint8_t auth_iv_len = tdata->auth_iv.len;
2590 
2591 	memcpy(cipher_auth_key, key, key_len);
2592 
2593 	/* Setup Authentication Parameters */
2594 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2595 	ut_params->auth_xform.next = NULL;
2596 
2597 	ut_params->auth_xform.auth.op = auth_op;
2598 	ut_params->auth_xform.auth.algo = auth_algo;
2599 	ut_params->auth_xform.auth.key.length = key_len;
2600 	/* Hash key = cipher key */
2601 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2602 	ut_params->auth_xform.auth.digest_length = auth_len;
2603 	/* Auth IV will be after cipher IV */
2604 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2605 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2606 
2607 	/* Setup Cipher Parameters */
2608 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2609 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2610 
2611 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2612 	ut_params->cipher_xform.cipher.op = cipher_op;
2613 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2614 	ut_params->cipher_xform.cipher.key.length = key_len;
2615 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2616 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2617 
2618 
2619 	debug_hexdump(stdout, "key:", key, key_len);
2620 
2621 	/* Create Crypto session*/
2622 	ut_params->sess = rte_cryptodev_sym_session_create(
2623 			ts_params->session_mpool);
2624 
2625 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2626 			&ut_params->cipher_xform,
2627 			ts_params->session_priv_mpool);
2628 	if (status == -ENOTSUP)
2629 		return TEST_SKIPPED;
2630 
2631 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2632 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2633 	return 0;
2634 }
2635 
2636 static int
2637 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2638 		const struct wireless_test_data *tdata)
2639 {
2640 	return create_wireless_cipher_auth_session(dev_id,
2641 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2642 		RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2643 		RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2644 }
2645 
2646 static int
2647 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2648 		enum rte_crypto_cipher_operation cipher_op,
2649 		enum rte_crypto_auth_operation auth_op,
2650 		enum rte_crypto_auth_algorithm auth_algo,
2651 		enum rte_crypto_cipher_algorithm cipher_algo,
2652 		const uint8_t *key, const uint8_t key_len,
2653 		uint8_t auth_iv_len, uint8_t auth_len,
2654 		uint8_t cipher_iv_len)
2655 {
2656 	uint8_t auth_cipher_key[key_len];
2657 	int status;
2658 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2659 	struct crypto_unittest_params *ut_params = &unittest_params;
2660 
2661 	memcpy(auth_cipher_key, key, key_len);
2662 
2663 	/* Setup Authentication Parameters */
2664 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2665 	ut_params->auth_xform.auth.op = auth_op;
2666 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2667 	ut_params->auth_xform.auth.algo = auth_algo;
2668 	ut_params->auth_xform.auth.key.length = key_len;
2669 	ut_params->auth_xform.auth.key.data = auth_cipher_key;
2670 	ut_params->auth_xform.auth.digest_length = auth_len;
2671 	/* Auth IV will be after cipher IV */
2672 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2673 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2674 
2675 	/* Setup Cipher Parameters */
2676 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2677 	ut_params->cipher_xform.next = NULL;
2678 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2679 	ut_params->cipher_xform.cipher.op = cipher_op;
2680 	ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2681 	ut_params->cipher_xform.cipher.key.length = key_len;
2682 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2683 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2684 
2685 	debug_hexdump(stdout, "key:", key, key_len);
2686 
2687 	/* Create Crypto session*/
2688 	ut_params->sess = rte_cryptodev_sym_session_create(
2689 			ts_params->session_mpool);
2690 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2691 
2692 	if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2693 		ut_params->auth_xform.next = NULL;
2694 		ut_params->cipher_xform.next = &ut_params->auth_xform;
2695 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2696 				&ut_params->cipher_xform,
2697 				ts_params->session_priv_mpool);
2698 
2699 	} else
2700 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2701 				&ut_params->auth_xform,
2702 				ts_params->session_priv_mpool);
2703 
2704 	if (status == -ENOTSUP)
2705 		return TEST_SKIPPED;
2706 
2707 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2708 
2709 	return 0;
2710 }
2711 
2712 static int
2713 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2714 		unsigned int auth_tag_len,
2715 		const uint8_t *iv, unsigned int iv_len,
2716 		unsigned int data_pad_len,
2717 		enum rte_crypto_auth_operation op,
2718 		unsigned int auth_len, unsigned int auth_offset)
2719 {
2720 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2721 
2722 	struct crypto_unittest_params *ut_params = &unittest_params;
2723 
2724 	/* Generate Crypto op data structure */
2725 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2726 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2727 	TEST_ASSERT_NOT_NULL(ut_params->op,
2728 		"Failed to allocate pktmbuf offload");
2729 
2730 	/* Set crypto operation data parameters */
2731 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2732 
2733 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2734 
2735 	/* set crypto operation source mbuf */
2736 	sym_op->m_src = ut_params->ibuf;
2737 
2738 	/* iv */
2739 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2740 			iv, iv_len);
2741 	/* digest */
2742 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2743 					ut_params->ibuf, auth_tag_len);
2744 
2745 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2746 				"no room to append auth tag");
2747 	ut_params->digest = sym_op->auth.digest.data;
2748 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2749 			ut_params->ibuf, data_pad_len);
2750 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2751 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2752 	else
2753 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2754 
2755 	debug_hexdump(stdout, "digest:",
2756 		sym_op->auth.digest.data,
2757 		auth_tag_len);
2758 
2759 	sym_op->auth.data.length = auth_len;
2760 	sym_op->auth.data.offset = auth_offset;
2761 
2762 	return 0;
2763 }
2764 
2765 static int
2766 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2767 	enum rte_crypto_auth_operation op)
2768 {
2769 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2770 	struct crypto_unittest_params *ut_params = &unittest_params;
2771 
2772 	const uint8_t *auth_tag = tdata->digest.data;
2773 	const unsigned int auth_tag_len = tdata->digest.len;
2774 	unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2775 	unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2776 
2777 	const uint8_t *cipher_iv = tdata->cipher_iv.data;
2778 	const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2779 	const uint8_t *auth_iv = tdata->auth_iv.data;
2780 	const uint8_t auth_iv_len = tdata->auth_iv.len;
2781 	const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2782 	const unsigned int auth_len = tdata->validAuthLenInBits.len;
2783 
2784 	/* Generate Crypto op data structure */
2785 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2786 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2787 	TEST_ASSERT_NOT_NULL(ut_params->op,
2788 			"Failed to allocate pktmbuf offload");
2789 	/* Set crypto operation data parameters */
2790 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2791 
2792 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2793 
2794 	/* set crypto operation source mbuf */
2795 	sym_op->m_src = ut_params->ibuf;
2796 
2797 	/* digest */
2798 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2799 			ut_params->ibuf, auth_tag_len);
2800 
2801 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2802 			"no room to append auth tag");
2803 	ut_params->digest = sym_op->auth.digest.data;
2804 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2805 			ut_params->ibuf, data_pad_len);
2806 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2807 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2808 	else
2809 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2810 
2811 	debug_hexdump(stdout, "digest:",
2812 		sym_op->auth.digest.data,
2813 		auth_tag_len);
2814 
2815 	/* Copy cipher and auth IVs at the end of the crypto operation */
2816 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2817 						IV_OFFSET);
2818 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2819 	iv_ptr += cipher_iv_len;
2820 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2821 
2822 	sym_op->cipher.data.length = cipher_len;
2823 	sym_op->cipher.data.offset = 0;
2824 	sym_op->auth.data.length = auth_len;
2825 	sym_op->auth.data.offset = 0;
2826 
2827 	return 0;
2828 }
2829 
2830 static int
2831 create_zuc_cipher_hash_generate_operation(
2832 		const struct wireless_test_data *tdata)
2833 {
2834 	return create_wireless_cipher_hash_operation(tdata,
2835 		RTE_CRYPTO_AUTH_OP_GENERATE);
2836 }
2837 
2838 static int
2839 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2840 		const unsigned auth_tag_len,
2841 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2842 		unsigned data_pad_len,
2843 		enum rte_crypto_auth_operation op,
2844 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2845 		const unsigned cipher_len, const unsigned cipher_offset,
2846 		const unsigned auth_len, const unsigned auth_offset)
2847 {
2848 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2849 	struct crypto_unittest_params *ut_params = &unittest_params;
2850 
2851 	enum rte_crypto_cipher_algorithm cipher_algo =
2852 			ut_params->cipher_xform.cipher.algo;
2853 	enum rte_crypto_auth_algorithm auth_algo =
2854 			ut_params->auth_xform.auth.algo;
2855 
2856 	/* Generate Crypto op data structure */
2857 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2858 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2859 	TEST_ASSERT_NOT_NULL(ut_params->op,
2860 			"Failed to allocate pktmbuf offload");
2861 	/* Set crypto operation data parameters */
2862 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2863 
2864 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2865 
2866 	/* set crypto operation source mbuf */
2867 	sym_op->m_src = ut_params->ibuf;
2868 
2869 	/* digest */
2870 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2871 			ut_params->ibuf, auth_tag_len);
2872 
2873 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2874 			"no room to append auth tag");
2875 	ut_params->digest = sym_op->auth.digest.data;
2876 
2877 	if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2878 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2879 				ut_params->ibuf, data_pad_len);
2880 	} else {
2881 		struct rte_mbuf *m = ut_params->ibuf;
2882 		unsigned int offset = data_pad_len;
2883 
2884 		while (offset > m->data_len && m->next != NULL) {
2885 			offset -= m->data_len;
2886 			m = m->next;
2887 		}
2888 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2889 			m, offset);
2890 	}
2891 
2892 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2893 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2894 	else
2895 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2896 
2897 	debug_hexdump(stdout, "digest:",
2898 		sym_op->auth.digest.data,
2899 		auth_tag_len);
2900 
2901 	/* Copy cipher and auth IVs at the end of the crypto operation */
2902 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2903 						IV_OFFSET);
2904 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2905 	iv_ptr += cipher_iv_len;
2906 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2907 
2908 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2909 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2910 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2911 		sym_op->cipher.data.length = cipher_len;
2912 		sym_op->cipher.data.offset = cipher_offset;
2913 	} else {
2914 		sym_op->cipher.data.length = cipher_len >> 3;
2915 		sym_op->cipher.data.offset = cipher_offset >> 3;
2916 	}
2917 
2918 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2919 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2920 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2921 		sym_op->auth.data.length = auth_len;
2922 		sym_op->auth.data.offset = auth_offset;
2923 	} else {
2924 		sym_op->auth.data.length = auth_len >> 3;
2925 		sym_op->auth.data.offset = auth_offset >> 3;
2926 	}
2927 
2928 	return 0;
2929 }
2930 
2931 static int
2932 create_wireless_algo_auth_cipher_operation(
2933 		const uint8_t *auth_tag, unsigned int auth_tag_len,
2934 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2935 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2936 		unsigned int data_pad_len,
2937 		unsigned int cipher_len, unsigned int cipher_offset,
2938 		unsigned int auth_len, unsigned int auth_offset,
2939 		uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2940 {
2941 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2942 	struct crypto_unittest_params *ut_params = &unittest_params;
2943 
2944 	enum rte_crypto_cipher_algorithm cipher_algo =
2945 			ut_params->cipher_xform.cipher.algo;
2946 	enum rte_crypto_auth_algorithm auth_algo =
2947 			ut_params->auth_xform.auth.algo;
2948 
2949 	/* Generate Crypto op data structure */
2950 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2951 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2952 	TEST_ASSERT_NOT_NULL(ut_params->op,
2953 			"Failed to allocate pktmbuf offload");
2954 
2955 	/* Set crypto operation data parameters */
2956 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2957 
2958 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2959 
2960 	/* set crypto operation mbufs */
2961 	sym_op->m_src = ut_params->ibuf;
2962 	if (op_mode == OUT_OF_PLACE)
2963 		sym_op->m_dst = ut_params->obuf;
2964 
2965 	/* digest */
2966 	if (!do_sgl) {
2967 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
2968 			(op_mode == IN_PLACE ?
2969 				ut_params->ibuf : ut_params->obuf),
2970 			uint8_t *, data_pad_len);
2971 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2972 			(op_mode == IN_PLACE ?
2973 				ut_params->ibuf : ut_params->obuf),
2974 			data_pad_len);
2975 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2976 	} else {
2977 		uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
2978 		struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
2979 				sym_op->m_src : sym_op->m_dst);
2980 		while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
2981 			remaining_off -= rte_pktmbuf_data_len(sgl_buf);
2982 			sgl_buf = sgl_buf->next;
2983 		}
2984 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
2985 				uint8_t *, remaining_off);
2986 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
2987 				remaining_off);
2988 		memset(sym_op->auth.digest.data, 0, remaining_off);
2989 		while (sgl_buf->next != NULL) {
2990 			memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
2991 				0, rte_pktmbuf_data_len(sgl_buf));
2992 			sgl_buf = sgl_buf->next;
2993 		}
2994 	}
2995 
2996 	/* Copy digest for the verification */
2997 	if (verify)
2998 		memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2999 
3000 	/* Copy cipher and auth IVs at the end of the crypto operation */
3001 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
3002 			ut_params->op, uint8_t *, IV_OFFSET);
3003 
3004 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3005 	iv_ptr += cipher_iv_len;
3006 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3007 
3008 	/* Only copy over the offset data needed from src to dst in OOP,
3009 	 * if the auth and cipher offsets are not aligned
3010 	 */
3011 	if (op_mode == OUT_OF_PLACE) {
3012 		if (cipher_offset > auth_offset)
3013 			rte_memcpy(
3014 				rte_pktmbuf_mtod_offset(
3015 					sym_op->m_dst,
3016 					uint8_t *, auth_offset >> 3),
3017 				rte_pktmbuf_mtod_offset(
3018 					sym_op->m_src,
3019 					uint8_t *, auth_offset >> 3),
3020 				((cipher_offset >> 3) - (auth_offset >> 3)));
3021 	}
3022 
3023 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3024 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3025 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3026 		sym_op->cipher.data.length = cipher_len;
3027 		sym_op->cipher.data.offset = cipher_offset;
3028 	} else {
3029 		sym_op->cipher.data.length = cipher_len >> 3;
3030 		sym_op->cipher.data.offset = cipher_offset >> 3;
3031 	}
3032 
3033 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3034 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3035 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3036 		sym_op->auth.data.length = auth_len;
3037 		sym_op->auth.data.offset = auth_offset;
3038 	} else {
3039 		sym_op->auth.data.length = auth_len >> 3;
3040 		sym_op->auth.data.offset = auth_offset >> 3;
3041 	}
3042 
3043 	return 0;
3044 }
3045 
3046 static int
3047 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
3048 {
3049 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3050 	struct crypto_unittest_params *ut_params = &unittest_params;
3051 
3052 	int retval;
3053 	unsigned plaintext_pad_len;
3054 	unsigned plaintext_len;
3055 	uint8_t *plaintext;
3056 	struct rte_cryptodev_info dev_info;
3057 
3058 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3059 	uint64_t feat_flags = dev_info.feature_flags;
3060 
3061 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3062 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3063 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3064 		return TEST_SKIPPED;
3065 	}
3066 
3067 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3068 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3069 		printf("Device doesn't support RAW data-path APIs.\n");
3070 		return TEST_SKIPPED;
3071 	}
3072 
3073 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3074 		return TEST_SKIPPED;
3075 
3076 	/* Verify the capabilities */
3077 	struct rte_cryptodev_sym_capability_idx cap_idx;
3078 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3079 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3080 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3081 			&cap_idx) == NULL)
3082 		return TEST_SKIPPED;
3083 
3084 	/* Create SNOW 3G session */
3085 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3086 			tdata->key.data, tdata->key.len,
3087 			tdata->auth_iv.len, tdata->digest.len,
3088 			RTE_CRYPTO_AUTH_OP_GENERATE,
3089 			RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3090 	if (retval < 0)
3091 		return retval;
3092 
3093 	/* alloc mbuf and set payload */
3094 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3095 
3096 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3097 	rte_pktmbuf_tailroom(ut_params->ibuf));
3098 
3099 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3100 	/* Append data which is padded to a multiple of */
3101 	/* the algorithms block size */
3102 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3103 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3104 				plaintext_pad_len);
3105 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3106 
3107 	/* Create SNOW 3G operation */
3108 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3109 			tdata->auth_iv.data, tdata->auth_iv.len,
3110 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3111 			tdata->validAuthLenInBits.len,
3112 			0);
3113 	if (retval < 0)
3114 		return retval;
3115 
3116 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3117 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3118 				ut_params->op, 0, 1, 1, 0);
3119 	else
3120 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3121 				ut_params->op);
3122 	ut_params->obuf = ut_params->op->sym->m_src;
3123 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3124 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3125 			+ plaintext_pad_len;
3126 
3127 	/* Validate obuf */
3128 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3129 	ut_params->digest,
3130 	tdata->digest.data,
3131 	DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3132 	"SNOW 3G Generated auth tag not as expected");
3133 
3134 	return 0;
3135 }
3136 
3137 static int
3138 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3139 {
3140 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3141 	struct crypto_unittest_params *ut_params = &unittest_params;
3142 
3143 	int retval;
3144 	unsigned plaintext_pad_len;
3145 	unsigned plaintext_len;
3146 	uint8_t *plaintext;
3147 	struct rte_cryptodev_info dev_info;
3148 
3149 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3150 	uint64_t feat_flags = dev_info.feature_flags;
3151 
3152 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3153 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3154 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3155 		return TEST_SKIPPED;
3156 	}
3157 
3158 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3159 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3160 		printf("Device doesn't support RAW data-path APIs.\n");
3161 		return TEST_SKIPPED;
3162 	}
3163 
3164 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3165 		return TEST_SKIPPED;
3166 
3167 	/* Verify the capabilities */
3168 	struct rte_cryptodev_sym_capability_idx cap_idx;
3169 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3170 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3171 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3172 			&cap_idx) == NULL)
3173 		return TEST_SKIPPED;
3174 
3175 	/* Create SNOW 3G session */
3176 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3177 				tdata->key.data, tdata->key.len,
3178 				tdata->auth_iv.len, tdata->digest.len,
3179 				RTE_CRYPTO_AUTH_OP_VERIFY,
3180 				RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3181 	if (retval < 0)
3182 		return retval;
3183 	/* alloc mbuf and set payload */
3184 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3185 
3186 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3187 	rte_pktmbuf_tailroom(ut_params->ibuf));
3188 
3189 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3190 	/* Append data which is padded to a multiple of */
3191 	/* the algorithms block size */
3192 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3193 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3194 				plaintext_pad_len);
3195 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3196 
3197 	/* Create SNOW 3G operation */
3198 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3199 			tdata->digest.len,
3200 			tdata->auth_iv.data, tdata->auth_iv.len,
3201 			plaintext_pad_len,
3202 			RTE_CRYPTO_AUTH_OP_VERIFY,
3203 			tdata->validAuthLenInBits.len,
3204 			0);
3205 	if (retval < 0)
3206 		return retval;
3207 
3208 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3209 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3210 				ut_params->op, 0, 1, 1, 0);
3211 	else
3212 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3213 				ut_params->op);
3214 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3215 	ut_params->obuf = ut_params->op->sym->m_src;
3216 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3217 				+ plaintext_pad_len;
3218 
3219 	/* Validate obuf */
3220 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3221 		return 0;
3222 	else
3223 		return -1;
3224 
3225 	return 0;
3226 }
3227 
3228 static int
3229 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3230 {
3231 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3232 	struct crypto_unittest_params *ut_params = &unittest_params;
3233 
3234 	int retval;
3235 	unsigned plaintext_pad_len;
3236 	unsigned plaintext_len;
3237 	uint8_t *plaintext;
3238 	struct rte_cryptodev_info dev_info;
3239 
3240 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3241 	uint64_t feat_flags = dev_info.feature_flags;
3242 
3243 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3244 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3245 		printf("Device doesn't support RAW data-path APIs.\n");
3246 		return TEST_SKIPPED;
3247 	}
3248 
3249 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3250 		return TEST_SKIPPED;
3251 
3252 	/* Verify the capabilities */
3253 	struct rte_cryptodev_sym_capability_idx cap_idx;
3254 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3255 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3256 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3257 			&cap_idx) == NULL)
3258 		return TEST_SKIPPED;
3259 
3260 	/* Create KASUMI session */
3261 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3262 			tdata->key.data, tdata->key.len,
3263 			0, tdata->digest.len,
3264 			RTE_CRYPTO_AUTH_OP_GENERATE,
3265 			RTE_CRYPTO_AUTH_KASUMI_F9);
3266 	if (retval < 0)
3267 		return retval;
3268 
3269 	/* alloc mbuf and set payload */
3270 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3271 
3272 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3273 	rte_pktmbuf_tailroom(ut_params->ibuf));
3274 
3275 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3276 	/* Append data which is padded to a multiple of */
3277 	/* the algorithms block size */
3278 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3279 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3280 				plaintext_pad_len);
3281 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3282 
3283 	/* Create KASUMI operation */
3284 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3285 			NULL, 0,
3286 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3287 			tdata->plaintext.len,
3288 			0);
3289 	if (retval < 0)
3290 		return retval;
3291 
3292 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3293 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3294 			ut_params->op);
3295 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3296 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3297 				ut_params->op, 0, 1, 1, 0);
3298 	else
3299 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3300 			ut_params->op);
3301 
3302 	ut_params->obuf = ut_params->op->sym->m_src;
3303 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3304 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3305 			+ plaintext_pad_len;
3306 
3307 	/* Validate obuf */
3308 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3309 	ut_params->digest,
3310 	tdata->digest.data,
3311 	DIGEST_BYTE_LENGTH_KASUMI_F9,
3312 	"KASUMI Generated auth tag not as expected");
3313 
3314 	return 0;
3315 }
3316 
3317 static int
3318 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3319 {
3320 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3321 	struct crypto_unittest_params *ut_params = &unittest_params;
3322 
3323 	int retval;
3324 	unsigned plaintext_pad_len;
3325 	unsigned plaintext_len;
3326 	uint8_t *plaintext;
3327 	struct rte_cryptodev_info dev_info;
3328 
3329 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3330 	uint64_t feat_flags = dev_info.feature_flags;
3331 
3332 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3333 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3334 		printf("Device doesn't support RAW data-path APIs.\n");
3335 		return TEST_SKIPPED;
3336 	}
3337 
3338 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3339 		return TEST_SKIPPED;
3340 
3341 	/* Verify the capabilities */
3342 	struct rte_cryptodev_sym_capability_idx cap_idx;
3343 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3344 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3345 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3346 			&cap_idx) == NULL)
3347 		return TEST_SKIPPED;
3348 
3349 	/* Create KASUMI session */
3350 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3351 				tdata->key.data, tdata->key.len,
3352 				0, tdata->digest.len,
3353 				RTE_CRYPTO_AUTH_OP_VERIFY,
3354 				RTE_CRYPTO_AUTH_KASUMI_F9);
3355 	if (retval < 0)
3356 		return retval;
3357 	/* alloc mbuf and set payload */
3358 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3359 
3360 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3361 	rte_pktmbuf_tailroom(ut_params->ibuf));
3362 
3363 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3364 	/* Append data which is padded to a multiple */
3365 	/* of the algorithms block size */
3366 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3367 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3368 				plaintext_pad_len);
3369 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3370 
3371 	/* Create KASUMI operation */
3372 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3373 			tdata->digest.len,
3374 			NULL, 0,
3375 			plaintext_pad_len,
3376 			RTE_CRYPTO_AUTH_OP_VERIFY,
3377 			tdata->plaintext.len,
3378 			0);
3379 	if (retval < 0)
3380 		return retval;
3381 
3382 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3383 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3384 				ut_params->op, 0, 1, 1, 0);
3385 	else
3386 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3387 				ut_params->op);
3388 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3389 	ut_params->obuf = ut_params->op->sym->m_src;
3390 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3391 				+ plaintext_pad_len;
3392 
3393 	/* Validate obuf */
3394 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3395 		return 0;
3396 	else
3397 		return -1;
3398 
3399 	return 0;
3400 }
3401 
3402 static int
3403 test_snow3g_hash_generate_test_case_1(void)
3404 {
3405 	return test_snow3g_authentication(&snow3g_hash_test_case_1);
3406 }
3407 
3408 static int
3409 test_snow3g_hash_generate_test_case_2(void)
3410 {
3411 	return test_snow3g_authentication(&snow3g_hash_test_case_2);
3412 }
3413 
3414 static int
3415 test_snow3g_hash_generate_test_case_3(void)
3416 {
3417 	return test_snow3g_authentication(&snow3g_hash_test_case_3);
3418 }
3419 
3420 static int
3421 test_snow3g_hash_generate_test_case_4(void)
3422 {
3423 	return test_snow3g_authentication(&snow3g_hash_test_case_4);
3424 }
3425 
3426 static int
3427 test_snow3g_hash_generate_test_case_5(void)
3428 {
3429 	return test_snow3g_authentication(&snow3g_hash_test_case_5);
3430 }
3431 
3432 static int
3433 test_snow3g_hash_generate_test_case_6(void)
3434 {
3435 	return test_snow3g_authentication(&snow3g_hash_test_case_6);
3436 }
3437 
3438 static int
3439 test_snow3g_hash_verify_test_case_1(void)
3440 {
3441 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3442 
3443 }
3444 
3445 static int
3446 test_snow3g_hash_verify_test_case_2(void)
3447 {
3448 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3449 }
3450 
3451 static int
3452 test_snow3g_hash_verify_test_case_3(void)
3453 {
3454 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3455 }
3456 
3457 static int
3458 test_snow3g_hash_verify_test_case_4(void)
3459 {
3460 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3461 }
3462 
3463 static int
3464 test_snow3g_hash_verify_test_case_5(void)
3465 {
3466 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3467 }
3468 
3469 static int
3470 test_snow3g_hash_verify_test_case_6(void)
3471 {
3472 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3473 }
3474 
3475 static int
3476 test_kasumi_hash_generate_test_case_1(void)
3477 {
3478 	return test_kasumi_authentication(&kasumi_hash_test_case_1);
3479 }
3480 
3481 static int
3482 test_kasumi_hash_generate_test_case_2(void)
3483 {
3484 	return test_kasumi_authentication(&kasumi_hash_test_case_2);
3485 }
3486 
3487 static int
3488 test_kasumi_hash_generate_test_case_3(void)
3489 {
3490 	return test_kasumi_authentication(&kasumi_hash_test_case_3);
3491 }
3492 
3493 static int
3494 test_kasumi_hash_generate_test_case_4(void)
3495 {
3496 	return test_kasumi_authentication(&kasumi_hash_test_case_4);
3497 }
3498 
3499 static int
3500 test_kasumi_hash_generate_test_case_5(void)
3501 {
3502 	return test_kasumi_authentication(&kasumi_hash_test_case_5);
3503 }
3504 
3505 static int
3506 test_kasumi_hash_generate_test_case_6(void)
3507 {
3508 	return test_kasumi_authentication(&kasumi_hash_test_case_6);
3509 }
3510 
3511 static int
3512 test_kasumi_hash_verify_test_case_1(void)
3513 {
3514 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3515 }
3516 
3517 static int
3518 test_kasumi_hash_verify_test_case_2(void)
3519 {
3520 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3521 }
3522 
3523 static int
3524 test_kasumi_hash_verify_test_case_3(void)
3525 {
3526 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3527 }
3528 
3529 static int
3530 test_kasumi_hash_verify_test_case_4(void)
3531 {
3532 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3533 }
3534 
3535 static int
3536 test_kasumi_hash_verify_test_case_5(void)
3537 {
3538 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3539 }
3540 
3541 static int
3542 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3543 {
3544 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3545 	struct crypto_unittest_params *ut_params = &unittest_params;
3546 
3547 	int retval;
3548 	uint8_t *plaintext, *ciphertext;
3549 	unsigned plaintext_pad_len;
3550 	unsigned plaintext_len;
3551 	struct rte_cryptodev_info dev_info;
3552 
3553 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3554 	uint64_t feat_flags = dev_info.feature_flags;
3555 
3556 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3557 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3558 		printf("Device doesn't support RAW data-path APIs.\n");
3559 		return TEST_SKIPPED;
3560 	}
3561 
3562 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3563 		return TEST_SKIPPED;
3564 
3565 	/* Verify the capabilities */
3566 	struct rte_cryptodev_sym_capability_idx cap_idx;
3567 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3568 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3569 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3570 			&cap_idx) == NULL)
3571 		return TEST_SKIPPED;
3572 
3573 	/* Create KASUMI session */
3574 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3575 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3576 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3577 					tdata->key.data, tdata->key.len,
3578 					tdata->cipher_iv.len);
3579 	if (retval < 0)
3580 		return retval;
3581 
3582 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3583 
3584 	/* Clear mbuf payload */
3585 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3586 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3587 
3588 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3589 	/* Append data which is padded to a multiple */
3590 	/* of the algorithms block size */
3591 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3592 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3593 				plaintext_pad_len);
3594 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3595 
3596 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3597 
3598 	/* Create KASUMI operation */
3599 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3600 				tdata->cipher_iv.len,
3601 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3602 				tdata->validCipherOffsetInBits.len);
3603 	if (retval < 0)
3604 		return retval;
3605 
3606 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3607 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3608 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3609 	else
3610 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3611 				ut_params->op);
3612 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3613 
3614 	ut_params->obuf = ut_params->op->sym->m_dst;
3615 	if (ut_params->obuf)
3616 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3617 	else
3618 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3619 
3620 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3621 
3622 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3623 				(tdata->validCipherOffsetInBits.len >> 3);
3624 	/* Validate obuf */
3625 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3626 		ciphertext,
3627 		reference_ciphertext,
3628 		tdata->validCipherLenInBits.len,
3629 		"KASUMI Ciphertext data not as expected");
3630 	return 0;
3631 }
3632 
3633 static int
3634 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3635 {
3636 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3637 	struct crypto_unittest_params *ut_params = &unittest_params;
3638 
3639 	int retval;
3640 
3641 	unsigned int plaintext_pad_len;
3642 	unsigned int plaintext_len;
3643 
3644 	uint8_t buffer[10000];
3645 	const uint8_t *ciphertext;
3646 
3647 	struct rte_cryptodev_info dev_info;
3648 
3649 	/* Verify the capabilities */
3650 	struct rte_cryptodev_sym_capability_idx cap_idx;
3651 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3652 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3653 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3654 			&cap_idx) == NULL)
3655 		return TEST_SKIPPED;
3656 
3657 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3658 
3659 	uint64_t feat_flags = dev_info.feature_flags;
3660 
3661 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3662 		printf("Device doesn't support in-place scatter-gather. "
3663 				"Test Skipped.\n");
3664 		return TEST_SKIPPED;
3665 	}
3666 
3667 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3668 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3669 		printf("Device doesn't support RAW data-path APIs.\n");
3670 		return TEST_SKIPPED;
3671 	}
3672 
3673 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3674 		return TEST_SKIPPED;
3675 
3676 	/* Create KASUMI session */
3677 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3678 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3679 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3680 					tdata->key.data, tdata->key.len,
3681 					tdata->cipher_iv.len);
3682 	if (retval < 0)
3683 		return retval;
3684 
3685 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3686 
3687 
3688 	/* Append data which is padded to a multiple */
3689 	/* of the algorithms block size */
3690 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3691 
3692 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3693 			plaintext_pad_len, 10, 0);
3694 
3695 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3696 
3697 	/* Create KASUMI operation */
3698 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3699 				tdata->cipher_iv.len,
3700 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3701 				tdata->validCipherOffsetInBits.len);
3702 	if (retval < 0)
3703 		return retval;
3704 
3705 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3706 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3707 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3708 	else
3709 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3710 						ut_params->op);
3711 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3712 
3713 	ut_params->obuf = ut_params->op->sym->m_dst;
3714 
3715 	if (ut_params->obuf)
3716 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3717 				plaintext_len, buffer);
3718 	else
3719 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3720 				tdata->validCipherOffsetInBits.len >> 3,
3721 				plaintext_len, buffer);
3722 
3723 	/* Validate obuf */
3724 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3725 
3726 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3727 				(tdata->validCipherOffsetInBits.len >> 3);
3728 	/* Validate obuf */
3729 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3730 		ciphertext,
3731 		reference_ciphertext,
3732 		tdata->validCipherLenInBits.len,
3733 		"KASUMI Ciphertext data not as expected");
3734 	return 0;
3735 }
3736 
3737 static int
3738 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3739 {
3740 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3741 	struct crypto_unittest_params *ut_params = &unittest_params;
3742 
3743 	int retval;
3744 	uint8_t *plaintext, *ciphertext;
3745 	unsigned plaintext_pad_len;
3746 	unsigned plaintext_len;
3747 
3748 	/* Verify the capabilities */
3749 	struct rte_cryptodev_sym_capability_idx cap_idx;
3750 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3751 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3752 	/* Data-path service does not support OOP */
3753 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3754 			&cap_idx) == NULL)
3755 		return TEST_SKIPPED;
3756 
3757 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3758 		return TEST_SKIPPED;
3759 
3760 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3761 		return TEST_SKIPPED;
3762 
3763 	/* Create KASUMI session */
3764 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3765 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3766 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3767 					tdata->key.data, tdata->key.len,
3768 					tdata->cipher_iv.len);
3769 	if (retval < 0)
3770 		return retval;
3771 
3772 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3773 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3774 
3775 	/* Clear mbuf payload */
3776 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3777 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3778 
3779 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3780 	/* Append data which is padded to a multiple */
3781 	/* of the algorithms block size */
3782 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3783 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3784 				plaintext_pad_len);
3785 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3786 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3787 
3788 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3789 
3790 	/* Create KASUMI operation */
3791 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3792 				tdata->cipher_iv.len,
3793 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3794 				tdata->validCipherOffsetInBits.len);
3795 	if (retval < 0)
3796 		return retval;
3797 
3798 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3799 						ut_params->op);
3800 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3801 
3802 	ut_params->obuf = ut_params->op->sym->m_dst;
3803 	if (ut_params->obuf)
3804 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3805 	else
3806 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3807 
3808 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3809 
3810 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3811 				(tdata->validCipherOffsetInBits.len >> 3);
3812 	/* Validate obuf */
3813 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3814 		ciphertext,
3815 		reference_ciphertext,
3816 		tdata->validCipherLenInBits.len,
3817 		"KASUMI Ciphertext data not as expected");
3818 	return 0;
3819 }
3820 
3821 static int
3822 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3823 {
3824 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3825 	struct crypto_unittest_params *ut_params = &unittest_params;
3826 
3827 	int retval;
3828 	unsigned int plaintext_pad_len;
3829 	unsigned int plaintext_len;
3830 
3831 	const uint8_t *ciphertext;
3832 	uint8_t buffer[2048];
3833 
3834 	struct rte_cryptodev_info dev_info;
3835 
3836 	/* Verify the capabilities */
3837 	struct rte_cryptodev_sym_capability_idx cap_idx;
3838 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3839 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3840 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3841 			&cap_idx) == NULL)
3842 		return TEST_SKIPPED;
3843 
3844 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3845 		return TEST_SKIPPED;
3846 
3847 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3848 		return TEST_SKIPPED;
3849 
3850 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3851 
3852 	uint64_t feat_flags = dev_info.feature_flags;
3853 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3854 		printf("Device doesn't support out-of-place scatter-gather "
3855 				"in both input and output mbufs. "
3856 				"Test Skipped.\n");
3857 		return TEST_SKIPPED;
3858 	}
3859 
3860 	/* Create KASUMI session */
3861 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3862 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3863 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3864 					tdata->key.data, tdata->key.len,
3865 					tdata->cipher_iv.len);
3866 	if (retval < 0)
3867 		return retval;
3868 
3869 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3870 	/* Append data which is padded to a multiple */
3871 	/* of the algorithms block size */
3872 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3873 
3874 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3875 			plaintext_pad_len, 10, 0);
3876 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3877 			plaintext_pad_len, 3, 0);
3878 
3879 	/* Append data which is padded to a multiple */
3880 	/* of the algorithms block size */
3881 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3882 
3883 	/* Create KASUMI operation */
3884 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3885 				tdata->cipher_iv.len,
3886 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3887 				tdata->validCipherOffsetInBits.len);
3888 	if (retval < 0)
3889 		return retval;
3890 
3891 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3892 						ut_params->op);
3893 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3894 
3895 	ut_params->obuf = ut_params->op->sym->m_dst;
3896 	if (ut_params->obuf)
3897 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3898 				plaintext_pad_len, buffer);
3899 	else
3900 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3901 				tdata->validCipherOffsetInBits.len >> 3,
3902 				plaintext_pad_len, buffer);
3903 
3904 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3905 				(tdata->validCipherOffsetInBits.len >> 3);
3906 	/* Validate obuf */
3907 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3908 		ciphertext,
3909 		reference_ciphertext,
3910 		tdata->validCipherLenInBits.len,
3911 		"KASUMI Ciphertext data not as expected");
3912 	return 0;
3913 }
3914 
3915 
3916 static int
3917 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3918 {
3919 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3920 	struct crypto_unittest_params *ut_params = &unittest_params;
3921 
3922 	int retval;
3923 	uint8_t *ciphertext, *plaintext;
3924 	unsigned ciphertext_pad_len;
3925 	unsigned ciphertext_len;
3926 
3927 	/* Verify the capabilities */
3928 	struct rte_cryptodev_sym_capability_idx cap_idx;
3929 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3930 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3931 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3932 			&cap_idx) == NULL)
3933 		return TEST_SKIPPED;
3934 
3935 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3936 		return TEST_SKIPPED;
3937 
3938 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3939 		return TEST_SKIPPED;
3940 
3941 	/* Create KASUMI session */
3942 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3943 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3944 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3945 					tdata->key.data, tdata->key.len,
3946 					tdata->cipher_iv.len);
3947 	if (retval < 0)
3948 		return retval;
3949 
3950 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3951 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3952 
3953 	/* Clear mbuf payload */
3954 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3955 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3956 
3957 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3958 	/* Append data which is padded to a multiple */
3959 	/* of the algorithms block size */
3960 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3961 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3962 				ciphertext_pad_len);
3963 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3964 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3965 
3966 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3967 
3968 	/* Create KASUMI operation */
3969 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3970 				tdata->cipher_iv.len,
3971 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3972 				tdata->validCipherOffsetInBits.len);
3973 	if (retval < 0)
3974 		return retval;
3975 
3976 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3977 						ut_params->op);
3978 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3979 
3980 	ut_params->obuf = ut_params->op->sym->m_dst;
3981 	if (ut_params->obuf)
3982 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3983 	else
3984 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3985 
3986 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3987 
3988 	const uint8_t *reference_plaintext = tdata->plaintext.data +
3989 				(tdata->validCipherOffsetInBits.len >> 3);
3990 	/* Validate obuf */
3991 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3992 		plaintext,
3993 		reference_plaintext,
3994 		tdata->validCipherLenInBits.len,
3995 		"KASUMI Plaintext data not as expected");
3996 	return 0;
3997 }
3998 
3999 static int
4000 test_kasumi_decryption(const struct kasumi_test_data *tdata)
4001 {
4002 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4003 	struct crypto_unittest_params *ut_params = &unittest_params;
4004 
4005 	int retval;
4006 	uint8_t *ciphertext, *plaintext;
4007 	unsigned ciphertext_pad_len;
4008 	unsigned ciphertext_len;
4009 	struct rte_cryptodev_info dev_info;
4010 
4011 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4012 	uint64_t feat_flags = dev_info.feature_flags;
4013 
4014 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4015 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4016 		printf("Device doesn't support RAW data-path APIs.\n");
4017 		return TEST_SKIPPED;
4018 	}
4019 
4020 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4021 		return TEST_SKIPPED;
4022 
4023 	/* Verify the capabilities */
4024 	struct rte_cryptodev_sym_capability_idx cap_idx;
4025 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4026 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4027 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4028 			&cap_idx) == NULL)
4029 		return TEST_SKIPPED;
4030 
4031 	/* Create KASUMI session */
4032 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4033 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4034 					RTE_CRYPTO_CIPHER_KASUMI_F8,
4035 					tdata->key.data, tdata->key.len,
4036 					tdata->cipher_iv.len);
4037 	if (retval < 0)
4038 		return retval;
4039 
4040 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4041 
4042 	/* Clear mbuf payload */
4043 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4044 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4045 
4046 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4047 	/* Append data which is padded to a multiple */
4048 	/* of the algorithms block size */
4049 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4050 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4051 				ciphertext_pad_len);
4052 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4053 
4054 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4055 
4056 	/* Create KASUMI operation */
4057 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4058 					tdata->cipher_iv.len,
4059 					tdata->ciphertext.len,
4060 					tdata->validCipherOffsetInBits.len);
4061 	if (retval < 0)
4062 		return retval;
4063 
4064 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4065 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4066 				ut_params->op, 1, 0, 1, 0);
4067 	else
4068 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4069 						ut_params->op);
4070 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4071 
4072 	ut_params->obuf = ut_params->op->sym->m_dst;
4073 	if (ut_params->obuf)
4074 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4075 	else
4076 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4077 
4078 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4079 
4080 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4081 				(tdata->validCipherOffsetInBits.len >> 3);
4082 	/* Validate obuf */
4083 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4084 		plaintext,
4085 		reference_plaintext,
4086 		tdata->validCipherLenInBits.len,
4087 		"KASUMI Plaintext data not as expected");
4088 	return 0;
4089 }
4090 
4091 static int
4092 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4093 {
4094 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4095 	struct crypto_unittest_params *ut_params = &unittest_params;
4096 
4097 	int retval;
4098 	uint8_t *plaintext, *ciphertext;
4099 	unsigned plaintext_pad_len;
4100 	unsigned plaintext_len;
4101 	struct rte_cryptodev_info dev_info;
4102 
4103 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4104 	uint64_t feat_flags = dev_info.feature_flags;
4105 
4106 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4107 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4108 		printf("Device doesn't support RAW data-path APIs.\n");
4109 		return TEST_SKIPPED;
4110 	}
4111 
4112 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4113 		return TEST_SKIPPED;
4114 
4115 	/* Verify the capabilities */
4116 	struct rte_cryptodev_sym_capability_idx cap_idx;
4117 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4118 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4119 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4120 			&cap_idx) == NULL)
4121 		return TEST_SKIPPED;
4122 
4123 	/* Create SNOW 3G session */
4124 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4125 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4126 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4127 					tdata->key.data, tdata->key.len,
4128 					tdata->cipher_iv.len);
4129 	if (retval < 0)
4130 		return retval;
4131 
4132 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4133 
4134 	/* Clear mbuf payload */
4135 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4136 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4137 
4138 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4139 	/* Append data which is padded to a multiple of */
4140 	/* the algorithms block size */
4141 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4142 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4143 				plaintext_pad_len);
4144 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4145 
4146 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4147 
4148 	/* Create SNOW 3G operation */
4149 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4150 					tdata->cipher_iv.len,
4151 					tdata->validCipherLenInBits.len,
4152 					0);
4153 	if (retval < 0)
4154 		return retval;
4155 
4156 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4157 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4158 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4159 	else
4160 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4161 						ut_params->op);
4162 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4163 
4164 	ut_params->obuf = ut_params->op->sym->m_dst;
4165 	if (ut_params->obuf)
4166 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4167 	else
4168 		ciphertext = plaintext;
4169 
4170 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4171 
4172 	/* Validate obuf */
4173 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4174 		ciphertext,
4175 		tdata->ciphertext.data,
4176 		tdata->validDataLenInBits.len,
4177 		"SNOW 3G Ciphertext data not as expected");
4178 	return 0;
4179 }
4180 
4181 
4182 static int
4183 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4184 {
4185 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4186 	struct crypto_unittest_params *ut_params = &unittest_params;
4187 	uint8_t *plaintext, *ciphertext;
4188 
4189 	int retval;
4190 	unsigned plaintext_pad_len;
4191 	unsigned plaintext_len;
4192 
4193 	/* Verify the capabilities */
4194 	struct rte_cryptodev_sym_capability_idx cap_idx;
4195 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4196 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4197 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4198 			&cap_idx) == NULL)
4199 		return TEST_SKIPPED;
4200 
4201 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4202 		return TEST_SKIPPED;
4203 
4204 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4205 		return TEST_SKIPPED;
4206 
4207 	/* Create SNOW 3G session */
4208 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4209 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4210 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4211 					tdata->key.data, tdata->key.len,
4212 					tdata->cipher_iv.len);
4213 	if (retval < 0)
4214 		return retval;
4215 
4216 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4217 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4218 
4219 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4220 			"Failed to allocate input buffer in mempool");
4221 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4222 			"Failed to allocate output buffer in mempool");
4223 
4224 	/* Clear mbuf payload */
4225 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4226 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4227 
4228 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4229 	/* Append data which is padded to a multiple of */
4230 	/* the algorithms block size */
4231 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4232 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4233 				plaintext_pad_len);
4234 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4235 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4236 
4237 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4238 
4239 	/* Create SNOW 3G operation */
4240 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4241 					tdata->cipher_iv.len,
4242 					tdata->validCipherLenInBits.len,
4243 					0);
4244 	if (retval < 0)
4245 		return retval;
4246 
4247 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4248 						ut_params->op);
4249 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4250 
4251 	ut_params->obuf = ut_params->op->sym->m_dst;
4252 	if (ut_params->obuf)
4253 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4254 	else
4255 		ciphertext = plaintext;
4256 
4257 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4258 
4259 	/* Validate obuf */
4260 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4261 		ciphertext,
4262 		tdata->ciphertext.data,
4263 		tdata->validDataLenInBits.len,
4264 		"SNOW 3G Ciphertext data not as expected");
4265 	return 0;
4266 }
4267 
4268 static int
4269 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4270 {
4271 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4272 	struct crypto_unittest_params *ut_params = &unittest_params;
4273 
4274 	int retval;
4275 	unsigned int plaintext_pad_len;
4276 	unsigned int plaintext_len;
4277 	uint8_t buffer[10000];
4278 	const uint8_t *ciphertext;
4279 
4280 	struct rte_cryptodev_info dev_info;
4281 
4282 	/* Verify the capabilities */
4283 	struct rte_cryptodev_sym_capability_idx cap_idx;
4284 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4285 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4286 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4287 			&cap_idx) == NULL)
4288 		return TEST_SKIPPED;
4289 
4290 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4291 		return TEST_SKIPPED;
4292 
4293 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4294 		return TEST_SKIPPED;
4295 
4296 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4297 
4298 	uint64_t feat_flags = dev_info.feature_flags;
4299 
4300 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4301 		printf("Device doesn't support out-of-place scatter-gather "
4302 				"in both input and output mbufs. "
4303 				"Test Skipped.\n");
4304 		return TEST_SKIPPED;
4305 	}
4306 
4307 	/* Create SNOW 3G session */
4308 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4309 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4310 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4311 					tdata->key.data, tdata->key.len,
4312 					tdata->cipher_iv.len);
4313 	if (retval < 0)
4314 		return retval;
4315 
4316 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4317 	/* Append data which is padded to a multiple of */
4318 	/* the algorithms block size */
4319 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4320 
4321 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4322 			plaintext_pad_len, 10, 0);
4323 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4324 			plaintext_pad_len, 3, 0);
4325 
4326 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4327 			"Failed to allocate input buffer in mempool");
4328 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4329 			"Failed to allocate output buffer in mempool");
4330 
4331 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4332 
4333 	/* Create SNOW 3G operation */
4334 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4335 					tdata->cipher_iv.len,
4336 					tdata->validCipherLenInBits.len,
4337 					0);
4338 	if (retval < 0)
4339 		return retval;
4340 
4341 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4342 						ut_params->op);
4343 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4344 
4345 	ut_params->obuf = ut_params->op->sym->m_dst;
4346 	if (ut_params->obuf)
4347 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4348 				plaintext_len, buffer);
4349 	else
4350 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4351 				plaintext_len, buffer);
4352 
4353 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4354 
4355 	/* Validate obuf */
4356 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4357 		ciphertext,
4358 		tdata->ciphertext.data,
4359 		tdata->validDataLenInBits.len,
4360 		"SNOW 3G Ciphertext data not as expected");
4361 
4362 	return 0;
4363 }
4364 
4365 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4366 static void
4367 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4368 {
4369 	uint8_t curr_byte, prev_byte;
4370 	uint32_t length_in_bytes = ceil_byte_length(length + offset);
4371 	uint8_t lower_byte_mask = (1 << offset) - 1;
4372 	unsigned i;
4373 
4374 	prev_byte = buffer[0];
4375 	buffer[0] >>= offset;
4376 
4377 	for (i = 1; i < length_in_bytes; i++) {
4378 		curr_byte = buffer[i];
4379 		buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4380 				(curr_byte >> offset);
4381 		prev_byte = curr_byte;
4382 	}
4383 }
4384 
4385 static int
4386 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4387 {
4388 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4389 	struct crypto_unittest_params *ut_params = &unittest_params;
4390 	uint8_t *plaintext, *ciphertext;
4391 	int retval;
4392 	uint32_t plaintext_len;
4393 	uint32_t plaintext_pad_len;
4394 	uint8_t extra_offset = 4;
4395 	uint8_t *expected_ciphertext_shifted;
4396 	struct rte_cryptodev_info dev_info;
4397 
4398 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4399 	uint64_t feat_flags = dev_info.feature_flags;
4400 
4401 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4402 			((tdata->validDataLenInBits.len % 8) != 0)) {
4403 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4404 		return TEST_SKIPPED;
4405 	}
4406 
4407 	/* Verify the capabilities */
4408 	struct rte_cryptodev_sym_capability_idx cap_idx;
4409 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4410 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4411 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4412 			&cap_idx) == NULL)
4413 		return TEST_SKIPPED;
4414 
4415 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4416 		return TEST_SKIPPED;
4417 
4418 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4419 		return TEST_SKIPPED;
4420 
4421 	/* Create SNOW 3G session */
4422 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4423 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4424 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4425 					tdata->key.data, tdata->key.len,
4426 					tdata->cipher_iv.len);
4427 	if (retval < 0)
4428 		return retval;
4429 
4430 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4431 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4432 
4433 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4434 			"Failed to allocate input buffer in mempool");
4435 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4436 			"Failed to allocate output buffer in mempool");
4437 
4438 	/* Clear mbuf payload */
4439 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4440 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4441 
4442 	plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4443 	/*
4444 	 * Append data which is padded to a
4445 	 * multiple of the algorithms block size
4446 	 */
4447 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4448 
4449 	plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4450 						plaintext_pad_len);
4451 
4452 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4453 
4454 	memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4455 	buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4456 
4457 #ifdef RTE_APP_TEST_DEBUG
4458 	rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4459 #endif
4460 	/* Create SNOW 3G operation */
4461 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4462 					tdata->cipher_iv.len,
4463 					tdata->validCipherLenInBits.len,
4464 					extra_offset);
4465 	if (retval < 0)
4466 		return retval;
4467 
4468 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4469 						ut_params->op);
4470 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4471 
4472 	ut_params->obuf = ut_params->op->sym->m_dst;
4473 	if (ut_params->obuf)
4474 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4475 	else
4476 		ciphertext = plaintext;
4477 
4478 #ifdef RTE_APP_TEST_DEBUG
4479 	rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4480 #endif
4481 
4482 	expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4483 
4484 	TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4485 			"failed to reserve memory for ciphertext shifted\n");
4486 
4487 	memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4488 			ceil_byte_length(tdata->ciphertext.len));
4489 	buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4490 			extra_offset);
4491 	/* Validate obuf */
4492 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4493 		ciphertext,
4494 		expected_ciphertext_shifted,
4495 		tdata->validDataLenInBits.len,
4496 		extra_offset,
4497 		"SNOW 3G Ciphertext data not as expected");
4498 	return 0;
4499 }
4500 
4501 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4502 {
4503 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4504 	struct crypto_unittest_params *ut_params = &unittest_params;
4505 
4506 	int retval;
4507 
4508 	uint8_t *plaintext, *ciphertext;
4509 	unsigned ciphertext_pad_len;
4510 	unsigned ciphertext_len;
4511 	struct rte_cryptodev_info dev_info;
4512 
4513 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4514 	uint64_t feat_flags = dev_info.feature_flags;
4515 
4516 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4517 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4518 		printf("Device doesn't support RAW data-path APIs.\n");
4519 		return TEST_SKIPPED;
4520 	}
4521 
4522 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4523 		return TEST_SKIPPED;
4524 
4525 	/* Verify the capabilities */
4526 	struct rte_cryptodev_sym_capability_idx cap_idx;
4527 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4528 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4529 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4530 			&cap_idx) == NULL)
4531 		return TEST_SKIPPED;
4532 
4533 	/* Create SNOW 3G session */
4534 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4535 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4536 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4537 					tdata->key.data, tdata->key.len,
4538 					tdata->cipher_iv.len);
4539 	if (retval < 0)
4540 		return retval;
4541 
4542 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4543 
4544 	/* Clear mbuf payload */
4545 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4546 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4547 
4548 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4549 	/* Append data which is padded to a multiple of */
4550 	/* the algorithms block size */
4551 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4552 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4553 				ciphertext_pad_len);
4554 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4555 
4556 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4557 
4558 	/* Create SNOW 3G operation */
4559 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4560 					tdata->cipher_iv.len,
4561 					tdata->validCipherLenInBits.len,
4562 					tdata->cipher.offset_bits);
4563 	if (retval < 0)
4564 		return retval;
4565 
4566 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4567 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4568 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4569 	else
4570 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4571 						ut_params->op);
4572 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4573 	ut_params->obuf = ut_params->op->sym->m_dst;
4574 	if (ut_params->obuf)
4575 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4576 	else
4577 		plaintext = ciphertext;
4578 
4579 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4580 
4581 	/* Validate obuf */
4582 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4583 				tdata->plaintext.data,
4584 				tdata->validDataLenInBits.len,
4585 				"SNOW 3G Plaintext data not as expected");
4586 	return 0;
4587 }
4588 
4589 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4590 {
4591 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4592 	struct crypto_unittest_params *ut_params = &unittest_params;
4593 
4594 	int retval;
4595 
4596 	uint8_t *plaintext, *ciphertext;
4597 	unsigned ciphertext_pad_len;
4598 	unsigned ciphertext_len;
4599 
4600 	/* Verify the capabilities */
4601 	struct rte_cryptodev_sym_capability_idx cap_idx;
4602 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4603 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4604 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4605 			&cap_idx) == NULL)
4606 		return TEST_SKIPPED;
4607 
4608 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4609 		return TEST_SKIPPED;
4610 
4611 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4612 		return TEST_SKIPPED;
4613 
4614 	/* Create SNOW 3G session */
4615 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4616 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4617 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4618 					tdata->key.data, tdata->key.len,
4619 					tdata->cipher_iv.len);
4620 	if (retval < 0)
4621 		return retval;
4622 
4623 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4624 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4625 
4626 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4627 			"Failed to allocate input buffer");
4628 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4629 			"Failed to allocate output buffer");
4630 
4631 	/* Clear mbuf payload */
4632 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4633 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4634 
4635 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4636 		       rte_pktmbuf_tailroom(ut_params->obuf));
4637 
4638 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4639 	/* Append data which is padded to a multiple of */
4640 	/* the algorithms block size */
4641 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4642 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4643 				ciphertext_pad_len);
4644 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4645 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4646 
4647 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4648 
4649 	/* Create SNOW 3G operation */
4650 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4651 					tdata->cipher_iv.len,
4652 					tdata->validCipherLenInBits.len,
4653 					0);
4654 	if (retval < 0)
4655 		return retval;
4656 
4657 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4658 						ut_params->op);
4659 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4660 	ut_params->obuf = ut_params->op->sym->m_dst;
4661 	if (ut_params->obuf)
4662 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4663 	else
4664 		plaintext = ciphertext;
4665 
4666 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4667 
4668 	/* Validate obuf */
4669 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4670 				tdata->plaintext.data,
4671 				tdata->validDataLenInBits.len,
4672 				"SNOW 3G Plaintext data not as expected");
4673 	return 0;
4674 }
4675 
4676 static int
4677 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4678 {
4679 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4680 	struct crypto_unittest_params *ut_params = &unittest_params;
4681 
4682 	int retval;
4683 
4684 	uint8_t *plaintext, *ciphertext;
4685 	unsigned int plaintext_pad_len;
4686 	unsigned int plaintext_len;
4687 
4688 	struct rte_cryptodev_info dev_info;
4689 	struct rte_cryptodev_sym_capability_idx cap_idx;
4690 
4691 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4692 	uint64_t feat_flags = dev_info.feature_flags;
4693 
4694 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4695 			((tdata->validAuthLenInBits.len % 8 != 0) ||
4696 			(tdata->validDataLenInBits.len % 8 != 0))) {
4697 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4698 		return TEST_SKIPPED;
4699 	}
4700 
4701 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4702 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4703 		printf("Device doesn't support RAW data-path APIs.\n");
4704 		return TEST_SKIPPED;
4705 	}
4706 
4707 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4708 		return TEST_SKIPPED;
4709 
4710 	/* Check if device supports ZUC EEA3 */
4711 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4712 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4713 
4714 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4715 			&cap_idx) == NULL)
4716 		return TEST_SKIPPED;
4717 
4718 	/* Check if device supports ZUC EIA3 */
4719 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4720 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4721 
4722 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4723 			&cap_idx) == NULL)
4724 		return TEST_SKIPPED;
4725 
4726 	/* Create ZUC session */
4727 	retval = create_zuc_cipher_auth_encrypt_generate_session(
4728 			ts_params->valid_devs[0],
4729 			tdata);
4730 	if (retval != 0)
4731 		return retval;
4732 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4733 
4734 	/* clear mbuf payload */
4735 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4736 			rte_pktmbuf_tailroom(ut_params->ibuf));
4737 
4738 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4739 	/* Append data which is padded to a multiple of */
4740 	/* the algorithms block size */
4741 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4742 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4743 				plaintext_pad_len);
4744 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4745 
4746 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4747 
4748 	/* Create ZUC operation */
4749 	retval = create_zuc_cipher_hash_generate_operation(tdata);
4750 	if (retval < 0)
4751 		return retval;
4752 
4753 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4754 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4755 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4756 	else
4757 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4758 			ut_params->op);
4759 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4760 	ut_params->obuf = ut_params->op->sym->m_src;
4761 	if (ut_params->obuf)
4762 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4763 	else
4764 		ciphertext = plaintext;
4765 
4766 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4767 	/* Validate obuf */
4768 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4769 			ciphertext,
4770 			tdata->ciphertext.data,
4771 			tdata->validDataLenInBits.len,
4772 			"ZUC Ciphertext data not as expected");
4773 
4774 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4775 	    + plaintext_pad_len;
4776 
4777 	/* Validate obuf */
4778 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4779 			ut_params->digest,
4780 			tdata->digest.data,
4781 			4,
4782 			"ZUC Generated auth tag not as expected");
4783 	return 0;
4784 }
4785 
4786 static int
4787 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4788 {
4789 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4790 	struct crypto_unittest_params *ut_params = &unittest_params;
4791 
4792 	int retval;
4793 
4794 	uint8_t *plaintext, *ciphertext;
4795 	unsigned plaintext_pad_len;
4796 	unsigned plaintext_len;
4797 	struct rte_cryptodev_info dev_info;
4798 
4799 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4800 	uint64_t feat_flags = dev_info.feature_flags;
4801 
4802 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4803 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4804 		printf("Device doesn't support RAW data-path APIs.\n");
4805 		return TEST_SKIPPED;
4806 	}
4807 
4808 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4809 		return TEST_SKIPPED;
4810 
4811 	/* Verify the capabilities */
4812 	struct rte_cryptodev_sym_capability_idx cap_idx;
4813 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4814 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4815 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4816 			&cap_idx) == NULL)
4817 		return TEST_SKIPPED;
4818 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4819 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4820 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4821 			&cap_idx) == NULL)
4822 		return TEST_SKIPPED;
4823 
4824 	/* Create SNOW 3G session */
4825 	retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4826 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4827 			RTE_CRYPTO_AUTH_OP_GENERATE,
4828 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4829 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4830 			tdata->key.data, tdata->key.len,
4831 			tdata->auth_iv.len, tdata->digest.len,
4832 			tdata->cipher_iv.len);
4833 	if (retval != 0)
4834 		return retval;
4835 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4836 
4837 	/* clear mbuf payload */
4838 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4839 			rte_pktmbuf_tailroom(ut_params->ibuf));
4840 
4841 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4842 	/* Append data which is padded to a multiple of */
4843 	/* the algorithms block size */
4844 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4845 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4846 				plaintext_pad_len);
4847 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4848 
4849 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4850 
4851 	/* Create SNOW 3G operation */
4852 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4853 			tdata->digest.len, tdata->auth_iv.data,
4854 			tdata->auth_iv.len,
4855 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4856 			tdata->cipher_iv.data, tdata->cipher_iv.len,
4857 			tdata->validCipherLenInBits.len,
4858 			0,
4859 			tdata->validAuthLenInBits.len,
4860 			0
4861 			);
4862 	if (retval < 0)
4863 		return retval;
4864 
4865 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4866 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4867 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4868 	else
4869 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4870 			ut_params->op);
4871 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4872 	ut_params->obuf = ut_params->op->sym->m_src;
4873 	if (ut_params->obuf)
4874 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4875 	else
4876 		ciphertext = plaintext;
4877 
4878 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4879 	/* Validate obuf */
4880 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4881 			ciphertext,
4882 			tdata->ciphertext.data,
4883 			tdata->validDataLenInBits.len,
4884 			"SNOW 3G Ciphertext data not as expected");
4885 
4886 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4887 	    + plaintext_pad_len;
4888 
4889 	/* Validate obuf */
4890 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4891 			ut_params->digest,
4892 			tdata->digest.data,
4893 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4894 			"SNOW 3G Generated auth tag not as expected");
4895 	return 0;
4896 }
4897 
4898 static int
4899 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4900 	uint8_t op_mode, uint8_t verify)
4901 {
4902 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4903 	struct crypto_unittest_params *ut_params = &unittest_params;
4904 
4905 	int retval;
4906 
4907 	uint8_t *plaintext = NULL, *ciphertext = NULL;
4908 	unsigned int plaintext_pad_len;
4909 	unsigned int plaintext_len;
4910 	unsigned int ciphertext_pad_len;
4911 	unsigned int ciphertext_len;
4912 
4913 	struct rte_cryptodev_info dev_info;
4914 
4915 	/* Verify the capabilities */
4916 	struct rte_cryptodev_sym_capability_idx cap_idx;
4917 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4918 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4919 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4920 			&cap_idx) == NULL)
4921 		return TEST_SKIPPED;
4922 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4923 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4924 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4925 			&cap_idx) == NULL)
4926 		return TEST_SKIPPED;
4927 
4928 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4929 		return TEST_SKIPPED;
4930 
4931 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4932 
4933 	uint64_t feat_flags = dev_info.feature_flags;
4934 
4935 	if (op_mode == OUT_OF_PLACE) {
4936 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4937 			printf("Device doesn't support digest encrypted.\n");
4938 			return TEST_SKIPPED;
4939 		}
4940 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4941 			return TEST_SKIPPED;
4942 	}
4943 
4944 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4945 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4946 		printf("Device doesn't support RAW data-path APIs.\n");
4947 		return TEST_SKIPPED;
4948 	}
4949 
4950 	/* Create SNOW 3G session */
4951 	retval = create_wireless_algo_auth_cipher_session(
4952 			ts_params->valid_devs[0],
4953 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4954 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4955 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4956 					: RTE_CRYPTO_AUTH_OP_GENERATE),
4957 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4958 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4959 			tdata->key.data, tdata->key.len,
4960 			tdata->auth_iv.len, tdata->digest.len,
4961 			tdata->cipher_iv.len);
4962 	if (retval != 0)
4963 		return retval;
4964 
4965 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4966 	if (op_mode == OUT_OF_PLACE)
4967 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4968 
4969 	/* clear mbuf payload */
4970 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4971 		rte_pktmbuf_tailroom(ut_params->ibuf));
4972 	if (op_mode == OUT_OF_PLACE)
4973 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4974 			rte_pktmbuf_tailroom(ut_params->obuf));
4975 
4976 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4977 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4978 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4979 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4980 
4981 	if (verify) {
4982 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4983 					ciphertext_pad_len);
4984 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4985 		if (op_mode == OUT_OF_PLACE)
4986 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4987 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4988 			ciphertext_len);
4989 	} else {
4990 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4991 					plaintext_pad_len);
4992 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4993 		if (op_mode == OUT_OF_PLACE)
4994 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4995 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4996 	}
4997 
4998 	/* Create SNOW 3G operation */
4999 	retval = create_wireless_algo_auth_cipher_operation(
5000 		tdata->digest.data, tdata->digest.len,
5001 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5002 		tdata->auth_iv.data, tdata->auth_iv.len,
5003 		(tdata->digest.offset_bytes == 0 ?
5004 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5005 			: tdata->digest.offset_bytes),
5006 		tdata->validCipherLenInBits.len,
5007 		tdata->cipher.offset_bits,
5008 		tdata->validAuthLenInBits.len,
5009 		tdata->auth.offset_bits,
5010 		op_mode, 0, verify);
5011 
5012 	if (retval < 0)
5013 		return retval;
5014 
5015 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5016 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5017 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5018 	else
5019 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5020 			ut_params->op);
5021 
5022 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5023 
5024 	ut_params->obuf = (op_mode == IN_PLACE ?
5025 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5026 
5027 	if (verify) {
5028 		if (ut_params->obuf)
5029 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5030 							uint8_t *);
5031 		else
5032 			plaintext = ciphertext +
5033 				(tdata->cipher.offset_bits >> 3);
5034 
5035 		debug_hexdump(stdout, "plaintext:", plaintext,
5036 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5037 		debug_hexdump(stdout, "plaintext expected:",
5038 			tdata->plaintext.data,
5039 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5040 	} else {
5041 		if (ut_params->obuf)
5042 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5043 							uint8_t *);
5044 		else
5045 			ciphertext = plaintext;
5046 
5047 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5048 			ciphertext_len);
5049 		debug_hexdump(stdout, "ciphertext expected:",
5050 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5051 
5052 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5053 			+ (tdata->digest.offset_bytes == 0 ?
5054 		plaintext_pad_len : tdata->digest.offset_bytes);
5055 
5056 		debug_hexdump(stdout, "digest:", ut_params->digest,
5057 			tdata->digest.len);
5058 		debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5059 				tdata->digest.len);
5060 	}
5061 
5062 	/* Validate obuf */
5063 	if (verify) {
5064 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5065 			plaintext,
5066 			tdata->plaintext.data,
5067 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5068 			 (tdata->digest.len << 3)),
5069 			tdata->cipher.offset_bits,
5070 			"SNOW 3G Plaintext data not as expected");
5071 	} else {
5072 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5073 			ciphertext,
5074 			tdata->ciphertext.data,
5075 			(tdata->validDataLenInBits.len -
5076 			 tdata->cipher.offset_bits),
5077 			tdata->cipher.offset_bits,
5078 			"SNOW 3G Ciphertext data not as expected");
5079 
5080 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5081 			ut_params->digest,
5082 			tdata->digest.data,
5083 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5084 			"SNOW 3G Generated auth tag not as expected");
5085 	}
5086 	return 0;
5087 }
5088 
5089 static int
5090 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5091 	uint8_t op_mode, uint8_t verify)
5092 {
5093 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5094 	struct crypto_unittest_params *ut_params = &unittest_params;
5095 
5096 	int retval;
5097 
5098 	const uint8_t *plaintext = NULL;
5099 	const uint8_t *ciphertext = NULL;
5100 	const uint8_t *digest = NULL;
5101 	unsigned int plaintext_pad_len;
5102 	unsigned int plaintext_len;
5103 	unsigned int ciphertext_pad_len;
5104 	unsigned int ciphertext_len;
5105 	uint8_t buffer[10000];
5106 	uint8_t digest_buffer[10000];
5107 
5108 	struct rte_cryptodev_info dev_info;
5109 
5110 	/* Verify the capabilities */
5111 	struct rte_cryptodev_sym_capability_idx cap_idx;
5112 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5113 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5114 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5115 			&cap_idx) == NULL)
5116 		return TEST_SKIPPED;
5117 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5118 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5119 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5120 			&cap_idx) == NULL)
5121 		return TEST_SKIPPED;
5122 
5123 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5124 		return TEST_SKIPPED;
5125 
5126 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5127 
5128 	uint64_t feat_flags = dev_info.feature_flags;
5129 
5130 	if (op_mode == IN_PLACE) {
5131 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5132 			printf("Device doesn't support in-place scatter-gather "
5133 					"in both input and output mbufs.\n");
5134 			return TEST_SKIPPED;
5135 		}
5136 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5137 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5138 			printf("Device doesn't support RAW data-path APIs.\n");
5139 			return TEST_SKIPPED;
5140 		}
5141 	} else {
5142 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5143 			return TEST_SKIPPED;
5144 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5145 			printf("Device doesn't support out-of-place scatter-gather "
5146 					"in both input and output mbufs.\n");
5147 			return TEST_SKIPPED;
5148 		}
5149 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5150 			printf("Device doesn't support digest encrypted.\n");
5151 			return TEST_SKIPPED;
5152 		}
5153 	}
5154 
5155 	/* Create SNOW 3G session */
5156 	retval = create_wireless_algo_auth_cipher_session(
5157 			ts_params->valid_devs[0],
5158 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5159 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5160 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5161 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5162 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5163 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5164 			tdata->key.data, tdata->key.len,
5165 			tdata->auth_iv.len, tdata->digest.len,
5166 			tdata->cipher_iv.len);
5167 
5168 	if (retval != 0)
5169 		return retval;
5170 
5171 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5172 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5173 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5174 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5175 
5176 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5177 			plaintext_pad_len, 15, 0);
5178 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5179 			"Failed to allocate input buffer in mempool");
5180 
5181 	if (op_mode == OUT_OF_PLACE) {
5182 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5183 				plaintext_pad_len, 15, 0);
5184 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5185 				"Failed to allocate output buffer in mempool");
5186 	}
5187 
5188 	if (verify) {
5189 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5190 			tdata->ciphertext.data);
5191 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5192 					ciphertext_len, buffer);
5193 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5194 			ciphertext_len);
5195 	} else {
5196 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5197 			tdata->plaintext.data);
5198 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5199 					plaintext_len, buffer);
5200 		debug_hexdump(stdout, "plaintext:", plaintext,
5201 			plaintext_len);
5202 	}
5203 	memset(buffer, 0, sizeof(buffer));
5204 
5205 	/* Create SNOW 3G operation */
5206 	retval = create_wireless_algo_auth_cipher_operation(
5207 		tdata->digest.data, tdata->digest.len,
5208 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5209 		tdata->auth_iv.data, tdata->auth_iv.len,
5210 		(tdata->digest.offset_bytes == 0 ?
5211 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5212 			: tdata->digest.offset_bytes),
5213 		tdata->validCipherLenInBits.len,
5214 		tdata->cipher.offset_bits,
5215 		tdata->validAuthLenInBits.len,
5216 		tdata->auth.offset_bits,
5217 		op_mode, 1, verify);
5218 
5219 	if (retval < 0)
5220 		return retval;
5221 
5222 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5223 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5224 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5225 	else
5226 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5227 			ut_params->op);
5228 
5229 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5230 
5231 	ut_params->obuf = (op_mode == IN_PLACE ?
5232 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5233 
5234 	if (verify) {
5235 		if (ut_params->obuf)
5236 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5237 					plaintext_len, buffer);
5238 		else
5239 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5240 					plaintext_len, buffer);
5241 
5242 		debug_hexdump(stdout, "plaintext:", plaintext,
5243 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5244 		debug_hexdump(stdout, "plaintext expected:",
5245 			tdata->plaintext.data,
5246 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5247 	} else {
5248 		if (ut_params->obuf)
5249 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5250 					ciphertext_len, buffer);
5251 		else
5252 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5253 					ciphertext_len, buffer);
5254 
5255 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5256 			ciphertext_len);
5257 		debug_hexdump(stdout, "ciphertext expected:",
5258 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5259 
5260 		if (ut_params->obuf)
5261 			digest = rte_pktmbuf_read(ut_params->obuf,
5262 				(tdata->digest.offset_bytes == 0 ?
5263 				plaintext_pad_len : tdata->digest.offset_bytes),
5264 				tdata->digest.len, digest_buffer);
5265 		else
5266 			digest = rte_pktmbuf_read(ut_params->ibuf,
5267 				(tdata->digest.offset_bytes == 0 ?
5268 				plaintext_pad_len : tdata->digest.offset_bytes),
5269 				tdata->digest.len, digest_buffer);
5270 
5271 		debug_hexdump(stdout, "digest:", digest,
5272 			tdata->digest.len);
5273 		debug_hexdump(stdout, "digest expected:",
5274 			tdata->digest.data, tdata->digest.len);
5275 	}
5276 
5277 	/* Validate obuf */
5278 	if (verify) {
5279 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5280 			plaintext,
5281 			tdata->plaintext.data,
5282 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5283 			 (tdata->digest.len << 3)),
5284 			tdata->cipher.offset_bits,
5285 			"SNOW 3G Plaintext data not as expected");
5286 	} else {
5287 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5288 			ciphertext,
5289 			tdata->ciphertext.data,
5290 			(tdata->validDataLenInBits.len -
5291 			 tdata->cipher.offset_bits),
5292 			tdata->cipher.offset_bits,
5293 			"SNOW 3G Ciphertext data not as expected");
5294 
5295 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5296 			digest,
5297 			tdata->digest.data,
5298 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5299 			"SNOW 3G Generated auth tag not as expected");
5300 	}
5301 	return 0;
5302 }
5303 
5304 static int
5305 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5306 	uint8_t op_mode, uint8_t verify)
5307 {
5308 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5309 	struct crypto_unittest_params *ut_params = &unittest_params;
5310 
5311 	int retval;
5312 
5313 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5314 	unsigned int plaintext_pad_len;
5315 	unsigned int plaintext_len;
5316 	unsigned int ciphertext_pad_len;
5317 	unsigned int ciphertext_len;
5318 
5319 	struct rte_cryptodev_info dev_info;
5320 
5321 	/* Verify the capabilities */
5322 	struct rte_cryptodev_sym_capability_idx cap_idx;
5323 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5324 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5325 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5326 			&cap_idx) == NULL)
5327 		return TEST_SKIPPED;
5328 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5329 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5330 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5331 			&cap_idx) == NULL)
5332 		return TEST_SKIPPED;
5333 
5334 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5335 
5336 	uint64_t feat_flags = dev_info.feature_flags;
5337 
5338 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5339 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5340 		printf("Device doesn't support RAW data-path APIs.\n");
5341 		return TEST_SKIPPED;
5342 	}
5343 
5344 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5345 		return TEST_SKIPPED;
5346 
5347 	if (op_mode == OUT_OF_PLACE) {
5348 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5349 			return TEST_SKIPPED;
5350 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5351 			printf("Device doesn't support digest encrypted.\n");
5352 			return TEST_SKIPPED;
5353 		}
5354 	}
5355 
5356 	/* Create KASUMI session */
5357 	retval = create_wireless_algo_auth_cipher_session(
5358 			ts_params->valid_devs[0],
5359 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5360 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5361 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5362 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5363 			RTE_CRYPTO_AUTH_KASUMI_F9,
5364 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5365 			tdata->key.data, tdata->key.len,
5366 			0, tdata->digest.len,
5367 			tdata->cipher_iv.len);
5368 
5369 	if (retval != 0)
5370 		return retval;
5371 
5372 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5373 	if (op_mode == OUT_OF_PLACE)
5374 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5375 
5376 	/* clear mbuf payload */
5377 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5378 		rte_pktmbuf_tailroom(ut_params->ibuf));
5379 	if (op_mode == OUT_OF_PLACE)
5380 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5381 			rte_pktmbuf_tailroom(ut_params->obuf));
5382 
5383 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5384 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5385 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5386 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5387 
5388 	if (verify) {
5389 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5390 					ciphertext_pad_len);
5391 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5392 		if (op_mode == OUT_OF_PLACE)
5393 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5394 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5395 			ciphertext_len);
5396 	} else {
5397 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5398 					plaintext_pad_len);
5399 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5400 		if (op_mode == OUT_OF_PLACE)
5401 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5402 		debug_hexdump(stdout, "plaintext:", plaintext,
5403 			plaintext_len);
5404 	}
5405 
5406 	/* Create KASUMI operation */
5407 	retval = create_wireless_algo_auth_cipher_operation(
5408 		tdata->digest.data, tdata->digest.len,
5409 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5410 		NULL, 0,
5411 		(tdata->digest.offset_bytes == 0 ?
5412 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5413 			: tdata->digest.offset_bytes),
5414 		tdata->validCipherLenInBits.len,
5415 		tdata->validCipherOffsetInBits.len,
5416 		tdata->validAuthLenInBits.len,
5417 		0,
5418 		op_mode, 0, verify);
5419 
5420 	if (retval < 0)
5421 		return retval;
5422 
5423 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5424 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5425 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5426 	else
5427 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5428 			ut_params->op);
5429 
5430 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5431 
5432 	ut_params->obuf = (op_mode == IN_PLACE ?
5433 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5434 
5435 
5436 	if (verify) {
5437 		if (ut_params->obuf)
5438 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5439 							uint8_t *);
5440 		else
5441 			plaintext = ciphertext;
5442 
5443 		debug_hexdump(stdout, "plaintext:", plaintext,
5444 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5445 		debug_hexdump(stdout, "plaintext expected:",
5446 			tdata->plaintext.data,
5447 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5448 	} else {
5449 		if (ut_params->obuf)
5450 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5451 							uint8_t *);
5452 		else
5453 			ciphertext = plaintext;
5454 
5455 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5456 			ciphertext_len);
5457 		debug_hexdump(stdout, "ciphertext expected:",
5458 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5459 
5460 		ut_params->digest = rte_pktmbuf_mtod(
5461 			ut_params->obuf, uint8_t *) +
5462 			(tdata->digest.offset_bytes == 0 ?
5463 			plaintext_pad_len : tdata->digest.offset_bytes);
5464 
5465 		debug_hexdump(stdout, "digest:", ut_params->digest,
5466 			tdata->digest.len);
5467 		debug_hexdump(stdout, "digest expected:",
5468 			tdata->digest.data, tdata->digest.len);
5469 	}
5470 
5471 	/* Validate obuf */
5472 	if (verify) {
5473 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5474 			plaintext,
5475 			tdata->plaintext.data,
5476 			tdata->plaintext.len >> 3,
5477 			"KASUMI Plaintext data not as expected");
5478 	} else {
5479 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5480 			ciphertext,
5481 			tdata->ciphertext.data,
5482 			tdata->ciphertext.len >> 3,
5483 			"KASUMI Ciphertext data not as expected");
5484 
5485 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5486 			ut_params->digest,
5487 			tdata->digest.data,
5488 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5489 			"KASUMI Generated auth tag not as expected");
5490 	}
5491 	return 0;
5492 }
5493 
5494 static int
5495 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5496 	uint8_t op_mode, uint8_t verify)
5497 {
5498 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5499 	struct crypto_unittest_params *ut_params = &unittest_params;
5500 
5501 	int retval;
5502 
5503 	const uint8_t *plaintext = NULL;
5504 	const uint8_t *ciphertext = NULL;
5505 	const uint8_t *digest = NULL;
5506 	unsigned int plaintext_pad_len;
5507 	unsigned int plaintext_len;
5508 	unsigned int ciphertext_pad_len;
5509 	unsigned int ciphertext_len;
5510 	uint8_t buffer[10000];
5511 	uint8_t digest_buffer[10000];
5512 
5513 	struct rte_cryptodev_info dev_info;
5514 
5515 	/* Verify the capabilities */
5516 	struct rte_cryptodev_sym_capability_idx cap_idx;
5517 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5518 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5519 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5520 			&cap_idx) == NULL)
5521 		return TEST_SKIPPED;
5522 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5523 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5524 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5525 			&cap_idx) == NULL)
5526 		return TEST_SKIPPED;
5527 
5528 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5529 		return TEST_SKIPPED;
5530 
5531 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5532 
5533 	uint64_t feat_flags = dev_info.feature_flags;
5534 
5535 	if (op_mode == IN_PLACE) {
5536 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5537 			printf("Device doesn't support in-place scatter-gather "
5538 					"in both input and output mbufs.\n");
5539 			return TEST_SKIPPED;
5540 		}
5541 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5542 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5543 			printf("Device doesn't support RAW data-path APIs.\n");
5544 			return TEST_SKIPPED;
5545 		}
5546 	} else {
5547 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5548 			return TEST_SKIPPED;
5549 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5550 			printf("Device doesn't support out-of-place scatter-gather "
5551 					"in both input and output mbufs.\n");
5552 			return TEST_SKIPPED;
5553 		}
5554 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5555 			printf("Device doesn't support digest encrypted.\n");
5556 			return TEST_SKIPPED;
5557 		}
5558 	}
5559 
5560 	/* Create KASUMI session */
5561 	retval = create_wireless_algo_auth_cipher_session(
5562 			ts_params->valid_devs[0],
5563 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5564 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5565 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5566 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5567 			RTE_CRYPTO_AUTH_KASUMI_F9,
5568 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5569 			tdata->key.data, tdata->key.len,
5570 			0, tdata->digest.len,
5571 			tdata->cipher_iv.len);
5572 
5573 	if (retval != 0)
5574 		return retval;
5575 
5576 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5577 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5578 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5579 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5580 
5581 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5582 			plaintext_pad_len, 15, 0);
5583 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5584 			"Failed to allocate input buffer in mempool");
5585 
5586 	if (op_mode == OUT_OF_PLACE) {
5587 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5588 				plaintext_pad_len, 15, 0);
5589 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5590 				"Failed to allocate output buffer in mempool");
5591 	}
5592 
5593 	if (verify) {
5594 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5595 			tdata->ciphertext.data);
5596 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5597 					ciphertext_len, buffer);
5598 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5599 			ciphertext_len);
5600 	} else {
5601 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5602 			tdata->plaintext.data);
5603 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5604 					plaintext_len, buffer);
5605 		debug_hexdump(stdout, "plaintext:", plaintext,
5606 			plaintext_len);
5607 	}
5608 	memset(buffer, 0, sizeof(buffer));
5609 
5610 	/* Create KASUMI operation */
5611 	retval = create_wireless_algo_auth_cipher_operation(
5612 		tdata->digest.data, tdata->digest.len,
5613 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5614 		NULL, 0,
5615 		(tdata->digest.offset_bytes == 0 ?
5616 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5617 			: tdata->digest.offset_bytes),
5618 		tdata->validCipherLenInBits.len,
5619 		tdata->validCipherOffsetInBits.len,
5620 		tdata->validAuthLenInBits.len,
5621 		0,
5622 		op_mode, 1, verify);
5623 
5624 	if (retval < 0)
5625 		return retval;
5626 
5627 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5628 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5629 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5630 	else
5631 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5632 			ut_params->op);
5633 
5634 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5635 
5636 	ut_params->obuf = (op_mode == IN_PLACE ?
5637 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5638 
5639 	if (verify) {
5640 		if (ut_params->obuf)
5641 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5642 					plaintext_len, buffer);
5643 		else
5644 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5645 					plaintext_len, buffer);
5646 
5647 		debug_hexdump(stdout, "plaintext:", plaintext,
5648 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5649 		debug_hexdump(stdout, "plaintext expected:",
5650 			tdata->plaintext.data,
5651 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5652 	} else {
5653 		if (ut_params->obuf)
5654 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5655 					ciphertext_len, buffer);
5656 		else
5657 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5658 					ciphertext_len, buffer);
5659 
5660 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5661 			ciphertext_len);
5662 		debug_hexdump(stdout, "ciphertext expected:",
5663 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5664 
5665 		if (ut_params->obuf)
5666 			digest = rte_pktmbuf_read(ut_params->obuf,
5667 				(tdata->digest.offset_bytes == 0 ?
5668 				plaintext_pad_len : tdata->digest.offset_bytes),
5669 				tdata->digest.len, digest_buffer);
5670 		else
5671 			digest = rte_pktmbuf_read(ut_params->ibuf,
5672 				(tdata->digest.offset_bytes == 0 ?
5673 				plaintext_pad_len : tdata->digest.offset_bytes),
5674 				tdata->digest.len, digest_buffer);
5675 
5676 		debug_hexdump(stdout, "digest:", digest,
5677 			tdata->digest.len);
5678 		debug_hexdump(stdout, "digest expected:",
5679 			tdata->digest.data, tdata->digest.len);
5680 	}
5681 
5682 	/* Validate obuf */
5683 	if (verify) {
5684 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5685 			plaintext,
5686 			tdata->plaintext.data,
5687 			tdata->plaintext.len >> 3,
5688 			"KASUMI Plaintext data not as expected");
5689 	} else {
5690 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5691 			ciphertext,
5692 			tdata->ciphertext.data,
5693 			tdata->validDataLenInBits.len,
5694 			"KASUMI Ciphertext data not as expected");
5695 
5696 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5697 			digest,
5698 			tdata->digest.data,
5699 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5700 			"KASUMI Generated auth tag not as expected");
5701 	}
5702 	return 0;
5703 }
5704 
5705 static int
5706 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5707 {
5708 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5709 	struct crypto_unittest_params *ut_params = &unittest_params;
5710 
5711 	int retval;
5712 
5713 	uint8_t *plaintext, *ciphertext;
5714 	unsigned plaintext_pad_len;
5715 	unsigned plaintext_len;
5716 	struct rte_cryptodev_info dev_info;
5717 
5718 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5719 	uint64_t feat_flags = dev_info.feature_flags;
5720 
5721 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5722 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5723 		printf("Device doesn't support RAW data-path APIs.\n");
5724 		return TEST_SKIPPED;
5725 	}
5726 
5727 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5728 		return TEST_SKIPPED;
5729 
5730 	/* Verify the capabilities */
5731 	struct rte_cryptodev_sym_capability_idx cap_idx;
5732 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5733 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5734 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5735 			&cap_idx) == NULL)
5736 		return TEST_SKIPPED;
5737 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5738 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5739 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5740 			&cap_idx) == NULL)
5741 		return TEST_SKIPPED;
5742 
5743 	/* Create KASUMI session */
5744 	retval = create_wireless_algo_cipher_auth_session(
5745 			ts_params->valid_devs[0],
5746 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5747 			RTE_CRYPTO_AUTH_OP_GENERATE,
5748 			RTE_CRYPTO_AUTH_KASUMI_F9,
5749 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5750 			tdata->key.data, tdata->key.len,
5751 			0, tdata->digest.len,
5752 			tdata->cipher_iv.len);
5753 	if (retval != 0)
5754 		return retval;
5755 
5756 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5757 
5758 	/* clear mbuf payload */
5759 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5760 			rte_pktmbuf_tailroom(ut_params->ibuf));
5761 
5762 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5763 	/* Append data which is padded to a multiple of */
5764 	/* the algorithms block size */
5765 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5766 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5767 				plaintext_pad_len);
5768 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5769 
5770 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5771 
5772 	/* Create KASUMI operation */
5773 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5774 				tdata->digest.len, NULL, 0,
5775 				plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5776 				tdata->cipher_iv.data, tdata->cipher_iv.len,
5777 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5778 				tdata->validCipherOffsetInBits.len,
5779 				tdata->validAuthLenInBits.len,
5780 				0
5781 				);
5782 	if (retval < 0)
5783 		return retval;
5784 
5785 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5786 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5787 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5788 	else
5789 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5790 			ut_params->op);
5791 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5792 
5793 	if (ut_params->op->sym->m_dst)
5794 		ut_params->obuf = ut_params->op->sym->m_dst;
5795 	else
5796 		ut_params->obuf = ut_params->op->sym->m_src;
5797 
5798 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5799 				tdata->validCipherOffsetInBits.len >> 3);
5800 
5801 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5802 			+ plaintext_pad_len;
5803 
5804 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5805 				(tdata->validCipherOffsetInBits.len >> 3);
5806 	/* Validate obuf */
5807 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5808 		ciphertext,
5809 		reference_ciphertext,
5810 		tdata->validCipherLenInBits.len,
5811 		"KASUMI Ciphertext data not as expected");
5812 
5813 	/* Validate obuf */
5814 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5815 		ut_params->digest,
5816 		tdata->digest.data,
5817 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5818 		"KASUMI Generated auth tag not as expected");
5819 	return 0;
5820 }
5821 
5822 static int
5823 test_zuc_encryption(const struct wireless_test_data *tdata)
5824 {
5825 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5826 	struct crypto_unittest_params *ut_params = &unittest_params;
5827 
5828 	int retval;
5829 	uint8_t *plaintext, *ciphertext;
5830 	unsigned plaintext_pad_len;
5831 	unsigned plaintext_len;
5832 	struct rte_cryptodev_info dev_info;
5833 
5834 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5835 	uint64_t feat_flags = dev_info.feature_flags;
5836 
5837 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5838 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5839 		printf("Device doesn't support RAW data-path APIs.\n");
5840 		return TEST_SKIPPED;
5841 	}
5842 
5843 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5844 		return TEST_SKIPPED;
5845 
5846 	struct rte_cryptodev_sym_capability_idx cap_idx;
5847 
5848 	/* Check if device supports ZUC EEA3 */
5849 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5850 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5851 
5852 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5853 			&cap_idx) == NULL)
5854 		return TEST_SKIPPED;
5855 
5856 	/* Create ZUC session */
5857 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5858 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5859 					RTE_CRYPTO_CIPHER_ZUC_EEA3,
5860 					tdata->key.data, tdata->key.len,
5861 					tdata->cipher_iv.len);
5862 	if (retval < 0)
5863 		return retval;
5864 
5865 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5866 
5867 	/* Clear mbuf payload */
5868 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5869 	       rte_pktmbuf_tailroom(ut_params->ibuf));
5870 
5871 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5872 	/* Append data which is padded to a multiple */
5873 	/* of the algorithms block size */
5874 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5875 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5876 				plaintext_pad_len);
5877 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5878 
5879 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5880 
5881 	/* Create ZUC operation */
5882 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5883 					tdata->cipher_iv.len,
5884 					tdata->plaintext.len,
5885 					0);
5886 	if (retval < 0)
5887 		return retval;
5888 
5889 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5890 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5891 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5892 	else
5893 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5894 						ut_params->op);
5895 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5896 
5897 	ut_params->obuf = ut_params->op->sym->m_dst;
5898 	if (ut_params->obuf)
5899 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
5900 	else
5901 		ciphertext = plaintext;
5902 
5903 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5904 
5905 	/* Validate obuf */
5906 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5907 		ciphertext,
5908 		tdata->ciphertext.data,
5909 		tdata->validCipherLenInBits.len,
5910 		"ZUC Ciphertext data not as expected");
5911 	return 0;
5912 }
5913 
5914 static int
5915 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
5916 {
5917 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5918 	struct crypto_unittest_params *ut_params = &unittest_params;
5919 
5920 	int retval;
5921 
5922 	unsigned int plaintext_pad_len;
5923 	unsigned int plaintext_len;
5924 	const uint8_t *ciphertext;
5925 	uint8_t ciphertext_buffer[2048];
5926 	struct rte_cryptodev_info dev_info;
5927 
5928 	struct rte_cryptodev_sym_capability_idx cap_idx;
5929 
5930 	/* Check if device supports ZUC EEA3 */
5931 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5932 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5933 
5934 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5935 			&cap_idx) == NULL)
5936 		return TEST_SKIPPED;
5937 
5938 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5939 		return TEST_SKIPPED;
5940 
5941 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5942 
5943 	uint64_t feat_flags = dev_info.feature_flags;
5944 
5945 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5946 		printf("Device doesn't support in-place scatter-gather. "
5947 				"Test Skipped.\n");
5948 		return TEST_SKIPPED;
5949 	}
5950 
5951 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5952 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5953 		printf("Device doesn't support RAW data-path APIs.\n");
5954 		return TEST_SKIPPED;
5955 	}
5956 
5957 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5958 
5959 	/* Append data which is padded to a multiple */
5960 	/* of the algorithms block size */
5961 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5962 
5963 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5964 			plaintext_pad_len, 10, 0);
5965 
5966 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5967 			tdata->plaintext.data);
5968 
5969 	/* Create ZUC session */
5970 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5971 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5972 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
5973 			tdata->key.data, tdata->key.len,
5974 			tdata->cipher_iv.len);
5975 	if (retval < 0)
5976 		return retval;
5977 
5978 	/* Clear mbuf payload */
5979 
5980 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
5981 
5982 	/* Create ZUC operation */
5983 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5984 			tdata->cipher_iv.len, tdata->plaintext.len,
5985 			0);
5986 	if (retval < 0)
5987 		return retval;
5988 
5989 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5990 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5991 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5992 	else
5993 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5994 						ut_params->op);
5995 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5996 
5997 	ut_params->obuf = ut_params->op->sym->m_dst;
5998 	if (ut_params->obuf)
5999 		ciphertext = rte_pktmbuf_read(ut_params->obuf,
6000 			0, plaintext_len, ciphertext_buffer);
6001 	else
6002 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
6003 			0, plaintext_len, ciphertext_buffer);
6004 
6005 	/* Validate obuf */
6006 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6007 
6008 	/* Validate obuf */
6009 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6010 		ciphertext,
6011 		tdata->ciphertext.data,
6012 		tdata->validCipherLenInBits.len,
6013 		"ZUC Ciphertext data not as expected");
6014 
6015 	return 0;
6016 }
6017 
6018 static int
6019 test_zuc_authentication(const struct wireless_test_data *tdata)
6020 {
6021 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6022 	struct crypto_unittest_params *ut_params = &unittest_params;
6023 
6024 	int retval;
6025 	unsigned plaintext_pad_len;
6026 	unsigned plaintext_len;
6027 	uint8_t *plaintext;
6028 
6029 	struct rte_cryptodev_sym_capability_idx cap_idx;
6030 	struct rte_cryptodev_info dev_info;
6031 
6032 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6033 	uint64_t feat_flags = dev_info.feature_flags;
6034 
6035 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
6036 			(tdata->validAuthLenInBits.len % 8 != 0)) {
6037 		printf("Device doesn't support NON-Byte Aligned Data.\n");
6038 		return TEST_SKIPPED;
6039 	}
6040 
6041 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6042 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6043 		printf("Device doesn't support RAW data-path APIs.\n");
6044 		return TEST_SKIPPED;
6045 	}
6046 
6047 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6048 		return TEST_SKIPPED;
6049 
6050 	/* Check if device supports ZUC EIA3 */
6051 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6052 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6053 
6054 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6055 			&cap_idx) == NULL)
6056 		return TEST_SKIPPED;
6057 
6058 	/* Create ZUC session */
6059 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6060 			tdata->key.data, tdata->key.len,
6061 			tdata->auth_iv.len, tdata->digest.len,
6062 			RTE_CRYPTO_AUTH_OP_GENERATE,
6063 			RTE_CRYPTO_AUTH_ZUC_EIA3);
6064 	if (retval < 0)
6065 		return retval;
6066 
6067 	/* alloc mbuf and set payload */
6068 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6069 
6070 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6071 	rte_pktmbuf_tailroom(ut_params->ibuf));
6072 
6073 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6074 	/* Append data which is padded to a multiple of */
6075 	/* the algorithms block size */
6076 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6077 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6078 				plaintext_pad_len);
6079 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6080 
6081 	/* Create ZUC operation */
6082 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6083 			tdata->auth_iv.data, tdata->auth_iv.len,
6084 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6085 			tdata->validAuthLenInBits.len,
6086 			0);
6087 	if (retval < 0)
6088 		return retval;
6089 
6090 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6091 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6092 				ut_params->op, 0, 1, 1, 0);
6093 	else
6094 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6095 				ut_params->op);
6096 	ut_params->obuf = ut_params->op->sym->m_src;
6097 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6098 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6099 			+ plaintext_pad_len;
6100 
6101 	/* Validate obuf */
6102 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
6103 	ut_params->digest,
6104 	tdata->digest.data,
6105 	tdata->digest.len,
6106 	"ZUC Generated auth tag not as expected");
6107 
6108 	return 0;
6109 }
6110 
6111 static int
6112 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6113 	uint8_t op_mode, uint8_t verify)
6114 {
6115 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6116 	struct crypto_unittest_params *ut_params = &unittest_params;
6117 
6118 	int retval;
6119 
6120 	uint8_t *plaintext = NULL, *ciphertext = NULL;
6121 	unsigned int plaintext_pad_len;
6122 	unsigned int plaintext_len;
6123 	unsigned int ciphertext_pad_len;
6124 	unsigned int ciphertext_len;
6125 
6126 	struct rte_cryptodev_info dev_info;
6127 	struct rte_cryptodev_sym_capability_idx cap_idx;
6128 
6129 	/* Check if device supports ZUC EIA3 */
6130 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6131 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6132 
6133 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6134 			&cap_idx) == NULL)
6135 		return TEST_SKIPPED;
6136 
6137 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6138 
6139 	uint64_t feat_flags = dev_info.feature_flags;
6140 
6141 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6142 		printf("Device doesn't support digest encrypted.\n");
6143 		return TEST_SKIPPED;
6144 	}
6145 	if (op_mode == IN_PLACE) {
6146 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6147 			printf("Device doesn't support in-place scatter-gather "
6148 					"in both input and output mbufs.\n");
6149 			return TEST_SKIPPED;
6150 		}
6151 
6152 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6153 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6154 			printf("Device doesn't support RAW data-path APIs.\n");
6155 			return TEST_SKIPPED;
6156 		}
6157 	} else {
6158 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6159 			return TEST_SKIPPED;
6160 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6161 			printf("Device doesn't support out-of-place scatter-gather "
6162 					"in both input and output mbufs.\n");
6163 			return TEST_SKIPPED;
6164 		}
6165 	}
6166 
6167 	/* Create ZUC session */
6168 	retval = create_wireless_algo_auth_cipher_session(
6169 			ts_params->valid_devs[0],
6170 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6171 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6172 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6173 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6174 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6175 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6176 			tdata->key.data, tdata->key.len,
6177 			tdata->auth_iv.len, tdata->digest.len,
6178 			tdata->cipher_iv.len);
6179 
6180 	if (retval != 0)
6181 		return retval;
6182 
6183 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6184 	if (op_mode == OUT_OF_PLACE)
6185 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6186 
6187 	/* clear mbuf payload */
6188 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6189 		rte_pktmbuf_tailroom(ut_params->ibuf));
6190 	if (op_mode == OUT_OF_PLACE)
6191 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6192 			rte_pktmbuf_tailroom(ut_params->obuf));
6193 
6194 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6195 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6196 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6197 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6198 
6199 	if (verify) {
6200 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6201 					ciphertext_pad_len);
6202 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6203 		if (op_mode == OUT_OF_PLACE)
6204 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6205 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6206 			ciphertext_len);
6207 	} else {
6208 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6209 					plaintext_pad_len);
6210 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6211 		if (op_mode == OUT_OF_PLACE)
6212 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6213 		debug_hexdump(stdout, "plaintext:", plaintext,
6214 			plaintext_len);
6215 	}
6216 
6217 	/* Create ZUC operation */
6218 	retval = create_wireless_algo_auth_cipher_operation(
6219 		tdata->digest.data, tdata->digest.len,
6220 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6221 		tdata->auth_iv.data, tdata->auth_iv.len,
6222 		(tdata->digest.offset_bytes == 0 ?
6223 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6224 			: tdata->digest.offset_bytes),
6225 		tdata->validCipherLenInBits.len,
6226 		tdata->validCipherOffsetInBits.len,
6227 		tdata->validAuthLenInBits.len,
6228 		0,
6229 		op_mode, 0, verify);
6230 
6231 	if (retval < 0)
6232 		return retval;
6233 
6234 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6235 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6236 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6237 	else
6238 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6239 			ut_params->op);
6240 
6241 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6242 
6243 	ut_params->obuf = (op_mode == IN_PLACE ?
6244 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6245 
6246 
6247 	if (verify) {
6248 		if (ut_params->obuf)
6249 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6250 							uint8_t *);
6251 		else
6252 			plaintext = ciphertext;
6253 
6254 		debug_hexdump(stdout, "plaintext:", plaintext,
6255 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6256 		debug_hexdump(stdout, "plaintext expected:",
6257 			tdata->plaintext.data,
6258 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6259 	} else {
6260 		if (ut_params->obuf)
6261 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6262 							uint8_t *);
6263 		else
6264 			ciphertext = plaintext;
6265 
6266 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6267 			ciphertext_len);
6268 		debug_hexdump(stdout, "ciphertext expected:",
6269 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6270 
6271 		ut_params->digest = rte_pktmbuf_mtod(
6272 			ut_params->obuf, uint8_t *) +
6273 			(tdata->digest.offset_bytes == 0 ?
6274 			plaintext_pad_len : tdata->digest.offset_bytes);
6275 
6276 		debug_hexdump(stdout, "digest:", ut_params->digest,
6277 			tdata->digest.len);
6278 		debug_hexdump(stdout, "digest expected:",
6279 			tdata->digest.data, tdata->digest.len);
6280 	}
6281 
6282 	/* Validate obuf */
6283 	if (verify) {
6284 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6285 			plaintext,
6286 			tdata->plaintext.data,
6287 			tdata->plaintext.len >> 3,
6288 			"ZUC Plaintext data not as expected");
6289 	} else {
6290 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6291 			ciphertext,
6292 			tdata->ciphertext.data,
6293 			tdata->ciphertext.len >> 3,
6294 			"ZUC Ciphertext data not as expected");
6295 
6296 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6297 			ut_params->digest,
6298 			tdata->digest.data,
6299 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6300 			"ZUC Generated auth tag not as expected");
6301 	}
6302 	return 0;
6303 }
6304 
6305 static int
6306 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6307 	uint8_t op_mode, uint8_t verify)
6308 {
6309 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6310 	struct crypto_unittest_params *ut_params = &unittest_params;
6311 
6312 	int retval;
6313 
6314 	const uint8_t *plaintext = NULL;
6315 	const uint8_t *ciphertext = NULL;
6316 	const uint8_t *digest = NULL;
6317 	unsigned int plaintext_pad_len;
6318 	unsigned int plaintext_len;
6319 	unsigned int ciphertext_pad_len;
6320 	unsigned int ciphertext_len;
6321 	uint8_t buffer[10000];
6322 	uint8_t digest_buffer[10000];
6323 
6324 	struct rte_cryptodev_info dev_info;
6325 	struct rte_cryptodev_sym_capability_idx cap_idx;
6326 
6327 	/* Check if device supports ZUC EIA3 */
6328 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6329 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6330 
6331 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6332 			&cap_idx) == NULL)
6333 		return TEST_SKIPPED;
6334 
6335 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6336 
6337 	uint64_t feat_flags = dev_info.feature_flags;
6338 
6339 	if (op_mode == IN_PLACE) {
6340 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6341 			printf("Device doesn't support in-place scatter-gather "
6342 					"in both input and output mbufs.\n");
6343 			return TEST_SKIPPED;
6344 		}
6345 
6346 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6347 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6348 			printf("Device doesn't support RAW data-path APIs.\n");
6349 			return TEST_SKIPPED;
6350 		}
6351 	} else {
6352 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6353 			return TEST_SKIPPED;
6354 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6355 			printf("Device doesn't support out-of-place scatter-gather "
6356 					"in both input and output mbufs.\n");
6357 			return TEST_SKIPPED;
6358 		}
6359 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6360 			printf("Device doesn't support digest encrypted.\n");
6361 			return TEST_SKIPPED;
6362 		}
6363 	}
6364 
6365 	/* Create ZUC session */
6366 	retval = create_wireless_algo_auth_cipher_session(
6367 			ts_params->valid_devs[0],
6368 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6369 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6370 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6371 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6372 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6373 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6374 			tdata->key.data, tdata->key.len,
6375 			tdata->auth_iv.len, tdata->digest.len,
6376 			tdata->cipher_iv.len);
6377 
6378 	if (retval != 0)
6379 		return retval;
6380 
6381 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6382 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6383 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6384 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6385 
6386 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6387 			plaintext_pad_len, 15, 0);
6388 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6389 			"Failed to allocate input buffer in mempool");
6390 
6391 	if (op_mode == OUT_OF_PLACE) {
6392 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6393 				plaintext_pad_len, 15, 0);
6394 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
6395 				"Failed to allocate output buffer in mempool");
6396 	}
6397 
6398 	if (verify) {
6399 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6400 			tdata->ciphertext.data);
6401 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6402 					ciphertext_len, buffer);
6403 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6404 			ciphertext_len);
6405 	} else {
6406 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6407 			tdata->plaintext.data);
6408 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6409 					plaintext_len, buffer);
6410 		debug_hexdump(stdout, "plaintext:", plaintext,
6411 			plaintext_len);
6412 	}
6413 	memset(buffer, 0, sizeof(buffer));
6414 
6415 	/* Create ZUC operation */
6416 	retval = create_wireless_algo_auth_cipher_operation(
6417 		tdata->digest.data, tdata->digest.len,
6418 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6419 		NULL, 0,
6420 		(tdata->digest.offset_bytes == 0 ?
6421 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6422 			: tdata->digest.offset_bytes),
6423 		tdata->validCipherLenInBits.len,
6424 		tdata->validCipherOffsetInBits.len,
6425 		tdata->validAuthLenInBits.len,
6426 		0,
6427 		op_mode, 1, verify);
6428 
6429 	if (retval < 0)
6430 		return retval;
6431 
6432 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6433 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6434 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6435 	else
6436 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6437 			ut_params->op);
6438 
6439 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6440 
6441 	ut_params->obuf = (op_mode == IN_PLACE ?
6442 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6443 
6444 	if (verify) {
6445 		if (ut_params->obuf)
6446 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6447 					plaintext_len, buffer);
6448 		else
6449 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6450 					plaintext_len, buffer);
6451 
6452 		debug_hexdump(stdout, "plaintext:", plaintext,
6453 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6454 		debug_hexdump(stdout, "plaintext expected:",
6455 			tdata->plaintext.data,
6456 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6457 	} else {
6458 		if (ut_params->obuf)
6459 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6460 					ciphertext_len, buffer);
6461 		else
6462 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6463 					ciphertext_len, buffer);
6464 
6465 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6466 			ciphertext_len);
6467 		debug_hexdump(stdout, "ciphertext expected:",
6468 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6469 
6470 		if (ut_params->obuf)
6471 			digest = rte_pktmbuf_read(ut_params->obuf,
6472 				(tdata->digest.offset_bytes == 0 ?
6473 				plaintext_pad_len : tdata->digest.offset_bytes),
6474 				tdata->digest.len, digest_buffer);
6475 		else
6476 			digest = rte_pktmbuf_read(ut_params->ibuf,
6477 				(tdata->digest.offset_bytes == 0 ?
6478 				plaintext_pad_len : tdata->digest.offset_bytes),
6479 				tdata->digest.len, digest_buffer);
6480 
6481 		debug_hexdump(stdout, "digest:", digest,
6482 			tdata->digest.len);
6483 		debug_hexdump(stdout, "digest expected:",
6484 			tdata->digest.data, tdata->digest.len);
6485 	}
6486 
6487 	/* Validate obuf */
6488 	if (verify) {
6489 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6490 			plaintext,
6491 			tdata->plaintext.data,
6492 			tdata->plaintext.len >> 3,
6493 			"ZUC Plaintext data not as expected");
6494 	} else {
6495 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6496 			ciphertext,
6497 			tdata->ciphertext.data,
6498 			tdata->validDataLenInBits.len,
6499 			"ZUC Ciphertext data not as expected");
6500 
6501 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6502 			digest,
6503 			tdata->digest.data,
6504 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6505 			"ZUC Generated auth tag not as expected");
6506 	}
6507 	return 0;
6508 }
6509 
6510 static int
6511 test_kasumi_encryption_test_case_1(void)
6512 {
6513 	return test_kasumi_encryption(&kasumi_test_case_1);
6514 }
6515 
6516 static int
6517 test_kasumi_encryption_test_case_1_sgl(void)
6518 {
6519 	return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6520 }
6521 
6522 static int
6523 test_kasumi_encryption_test_case_1_oop(void)
6524 {
6525 	return test_kasumi_encryption_oop(&kasumi_test_case_1);
6526 }
6527 
6528 static int
6529 test_kasumi_encryption_test_case_1_oop_sgl(void)
6530 {
6531 	return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6532 }
6533 
6534 static int
6535 test_kasumi_encryption_test_case_2(void)
6536 {
6537 	return test_kasumi_encryption(&kasumi_test_case_2);
6538 }
6539 
6540 static int
6541 test_kasumi_encryption_test_case_3(void)
6542 {
6543 	return test_kasumi_encryption(&kasumi_test_case_3);
6544 }
6545 
6546 static int
6547 test_kasumi_encryption_test_case_4(void)
6548 {
6549 	return test_kasumi_encryption(&kasumi_test_case_4);
6550 }
6551 
6552 static int
6553 test_kasumi_encryption_test_case_5(void)
6554 {
6555 	return test_kasumi_encryption(&kasumi_test_case_5);
6556 }
6557 
6558 static int
6559 test_kasumi_decryption_test_case_1(void)
6560 {
6561 	return test_kasumi_decryption(&kasumi_test_case_1);
6562 }
6563 
6564 static int
6565 test_kasumi_decryption_test_case_1_oop(void)
6566 {
6567 	return test_kasumi_decryption_oop(&kasumi_test_case_1);
6568 }
6569 
6570 static int
6571 test_kasumi_decryption_test_case_2(void)
6572 {
6573 	return test_kasumi_decryption(&kasumi_test_case_2);
6574 }
6575 
6576 static int
6577 test_kasumi_decryption_test_case_3(void)
6578 {
6579 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6580 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6581 		return TEST_SKIPPED;
6582 	return test_kasumi_decryption(&kasumi_test_case_3);
6583 }
6584 
6585 static int
6586 test_kasumi_decryption_test_case_4(void)
6587 {
6588 	return test_kasumi_decryption(&kasumi_test_case_4);
6589 }
6590 
6591 static int
6592 test_kasumi_decryption_test_case_5(void)
6593 {
6594 	return test_kasumi_decryption(&kasumi_test_case_5);
6595 }
6596 static int
6597 test_snow3g_encryption_test_case_1(void)
6598 {
6599 	return test_snow3g_encryption(&snow3g_test_case_1);
6600 }
6601 
6602 static int
6603 test_snow3g_encryption_test_case_1_oop(void)
6604 {
6605 	return test_snow3g_encryption_oop(&snow3g_test_case_1);
6606 }
6607 
6608 static int
6609 test_snow3g_encryption_test_case_1_oop_sgl(void)
6610 {
6611 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6612 }
6613 
6614 
6615 static int
6616 test_snow3g_encryption_test_case_1_offset_oop(void)
6617 {
6618 	return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6619 }
6620 
6621 static int
6622 test_snow3g_encryption_test_case_2(void)
6623 {
6624 	return test_snow3g_encryption(&snow3g_test_case_2);
6625 }
6626 
6627 static int
6628 test_snow3g_encryption_test_case_3(void)
6629 {
6630 	return test_snow3g_encryption(&snow3g_test_case_3);
6631 }
6632 
6633 static int
6634 test_snow3g_encryption_test_case_4(void)
6635 {
6636 	return test_snow3g_encryption(&snow3g_test_case_4);
6637 }
6638 
6639 static int
6640 test_snow3g_encryption_test_case_5(void)
6641 {
6642 	return test_snow3g_encryption(&snow3g_test_case_5);
6643 }
6644 
6645 static int
6646 test_snow3g_decryption_test_case_1(void)
6647 {
6648 	return test_snow3g_decryption(&snow3g_test_case_1);
6649 }
6650 
6651 static int
6652 test_snow3g_decryption_test_case_1_oop(void)
6653 {
6654 	return test_snow3g_decryption_oop(&snow3g_test_case_1);
6655 }
6656 
6657 static int
6658 test_snow3g_decryption_test_case_2(void)
6659 {
6660 	return test_snow3g_decryption(&snow3g_test_case_2);
6661 }
6662 
6663 static int
6664 test_snow3g_decryption_test_case_3(void)
6665 {
6666 	return test_snow3g_decryption(&snow3g_test_case_3);
6667 }
6668 
6669 static int
6670 test_snow3g_decryption_test_case_4(void)
6671 {
6672 	return test_snow3g_decryption(&snow3g_test_case_4);
6673 }
6674 
6675 static int
6676 test_snow3g_decryption_test_case_5(void)
6677 {
6678 	return test_snow3g_decryption(&snow3g_test_case_5);
6679 }
6680 
6681 /*
6682  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6683  * Pattern digest from snow3g_test_data must be allocated as
6684  * 4 last bytes in plaintext.
6685  */
6686 static void
6687 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6688 		struct snow3g_hash_test_data *output)
6689 {
6690 	if ((pattern != NULL) && (output != NULL)) {
6691 		output->key.len = pattern->key.len;
6692 
6693 		memcpy(output->key.data,
6694 		pattern->key.data, pattern->key.len);
6695 
6696 		output->auth_iv.len = pattern->auth_iv.len;
6697 
6698 		memcpy(output->auth_iv.data,
6699 		pattern->auth_iv.data, pattern->auth_iv.len);
6700 
6701 		output->plaintext.len = pattern->plaintext.len;
6702 
6703 		memcpy(output->plaintext.data,
6704 		pattern->plaintext.data, pattern->plaintext.len >> 3);
6705 
6706 		output->digest.len = pattern->digest.len;
6707 
6708 		memcpy(output->digest.data,
6709 		&pattern->plaintext.data[pattern->digest.offset_bytes],
6710 		pattern->digest.len);
6711 
6712 		output->validAuthLenInBits.len =
6713 		pattern->validAuthLenInBits.len;
6714 	}
6715 }
6716 
6717 /*
6718  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6719  */
6720 static int
6721 test_snow3g_decryption_with_digest_test_case_1(void)
6722 {
6723 	struct snow3g_hash_test_data snow3g_hash_data;
6724 	struct rte_cryptodev_info dev_info;
6725 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6726 
6727 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6728 	uint64_t feat_flags = dev_info.feature_flags;
6729 
6730 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6731 		printf("Device doesn't support encrypted digest operations.\n");
6732 		return TEST_SKIPPED;
6733 	}
6734 
6735 	/*
6736 	 * Function prepare data for hash veryfication test case.
6737 	 * Digest is allocated in 4 last bytes in plaintext, pattern.
6738 	 */
6739 	snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6740 
6741 	return test_snow3g_decryption(&snow3g_test_case_7) &
6742 			test_snow3g_authentication_verify(&snow3g_hash_data);
6743 }
6744 
6745 static int
6746 test_snow3g_cipher_auth_test_case_1(void)
6747 {
6748 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
6749 }
6750 
6751 static int
6752 test_snow3g_auth_cipher_test_case_1(void)
6753 {
6754 	return test_snow3g_auth_cipher(
6755 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6756 }
6757 
6758 static int
6759 test_snow3g_auth_cipher_test_case_2(void)
6760 {
6761 	return test_snow3g_auth_cipher(
6762 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6763 }
6764 
6765 static int
6766 test_snow3g_auth_cipher_test_case_2_oop(void)
6767 {
6768 	return test_snow3g_auth_cipher(
6769 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6770 }
6771 
6772 static int
6773 test_snow3g_auth_cipher_part_digest_enc(void)
6774 {
6775 	return test_snow3g_auth_cipher(
6776 		&snow3g_auth_cipher_partial_digest_encryption,
6777 			IN_PLACE, 0);
6778 }
6779 
6780 static int
6781 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6782 {
6783 	return test_snow3g_auth_cipher(
6784 		&snow3g_auth_cipher_partial_digest_encryption,
6785 			OUT_OF_PLACE, 0);
6786 }
6787 
6788 static int
6789 test_snow3g_auth_cipher_test_case_3_sgl(void)
6790 {
6791 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6792 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6793 		return TEST_SKIPPED;
6794 	return test_snow3g_auth_cipher_sgl(
6795 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6796 }
6797 
6798 static int
6799 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6800 {
6801 	return test_snow3g_auth_cipher_sgl(
6802 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6803 }
6804 
6805 static int
6806 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6807 {
6808 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6809 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6810 		return TEST_SKIPPED;
6811 	return test_snow3g_auth_cipher_sgl(
6812 		&snow3g_auth_cipher_partial_digest_encryption,
6813 			IN_PLACE, 0);
6814 }
6815 
6816 static int
6817 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6818 {
6819 	return test_snow3g_auth_cipher_sgl(
6820 		&snow3g_auth_cipher_partial_digest_encryption,
6821 			OUT_OF_PLACE, 0);
6822 }
6823 
6824 static int
6825 test_snow3g_auth_cipher_verify_test_case_1(void)
6826 {
6827 	return test_snow3g_auth_cipher(
6828 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6829 }
6830 
6831 static int
6832 test_snow3g_auth_cipher_verify_test_case_2(void)
6833 {
6834 	return test_snow3g_auth_cipher(
6835 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6836 }
6837 
6838 static int
6839 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6840 {
6841 	return test_snow3g_auth_cipher(
6842 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6843 }
6844 
6845 static int
6846 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6847 {
6848 	return test_snow3g_auth_cipher(
6849 		&snow3g_auth_cipher_partial_digest_encryption,
6850 			IN_PLACE, 1);
6851 }
6852 
6853 static int
6854 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6855 {
6856 	return test_snow3g_auth_cipher(
6857 		&snow3g_auth_cipher_partial_digest_encryption,
6858 			OUT_OF_PLACE, 1);
6859 }
6860 
6861 static int
6862 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6863 {
6864 	return test_snow3g_auth_cipher_sgl(
6865 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6866 }
6867 
6868 static int
6869 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6870 {
6871 	return test_snow3g_auth_cipher_sgl(
6872 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6873 }
6874 
6875 static int
6876 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6877 {
6878 	return test_snow3g_auth_cipher_sgl(
6879 		&snow3g_auth_cipher_partial_digest_encryption,
6880 			IN_PLACE, 1);
6881 }
6882 
6883 static int
6884 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6885 {
6886 	return test_snow3g_auth_cipher_sgl(
6887 		&snow3g_auth_cipher_partial_digest_encryption,
6888 			OUT_OF_PLACE, 1);
6889 }
6890 
6891 static int
6892 test_snow3g_auth_cipher_with_digest_test_case_1(void)
6893 {
6894 	return test_snow3g_auth_cipher(
6895 		&snow3g_test_case_7, IN_PLACE, 0);
6896 }
6897 
6898 static int
6899 test_kasumi_auth_cipher_test_case_1(void)
6900 {
6901 	return test_kasumi_auth_cipher(
6902 		&kasumi_test_case_3, IN_PLACE, 0);
6903 }
6904 
6905 static int
6906 test_kasumi_auth_cipher_test_case_2(void)
6907 {
6908 	return test_kasumi_auth_cipher(
6909 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6910 }
6911 
6912 static int
6913 test_kasumi_auth_cipher_test_case_2_oop(void)
6914 {
6915 	return test_kasumi_auth_cipher(
6916 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6917 }
6918 
6919 static int
6920 test_kasumi_auth_cipher_test_case_2_sgl(void)
6921 {
6922 	return test_kasumi_auth_cipher_sgl(
6923 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6924 }
6925 
6926 static int
6927 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
6928 {
6929 	return test_kasumi_auth_cipher_sgl(
6930 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6931 }
6932 
6933 static int
6934 test_kasumi_auth_cipher_verify_test_case_1(void)
6935 {
6936 	return test_kasumi_auth_cipher(
6937 		&kasumi_test_case_3, IN_PLACE, 1);
6938 }
6939 
6940 static int
6941 test_kasumi_auth_cipher_verify_test_case_2(void)
6942 {
6943 	return test_kasumi_auth_cipher(
6944 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6945 }
6946 
6947 static int
6948 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
6949 {
6950 	return test_kasumi_auth_cipher(
6951 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6952 }
6953 
6954 static int
6955 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
6956 {
6957 	return test_kasumi_auth_cipher_sgl(
6958 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6959 }
6960 
6961 static int
6962 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
6963 {
6964 	return test_kasumi_auth_cipher_sgl(
6965 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6966 }
6967 
6968 static int
6969 test_kasumi_cipher_auth_test_case_1(void)
6970 {
6971 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
6972 }
6973 
6974 static int
6975 test_zuc_encryption_test_case_1(void)
6976 {
6977 	return test_zuc_encryption(&zuc_test_case_cipher_193b);
6978 }
6979 
6980 static int
6981 test_zuc_encryption_test_case_2(void)
6982 {
6983 	return test_zuc_encryption(&zuc_test_case_cipher_800b);
6984 }
6985 
6986 static int
6987 test_zuc_encryption_test_case_3(void)
6988 {
6989 	return test_zuc_encryption(&zuc_test_case_cipher_1570b);
6990 }
6991 
6992 static int
6993 test_zuc_encryption_test_case_4(void)
6994 {
6995 	return test_zuc_encryption(&zuc_test_case_cipher_2798b);
6996 }
6997 
6998 static int
6999 test_zuc_encryption_test_case_5(void)
7000 {
7001 	return test_zuc_encryption(&zuc_test_case_cipher_4019b);
7002 }
7003 
7004 static int
7005 test_zuc_encryption_test_case_6_sgl(void)
7006 {
7007 	return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
7008 }
7009 
7010 static int
7011 test_zuc_hash_generate_test_case_1(void)
7012 {
7013 	return test_zuc_authentication(&zuc_test_case_auth_1b);
7014 }
7015 
7016 static int
7017 test_zuc_hash_generate_test_case_2(void)
7018 {
7019 	return test_zuc_authentication(&zuc_test_case_auth_90b);
7020 }
7021 
7022 static int
7023 test_zuc_hash_generate_test_case_3(void)
7024 {
7025 	return test_zuc_authentication(&zuc_test_case_auth_577b);
7026 }
7027 
7028 static int
7029 test_zuc_hash_generate_test_case_4(void)
7030 {
7031 	return test_zuc_authentication(&zuc_test_case_auth_2079b);
7032 }
7033 
7034 static int
7035 test_zuc_hash_generate_test_case_5(void)
7036 {
7037 	return test_zuc_authentication(&zuc_test_auth_5670b);
7038 }
7039 
7040 static int
7041 test_zuc_hash_generate_test_case_6(void)
7042 {
7043 	return test_zuc_authentication(&zuc_test_case_auth_128b);
7044 }
7045 
7046 static int
7047 test_zuc_hash_generate_test_case_7(void)
7048 {
7049 	return test_zuc_authentication(&zuc_test_case_auth_2080b);
7050 }
7051 
7052 static int
7053 test_zuc_hash_generate_test_case_8(void)
7054 {
7055 	return test_zuc_authentication(&zuc_test_case_auth_584b);
7056 }
7057 
7058 static int
7059 test_zuc_cipher_auth_test_case_1(void)
7060 {
7061 	return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7062 }
7063 
7064 static int
7065 test_zuc_cipher_auth_test_case_2(void)
7066 {
7067 	return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7068 }
7069 
7070 static int
7071 test_zuc_auth_cipher_test_case_1(void)
7072 {
7073 	return test_zuc_auth_cipher(
7074 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7075 }
7076 
7077 static int
7078 test_zuc_auth_cipher_test_case_1_oop(void)
7079 {
7080 	return test_zuc_auth_cipher(
7081 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7082 }
7083 
7084 static int
7085 test_zuc_auth_cipher_test_case_1_sgl(void)
7086 {
7087 	return test_zuc_auth_cipher_sgl(
7088 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7089 }
7090 
7091 static int
7092 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7093 {
7094 	return test_zuc_auth_cipher_sgl(
7095 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7096 }
7097 
7098 static int
7099 test_zuc_auth_cipher_verify_test_case_1(void)
7100 {
7101 	return test_zuc_auth_cipher(
7102 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7103 }
7104 
7105 static int
7106 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7107 {
7108 	return test_zuc_auth_cipher(
7109 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7110 }
7111 
7112 static int
7113 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7114 {
7115 	return test_zuc_auth_cipher_sgl(
7116 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7117 }
7118 
7119 static int
7120 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7121 {
7122 	return test_zuc_auth_cipher_sgl(
7123 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7124 }
7125 
7126 static int
7127 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7128 {
7129 	uint8_t dev_id = testsuite_params.valid_devs[0];
7130 
7131 	struct rte_cryptodev_sym_capability_idx cap_idx;
7132 
7133 	/* Check if device supports particular cipher algorithm */
7134 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7135 	cap_idx.algo.cipher = tdata->cipher_algo;
7136 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7137 		return TEST_SKIPPED;
7138 
7139 	/* Check if device supports particular hash algorithm */
7140 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7141 	cap_idx.algo.auth = tdata->auth_algo;
7142 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7143 		return TEST_SKIPPED;
7144 
7145 	return 0;
7146 }
7147 
7148 static int
7149 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7150 	uint8_t op_mode, uint8_t verify)
7151 {
7152 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7153 	struct crypto_unittest_params *ut_params = &unittest_params;
7154 
7155 	int retval;
7156 
7157 	uint8_t *plaintext = NULL, *ciphertext = NULL;
7158 	unsigned int plaintext_pad_len;
7159 	unsigned int plaintext_len;
7160 	unsigned int ciphertext_pad_len;
7161 	unsigned int ciphertext_len;
7162 
7163 	struct rte_cryptodev_info dev_info;
7164 	struct rte_crypto_op *op;
7165 
7166 	/* Check if device supports particular algorithms separately */
7167 	if (test_mixed_check_if_unsupported(tdata))
7168 		return TEST_SKIPPED;
7169 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7170 		return TEST_SKIPPED;
7171 
7172 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7173 
7174 	uint64_t feat_flags = dev_info.feature_flags;
7175 
7176 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7177 		printf("Device doesn't support digest encrypted.\n");
7178 		return TEST_SKIPPED;
7179 	}
7180 
7181 	/* Create the session */
7182 	if (verify)
7183 		retval = create_wireless_algo_cipher_auth_session(
7184 				ts_params->valid_devs[0],
7185 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7186 				RTE_CRYPTO_AUTH_OP_VERIFY,
7187 				tdata->auth_algo,
7188 				tdata->cipher_algo,
7189 				tdata->auth_key.data, tdata->auth_key.len,
7190 				tdata->auth_iv.len, tdata->digest_enc.len,
7191 				tdata->cipher_iv.len);
7192 	else
7193 		retval = create_wireless_algo_auth_cipher_session(
7194 				ts_params->valid_devs[0],
7195 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7196 				RTE_CRYPTO_AUTH_OP_GENERATE,
7197 				tdata->auth_algo,
7198 				tdata->cipher_algo,
7199 				tdata->auth_key.data, tdata->auth_key.len,
7200 				tdata->auth_iv.len, tdata->digest_enc.len,
7201 				tdata->cipher_iv.len);
7202 	if (retval != 0)
7203 		return retval;
7204 
7205 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7206 	if (op_mode == OUT_OF_PLACE)
7207 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7208 
7209 	/* clear mbuf payload */
7210 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7211 		rte_pktmbuf_tailroom(ut_params->ibuf));
7212 	if (op_mode == OUT_OF_PLACE) {
7213 
7214 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7215 				rte_pktmbuf_tailroom(ut_params->obuf));
7216 	}
7217 
7218 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7219 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7220 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7221 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7222 
7223 	if (verify) {
7224 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7225 				ciphertext_pad_len);
7226 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7227 		if (op_mode == OUT_OF_PLACE)
7228 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7229 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7230 				ciphertext_len);
7231 	} else {
7232 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7233 				plaintext_pad_len);
7234 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7235 		if (op_mode == OUT_OF_PLACE)
7236 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
7237 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7238 	}
7239 
7240 	/* Create the operation */
7241 	retval = create_wireless_algo_auth_cipher_operation(
7242 			tdata->digest_enc.data, tdata->digest_enc.len,
7243 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7244 			tdata->auth_iv.data, tdata->auth_iv.len,
7245 			(tdata->digest_enc.offset == 0 ?
7246 				plaintext_pad_len
7247 				: tdata->digest_enc.offset),
7248 			tdata->validCipherLen.len_bits,
7249 			tdata->cipher.offset_bits,
7250 			tdata->validAuthLen.len_bits,
7251 			tdata->auth.offset_bits,
7252 			op_mode, 0, verify);
7253 
7254 	if (retval < 0)
7255 		return retval;
7256 
7257 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7258 
7259 	/* Check if the op failed because the device doesn't */
7260 	/* support this particular combination of algorithms */
7261 	if (op == NULL && ut_params->op->status ==
7262 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7263 		printf("Device doesn't support this mixed combination. "
7264 				"Test Skipped.\n");
7265 		return TEST_SKIPPED;
7266 	}
7267 	ut_params->op = op;
7268 
7269 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7270 
7271 	ut_params->obuf = (op_mode == IN_PLACE ?
7272 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7273 
7274 	if (verify) {
7275 		if (ut_params->obuf)
7276 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7277 							uint8_t *);
7278 		else
7279 			plaintext = ciphertext +
7280 					(tdata->cipher.offset_bits >> 3);
7281 
7282 		debug_hexdump(stdout, "plaintext:", plaintext,
7283 				tdata->plaintext.len_bits >> 3);
7284 		debug_hexdump(stdout, "plaintext expected:",
7285 				tdata->plaintext.data,
7286 				tdata->plaintext.len_bits >> 3);
7287 	} else {
7288 		if (ut_params->obuf)
7289 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7290 					uint8_t *);
7291 		else
7292 			ciphertext = plaintext;
7293 
7294 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7295 				ciphertext_len);
7296 		debug_hexdump(stdout, "ciphertext expected:",
7297 				tdata->ciphertext.data,
7298 				tdata->ciphertext.len_bits >> 3);
7299 
7300 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7301 				+ (tdata->digest_enc.offset == 0 ?
7302 		plaintext_pad_len : tdata->digest_enc.offset);
7303 
7304 		debug_hexdump(stdout, "digest:", ut_params->digest,
7305 				tdata->digest_enc.len);
7306 		debug_hexdump(stdout, "digest expected:",
7307 				tdata->digest_enc.data,
7308 				tdata->digest_enc.len);
7309 	}
7310 
7311 	/* Validate obuf */
7312 	if (verify) {
7313 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7314 				plaintext,
7315 				tdata->plaintext.data,
7316 				tdata->plaintext.len_bits >> 3,
7317 				"Plaintext data not as expected");
7318 	} else {
7319 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7320 				ciphertext,
7321 				tdata->ciphertext.data,
7322 				tdata->validDataLen.len_bits,
7323 				"Ciphertext data not as expected");
7324 
7325 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7326 				ut_params->digest,
7327 				tdata->digest_enc.data,
7328 				DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
7329 				"Generated auth tag not as expected");
7330 	}
7331 
7332 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7333 			"crypto op processing failed");
7334 
7335 	return 0;
7336 }
7337 
7338 static int
7339 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7340 	uint8_t op_mode, uint8_t verify)
7341 {
7342 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7343 	struct crypto_unittest_params *ut_params = &unittest_params;
7344 
7345 	int retval;
7346 
7347 	const uint8_t *plaintext = NULL;
7348 	const uint8_t *ciphertext = NULL;
7349 	const uint8_t *digest = NULL;
7350 	unsigned int plaintext_pad_len;
7351 	unsigned int plaintext_len;
7352 	unsigned int ciphertext_pad_len;
7353 	unsigned int ciphertext_len;
7354 	uint8_t buffer[10000];
7355 	uint8_t digest_buffer[10000];
7356 
7357 	struct rte_cryptodev_info dev_info;
7358 	struct rte_crypto_op *op;
7359 
7360 	/* Check if device supports particular algorithms */
7361 	if (test_mixed_check_if_unsupported(tdata))
7362 		return TEST_SKIPPED;
7363 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7364 		return TEST_SKIPPED;
7365 
7366 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7367 
7368 	uint64_t feat_flags = dev_info.feature_flags;
7369 
7370 	if (op_mode == IN_PLACE) {
7371 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7372 			printf("Device doesn't support in-place scatter-gather "
7373 					"in both input and output mbufs.\n");
7374 			return TEST_SKIPPED;
7375 		}
7376 	} else {
7377 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7378 			printf("Device doesn't support out-of-place scatter-gather "
7379 					"in both input and output mbufs.\n");
7380 			return TEST_SKIPPED;
7381 		}
7382 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7383 			printf("Device doesn't support digest encrypted.\n");
7384 			return TEST_SKIPPED;
7385 		}
7386 	}
7387 
7388 	/* Create the session */
7389 	if (verify)
7390 		retval = create_wireless_algo_cipher_auth_session(
7391 				ts_params->valid_devs[0],
7392 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7393 				RTE_CRYPTO_AUTH_OP_VERIFY,
7394 				tdata->auth_algo,
7395 				tdata->cipher_algo,
7396 				tdata->auth_key.data, tdata->auth_key.len,
7397 				tdata->auth_iv.len, tdata->digest_enc.len,
7398 				tdata->cipher_iv.len);
7399 	else
7400 		retval = create_wireless_algo_auth_cipher_session(
7401 				ts_params->valid_devs[0],
7402 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7403 				RTE_CRYPTO_AUTH_OP_GENERATE,
7404 				tdata->auth_algo,
7405 				tdata->cipher_algo,
7406 				tdata->auth_key.data, tdata->auth_key.len,
7407 				tdata->auth_iv.len, tdata->digest_enc.len,
7408 				tdata->cipher_iv.len);
7409 	if (retval != 0)
7410 		return retval;
7411 
7412 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7413 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7414 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7415 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7416 
7417 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7418 			ciphertext_pad_len, 15, 0);
7419 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7420 			"Failed to allocate input buffer in mempool");
7421 
7422 	if (op_mode == OUT_OF_PLACE) {
7423 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7424 				plaintext_pad_len, 15, 0);
7425 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
7426 				"Failed to allocate output buffer in mempool");
7427 	}
7428 
7429 	if (verify) {
7430 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7431 			tdata->ciphertext.data);
7432 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7433 					ciphertext_len, buffer);
7434 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7435 			ciphertext_len);
7436 	} else {
7437 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7438 			tdata->plaintext.data);
7439 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7440 					plaintext_len, buffer);
7441 		debug_hexdump(stdout, "plaintext:", plaintext,
7442 			plaintext_len);
7443 	}
7444 	memset(buffer, 0, sizeof(buffer));
7445 
7446 	/* Create the operation */
7447 	retval = create_wireless_algo_auth_cipher_operation(
7448 			tdata->digest_enc.data, tdata->digest_enc.len,
7449 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7450 			tdata->auth_iv.data, tdata->auth_iv.len,
7451 			(tdata->digest_enc.offset == 0 ?
7452 				plaintext_pad_len
7453 				: tdata->digest_enc.offset),
7454 			tdata->validCipherLen.len_bits,
7455 			tdata->cipher.offset_bits,
7456 			tdata->validAuthLen.len_bits,
7457 			tdata->auth.offset_bits,
7458 			op_mode, 1, verify);
7459 
7460 	if (retval < 0)
7461 		return retval;
7462 
7463 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7464 
7465 	/* Check if the op failed because the device doesn't */
7466 	/* support this particular combination of algorithms */
7467 	if (op == NULL && ut_params->op->status ==
7468 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7469 		printf("Device doesn't support this mixed combination. "
7470 				"Test Skipped.\n");
7471 		return TEST_SKIPPED;
7472 	}
7473 	ut_params->op = op;
7474 
7475 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7476 
7477 	ut_params->obuf = (op_mode == IN_PLACE ?
7478 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7479 
7480 	if (verify) {
7481 		if (ut_params->obuf)
7482 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7483 					plaintext_len, buffer);
7484 		else
7485 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7486 					plaintext_len, buffer);
7487 
7488 		debug_hexdump(stdout, "plaintext:", plaintext,
7489 				(tdata->plaintext.len_bits >> 3) -
7490 				tdata->digest_enc.len);
7491 		debug_hexdump(stdout, "plaintext expected:",
7492 				tdata->plaintext.data,
7493 				(tdata->plaintext.len_bits >> 3) -
7494 				tdata->digest_enc.len);
7495 	} else {
7496 		if (ut_params->obuf)
7497 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7498 					ciphertext_len, buffer);
7499 		else
7500 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7501 					ciphertext_len, buffer);
7502 
7503 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7504 			ciphertext_len);
7505 		debug_hexdump(stdout, "ciphertext expected:",
7506 			tdata->ciphertext.data,
7507 			tdata->ciphertext.len_bits >> 3);
7508 
7509 		if (ut_params->obuf)
7510 			digest = rte_pktmbuf_read(ut_params->obuf,
7511 					(tdata->digest_enc.offset == 0 ?
7512 						plaintext_pad_len :
7513 						tdata->digest_enc.offset),
7514 					tdata->digest_enc.len, digest_buffer);
7515 		else
7516 			digest = rte_pktmbuf_read(ut_params->ibuf,
7517 					(tdata->digest_enc.offset == 0 ?
7518 						plaintext_pad_len :
7519 						tdata->digest_enc.offset),
7520 					tdata->digest_enc.len, digest_buffer);
7521 
7522 		debug_hexdump(stdout, "digest:", digest,
7523 				tdata->digest_enc.len);
7524 		debug_hexdump(stdout, "digest expected:",
7525 				tdata->digest_enc.data, tdata->digest_enc.len);
7526 	}
7527 
7528 	/* Validate obuf */
7529 	if (verify) {
7530 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7531 				plaintext,
7532 				tdata->plaintext.data,
7533 				tdata->plaintext.len_bits >> 3,
7534 				"Plaintext data not as expected");
7535 	} else {
7536 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7537 				ciphertext,
7538 				tdata->ciphertext.data,
7539 				tdata->validDataLen.len_bits,
7540 				"Ciphertext data not as expected");
7541 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7542 				digest,
7543 				tdata->digest_enc.data,
7544 				tdata->digest_enc.len,
7545 				"Generated auth tag not as expected");
7546 	}
7547 
7548 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7549 			"crypto op processing failed");
7550 
7551 	return 0;
7552 }
7553 
7554 /** AUTH AES CMAC + CIPHER AES CTR */
7555 
7556 static int
7557 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7558 {
7559 	return test_mixed_auth_cipher(
7560 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7561 }
7562 
7563 static int
7564 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7565 {
7566 	return test_mixed_auth_cipher(
7567 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7568 }
7569 
7570 static int
7571 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7572 {
7573 	return test_mixed_auth_cipher_sgl(
7574 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7575 }
7576 
7577 static int
7578 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7579 {
7580 	return test_mixed_auth_cipher_sgl(
7581 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7582 }
7583 
7584 static int
7585 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7586 {
7587 	return test_mixed_auth_cipher(
7588 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7589 }
7590 
7591 static int
7592 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7593 {
7594 	return test_mixed_auth_cipher(
7595 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7596 }
7597 
7598 static int
7599 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7600 {
7601 	return test_mixed_auth_cipher_sgl(
7602 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7603 }
7604 
7605 static int
7606 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7607 {
7608 	return test_mixed_auth_cipher_sgl(
7609 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7610 }
7611 
7612 /** MIXED AUTH + CIPHER */
7613 
7614 static int
7615 test_auth_zuc_cipher_snow_test_case_1(void)
7616 {
7617 	return test_mixed_auth_cipher(
7618 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7619 }
7620 
7621 static int
7622 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7623 {
7624 	return test_mixed_auth_cipher(
7625 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7626 }
7627 
7628 static int
7629 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7630 {
7631 	return test_mixed_auth_cipher(
7632 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7633 }
7634 
7635 static int
7636 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7637 {
7638 	return test_mixed_auth_cipher(
7639 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7640 }
7641 
7642 static int
7643 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7644 {
7645 	return test_mixed_auth_cipher(
7646 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7647 }
7648 
7649 static int
7650 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7651 {
7652 	return test_mixed_auth_cipher(
7653 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7654 }
7655 
7656 static int
7657 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7658 {
7659 	return test_mixed_auth_cipher(
7660 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7661 }
7662 
7663 static int
7664 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7665 {
7666 	return test_mixed_auth_cipher(
7667 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7668 }
7669 
7670 static int
7671 test_auth_snow_cipher_zuc_test_case_1(void)
7672 {
7673 	return test_mixed_auth_cipher(
7674 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7675 }
7676 
7677 static int
7678 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7679 {
7680 	return test_mixed_auth_cipher(
7681 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7682 }
7683 
7684 static int
7685 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7686 {
7687 	return test_mixed_auth_cipher(
7688 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7689 }
7690 
7691 static int
7692 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7693 {
7694 	return test_mixed_auth_cipher(
7695 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7696 }
7697 
7698 static int
7699 test_auth_null_cipher_snow_test_case_1(void)
7700 {
7701 	return test_mixed_auth_cipher(
7702 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7703 }
7704 
7705 static int
7706 test_verify_auth_null_cipher_snow_test_case_1(void)
7707 {
7708 	return test_mixed_auth_cipher(
7709 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7710 }
7711 
7712 static int
7713 test_auth_null_cipher_zuc_test_case_1(void)
7714 {
7715 	return test_mixed_auth_cipher(
7716 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7717 }
7718 
7719 static int
7720 test_verify_auth_null_cipher_zuc_test_case_1(void)
7721 {
7722 	return test_mixed_auth_cipher(
7723 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7724 }
7725 
7726 static int
7727 test_auth_snow_cipher_null_test_case_1(void)
7728 {
7729 	return test_mixed_auth_cipher(
7730 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7731 }
7732 
7733 static int
7734 test_verify_auth_snow_cipher_null_test_case_1(void)
7735 {
7736 	return test_mixed_auth_cipher(
7737 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7738 }
7739 
7740 static int
7741 test_auth_zuc_cipher_null_test_case_1(void)
7742 {
7743 	return test_mixed_auth_cipher(
7744 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7745 }
7746 
7747 static int
7748 test_verify_auth_zuc_cipher_null_test_case_1(void)
7749 {
7750 	return test_mixed_auth_cipher(
7751 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7752 }
7753 
7754 static int
7755 test_auth_null_cipher_aes_ctr_test_case_1(void)
7756 {
7757 	return test_mixed_auth_cipher(
7758 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7759 }
7760 
7761 static int
7762 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7763 {
7764 	return test_mixed_auth_cipher(
7765 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7766 }
7767 
7768 static int
7769 test_auth_aes_cmac_cipher_null_test_case_1(void)
7770 {
7771 	return test_mixed_auth_cipher(
7772 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7773 }
7774 
7775 static int
7776 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7777 {
7778 	return test_mixed_auth_cipher(
7779 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7780 }
7781 
7782 /* ***** AEAD algorithm Tests ***** */
7783 
7784 static int
7785 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7786 		enum rte_crypto_aead_operation op,
7787 		const uint8_t *key, const uint8_t key_len,
7788 		const uint16_t aad_len, const uint8_t auth_len,
7789 		uint8_t iv_len)
7790 {
7791 	uint8_t aead_key[key_len];
7792 
7793 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7794 	struct crypto_unittest_params *ut_params = &unittest_params;
7795 
7796 	memcpy(aead_key, key, key_len);
7797 
7798 	/* Setup AEAD Parameters */
7799 	ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7800 	ut_params->aead_xform.next = NULL;
7801 	ut_params->aead_xform.aead.algo = algo;
7802 	ut_params->aead_xform.aead.op = op;
7803 	ut_params->aead_xform.aead.key.data = aead_key;
7804 	ut_params->aead_xform.aead.key.length = key_len;
7805 	ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7806 	ut_params->aead_xform.aead.iv.length = iv_len;
7807 	ut_params->aead_xform.aead.digest_length = auth_len;
7808 	ut_params->aead_xform.aead.aad_length = aad_len;
7809 
7810 	debug_hexdump(stdout, "key:", key, key_len);
7811 
7812 	/* Create Crypto session*/
7813 	ut_params->sess = rte_cryptodev_sym_session_create(
7814 			ts_params->session_mpool);
7815 
7816 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7817 			&ut_params->aead_xform,
7818 			ts_params->session_priv_mpool);
7819 
7820 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7821 
7822 	return 0;
7823 }
7824 
7825 static int
7826 create_aead_xform(struct rte_crypto_op *op,
7827 		enum rte_crypto_aead_algorithm algo,
7828 		enum rte_crypto_aead_operation aead_op,
7829 		uint8_t *key, const uint8_t key_len,
7830 		const uint8_t aad_len, const uint8_t auth_len,
7831 		uint8_t iv_len)
7832 {
7833 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7834 			"failed to allocate space for crypto transform");
7835 
7836 	struct rte_crypto_sym_op *sym_op = op->sym;
7837 
7838 	/* Setup AEAD Parameters */
7839 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7840 	sym_op->xform->next = NULL;
7841 	sym_op->xform->aead.algo = algo;
7842 	sym_op->xform->aead.op = aead_op;
7843 	sym_op->xform->aead.key.data = key;
7844 	sym_op->xform->aead.key.length = key_len;
7845 	sym_op->xform->aead.iv.offset = IV_OFFSET;
7846 	sym_op->xform->aead.iv.length = iv_len;
7847 	sym_op->xform->aead.digest_length = auth_len;
7848 	sym_op->xform->aead.aad_length = aad_len;
7849 
7850 	debug_hexdump(stdout, "key:", key, key_len);
7851 
7852 	return 0;
7853 }
7854 
7855 static int
7856 create_aead_operation(enum rte_crypto_aead_operation op,
7857 		const struct aead_test_data *tdata)
7858 {
7859 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7860 	struct crypto_unittest_params *ut_params = &unittest_params;
7861 
7862 	uint8_t *plaintext, *ciphertext;
7863 	unsigned int aad_pad_len, plaintext_pad_len;
7864 
7865 	/* Generate Crypto op data structure */
7866 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7867 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7868 	TEST_ASSERT_NOT_NULL(ut_params->op,
7869 			"Failed to allocate symmetric crypto operation struct");
7870 
7871 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7872 
7873 	/* Append aad data */
7874 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
7875 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
7876 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7877 				aad_pad_len);
7878 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7879 				"no room to append aad");
7880 
7881 		sym_op->aead.aad.phys_addr =
7882 				rte_pktmbuf_iova(ut_params->ibuf);
7883 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
7884 		memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
7885 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7886 			tdata->aad.len);
7887 
7888 		/* Append IV at the end of the crypto operation*/
7889 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7890 				uint8_t *, IV_OFFSET);
7891 
7892 		/* Copy IV 1 byte after the IV pointer, according to the API */
7893 		rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
7894 		debug_hexdump(stdout, "iv:", iv_ptr,
7895 			tdata->iv.len);
7896 	} else {
7897 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
7898 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7899 				aad_pad_len);
7900 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7901 				"no room to append aad");
7902 
7903 		sym_op->aead.aad.phys_addr =
7904 				rte_pktmbuf_iova(ut_params->ibuf);
7905 		memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
7906 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7907 			tdata->aad.len);
7908 
7909 		/* Append IV at the end of the crypto operation*/
7910 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7911 				uint8_t *, IV_OFFSET);
7912 
7913 		if (tdata->iv.len == 0) {
7914 			rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
7915 			debug_hexdump(stdout, "iv:", iv_ptr,
7916 				AES_GCM_J0_LENGTH);
7917 		} else {
7918 			rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
7919 			debug_hexdump(stdout, "iv:", iv_ptr,
7920 				tdata->iv.len);
7921 		}
7922 	}
7923 
7924 	/* Append plaintext/ciphertext */
7925 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7926 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7927 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7928 				plaintext_pad_len);
7929 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7930 
7931 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
7932 		debug_hexdump(stdout, "plaintext:", plaintext,
7933 				tdata->plaintext.len);
7934 
7935 		if (ut_params->obuf) {
7936 			ciphertext = (uint8_t *)rte_pktmbuf_append(
7937 					ut_params->obuf,
7938 					plaintext_pad_len + aad_pad_len);
7939 			TEST_ASSERT_NOT_NULL(ciphertext,
7940 					"no room to append ciphertext");
7941 
7942 			memset(ciphertext + aad_pad_len, 0,
7943 					tdata->ciphertext.len);
7944 		}
7945 	} else {
7946 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
7947 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7948 				plaintext_pad_len);
7949 		TEST_ASSERT_NOT_NULL(ciphertext,
7950 				"no room to append ciphertext");
7951 
7952 		memcpy(ciphertext, tdata->ciphertext.data,
7953 				tdata->ciphertext.len);
7954 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7955 				tdata->ciphertext.len);
7956 
7957 		if (ut_params->obuf) {
7958 			plaintext = (uint8_t *)rte_pktmbuf_append(
7959 					ut_params->obuf,
7960 					plaintext_pad_len + aad_pad_len);
7961 			TEST_ASSERT_NOT_NULL(plaintext,
7962 					"no room to append plaintext");
7963 
7964 			memset(plaintext + aad_pad_len, 0,
7965 					tdata->plaintext.len);
7966 		}
7967 	}
7968 
7969 	/* Append digest data */
7970 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7971 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7972 				ut_params->obuf ? ut_params->obuf :
7973 						ut_params->ibuf,
7974 						tdata->auth_tag.len);
7975 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7976 				"no room to append digest");
7977 		memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
7978 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7979 				ut_params->obuf ? ut_params->obuf :
7980 						ut_params->ibuf,
7981 						plaintext_pad_len +
7982 						aad_pad_len);
7983 	} else {
7984 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7985 				ut_params->ibuf, tdata->auth_tag.len);
7986 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7987 				"no room to append digest");
7988 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7989 				ut_params->ibuf,
7990 				plaintext_pad_len + aad_pad_len);
7991 
7992 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
7993 			tdata->auth_tag.len);
7994 		debug_hexdump(stdout, "digest:",
7995 			sym_op->aead.digest.data,
7996 			tdata->auth_tag.len);
7997 	}
7998 
7999 	sym_op->aead.data.length = tdata->plaintext.len;
8000 	sym_op->aead.data.offset = aad_pad_len;
8001 
8002 	return 0;
8003 }
8004 
8005 static int
8006 test_authenticated_encryption(const struct aead_test_data *tdata)
8007 {
8008 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8009 	struct crypto_unittest_params *ut_params = &unittest_params;
8010 
8011 	int retval;
8012 	uint8_t *ciphertext, *auth_tag;
8013 	uint16_t plaintext_pad_len;
8014 	uint32_t i;
8015 	struct rte_cryptodev_info dev_info;
8016 
8017 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8018 	uint64_t feat_flags = dev_info.feature_flags;
8019 
8020 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8021 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8022 		printf("Device doesn't support RAW data-path APIs.\n");
8023 		return TEST_SKIPPED;
8024 	}
8025 
8026 	/* Verify the capabilities */
8027 	struct rte_cryptodev_sym_capability_idx cap_idx;
8028 	const struct rte_cryptodev_symmetric_capability *capability;
8029 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8030 	cap_idx.algo.aead = tdata->algo;
8031 	capability = rte_cryptodev_sym_capability_get(
8032 			ts_params->valid_devs[0], &cap_idx);
8033 	if (capability == NULL)
8034 		return TEST_SKIPPED;
8035 	if (rte_cryptodev_sym_capability_check_aead(
8036 			capability, tdata->key.len, tdata->auth_tag.len,
8037 			tdata->aad.len, tdata->iv.len))
8038 		return TEST_SKIPPED;
8039 
8040 	/* Create AEAD session */
8041 	retval = create_aead_session(ts_params->valid_devs[0],
8042 			tdata->algo,
8043 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
8044 			tdata->key.data, tdata->key.len,
8045 			tdata->aad.len, tdata->auth_tag.len,
8046 			tdata->iv.len);
8047 	if (retval < 0)
8048 		return retval;
8049 
8050 	if (tdata->aad.len > MBUF_SIZE) {
8051 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8052 		/* Populate full size of add data */
8053 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8054 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8055 	} else
8056 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8057 
8058 	/* clear mbuf payload */
8059 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8060 			rte_pktmbuf_tailroom(ut_params->ibuf));
8061 
8062 	/* Create AEAD operation */
8063 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8064 	if (retval < 0)
8065 		return retval;
8066 
8067 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8068 
8069 	ut_params->op->sym->m_src = ut_params->ibuf;
8070 
8071 	/* Process crypto operation */
8072 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8073 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8074 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8075 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8076 				ut_params->op, 0, 0, 0, 0);
8077 	else
8078 		TEST_ASSERT_NOT_NULL(
8079 			process_crypto_request(ts_params->valid_devs[0],
8080 			ut_params->op), "failed to process sym crypto op");
8081 
8082 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8083 			"crypto op processing failed");
8084 
8085 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8086 
8087 	if (ut_params->op->sym->m_dst) {
8088 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8089 				uint8_t *);
8090 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8091 				uint8_t *, plaintext_pad_len);
8092 	} else {
8093 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8094 				uint8_t *,
8095 				ut_params->op->sym->cipher.data.offset);
8096 		auth_tag = ciphertext + plaintext_pad_len;
8097 	}
8098 
8099 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8100 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8101 
8102 	/* Validate obuf */
8103 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8104 			ciphertext,
8105 			tdata->ciphertext.data,
8106 			tdata->ciphertext.len,
8107 			"Ciphertext data not as expected");
8108 
8109 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8110 			auth_tag,
8111 			tdata->auth_tag.data,
8112 			tdata->auth_tag.len,
8113 			"Generated auth tag not as expected");
8114 
8115 	return 0;
8116 
8117 }
8118 
8119 #ifdef RTE_LIB_SECURITY
8120 static int
8121 security_proto_supported(enum rte_security_session_action_type action,
8122 	enum rte_security_session_protocol proto)
8123 {
8124 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8125 
8126 	const struct rte_security_capability *capabilities;
8127 	const struct rte_security_capability *capability;
8128 	uint16_t i = 0;
8129 
8130 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8131 				rte_cryptodev_get_sec_ctx(
8132 				ts_params->valid_devs[0]);
8133 
8134 
8135 	capabilities = rte_security_capabilities_get(ctx);
8136 
8137 	if (capabilities == NULL)
8138 		return -ENOTSUP;
8139 
8140 	while ((capability = &capabilities[i++])->action !=
8141 			RTE_SECURITY_ACTION_TYPE_NONE) {
8142 		if (capability->action == action &&
8143 				capability->protocol == proto)
8144 			return 0;
8145 	}
8146 
8147 	return -ENOTSUP;
8148 }
8149 
8150 /* Basic algorithm run function for async inplace mode.
8151  * Creates a session from input parameters and runs one operation
8152  * on input_vec. Checks the output of the crypto operation against
8153  * output_vec.
8154  */
8155 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8156 			   enum rte_crypto_auth_operation opa,
8157 			   const uint8_t *input_vec, unsigned int input_vec_len,
8158 			   const uint8_t *output_vec,
8159 			   unsigned int output_vec_len,
8160 			   enum rte_crypto_cipher_algorithm cipher_alg,
8161 			   const uint8_t *cipher_key, uint32_t cipher_key_len,
8162 			   enum rte_crypto_auth_algorithm auth_alg,
8163 			   const uint8_t *auth_key, uint32_t auth_key_len,
8164 			   uint8_t bearer, enum rte_security_pdcp_domain domain,
8165 			   uint8_t packet_direction, uint8_t sn_size,
8166 			   uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8167 {
8168 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8169 	struct crypto_unittest_params *ut_params = &unittest_params;
8170 	uint8_t *plaintext;
8171 	int ret = TEST_SUCCESS;
8172 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8173 				rte_cryptodev_get_sec_ctx(
8174 				ts_params->valid_devs[0]);
8175 
8176 	/* Verify the capabilities */
8177 	struct rte_security_capability_idx sec_cap_idx;
8178 
8179 	sec_cap_idx.action = ut_params->type;
8180 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8181 	sec_cap_idx.pdcp.domain = domain;
8182 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8183 		return TEST_SKIPPED;
8184 
8185 	/* Generate test mbuf data */
8186 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8187 
8188 	/* clear mbuf payload */
8189 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8190 			rte_pktmbuf_tailroom(ut_params->ibuf));
8191 
8192 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8193 						  input_vec_len);
8194 	memcpy(plaintext, input_vec, input_vec_len);
8195 
8196 	/* Out of place support */
8197 	if (oop) {
8198 		/*
8199 		 * For out-op-place we need to alloc another mbuf
8200 		 */
8201 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8202 		rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8203 	}
8204 
8205 	/* Setup Cipher Parameters */
8206 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8207 	ut_params->cipher_xform.cipher.algo = cipher_alg;
8208 	ut_params->cipher_xform.cipher.op = opc;
8209 	ut_params->cipher_xform.cipher.key.data = cipher_key;
8210 	ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8211 	ut_params->cipher_xform.cipher.iv.length =
8212 				packet_direction ? 4 : 0;
8213 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8214 
8215 	/* Setup HMAC Parameters if ICV header is required */
8216 	if (auth_alg != 0) {
8217 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8218 		ut_params->auth_xform.next = NULL;
8219 		ut_params->auth_xform.auth.algo = auth_alg;
8220 		ut_params->auth_xform.auth.op = opa;
8221 		ut_params->auth_xform.auth.key.data = auth_key;
8222 		ut_params->auth_xform.auth.key.length = auth_key_len;
8223 
8224 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8225 	} else {
8226 		ut_params->cipher_xform.next = NULL;
8227 	}
8228 
8229 	struct rte_security_session_conf sess_conf = {
8230 		.action_type = ut_params->type,
8231 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8232 		{.pdcp = {
8233 			.bearer = bearer,
8234 			.domain = domain,
8235 			.pkt_dir = packet_direction,
8236 			.sn_size = sn_size,
8237 			.hfn = packet_direction ? 0 : hfn,
8238 			/**
8239 			 * hfn can be set as pdcp_test_hfn[i]
8240 			 * if hfn_ovrd is not set. Here, PDCP
8241 			 * packet direction is just used to
8242 			 * run half of the cases with session
8243 			 * HFN and other half with per packet
8244 			 * HFN.
8245 			 */
8246 			.hfn_threshold = hfn_threshold,
8247 			.hfn_ovrd = packet_direction ? 1 : 0,
8248 			.sdap_enabled = sdap,
8249 		} },
8250 		.crypto_xform = &ut_params->cipher_xform
8251 	};
8252 
8253 	/* Create security session */
8254 	ut_params->sec_session = rte_security_session_create(ctx,
8255 				&sess_conf, ts_params->session_mpool,
8256 				ts_params->session_priv_mpool);
8257 
8258 	if (!ut_params->sec_session) {
8259 		printf("TestCase %s()-%d line %d failed %s: ",
8260 			__func__, i, __LINE__, "Failed to allocate session");
8261 		ret = TEST_FAILED;
8262 		goto on_err;
8263 	}
8264 
8265 	/* Generate crypto op data structure */
8266 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8267 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8268 	if (!ut_params->op) {
8269 		printf("TestCase %s()-%d line %d failed %s: ",
8270 			__func__, i, __LINE__,
8271 			"Failed to allocate symmetric crypto operation struct");
8272 		ret = TEST_FAILED;
8273 		goto on_err;
8274 	}
8275 
8276 	uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8277 					uint32_t *, IV_OFFSET);
8278 	*per_pkt_hfn = packet_direction ? hfn : 0;
8279 
8280 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8281 
8282 	/* set crypto operation source mbuf */
8283 	ut_params->op->sym->m_src = ut_params->ibuf;
8284 	if (oop)
8285 		ut_params->op->sym->m_dst = ut_params->obuf;
8286 
8287 	/* Process crypto operation */
8288 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8289 		== NULL) {
8290 		printf("TestCase %s()-%d line %d failed %s: ",
8291 			__func__, i, __LINE__,
8292 			"failed to process sym crypto op");
8293 		ret = TEST_FAILED;
8294 		goto on_err;
8295 	}
8296 
8297 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8298 		printf("TestCase %s()-%d line %d failed %s: ",
8299 			__func__, i, __LINE__, "crypto op processing failed");
8300 		ret = TEST_FAILED;
8301 		goto on_err;
8302 	}
8303 
8304 	/* Validate obuf */
8305 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8306 			uint8_t *);
8307 	if (oop) {
8308 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8309 				uint8_t *);
8310 	}
8311 
8312 	if (memcmp(ciphertext, output_vec, output_vec_len)) {
8313 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8314 		rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8315 		rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8316 		ret = TEST_FAILED;
8317 		goto on_err;
8318 	}
8319 
8320 on_err:
8321 	rte_crypto_op_free(ut_params->op);
8322 	ut_params->op = NULL;
8323 
8324 	if (ut_params->sec_session)
8325 		rte_security_session_destroy(ctx, ut_params->sec_session);
8326 	ut_params->sec_session = NULL;
8327 
8328 	rte_pktmbuf_free(ut_params->ibuf);
8329 	ut_params->ibuf = NULL;
8330 	if (oop) {
8331 		rte_pktmbuf_free(ut_params->obuf);
8332 		ut_params->obuf = NULL;
8333 	}
8334 
8335 	return ret;
8336 }
8337 
8338 static int
8339 test_pdcp_proto_SGL(int i, int oop,
8340 	enum rte_crypto_cipher_operation opc,
8341 	enum rte_crypto_auth_operation opa,
8342 	uint8_t *input_vec,
8343 	unsigned int input_vec_len,
8344 	uint8_t *output_vec,
8345 	unsigned int output_vec_len,
8346 	uint32_t fragsz,
8347 	uint32_t fragsz_oop)
8348 {
8349 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8350 	struct crypto_unittest_params *ut_params = &unittest_params;
8351 	uint8_t *plaintext;
8352 	struct rte_mbuf *buf, *buf_oop = NULL;
8353 	int ret = TEST_SUCCESS;
8354 	int to_trn = 0;
8355 	int to_trn_tbl[16];
8356 	int segs = 1;
8357 	unsigned int trn_data = 0;
8358 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8359 				rte_cryptodev_get_sec_ctx(
8360 				ts_params->valid_devs[0]);
8361 
8362 	/* Verify the capabilities */
8363 	struct rte_security_capability_idx sec_cap_idx;
8364 
8365 	sec_cap_idx.action = ut_params->type;
8366 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8367 	sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8368 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8369 		return TEST_SKIPPED;
8370 
8371 	if (fragsz > input_vec_len)
8372 		fragsz = input_vec_len;
8373 
8374 	uint16_t plaintext_len = fragsz;
8375 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8376 
8377 	if (fragsz_oop > output_vec_len)
8378 		frag_size_oop = output_vec_len;
8379 
8380 	int ecx = 0;
8381 	if (input_vec_len % fragsz != 0) {
8382 		if (input_vec_len / fragsz + 1 > 16)
8383 			return 1;
8384 	} else if (input_vec_len / fragsz > 16)
8385 		return 1;
8386 
8387 	/* Out of place support */
8388 	if (oop) {
8389 		/*
8390 		 * For out-op-place we need to alloc another mbuf
8391 		 */
8392 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8393 		rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8394 		buf_oop = ut_params->obuf;
8395 	}
8396 
8397 	/* Generate test mbuf data */
8398 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8399 
8400 	/* clear mbuf payload */
8401 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8402 			rte_pktmbuf_tailroom(ut_params->ibuf));
8403 
8404 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8405 						  plaintext_len);
8406 	memcpy(plaintext, input_vec, plaintext_len);
8407 	trn_data += plaintext_len;
8408 
8409 	buf = ut_params->ibuf;
8410 
8411 	/*
8412 	 * Loop until no more fragments
8413 	 */
8414 
8415 	while (trn_data < input_vec_len) {
8416 		++segs;
8417 		to_trn = (input_vec_len - trn_data < fragsz) ?
8418 				(input_vec_len - trn_data) : fragsz;
8419 
8420 		to_trn_tbl[ecx++] = to_trn;
8421 
8422 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8423 		buf = buf->next;
8424 
8425 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8426 				rte_pktmbuf_tailroom(buf));
8427 
8428 		/* OOP */
8429 		if (oop && !fragsz_oop) {
8430 			buf_oop->next =
8431 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
8432 			buf_oop = buf_oop->next;
8433 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8434 					0, rte_pktmbuf_tailroom(buf_oop));
8435 			rte_pktmbuf_append(buf_oop, to_trn);
8436 		}
8437 
8438 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8439 				to_trn);
8440 
8441 		memcpy(plaintext, input_vec + trn_data, to_trn);
8442 		trn_data += to_trn;
8443 	}
8444 
8445 	ut_params->ibuf->nb_segs = segs;
8446 
8447 	segs = 1;
8448 	if (fragsz_oop && oop) {
8449 		to_trn = 0;
8450 		ecx = 0;
8451 
8452 		trn_data = frag_size_oop;
8453 		while (trn_data < output_vec_len) {
8454 			++segs;
8455 			to_trn =
8456 				(output_vec_len - trn_data <
8457 						frag_size_oop) ?
8458 				(output_vec_len - trn_data) :
8459 						frag_size_oop;
8460 
8461 			to_trn_tbl[ecx++] = to_trn;
8462 
8463 			buf_oop->next =
8464 				rte_pktmbuf_alloc(ts_params->mbuf_pool);
8465 			buf_oop = buf_oop->next;
8466 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8467 					0, rte_pktmbuf_tailroom(buf_oop));
8468 			rte_pktmbuf_append(buf_oop, to_trn);
8469 
8470 			trn_data += to_trn;
8471 		}
8472 		ut_params->obuf->nb_segs = segs;
8473 	}
8474 
8475 	/* Setup Cipher Parameters */
8476 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8477 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8478 	ut_params->cipher_xform.cipher.op = opc;
8479 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8480 	ut_params->cipher_xform.cipher.key.length =
8481 					pdcp_test_params[i].cipher_key_len;
8482 	ut_params->cipher_xform.cipher.iv.length = 0;
8483 
8484 	/* Setup HMAC Parameters if ICV header is required */
8485 	if (pdcp_test_params[i].auth_alg != 0) {
8486 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8487 		ut_params->auth_xform.next = NULL;
8488 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8489 		ut_params->auth_xform.auth.op = opa;
8490 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8491 		ut_params->auth_xform.auth.key.length =
8492 					pdcp_test_params[i].auth_key_len;
8493 
8494 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8495 	} else {
8496 		ut_params->cipher_xform.next = NULL;
8497 	}
8498 
8499 	struct rte_security_session_conf sess_conf = {
8500 		.action_type = ut_params->type,
8501 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8502 		{.pdcp = {
8503 			.bearer = pdcp_test_bearer[i],
8504 			.domain = pdcp_test_params[i].domain,
8505 			.pkt_dir = pdcp_test_packet_direction[i],
8506 			.sn_size = pdcp_test_data_sn_size[i],
8507 			.hfn = pdcp_test_hfn[i],
8508 			.hfn_threshold = pdcp_test_hfn_threshold[i],
8509 			.hfn_ovrd = 0,
8510 		} },
8511 		.crypto_xform = &ut_params->cipher_xform
8512 	};
8513 
8514 	/* Create security session */
8515 	ut_params->sec_session = rte_security_session_create(ctx,
8516 				&sess_conf, ts_params->session_mpool,
8517 				ts_params->session_priv_mpool);
8518 
8519 	if (!ut_params->sec_session) {
8520 		printf("TestCase %s()-%d line %d failed %s: ",
8521 			__func__, i, __LINE__, "Failed to allocate session");
8522 		ret = TEST_FAILED;
8523 		goto on_err;
8524 	}
8525 
8526 	/* Generate crypto op data structure */
8527 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8528 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8529 	if (!ut_params->op) {
8530 		printf("TestCase %s()-%d line %d failed %s: ",
8531 			__func__, i, __LINE__,
8532 			"Failed to allocate symmetric crypto operation struct");
8533 		ret = TEST_FAILED;
8534 		goto on_err;
8535 	}
8536 
8537 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8538 
8539 	/* set crypto operation source mbuf */
8540 	ut_params->op->sym->m_src = ut_params->ibuf;
8541 	if (oop)
8542 		ut_params->op->sym->m_dst = ut_params->obuf;
8543 
8544 	/* Process crypto operation */
8545 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8546 		== NULL) {
8547 		printf("TestCase %s()-%d line %d failed %s: ",
8548 			__func__, i, __LINE__,
8549 			"failed to process sym crypto op");
8550 		ret = TEST_FAILED;
8551 		goto on_err;
8552 	}
8553 
8554 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8555 		printf("TestCase %s()-%d line %d failed %s: ",
8556 			__func__, i, __LINE__, "crypto op processing failed");
8557 		ret = TEST_FAILED;
8558 		goto on_err;
8559 	}
8560 
8561 	/* Validate obuf */
8562 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8563 			uint8_t *);
8564 	if (oop) {
8565 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8566 				uint8_t *);
8567 	}
8568 	if (fragsz_oop)
8569 		fragsz = frag_size_oop;
8570 	if (memcmp(ciphertext, output_vec, fragsz)) {
8571 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8572 		rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8573 		rte_hexdump(stdout, "reference", output_vec, fragsz);
8574 		ret = TEST_FAILED;
8575 		goto on_err;
8576 	}
8577 
8578 	buf = ut_params->op->sym->m_src->next;
8579 	if (oop)
8580 		buf = ut_params->op->sym->m_dst->next;
8581 
8582 	unsigned int off = fragsz;
8583 
8584 	ecx = 0;
8585 	while (buf) {
8586 		ciphertext = rte_pktmbuf_mtod(buf,
8587 				uint8_t *);
8588 		if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8589 			printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8590 			rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8591 			rte_hexdump(stdout, "reference", output_vec + off,
8592 					to_trn_tbl[ecx]);
8593 			ret = TEST_FAILED;
8594 			goto on_err;
8595 		}
8596 		off += to_trn_tbl[ecx++];
8597 		buf = buf->next;
8598 	}
8599 on_err:
8600 	rte_crypto_op_free(ut_params->op);
8601 	ut_params->op = NULL;
8602 
8603 	if (ut_params->sec_session)
8604 		rte_security_session_destroy(ctx, ut_params->sec_session);
8605 	ut_params->sec_session = NULL;
8606 
8607 	rte_pktmbuf_free(ut_params->ibuf);
8608 	ut_params->ibuf = NULL;
8609 	if (oop) {
8610 		rte_pktmbuf_free(ut_params->obuf);
8611 		ut_params->obuf = NULL;
8612 	}
8613 
8614 	return ret;
8615 }
8616 
8617 int
8618 test_pdcp_proto_cplane_encap(int i)
8619 {
8620 	return test_pdcp_proto(
8621 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8622 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8623 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8624 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8625 		pdcp_test_params[i].cipher_key_len,
8626 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8627 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8628 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8629 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8630 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8631 }
8632 
8633 int
8634 test_pdcp_proto_uplane_encap(int i)
8635 {
8636 	return test_pdcp_proto(
8637 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8638 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8639 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8640 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8641 		pdcp_test_params[i].cipher_key_len,
8642 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8643 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8644 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8645 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8646 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8647 }
8648 
8649 int
8650 test_pdcp_proto_uplane_encap_with_int(int i)
8651 {
8652 	return test_pdcp_proto(
8653 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8654 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8655 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8656 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8657 		pdcp_test_params[i].cipher_key_len,
8658 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8659 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8660 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8661 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8662 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8663 }
8664 
8665 int
8666 test_pdcp_proto_cplane_decap(int i)
8667 {
8668 	return test_pdcp_proto(
8669 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8670 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8671 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8672 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8673 		pdcp_test_params[i].cipher_key_len,
8674 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8675 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8676 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8677 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8678 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8679 }
8680 
8681 int
8682 test_pdcp_proto_uplane_decap(int i)
8683 {
8684 	return test_pdcp_proto(
8685 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8686 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8687 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8688 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8689 		pdcp_test_params[i].cipher_key_len,
8690 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8691 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8692 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8693 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8694 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8695 }
8696 
8697 int
8698 test_pdcp_proto_uplane_decap_with_int(int i)
8699 {
8700 	return test_pdcp_proto(
8701 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8702 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8703 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8704 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8705 		pdcp_test_params[i].cipher_key_len,
8706 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8707 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8708 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8709 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8710 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8711 }
8712 
8713 static int
8714 test_PDCP_PROTO_SGL_in_place_32B(void)
8715 {
8716 	/* i can be used for running any PDCP case
8717 	 * In this case it is uplane 12-bit AES-SNOW DL encap
8718 	 */
8719 	int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8720 	return test_pdcp_proto_SGL(i, IN_PLACE,
8721 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8722 			RTE_CRYPTO_AUTH_OP_GENERATE,
8723 			pdcp_test_data_in[i],
8724 			pdcp_test_data_in_len[i],
8725 			pdcp_test_data_out[i],
8726 			pdcp_test_data_in_len[i]+4,
8727 			32, 0);
8728 }
8729 static int
8730 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8731 {
8732 	/* i can be used for running any PDCP case
8733 	 * In this case it is uplane 18-bit NULL-NULL DL encap
8734 	 */
8735 	int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8736 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8737 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8738 			RTE_CRYPTO_AUTH_OP_GENERATE,
8739 			pdcp_test_data_in[i],
8740 			pdcp_test_data_in_len[i],
8741 			pdcp_test_data_out[i],
8742 			pdcp_test_data_in_len[i]+4,
8743 			32, 128);
8744 }
8745 static int
8746 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8747 {
8748 	/* i can be used for running any PDCP case
8749 	 * In this case it is uplane 18-bit AES DL encap
8750 	 */
8751 	int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8752 			+ DOWNLINK;
8753 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8754 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8755 			RTE_CRYPTO_AUTH_OP_GENERATE,
8756 			pdcp_test_data_in[i],
8757 			pdcp_test_data_in_len[i],
8758 			pdcp_test_data_out[i],
8759 			pdcp_test_data_in_len[i],
8760 			32, 40);
8761 }
8762 static int
8763 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8764 {
8765 	/* i can be used for running any PDCP case
8766 	 * In this case it is cplane 12-bit AES-ZUC DL encap
8767 	 */
8768 	int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8769 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8770 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8771 			RTE_CRYPTO_AUTH_OP_GENERATE,
8772 			pdcp_test_data_in[i],
8773 			pdcp_test_data_in_len[i],
8774 			pdcp_test_data_out[i],
8775 			pdcp_test_data_in_len[i]+4,
8776 			128, 32);
8777 }
8778 
8779 static int
8780 test_PDCP_SDAP_PROTO_encap_all(void)
8781 {
8782 	int i = 0, size = 0;
8783 	int err, all_err = TEST_SUCCESS;
8784 	const struct pdcp_sdap_test *cur_test;
8785 
8786 	size = RTE_DIM(list_pdcp_sdap_tests);
8787 
8788 	for (i = 0; i < size; i++) {
8789 		cur_test = &list_pdcp_sdap_tests[i];
8790 		err = test_pdcp_proto(
8791 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8792 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8793 			cur_test->in_len, cur_test->data_out,
8794 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8795 			cur_test->param.cipher_alg, cur_test->cipher_key,
8796 			cur_test->param.cipher_key_len,
8797 			cur_test->param.auth_alg,
8798 			cur_test->auth_key, cur_test->param.auth_key_len,
8799 			cur_test->bearer, cur_test->param.domain,
8800 			cur_test->packet_direction, cur_test->sn_size,
8801 			cur_test->hfn,
8802 			cur_test->hfn_threshold, SDAP_ENABLED);
8803 		if (err) {
8804 			printf("\t%d) %s: Encapsulation failed\n",
8805 					cur_test->test_idx,
8806 					cur_test->param.name);
8807 			err = TEST_FAILED;
8808 		} else {
8809 			printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
8810 					cur_test->param.name);
8811 			err = TEST_SUCCESS;
8812 		}
8813 		all_err += err;
8814 	}
8815 
8816 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8817 
8818 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8819 }
8820 
8821 static int
8822 test_PDCP_PROTO_short_mac(void)
8823 {
8824 	int i = 0, size = 0;
8825 	int err, all_err = TEST_SUCCESS;
8826 	const struct pdcp_short_mac_test *cur_test;
8827 
8828 	size = RTE_DIM(list_pdcp_smac_tests);
8829 
8830 	for (i = 0; i < size; i++) {
8831 		cur_test = &list_pdcp_smac_tests[i];
8832 		err = test_pdcp_proto(
8833 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8834 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8835 			cur_test->in_len, cur_test->data_out,
8836 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8837 			RTE_CRYPTO_CIPHER_NULL, NULL,
8838 			0, cur_test->param.auth_alg,
8839 			cur_test->auth_key, cur_test->param.auth_key_len,
8840 			0, cur_test->param.domain, 0, 0,
8841 			0, 0, 0);
8842 		if (err) {
8843 			printf("\t%d) %s: Short MAC test failed\n",
8844 					cur_test->test_idx,
8845 					cur_test->param.name);
8846 			err = TEST_FAILED;
8847 		} else {
8848 			printf("\t%d) %s: Short MAC test PASS\n",
8849 					cur_test->test_idx,
8850 					cur_test->param.name);
8851 			rte_hexdump(stdout, "MAC I",
8852 				    cur_test->data_out + cur_test->in_len + 2,
8853 				    2);
8854 			err = TEST_SUCCESS;
8855 		}
8856 		all_err += err;
8857 	}
8858 
8859 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8860 
8861 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8862 
8863 }
8864 
8865 static int
8866 test_PDCP_SDAP_PROTO_decap_all(void)
8867 {
8868 	int i = 0, size = 0;
8869 	int err, all_err = TEST_SUCCESS;
8870 	const struct pdcp_sdap_test *cur_test;
8871 
8872 	size = RTE_DIM(list_pdcp_sdap_tests);
8873 
8874 	for (i = 0; i < size; i++) {
8875 		cur_test = &list_pdcp_sdap_tests[i];
8876 		err = test_pdcp_proto(
8877 			i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
8878 			RTE_CRYPTO_AUTH_OP_VERIFY,
8879 			cur_test->data_out,
8880 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8881 			cur_test->data_in, cur_test->in_len,
8882 			cur_test->param.cipher_alg,
8883 			cur_test->cipher_key, cur_test->param.cipher_key_len,
8884 			cur_test->param.auth_alg, cur_test->auth_key,
8885 			cur_test->param.auth_key_len, cur_test->bearer,
8886 			cur_test->param.domain, cur_test->packet_direction,
8887 			cur_test->sn_size, cur_test->hfn,
8888 			cur_test->hfn_threshold, SDAP_ENABLED);
8889 		if (err) {
8890 			printf("\t%d) %s: Decapsulation failed\n",
8891 					cur_test->test_idx,
8892 					cur_test->param.name);
8893 			err = TEST_FAILED;
8894 		} else {
8895 			printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
8896 					cur_test->param.name);
8897 			err = TEST_SUCCESS;
8898 		}
8899 		all_err += err;
8900 	}
8901 
8902 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8903 
8904 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8905 }
8906 
8907 static int
8908 test_ipsec_proto_process(const struct ipsec_test_data td[],
8909 			 struct ipsec_test_data res_d[],
8910 			 int nb_td,
8911 			 bool silent,
8912 			 const struct ipsec_test_flags *flags)
8913 {
8914 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8915 	struct crypto_unittest_params *ut_params = &unittest_params;
8916 	struct rte_security_capability_idx sec_cap_idx;
8917 	const struct rte_security_capability *sec_cap;
8918 	struct rte_security_ipsec_xform ipsec_xform;
8919 	uint8_t dev_id = ts_params->valid_devs[0];
8920 	enum rte_security_ipsec_sa_direction dir;
8921 	struct ipsec_test_data *res_d_tmp = NULL;
8922 	uint32_t src = RTE_IPV4(192, 168, 1, 0);
8923 	uint32_t dst = RTE_IPV4(192, 168, 1, 1);
8924 	int salt_len, i, ret = TEST_SUCCESS;
8925 	struct rte_security_ctx *ctx;
8926 	uint8_t *input_text;
8927 
8928 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
8929 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
8930 
8931 	/* Use first test data to create session */
8932 
8933 	/* Copy IPsec xform */
8934 	memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform));
8935 
8936 	memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src, sizeof(src));
8937 	memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst, sizeof(dst));
8938 
8939 	dir = ipsec_xform.direction;
8940 
8941 	ctx = rte_cryptodev_get_sec_ctx(dev_id);
8942 
8943 	sec_cap_idx.action = ut_params->type;
8944 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
8945 	sec_cap_idx.ipsec.proto = ipsec_xform.proto;
8946 	sec_cap_idx.ipsec.mode = ipsec_xform.mode;
8947 	sec_cap_idx.ipsec.direction = ipsec_xform.direction;
8948 
8949 	if (flags->udp_encap)
8950 		ipsec_xform.options.udp_encap = 1;
8951 
8952 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8953 	if (sec_cap == NULL)
8954 		return TEST_SKIPPED;
8955 
8956 	/* Copy cipher session parameters */
8957 	if (td[0].aead) {
8958 		memcpy(&ut_params->aead_xform, &td[0].xform.aead,
8959 		       sizeof(ut_params->aead_xform));
8960 		ut_params->aead_xform.aead.key.data = td[0].key.data;
8961 		ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
8962 
8963 		/* Verify crypto capabilities */
8964 		if (test_ipsec_crypto_caps_aead_verify(
8965 				sec_cap,
8966 				&ut_params->aead_xform) != 0) {
8967 			if (!silent)
8968 				RTE_LOG(INFO, USER1,
8969 					"Crypto capabilities not supported\n");
8970 			return TEST_SKIPPED;
8971 		}
8972 	} else {
8973 		/* Only AEAD supported now */
8974 		return TEST_SKIPPED;
8975 	}
8976 
8977 	if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
8978 		return TEST_SKIPPED;
8979 
8980 	salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
8981 	memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
8982 
8983 	struct rte_security_session_conf sess_conf = {
8984 		.action_type = ut_params->type,
8985 		.protocol = RTE_SECURITY_PROTOCOL_IPSEC,
8986 		.ipsec = ipsec_xform,
8987 		.crypto_xform = &ut_params->aead_xform,
8988 	};
8989 
8990 	/* Create security session */
8991 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8992 					ts_params->session_mpool,
8993 					ts_params->session_priv_mpool);
8994 
8995 	if (ut_params->sec_session == NULL)
8996 		return TEST_SKIPPED;
8997 
8998 	for (i = 0; i < nb_td; i++) {
8999 		/* Setup source mbuf payload */
9000 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9001 		memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9002 				rte_pktmbuf_tailroom(ut_params->ibuf));
9003 
9004 		input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9005 				td[i].input_text.len);
9006 
9007 		memcpy(input_text, td[i].input_text.data,
9008 		       td[i].input_text.len);
9009 
9010 		/* Generate crypto op data structure */
9011 		ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9012 					RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9013 		if (!ut_params->op) {
9014 			printf("TestCase %s line %d: %s\n",
9015 				__func__, __LINE__,
9016 				"failed to allocate crypto op");
9017 			ret = TEST_FAILED;
9018 			goto crypto_op_free;
9019 		}
9020 
9021 		/* Attach session to operation */
9022 		rte_security_attach_session(ut_params->op,
9023 					    ut_params->sec_session);
9024 
9025 		/* Set crypto operation mbufs */
9026 		ut_params->op->sym->m_src = ut_params->ibuf;
9027 		ut_params->op->sym->m_dst = NULL;
9028 
9029 		/* Copy IV in crypto operation when IV generation is disabled */
9030 		if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
9031 		    ipsec_xform.options.iv_gen_disable == 1) {
9032 			uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
9033 								uint8_t *,
9034 								IV_OFFSET);
9035 			int len;
9036 
9037 			if (td[i].aead)
9038 				len = td[i].xform.aead.aead.iv.length;
9039 			else
9040 				len = td[i].xform.chain.cipher.cipher.iv.length;
9041 
9042 			memcpy(iv, td[i].iv.data, len);
9043 		}
9044 
9045 		/* Process crypto operation */
9046 		process_crypto_request(dev_id, ut_params->op);
9047 
9048 		ret = test_ipsec_status_check(ut_params->op, flags, dir);
9049 		if (ret != TEST_SUCCESS)
9050 			goto crypto_op_free;
9051 
9052 		if (res_d != NULL)
9053 			res_d_tmp = &res_d[i];
9054 
9055 		ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
9056 					      res_d_tmp, silent, flags);
9057 		if (ret != TEST_SUCCESS)
9058 			goto crypto_op_free;
9059 
9060 		rte_crypto_op_free(ut_params->op);
9061 		ut_params->op = NULL;
9062 
9063 		rte_pktmbuf_free(ut_params->ibuf);
9064 		ut_params->ibuf = NULL;
9065 	}
9066 
9067 crypto_op_free:
9068 	rte_crypto_op_free(ut_params->op);
9069 	ut_params->op = NULL;
9070 
9071 	rte_pktmbuf_free(ut_params->ibuf);
9072 	ut_params->ibuf = NULL;
9073 
9074 	if (ut_params->sec_session)
9075 		rte_security_session_destroy(ctx, ut_params->sec_session);
9076 	ut_params->sec_session = NULL;
9077 
9078 	return ret;
9079 }
9080 
9081 static int
9082 test_ipsec_proto_known_vec(const void *test_data)
9083 {
9084 	struct ipsec_test_data td_outb;
9085 	struct ipsec_test_flags flags;
9086 
9087 	memset(&flags, 0, sizeof(flags));
9088 
9089 	memcpy(&td_outb, test_data, sizeof(td_outb));
9090 
9091 	/* Disable IV gen to be able to test with known vectors */
9092 	td_outb.ipsec_xform.options.iv_gen_disable = 1;
9093 
9094 	return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9095 }
9096 
9097 static int
9098 test_ipsec_proto_known_vec_inb(const void *td_outb)
9099 {
9100 	struct ipsec_test_flags flags;
9101 	struct ipsec_test_data td_inb;
9102 
9103 	memset(&flags, 0, sizeof(flags));
9104 
9105 	test_ipsec_td_in_from_out(td_outb, &td_inb);
9106 
9107 	return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
9108 }
9109 
9110 static int
9111 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
9112 {
9113 	struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9114 	struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9115 	unsigned int i, nb_pkts = 1, pass_cnt = 0;
9116 	int ret;
9117 
9118 	if (flags->iv_gen)
9119 		nb_pkts = IPSEC_TEST_PACKETS_MAX;
9120 
9121 	for (i = 0; i < RTE_DIM(aead_list); i++) {
9122 		test_ipsec_td_prepare(&aead_list[i],
9123 				      NULL,
9124 				      flags,
9125 				      td_outb,
9126 				      nb_pkts);
9127 
9128 		ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9129 					       flags);
9130 		if (ret == TEST_SKIPPED)
9131 			continue;
9132 
9133 		if (ret == TEST_FAILED)
9134 			return TEST_FAILED;
9135 
9136 		test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9137 
9138 		ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9139 					       flags);
9140 		if (ret == TEST_SKIPPED)
9141 			continue;
9142 
9143 		if (ret == TEST_FAILED)
9144 			return TEST_FAILED;
9145 
9146 		if (flags->display_alg)
9147 			test_ipsec_display_alg(&aead_list[i], NULL);
9148 
9149 		pass_cnt++;
9150 	}
9151 
9152 	if (pass_cnt > 0)
9153 		return TEST_SUCCESS;
9154 	else
9155 		return TEST_SKIPPED;
9156 }
9157 
9158 static int
9159 test_ipsec_proto_display_list(const void *data __rte_unused)
9160 {
9161 	struct ipsec_test_flags flags;
9162 
9163 	memset(&flags, 0, sizeof(flags));
9164 
9165 	flags.display_alg = true;
9166 
9167 	return test_ipsec_proto_all(&flags);
9168 }
9169 
9170 static int
9171 test_ipsec_proto_iv_gen(const void *data __rte_unused)
9172 {
9173 	struct ipsec_test_flags flags;
9174 
9175 	memset(&flags, 0, sizeof(flags));
9176 
9177 	flags.iv_gen = true;
9178 
9179 	return test_ipsec_proto_all(&flags);
9180 }
9181 
9182 static int
9183 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused)
9184 {
9185 	struct ipsec_test_flags flags;
9186 
9187 	memset(&flags, 0, sizeof(flags));
9188 
9189 	flags.icv_corrupt = true;
9190 
9191 	return test_ipsec_proto_all(&flags);
9192 }
9193 
9194 static int
9195 test_ipsec_proto_udp_encap(const void *data __rte_unused)
9196 {
9197 	struct ipsec_test_flags flags;
9198 
9199 	memset(&flags, 0, sizeof(flags));
9200 
9201 	flags.udp_encap = true;
9202 
9203 	return test_ipsec_proto_all(&flags);
9204 }
9205 
9206 static int
9207 test_PDCP_PROTO_all(void)
9208 {
9209 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9210 	struct crypto_unittest_params *ut_params = &unittest_params;
9211 	struct rte_cryptodev_info dev_info;
9212 	int status;
9213 
9214 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9215 	uint64_t feat_flags = dev_info.feature_flags;
9216 
9217 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9218 		return TEST_SKIPPED;
9219 
9220 	/* Set action type */
9221 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9222 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9223 		gbl_action_type;
9224 
9225 	if (security_proto_supported(ut_params->type,
9226 			RTE_SECURITY_PROTOCOL_PDCP) < 0)
9227 		return TEST_SKIPPED;
9228 
9229 	status = test_PDCP_PROTO_cplane_encap_all();
9230 	status += test_PDCP_PROTO_cplane_decap_all();
9231 	status += test_PDCP_PROTO_uplane_encap_all();
9232 	status += test_PDCP_PROTO_uplane_decap_all();
9233 	status += test_PDCP_PROTO_SGL_in_place_32B();
9234 	status += test_PDCP_PROTO_SGL_oop_32B_128B();
9235 	status += test_PDCP_PROTO_SGL_oop_32B_40B();
9236 	status += test_PDCP_PROTO_SGL_oop_128B_32B();
9237 	status += test_PDCP_SDAP_PROTO_encap_all();
9238 	status += test_PDCP_SDAP_PROTO_decap_all();
9239 	status += test_PDCP_PROTO_short_mac();
9240 
9241 	if (status)
9242 		return TEST_FAILED;
9243 	else
9244 		return TEST_SUCCESS;
9245 }
9246 
9247 static int
9248 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td)
9249 {
9250 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9251 	struct crypto_unittest_params *ut_params = &unittest_params;
9252 	uint8_t *plaintext, *ciphertext;
9253 	uint8_t *iv_ptr;
9254 	int32_t cipher_len, crc_len;
9255 	uint32_t crc_data_len;
9256 	int ret = TEST_SUCCESS;
9257 
9258 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9259 					rte_cryptodev_get_sec_ctx(
9260 						ts_params->valid_devs[0]);
9261 
9262 	/* Verify the capabilities */
9263 	struct rte_security_capability_idx sec_cap_idx;
9264 	const struct rte_security_capability *sec_cap;
9265 	const struct rte_cryptodev_capabilities *crypto_cap;
9266 	const struct rte_cryptodev_symmetric_capability *sym_cap;
9267 	int j = 0;
9268 
9269 	sec_cap_idx.action = ut_params->type;
9270 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9271 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
9272 
9273 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9274 	if (sec_cap == NULL)
9275 		return TEST_SKIPPED;
9276 
9277 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9278 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9279 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9280 				crypto_cap->sym.xform_type ==
9281 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
9282 				crypto_cap->sym.cipher.algo ==
9283 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9284 			sym_cap = &crypto_cap->sym;
9285 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9286 						d_td->key.len,
9287 						d_td->iv.len) == 0)
9288 				break;
9289 		}
9290 	}
9291 
9292 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9293 		return TEST_SKIPPED;
9294 
9295 	/* Setup source mbuf payload */
9296 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9297 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9298 			rte_pktmbuf_tailroom(ut_params->ibuf));
9299 
9300 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9301 			d_td->ciphertext.len);
9302 
9303 	memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
9304 
9305 	/* Setup cipher session parameters */
9306 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9307 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9308 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
9309 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9310 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9311 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9312 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9313 	ut_params->cipher_xform.next = NULL;
9314 
9315 	/* Setup DOCSIS session parameters */
9316 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
9317 
9318 	struct rte_security_session_conf sess_conf = {
9319 		.action_type = ut_params->type,
9320 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9321 		.docsis = ut_params->docsis_xform,
9322 		.crypto_xform = &ut_params->cipher_xform,
9323 	};
9324 
9325 	/* Create security session */
9326 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9327 					ts_params->session_mpool,
9328 					ts_params->session_priv_mpool);
9329 
9330 	if (!ut_params->sec_session) {
9331 		printf("TestCase %s(%d) line %d: %s\n",
9332 			__func__, i, __LINE__, "failed to allocate session");
9333 		ret = TEST_FAILED;
9334 		goto on_err;
9335 	}
9336 
9337 	/* Generate crypto op data structure */
9338 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9339 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9340 	if (!ut_params->op) {
9341 		printf("TestCase %s(%d) line %d: %s\n",
9342 			__func__, i, __LINE__,
9343 			"failed to allocate symmetric crypto operation");
9344 		ret = TEST_FAILED;
9345 		goto on_err;
9346 	}
9347 
9348 	/* Setup CRC operation parameters */
9349 	crc_len = d_td->ciphertext.no_crc == false ?
9350 			(d_td->ciphertext.len -
9351 				d_td->ciphertext.crc_offset -
9352 				RTE_ETHER_CRC_LEN) :
9353 			0;
9354 	crc_len = crc_len > 0 ? crc_len : 0;
9355 	crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
9356 	ut_params->op->sym->auth.data.length = crc_len;
9357 	ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
9358 
9359 	/* Setup cipher operation parameters */
9360 	cipher_len = d_td->ciphertext.no_cipher == false ?
9361 			(d_td->ciphertext.len -
9362 				d_td->ciphertext.cipher_offset) :
9363 			0;
9364 	cipher_len = cipher_len > 0 ? cipher_len : 0;
9365 	ut_params->op->sym->cipher.data.length = cipher_len;
9366 	ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
9367 
9368 	/* Setup cipher IV */
9369 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9370 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9371 
9372 	/* Attach session to operation */
9373 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
9374 
9375 	/* Set crypto operation mbufs */
9376 	ut_params->op->sym->m_src = ut_params->ibuf;
9377 	ut_params->op->sym->m_dst = NULL;
9378 
9379 	/* Process crypto operation */
9380 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9381 			NULL) {
9382 		printf("TestCase %s(%d) line %d: %s\n",
9383 			__func__, i, __LINE__,
9384 			"failed to process security crypto op");
9385 		ret = TEST_FAILED;
9386 		goto on_err;
9387 	}
9388 
9389 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9390 		printf("TestCase %s(%d) line %d: %s\n",
9391 			__func__, i, __LINE__, "crypto op processing failed");
9392 		ret = TEST_FAILED;
9393 		goto on_err;
9394 	}
9395 
9396 	/* Validate plaintext */
9397 	plaintext = ciphertext;
9398 
9399 	if (memcmp(plaintext, d_td->plaintext.data,
9400 			d_td->plaintext.len - crc_data_len)) {
9401 		printf("TestCase %s(%d) line %d: %s\n",
9402 			__func__, i, __LINE__, "plaintext not as expected\n");
9403 		rte_hexdump(stdout, "expected", d_td->plaintext.data,
9404 				d_td->plaintext.len);
9405 		rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
9406 		ret = TEST_FAILED;
9407 		goto on_err;
9408 	}
9409 
9410 on_err:
9411 	rte_crypto_op_free(ut_params->op);
9412 	ut_params->op = NULL;
9413 
9414 	if (ut_params->sec_session)
9415 		rte_security_session_destroy(ctx, ut_params->sec_session);
9416 	ut_params->sec_session = NULL;
9417 
9418 	rte_pktmbuf_free(ut_params->ibuf);
9419 	ut_params->ibuf = NULL;
9420 
9421 	return ret;
9422 }
9423 
9424 static int
9425 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td)
9426 {
9427 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9428 	struct crypto_unittest_params *ut_params = &unittest_params;
9429 	uint8_t *plaintext, *ciphertext;
9430 	uint8_t *iv_ptr;
9431 	int32_t cipher_len, crc_len;
9432 	int ret = TEST_SUCCESS;
9433 
9434 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9435 					rte_cryptodev_get_sec_ctx(
9436 						ts_params->valid_devs[0]);
9437 
9438 	/* Verify the capabilities */
9439 	struct rte_security_capability_idx sec_cap_idx;
9440 	const struct rte_security_capability *sec_cap;
9441 	const struct rte_cryptodev_capabilities *crypto_cap;
9442 	const struct rte_cryptodev_symmetric_capability *sym_cap;
9443 	int j = 0;
9444 
9445 	sec_cap_idx.action = ut_params->type;
9446 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9447 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9448 
9449 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9450 	if (sec_cap == NULL)
9451 		return TEST_SKIPPED;
9452 
9453 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9454 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9455 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9456 				crypto_cap->sym.xform_type ==
9457 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
9458 				crypto_cap->sym.cipher.algo ==
9459 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9460 			sym_cap = &crypto_cap->sym;
9461 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9462 						d_td->key.len,
9463 						d_td->iv.len) == 0)
9464 				break;
9465 		}
9466 	}
9467 
9468 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9469 		return TEST_SKIPPED;
9470 
9471 	/* Setup source mbuf payload */
9472 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9473 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9474 			rte_pktmbuf_tailroom(ut_params->ibuf));
9475 
9476 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9477 			d_td->plaintext.len);
9478 
9479 	memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
9480 
9481 	/* Setup cipher session parameters */
9482 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9483 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9484 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9485 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9486 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9487 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9488 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9489 	ut_params->cipher_xform.next = NULL;
9490 
9491 	/* Setup DOCSIS session parameters */
9492 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9493 
9494 	struct rte_security_session_conf sess_conf = {
9495 		.action_type = ut_params->type,
9496 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9497 		.docsis = ut_params->docsis_xform,
9498 		.crypto_xform = &ut_params->cipher_xform,
9499 	};
9500 
9501 	/* Create security session */
9502 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9503 					ts_params->session_mpool,
9504 					ts_params->session_priv_mpool);
9505 
9506 	if (!ut_params->sec_session) {
9507 		printf("TestCase %s(%d) line %d: %s\n",
9508 			__func__, i, __LINE__, "failed to allocate session");
9509 		ret = TEST_FAILED;
9510 		goto on_err;
9511 	}
9512 
9513 	/* Generate crypto op data structure */
9514 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9515 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9516 	if (!ut_params->op) {
9517 		printf("TestCase %s(%d) line %d: %s\n",
9518 			__func__, i, __LINE__,
9519 			"failed to allocate security crypto operation");
9520 		ret = TEST_FAILED;
9521 		goto on_err;
9522 	}
9523 
9524 	/* Setup CRC operation parameters */
9525 	crc_len = d_td->plaintext.no_crc == false ?
9526 			(d_td->plaintext.len -
9527 				d_td->plaintext.crc_offset -
9528 				RTE_ETHER_CRC_LEN) :
9529 			0;
9530 	crc_len = crc_len > 0 ? crc_len : 0;
9531 	ut_params->op->sym->auth.data.length = crc_len;
9532 	ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
9533 
9534 	/* Setup cipher operation parameters */
9535 	cipher_len = d_td->plaintext.no_cipher == false ?
9536 			(d_td->plaintext.len -
9537 				d_td->plaintext.cipher_offset) :
9538 			0;
9539 	cipher_len = cipher_len > 0 ? cipher_len : 0;
9540 	ut_params->op->sym->cipher.data.length = cipher_len;
9541 	ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
9542 
9543 	/* Setup cipher IV */
9544 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9545 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9546 
9547 	/* Attach session to operation */
9548 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
9549 
9550 	/* Set crypto operation mbufs */
9551 	ut_params->op->sym->m_src = ut_params->ibuf;
9552 	ut_params->op->sym->m_dst = NULL;
9553 
9554 	/* Process crypto operation */
9555 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9556 			NULL) {
9557 		printf("TestCase %s(%d) line %d: %s\n",
9558 			__func__, i, __LINE__,
9559 			"failed to process security crypto op");
9560 		ret = TEST_FAILED;
9561 		goto on_err;
9562 	}
9563 
9564 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9565 		printf("TestCase %s(%d) line %d: %s\n",
9566 			__func__, i, __LINE__, "crypto op processing failed");
9567 		ret = TEST_FAILED;
9568 		goto on_err;
9569 	}
9570 
9571 	/* Validate ciphertext */
9572 	ciphertext = plaintext;
9573 
9574 	if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
9575 		printf("TestCase %s(%d) line %d: %s\n",
9576 			__func__, i, __LINE__, "ciphertext not as expected\n");
9577 		rte_hexdump(stdout, "expected", d_td->ciphertext.data,
9578 				d_td->ciphertext.len);
9579 		rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
9580 		ret = TEST_FAILED;
9581 		goto on_err;
9582 	}
9583 
9584 on_err:
9585 	rte_crypto_op_free(ut_params->op);
9586 	ut_params->op = NULL;
9587 
9588 	if (ut_params->sec_session)
9589 		rte_security_session_destroy(ctx, ut_params->sec_session);
9590 	ut_params->sec_session = NULL;
9591 
9592 	rte_pktmbuf_free(ut_params->ibuf);
9593 	ut_params->ibuf = NULL;
9594 
9595 	return ret;
9596 }
9597 
9598 #define TEST_DOCSIS_COUNT(func) do {			\
9599 	int ret = func;					\
9600 	if (ret == TEST_SUCCESS)  {			\
9601 		printf("\t%2d)", n++);			\
9602 		printf("+++++ PASSED:" #func"\n");	\
9603 		p++;					\
9604 	} else if (ret == TEST_SKIPPED) {		\
9605 		printf("\t%2d)", n++);			\
9606 		printf("~~~~~ SKIPPED:" #func"\n");	\
9607 		s++;					\
9608 	} else {					\
9609 		printf("\t%2d)", n++);			\
9610 		printf("----- FAILED:" #func"\n");	\
9611 		f++;					\
9612 	}						\
9613 } while (0)
9614 
9615 static int
9616 test_DOCSIS_PROTO_uplink_all(void)
9617 {
9618 	int p = 0, s = 0, f = 0, n = 0;
9619 
9620 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1));
9621 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2));
9622 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3));
9623 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4));
9624 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5));
9625 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6));
9626 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7));
9627 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8));
9628 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9));
9629 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10));
9630 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11));
9631 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12));
9632 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13));
9633 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14));
9634 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15));
9635 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16));
9636 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17));
9637 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18));
9638 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19));
9639 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20));
9640 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21));
9641 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22));
9642 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23));
9643 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24));
9644 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25));
9645 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26));
9646 
9647 	if (f)
9648 		printf("## %s: %d passed out of %d (%d skipped)\n",
9649 			__func__, p, n, s);
9650 
9651 	return f;
9652 };
9653 
9654 static int
9655 test_DOCSIS_PROTO_downlink_all(void)
9656 {
9657 	int p = 0, s = 0, f = 0, n = 0;
9658 
9659 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1));
9660 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2));
9661 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3));
9662 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4));
9663 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5));
9664 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6));
9665 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7));
9666 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8));
9667 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9));
9668 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10));
9669 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11));
9670 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12));
9671 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13));
9672 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14));
9673 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15));
9674 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16));
9675 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17));
9676 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18));
9677 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19));
9678 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20));
9679 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21));
9680 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22));
9681 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23));
9682 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24));
9683 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25));
9684 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26));
9685 
9686 	if (f)
9687 		printf("## %s: %d passed out of %d (%d skipped)\n",
9688 			__func__, p, n, s);
9689 
9690 	return f;
9691 };
9692 
9693 static int
9694 test_DOCSIS_PROTO_all(void)
9695 {
9696 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9697 	struct crypto_unittest_params *ut_params = &unittest_params;
9698 	struct rte_cryptodev_info dev_info;
9699 	int status;
9700 
9701 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9702 	uint64_t feat_flags = dev_info.feature_flags;
9703 
9704 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9705 		return TEST_SKIPPED;
9706 
9707 	/* Set action type */
9708 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9709 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9710 		gbl_action_type;
9711 
9712 	if (security_proto_supported(ut_params->type,
9713 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
9714 		return TEST_SKIPPED;
9715 
9716 	status = test_DOCSIS_PROTO_uplink_all();
9717 	status += test_DOCSIS_PROTO_downlink_all();
9718 
9719 	if (status)
9720 		return TEST_FAILED;
9721 	else
9722 		return TEST_SUCCESS;
9723 }
9724 #endif
9725 
9726 static int
9727 test_AES_GCM_authenticated_encryption_test_case_1(void)
9728 {
9729 	return test_authenticated_encryption(&gcm_test_case_1);
9730 }
9731 
9732 static int
9733 test_AES_GCM_authenticated_encryption_test_case_2(void)
9734 {
9735 	return test_authenticated_encryption(&gcm_test_case_2);
9736 }
9737 
9738 static int
9739 test_AES_GCM_authenticated_encryption_test_case_3(void)
9740 {
9741 	return test_authenticated_encryption(&gcm_test_case_3);
9742 }
9743 
9744 static int
9745 test_AES_GCM_authenticated_encryption_test_case_4(void)
9746 {
9747 	return test_authenticated_encryption(&gcm_test_case_4);
9748 }
9749 
9750 static int
9751 test_AES_GCM_authenticated_encryption_test_case_5(void)
9752 {
9753 	return test_authenticated_encryption(&gcm_test_case_5);
9754 }
9755 
9756 static int
9757 test_AES_GCM_authenticated_encryption_test_case_6(void)
9758 {
9759 	return test_authenticated_encryption(&gcm_test_case_6);
9760 }
9761 
9762 static int
9763 test_AES_GCM_authenticated_encryption_test_case_7(void)
9764 {
9765 	return test_authenticated_encryption(&gcm_test_case_7);
9766 }
9767 
9768 static int
9769 test_AES_GCM_authenticated_encryption_test_case_8(void)
9770 {
9771 	return test_authenticated_encryption(&gcm_test_case_8);
9772 }
9773 
9774 static int
9775 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
9776 {
9777 	return test_authenticated_encryption(&gcm_J0_test_case_1);
9778 }
9779 
9780 static int
9781 test_AES_GCM_auth_encryption_test_case_192_1(void)
9782 {
9783 	return test_authenticated_encryption(&gcm_test_case_192_1);
9784 }
9785 
9786 static int
9787 test_AES_GCM_auth_encryption_test_case_192_2(void)
9788 {
9789 	return test_authenticated_encryption(&gcm_test_case_192_2);
9790 }
9791 
9792 static int
9793 test_AES_GCM_auth_encryption_test_case_192_3(void)
9794 {
9795 	return test_authenticated_encryption(&gcm_test_case_192_3);
9796 }
9797 
9798 static int
9799 test_AES_GCM_auth_encryption_test_case_192_4(void)
9800 {
9801 	return test_authenticated_encryption(&gcm_test_case_192_4);
9802 }
9803 
9804 static int
9805 test_AES_GCM_auth_encryption_test_case_192_5(void)
9806 {
9807 	return test_authenticated_encryption(&gcm_test_case_192_5);
9808 }
9809 
9810 static int
9811 test_AES_GCM_auth_encryption_test_case_192_6(void)
9812 {
9813 	return test_authenticated_encryption(&gcm_test_case_192_6);
9814 }
9815 
9816 static int
9817 test_AES_GCM_auth_encryption_test_case_192_7(void)
9818 {
9819 	return test_authenticated_encryption(&gcm_test_case_192_7);
9820 }
9821 
9822 static int
9823 test_AES_GCM_auth_encryption_test_case_256_1(void)
9824 {
9825 	return test_authenticated_encryption(&gcm_test_case_256_1);
9826 }
9827 
9828 static int
9829 test_AES_GCM_auth_encryption_test_case_256_2(void)
9830 {
9831 	return test_authenticated_encryption(&gcm_test_case_256_2);
9832 }
9833 
9834 static int
9835 test_AES_GCM_auth_encryption_test_case_256_3(void)
9836 {
9837 	return test_authenticated_encryption(&gcm_test_case_256_3);
9838 }
9839 
9840 static int
9841 test_AES_GCM_auth_encryption_test_case_256_4(void)
9842 {
9843 	return test_authenticated_encryption(&gcm_test_case_256_4);
9844 }
9845 
9846 static int
9847 test_AES_GCM_auth_encryption_test_case_256_5(void)
9848 {
9849 	return test_authenticated_encryption(&gcm_test_case_256_5);
9850 }
9851 
9852 static int
9853 test_AES_GCM_auth_encryption_test_case_256_6(void)
9854 {
9855 	return test_authenticated_encryption(&gcm_test_case_256_6);
9856 }
9857 
9858 static int
9859 test_AES_GCM_auth_encryption_test_case_256_7(void)
9860 {
9861 	return test_authenticated_encryption(&gcm_test_case_256_7);
9862 }
9863 
9864 static int
9865 test_AES_GCM_auth_encryption_test_case_aad_1(void)
9866 {
9867 	return test_authenticated_encryption(&gcm_test_case_aad_1);
9868 }
9869 
9870 static int
9871 test_AES_GCM_auth_encryption_test_case_aad_2(void)
9872 {
9873 	return test_authenticated_encryption(&gcm_test_case_aad_2);
9874 }
9875 
9876 static int
9877 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
9878 {
9879 	struct aead_test_data tdata;
9880 	int res;
9881 
9882 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9883 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9884 	tdata.iv.data[0] += 1;
9885 	res = test_authenticated_encryption(&tdata);
9886 	if (res == TEST_SKIPPED)
9887 		return res;
9888 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9889 	return TEST_SUCCESS;
9890 }
9891 
9892 static int
9893 test_AES_GCM_auth_encryption_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_encryption(&tdata);
9902 	if (res == TEST_SKIPPED)
9903 		return res;
9904 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9905 	return TEST_SUCCESS;
9906 }
9907 
9908 static int
9909 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
9910 {
9911 	struct aead_test_data tdata;
9912 	int res;
9913 
9914 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9915 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9916 	tdata.ciphertext.data[0] += 1;
9917 	res = test_authenticated_encryption(&tdata);
9918 	if (res == TEST_SKIPPED)
9919 		return res;
9920 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9921 	return TEST_SUCCESS;
9922 }
9923 
9924 static int
9925 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
9926 {
9927 	struct aead_test_data tdata;
9928 	int res;
9929 
9930 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9931 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9932 	tdata.aad.len += 1;
9933 	res = test_authenticated_encryption(&tdata);
9934 	if (res == TEST_SKIPPED)
9935 		return res;
9936 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9937 	return TEST_SUCCESS;
9938 }
9939 
9940 static int
9941 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
9942 {
9943 	struct aead_test_data tdata;
9944 	uint8_t aad[gcm_test_case_7.aad.len];
9945 	int res;
9946 
9947 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9948 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9949 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9950 	aad[0] += 1;
9951 	tdata.aad.data = aad;
9952 	res = test_authenticated_encryption(&tdata);
9953 	if (res == TEST_SKIPPED)
9954 		return res;
9955 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9956 	return TEST_SUCCESS;
9957 }
9958 
9959 static int
9960 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
9961 {
9962 	struct aead_test_data tdata;
9963 	int res;
9964 
9965 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9966 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9967 	tdata.auth_tag.data[0] += 1;
9968 	res = test_authenticated_encryption(&tdata);
9969 	if (res == TEST_SKIPPED)
9970 		return res;
9971 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9972 	return TEST_SUCCESS;
9973 }
9974 
9975 static int
9976 test_authenticated_decryption(const struct aead_test_data *tdata)
9977 {
9978 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9979 	struct crypto_unittest_params *ut_params = &unittest_params;
9980 
9981 	int retval;
9982 	uint8_t *plaintext;
9983 	uint32_t i;
9984 	struct rte_cryptodev_info dev_info;
9985 
9986 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9987 	uint64_t feat_flags = dev_info.feature_flags;
9988 
9989 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9990 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9991 		printf("Device doesn't support RAW data-path APIs.\n");
9992 		return TEST_SKIPPED;
9993 	}
9994 
9995 	/* Verify the capabilities */
9996 	struct rte_cryptodev_sym_capability_idx cap_idx;
9997 	const struct rte_cryptodev_symmetric_capability *capability;
9998 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9999 	cap_idx.algo.aead = tdata->algo;
10000 	capability = rte_cryptodev_sym_capability_get(
10001 			ts_params->valid_devs[0], &cap_idx);
10002 	if (capability == NULL)
10003 		return TEST_SKIPPED;
10004 	if (rte_cryptodev_sym_capability_check_aead(
10005 			capability, tdata->key.len, tdata->auth_tag.len,
10006 			tdata->aad.len, tdata->iv.len))
10007 		return TEST_SKIPPED;
10008 
10009 	/* Create AEAD session */
10010 	retval = create_aead_session(ts_params->valid_devs[0],
10011 			tdata->algo,
10012 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10013 			tdata->key.data, tdata->key.len,
10014 			tdata->aad.len, tdata->auth_tag.len,
10015 			tdata->iv.len);
10016 	if (retval < 0)
10017 		return retval;
10018 
10019 	/* alloc mbuf and set payload */
10020 	if (tdata->aad.len > MBUF_SIZE) {
10021 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10022 		/* Populate full size of add data */
10023 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
10024 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
10025 	} else
10026 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10027 
10028 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10029 			rte_pktmbuf_tailroom(ut_params->ibuf));
10030 
10031 	/* Create AEAD operation */
10032 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10033 	if (retval < 0)
10034 		return retval;
10035 
10036 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10037 
10038 	ut_params->op->sym->m_src = ut_params->ibuf;
10039 
10040 	/* Process crypto operation */
10041 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10042 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
10043 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10044 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10045 				ut_params->op, 0, 0, 0, 0);
10046 	else
10047 		TEST_ASSERT_NOT_NULL(
10048 			process_crypto_request(ts_params->valid_devs[0],
10049 			ut_params->op), "failed to process sym crypto op");
10050 
10051 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10052 			"crypto op processing failed");
10053 
10054 	if (ut_params->op->sym->m_dst)
10055 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
10056 				uint8_t *);
10057 	else
10058 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
10059 				uint8_t *,
10060 				ut_params->op->sym->cipher.data.offset);
10061 
10062 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10063 
10064 	/* Validate obuf */
10065 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10066 			plaintext,
10067 			tdata->plaintext.data,
10068 			tdata->plaintext.len,
10069 			"Plaintext data not as expected");
10070 
10071 	TEST_ASSERT_EQUAL(ut_params->op->status,
10072 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10073 			"Authentication failed");
10074 
10075 	return 0;
10076 }
10077 
10078 static int
10079 test_AES_GCM_authenticated_decryption_test_case_1(void)
10080 {
10081 	return test_authenticated_decryption(&gcm_test_case_1);
10082 }
10083 
10084 static int
10085 test_AES_GCM_authenticated_decryption_test_case_2(void)
10086 {
10087 	return test_authenticated_decryption(&gcm_test_case_2);
10088 }
10089 
10090 static int
10091 test_AES_GCM_authenticated_decryption_test_case_3(void)
10092 {
10093 	return test_authenticated_decryption(&gcm_test_case_3);
10094 }
10095 
10096 static int
10097 test_AES_GCM_authenticated_decryption_test_case_4(void)
10098 {
10099 	return test_authenticated_decryption(&gcm_test_case_4);
10100 }
10101 
10102 static int
10103 test_AES_GCM_authenticated_decryption_test_case_5(void)
10104 {
10105 	return test_authenticated_decryption(&gcm_test_case_5);
10106 }
10107 
10108 static int
10109 test_AES_GCM_authenticated_decryption_test_case_6(void)
10110 {
10111 	return test_authenticated_decryption(&gcm_test_case_6);
10112 }
10113 
10114 static int
10115 test_AES_GCM_authenticated_decryption_test_case_7(void)
10116 {
10117 	return test_authenticated_decryption(&gcm_test_case_7);
10118 }
10119 
10120 static int
10121 test_AES_GCM_authenticated_decryption_test_case_8(void)
10122 {
10123 	return test_authenticated_decryption(&gcm_test_case_8);
10124 }
10125 
10126 static int
10127 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
10128 {
10129 	return test_authenticated_decryption(&gcm_J0_test_case_1);
10130 }
10131 
10132 static int
10133 test_AES_GCM_auth_decryption_test_case_192_1(void)
10134 {
10135 	return test_authenticated_decryption(&gcm_test_case_192_1);
10136 }
10137 
10138 static int
10139 test_AES_GCM_auth_decryption_test_case_192_2(void)
10140 {
10141 	return test_authenticated_decryption(&gcm_test_case_192_2);
10142 }
10143 
10144 static int
10145 test_AES_GCM_auth_decryption_test_case_192_3(void)
10146 {
10147 	return test_authenticated_decryption(&gcm_test_case_192_3);
10148 }
10149 
10150 static int
10151 test_AES_GCM_auth_decryption_test_case_192_4(void)
10152 {
10153 	return test_authenticated_decryption(&gcm_test_case_192_4);
10154 }
10155 
10156 static int
10157 test_AES_GCM_auth_decryption_test_case_192_5(void)
10158 {
10159 	return test_authenticated_decryption(&gcm_test_case_192_5);
10160 }
10161 
10162 static int
10163 test_AES_GCM_auth_decryption_test_case_192_6(void)
10164 {
10165 	return test_authenticated_decryption(&gcm_test_case_192_6);
10166 }
10167 
10168 static int
10169 test_AES_GCM_auth_decryption_test_case_192_7(void)
10170 {
10171 	return test_authenticated_decryption(&gcm_test_case_192_7);
10172 }
10173 
10174 static int
10175 test_AES_GCM_auth_decryption_test_case_256_1(void)
10176 {
10177 	return test_authenticated_decryption(&gcm_test_case_256_1);
10178 }
10179 
10180 static int
10181 test_AES_GCM_auth_decryption_test_case_256_2(void)
10182 {
10183 	return test_authenticated_decryption(&gcm_test_case_256_2);
10184 }
10185 
10186 static int
10187 test_AES_GCM_auth_decryption_test_case_256_3(void)
10188 {
10189 	return test_authenticated_decryption(&gcm_test_case_256_3);
10190 }
10191 
10192 static int
10193 test_AES_GCM_auth_decryption_test_case_256_4(void)
10194 {
10195 	return test_authenticated_decryption(&gcm_test_case_256_4);
10196 }
10197 
10198 static int
10199 test_AES_GCM_auth_decryption_test_case_256_5(void)
10200 {
10201 	return test_authenticated_decryption(&gcm_test_case_256_5);
10202 }
10203 
10204 static int
10205 test_AES_GCM_auth_decryption_test_case_256_6(void)
10206 {
10207 	return test_authenticated_decryption(&gcm_test_case_256_6);
10208 }
10209 
10210 static int
10211 test_AES_GCM_auth_decryption_test_case_256_7(void)
10212 {
10213 	return test_authenticated_decryption(&gcm_test_case_256_7);
10214 }
10215 
10216 static int
10217 test_AES_GCM_auth_decryption_test_case_aad_1(void)
10218 {
10219 	return test_authenticated_decryption(&gcm_test_case_aad_1);
10220 }
10221 
10222 static int
10223 test_AES_GCM_auth_decryption_test_case_aad_2(void)
10224 {
10225 	return test_authenticated_decryption(&gcm_test_case_aad_2);
10226 }
10227 
10228 static int
10229 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
10230 {
10231 	struct aead_test_data tdata;
10232 	int res;
10233 
10234 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10235 	tdata.iv.data[0] += 1;
10236 	res = test_authenticated_decryption(&tdata);
10237 	if (res == TEST_SKIPPED)
10238 		return res;
10239 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10240 	return TEST_SUCCESS;
10241 }
10242 
10243 static int
10244 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
10245 {
10246 	struct aead_test_data tdata;
10247 	int res;
10248 
10249 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10250 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10251 	tdata.plaintext.data[0] += 1;
10252 	res = test_authenticated_decryption(&tdata);
10253 	if (res == TEST_SKIPPED)
10254 		return res;
10255 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10256 	return TEST_SUCCESS;
10257 }
10258 
10259 static int
10260 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
10261 {
10262 	struct aead_test_data tdata;
10263 	int res;
10264 
10265 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10266 	tdata.ciphertext.data[0] += 1;
10267 	res = test_authenticated_decryption(&tdata);
10268 	if (res == TEST_SKIPPED)
10269 		return res;
10270 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10271 	return TEST_SUCCESS;
10272 }
10273 
10274 static int
10275 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
10276 {
10277 	struct aead_test_data tdata;
10278 	int res;
10279 
10280 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10281 	tdata.aad.len += 1;
10282 	res = test_authenticated_decryption(&tdata);
10283 	if (res == TEST_SKIPPED)
10284 		return res;
10285 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10286 	return TEST_SUCCESS;
10287 }
10288 
10289 static int
10290 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
10291 {
10292 	struct aead_test_data tdata;
10293 	uint8_t aad[gcm_test_case_7.aad.len];
10294 	int res;
10295 
10296 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10297 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10298 	aad[0] += 1;
10299 	tdata.aad.data = aad;
10300 	res = test_authenticated_decryption(&tdata);
10301 	if (res == TEST_SKIPPED)
10302 		return res;
10303 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10304 	return TEST_SUCCESS;
10305 }
10306 
10307 static int
10308 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
10309 {
10310 	struct aead_test_data tdata;
10311 	int res;
10312 
10313 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10314 	tdata.auth_tag.data[0] += 1;
10315 	res = test_authenticated_decryption(&tdata);
10316 	if (res == TEST_SKIPPED)
10317 		return res;
10318 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
10319 	return TEST_SUCCESS;
10320 }
10321 
10322 static int
10323 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
10324 {
10325 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10326 	struct crypto_unittest_params *ut_params = &unittest_params;
10327 
10328 	int retval;
10329 	uint8_t *ciphertext, *auth_tag;
10330 	uint16_t plaintext_pad_len;
10331 
10332 	/* Verify the capabilities */
10333 	struct rte_cryptodev_sym_capability_idx cap_idx;
10334 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10335 	cap_idx.algo.aead = tdata->algo;
10336 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10337 			&cap_idx) == NULL)
10338 		return TEST_SKIPPED;
10339 
10340 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10341 		return TEST_SKIPPED;
10342 
10343 	/* not supported with CPU crypto */
10344 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10345 		return TEST_SKIPPED;
10346 
10347 	/* Create AEAD session */
10348 	retval = create_aead_session(ts_params->valid_devs[0],
10349 			tdata->algo,
10350 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
10351 			tdata->key.data, tdata->key.len,
10352 			tdata->aad.len, tdata->auth_tag.len,
10353 			tdata->iv.len);
10354 	if (retval < 0)
10355 		return retval;
10356 
10357 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10358 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10359 
10360 	/* clear mbuf payload */
10361 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10362 			rte_pktmbuf_tailroom(ut_params->ibuf));
10363 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10364 			rte_pktmbuf_tailroom(ut_params->obuf));
10365 
10366 	/* Create AEAD operation */
10367 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10368 	if (retval < 0)
10369 		return retval;
10370 
10371 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10372 
10373 	ut_params->op->sym->m_src = ut_params->ibuf;
10374 	ut_params->op->sym->m_dst = ut_params->obuf;
10375 
10376 	/* Process crypto operation */
10377 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10378 			ut_params->op), "failed to process sym crypto op");
10379 
10380 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10381 			"crypto op processing failed");
10382 
10383 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10384 
10385 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10386 			ut_params->op->sym->cipher.data.offset);
10387 	auth_tag = ciphertext + plaintext_pad_len;
10388 
10389 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10390 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10391 
10392 	/* Validate obuf */
10393 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10394 			ciphertext,
10395 			tdata->ciphertext.data,
10396 			tdata->ciphertext.len,
10397 			"Ciphertext data not as expected");
10398 
10399 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10400 			auth_tag,
10401 			tdata->auth_tag.data,
10402 			tdata->auth_tag.len,
10403 			"Generated auth tag not as expected");
10404 
10405 	return 0;
10406 
10407 }
10408 
10409 static int
10410 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
10411 {
10412 	return test_authenticated_encryption_oop(&gcm_test_case_5);
10413 }
10414 
10415 static int
10416 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
10417 {
10418 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10419 	struct crypto_unittest_params *ut_params = &unittest_params;
10420 
10421 	int retval;
10422 	uint8_t *plaintext;
10423 
10424 	/* Verify the capabilities */
10425 	struct rte_cryptodev_sym_capability_idx cap_idx;
10426 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10427 	cap_idx.algo.aead = tdata->algo;
10428 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10429 			&cap_idx) == NULL)
10430 		return TEST_SKIPPED;
10431 
10432 	/* not supported with CPU crypto and raw data-path APIs*/
10433 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
10434 			global_api_test_type == CRYPTODEV_RAW_API_TEST)
10435 		return TEST_SKIPPED;
10436 
10437 	/* Create AEAD session */
10438 	retval = create_aead_session(ts_params->valid_devs[0],
10439 			tdata->algo,
10440 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10441 			tdata->key.data, tdata->key.len,
10442 			tdata->aad.len, tdata->auth_tag.len,
10443 			tdata->iv.len);
10444 	if (retval < 0)
10445 		return retval;
10446 
10447 	/* alloc mbuf and set payload */
10448 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10449 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10450 
10451 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10452 			rte_pktmbuf_tailroom(ut_params->ibuf));
10453 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10454 			rte_pktmbuf_tailroom(ut_params->obuf));
10455 
10456 	/* Create AEAD operation */
10457 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10458 	if (retval < 0)
10459 		return retval;
10460 
10461 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10462 
10463 	ut_params->op->sym->m_src = ut_params->ibuf;
10464 	ut_params->op->sym->m_dst = ut_params->obuf;
10465 
10466 	/* Process crypto operation */
10467 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10468 			ut_params->op), "failed to process sym crypto op");
10469 
10470 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10471 			"crypto op processing failed");
10472 
10473 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10474 			ut_params->op->sym->cipher.data.offset);
10475 
10476 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10477 
10478 	/* Validate obuf */
10479 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10480 			plaintext,
10481 			tdata->plaintext.data,
10482 			tdata->plaintext.len,
10483 			"Plaintext data not as expected");
10484 
10485 	TEST_ASSERT_EQUAL(ut_params->op->status,
10486 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10487 			"Authentication failed");
10488 	return 0;
10489 }
10490 
10491 static int
10492 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
10493 {
10494 	return test_authenticated_decryption_oop(&gcm_test_case_5);
10495 }
10496 
10497 static int
10498 test_authenticated_encryption_sessionless(
10499 		const struct aead_test_data *tdata)
10500 {
10501 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10502 	struct crypto_unittest_params *ut_params = &unittest_params;
10503 
10504 	int retval;
10505 	uint8_t *ciphertext, *auth_tag;
10506 	uint16_t plaintext_pad_len;
10507 	uint8_t key[tdata->key.len + 1];
10508 	struct rte_cryptodev_info dev_info;
10509 
10510 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10511 	uint64_t feat_flags = dev_info.feature_flags;
10512 
10513 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10514 		printf("Device doesn't support Sessionless ops.\n");
10515 		return TEST_SKIPPED;
10516 	}
10517 
10518 	/* not supported with CPU crypto */
10519 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10520 		return TEST_SKIPPED;
10521 
10522 	/* Verify the capabilities */
10523 	struct rte_cryptodev_sym_capability_idx cap_idx;
10524 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10525 	cap_idx.algo.aead = tdata->algo;
10526 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10527 			&cap_idx) == NULL)
10528 		return TEST_SKIPPED;
10529 
10530 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10531 
10532 	/* clear mbuf payload */
10533 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10534 			rte_pktmbuf_tailroom(ut_params->ibuf));
10535 
10536 	/* Create AEAD operation */
10537 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10538 	if (retval < 0)
10539 		return retval;
10540 
10541 	/* Create GCM xform */
10542 	memcpy(key, tdata->key.data, tdata->key.len);
10543 	retval = create_aead_xform(ut_params->op,
10544 			tdata->algo,
10545 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
10546 			key, tdata->key.len,
10547 			tdata->aad.len, tdata->auth_tag.len,
10548 			tdata->iv.len);
10549 	if (retval < 0)
10550 		return retval;
10551 
10552 	ut_params->op->sym->m_src = ut_params->ibuf;
10553 
10554 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10555 			RTE_CRYPTO_OP_SESSIONLESS,
10556 			"crypto op session type not sessionless");
10557 
10558 	/* Process crypto operation */
10559 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10560 			ut_params->op), "failed to process sym crypto op");
10561 
10562 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10563 
10564 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10565 			"crypto op status not success");
10566 
10567 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10568 
10569 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10570 			ut_params->op->sym->cipher.data.offset);
10571 	auth_tag = ciphertext + plaintext_pad_len;
10572 
10573 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10574 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10575 
10576 	/* Validate obuf */
10577 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10578 			ciphertext,
10579 			tdata->ciphertext.data,
10580 			tdata->ciphertext.len,
10581 			"Ciphertext data not as expected");
10582 
10583 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10584 			auth_tag,
10585 			tdata->auth_tag.data,
10586 			tdata->auth_tag.len,
10587 			"Generated auth tag not as expected");
10588 
10589 	return 0;
10590 
10591 }
10592 
10593 static int
10594 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
10595 {
10596 	return test_authenticated_encryption_sessionless(
10597 			&gcm_test_case_5);
10598 }
10599 
10600 static int
10601 test_authenticated_decryption_sessionless(
10602 		const struct aead_test_data *tdata)
10603 {
10604 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10605 	struct crypto_unittest_params *ut_params = &unittest_params;
10606 
10607 	int retval;
10608 	uint8_t *plaintext;
10609 	uint8_t key[tdata->key.len + 1];
10610 	struct rte_cryptodev_info dev_info;
10611 
10612 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10613 	uint64_t feat_flags = dev_info.feature_flags;
10614 
10615 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10616 		printf("Device doesn't support Sessionless ops.\n");
10617 		return TEST_SKIPPED;
10618 	}
10619 
10620 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10621 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10622 		printf("Device doesn't support RAW data-path APIs.\n");
10623 		return TEST_SKIPPED;
10624 	}
10625 
10626 	/* not supported with CPU crypto */
10627 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10628 		return TEST_SKIPPED;
10629 
10630 	/* Verify the capabilities */
10631 	struct rte_cryptodev_sym_capability_idx cap_idx;
10632 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10633 	cap_idx.algo.aead = tdata->algo;
10634 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10635 			&cap_idx) == NULL)
10636 		return TEST_SKIPPED;
10637 
10638 	/* alloc mbuf and set payload */
10639 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10640 
10641 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10642 			rte_pktmbuf_tailroom(ut_params->ibuf));
10643 
10644 	/* Create AEAD operation */
10645 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10646 	if (retval < 0)
10647 		return retval;
10648 
10649 	/* Create AEAD xform */
10650 	memcpy(key, tdata->key.data, tdata->key.len);
10651 	retval = create_aead_xform(ut_params->op,
10652 			tdata->algo,
10653 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10654 			key, tdata->key.len,
10655 			tdata->aad.len, tdata->auth_tag.len,
10656 			tdata->iv.len);
10657 	if (retval < 0)
10658 		return retval;
10659 
10660 	ut_params->op->sym->m_src = ut_params->ibuf;
10661 
10662 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10663 			RTE_CRYPTO_OP_SESSIONLESS,
10664 			"crypto op session type not sessionless");
10665 
10666 	/* Process crypto operation */
10667 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10668 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10669 				ut_params->op, 0, 0, 0, 0);
10670 	else
10671 		TEST_ASSERT_NOT_NULL(process_crypto_request(
10672 			ts_params->valid_devs[0], ut_params->op),
10673 				"failed to process sym crypto op");
10674 
10675 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10676 
10677 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10678 			"crypto op status not success");
10679 
10680 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10681 			ut_params->op->sym->cipher.data.offset);
10682 
10683 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10684 
10685 	/* Validate obuf */
10686 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10687 			plaintext,
10688 			tdata->plaintext.data,
10689 			tdata->plaintext.len,
10690 			"Plaintext data not as expected");
10691 
10692 	TEST_ASSERT_EQUAL(ut_params->op->status,
10693 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10694 			"Authentication failed");
10695 	return 0;
10696 }
10697 
10698 static int
10699 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
10700 {
10701 	return test_authenticated_decryption_sessionless(
10702 			&gcm_test_case_5);
10703 }
10704 
10705 static int
10706 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
10707 {
10708 	return test_authenticated_encryption(&ccm_test_case_128_1);
10709 }
10710 
10711 static int
10712 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
10713 {
10714 	return test_authenticated_encryption(&ccm_test_case_128_2);
10715 }
10716 
10717 static int
10718 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
10719 {
10720 	return test_authenticated_encryption(&ccm_test_case_128_3);
10721 }
10722 
10723 static int
10724 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
10725 {
10726 	return test_authenticated_decryption(&ccm_test_case_128_1);
10727 }
10728 
10729 static int
10730 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
10731 {
10732 	return test_authenticated_decryption(&ccm_test_case_128_2);
10733 }
10734 
10735 static int
10736 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
10737 {
10738 	return test_authenticated_decryption(&ccm_test_case_128_3);
10739 }
10740 
10741 static int
10742 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
10743 {
10744 	return test_authenticated_encryption(&ccm_test_case_192_1);
10745 }
10746 
10747 static int
10748 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
10749 {
10750 	return test_authenticated_encryption(&ccm_test_case_192_2);
10751 }
10752 
10753 static int
10754 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
10755 {
10756 	return test_authenticated_encryption(&ccm_test_case_192_3);
10757 }
10758 
10759 static int
10760 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
10761 {
10762 	return test_authenticated_decryption(&ccm_test_case_192_1);
10763 }
10764 
10765 static int
10766 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
10767 {
10768 	return test_authenticated_decryption(&ccm_test_case_192_2);
10769 }
10770 
10771 static int
10772 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
10773 {
10774 	return test_authenticated_decryption(&ccm_test_case_192_3);
10775 }
10776 
10777 static int
10778 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
10779 {
10780 	return test_authenticated_encryption(&ccm_test_case_256_1);
10781 }
10782 
10783 static int
10784 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
10785 {
10786 	return test_authenticated_encryption(&ccm_test_case_256_2);
10787 }
10788 
10789 static int
10790 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
10791 {
10792 	return test_authenticated_encryption(&ccm_test_case_256_3);
10793 }
10794 
10795 static int
10796 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
10797 {
10798 	return test_authenticated_decryption(&ccm_test_case_256_1);
10799 }
10800 
10801 static int
10802 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
10803 {
10804 	return test_authenticated_decryption(&ccm_test_case_256_2);
10805 }
10806 
10807 static int
10808 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
10809 {
10810 	return test_authenticated_decryption(&ccm_test_case_256_3);
10811 }
10812 
10813 static int
10814 test_stats(void)
10815 {
10816 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10817 	struct rte_cryptodev_stats stats;
10818 
10819 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10820 		return TEST_SKIPPED;
10821 
10822 	/* Verify the capabilities */
10823 	struct rte_cryptodev_sym_capability_idx cap_idx;
10824 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10825 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
10826 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10827 			&cap_idx) == NULL)
10828 		return TEST_SKIPPED;
10829 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10830 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10831 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10832 			&cap_idx) == NULL)
10833 		return TEST_SKIPPED;
10834 
10835 	if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
10836 			== -ENOTSUP)
10837 		return TEST_SKIPPED;
10838 
10839 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10840 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
10841 			&stats) == -ENODEV),
10842 		"rte_cryptodev_stats_get invalid dev failed");
10843 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
10844 		"rte_cryptodev_stats_get invalid Param failed");
10845 
10846 	/* Test expected values */
10847 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
10848 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10849 			&stats),
10850 		"rte_cryptodev_stats_get failed");
10851 	TEST_ASSERT((stats.enqueued_count == 1),
10852 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10853 	TEST_ASSERT((stats.dequeued_count == 1),
10854 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10855 	TEST_ASSERT((stats.enqueue_err_count == 0),
10856 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10857 	TEST_ASSERT((stats.dequeue_err_count == 0),
10858 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10859 
10860 	/* invalid device but should ignore and not reset device stats*/
10861 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
10862 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10863 			&stats),
10864 		"rte_cryptodev_stats_get failed");
10865 	TEST_ASSERT((stats.enqueued_count == 1),
10866 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10867 
10868 	/* check that a valid reset clears stats */
10869 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10870 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10871 			&stats),
10872 					  "rte_cryptodev_stats_get failed");
10873 	TEST_ASSERT((stats.enqueued_count == 0),
10874 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10875 	TEST_ASSERT((stats.dequeued_count == 0),
10876 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10877 
10878 	return TEST_SUCCESS;
10879 }
10880 
10881 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
10882 				   struct crypto_unittest_params *ut_params,
10883 				   enum rte_crypto_auth_operation op,
10884 				   const struct HMAC_MD5_vector *test_case)
10885 {
10886 	uint8_t key[64];
10887 
10888 	memcpy(key, test_case->key.data, test_case->key.len);
10889 
10890 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10891 	ut_params->auth_xform.next = NULL;
10892 	ut_params->auth_xform.auth.op = op;
10893 
10894 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
10895 
10896 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
10897 	ut_params->auth_xform.auth.key.length = test_case->key.len;
10898 	ut_params->auth_xform.auth.key.data = key;
10899 
10900 	ut_params->sess = rte_cryptodev_sym_session_create(
10901 			ts_params->session_mpool);
10902 
10903 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10904 			ut_params->sess, &ut_params->auth_xform,
10905 			ts_params->session_priv_mpool);
10906 
10907 	if (ut_params->sess == NULL)
10908 		return TEST_FAILED;
10909 
10910 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10911 
10912 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10913 			rte_pktmbuf_tailroom(ut_params->ibuf));
10914 
10915 	return 0;
10916 }
10917 
10918 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
10919 			      const struct HMAC_MD5_vector *test_case,
10920 			      uint8_t **plaintext)
10921 {
10922 	uint16_t plaintext_pad_len;
10923 
10924 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10925 
10926 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10927 				16);
10928 
10929 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10930 			plaintext_pad_len);
10931 	memcpy(*plaintext, test_case->plaintext.data,
10932 			test_case->plaintext.len);
10933 
10934 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10935 			ut_params->ibuf, MD5_DIGEST_LEN);
10936 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10937 			"no room to append digest");
10938 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10939 			ut_params->ibuf, plaintext_pad_len);
10940 
10941 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10942 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
10943 			   test_case->auth_tag.len);
10944 	}
10945 
10946 	sym_op->auth.data.offset = 0;
10947 	sym_op->auth.data.length = test_case->plaintext.len;
10948 
10949 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10950 	ut_params->op->sym->m_src = ut_params->ibuf;
10951 
10952 	return 0;
10953 }
10954 
10955 static int
10956 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
10957 {
10958 	uint16_t plaintext_pad_len;
10959 	uint8_t *plaintext, *auth_tag;
10960 
10961 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10962 	struct crypto_unittest_params *ut_params = &unittest_params;
10963 	struct rte_cryptodev_info dev_info;
10964 
10965 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10966 	uint64_t feat_flags = dev_info.feature_flags;
10967 
10968 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10969 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10970 		printf("Device doesn't support RAW data-path APIs.\n");
10971 		return TEST_SKIPPED;
10972 	}
10973 
10974 	/* Verify the capabilities */
10975 	struct rte_cryptodev_sym_capability_idx cap_idx;
10976 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10977 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10978 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10979 			&cap_idx) == NULL)
10980 		return TEST_SKIPPED;
10981 
10982 	if (MD5_HMAC_create_session(ts_params, ut_params,
10983 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
10984 		return TEST_FAILED;
10985 
10986 	/* Generate Crypto op data structure */
10987 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10988 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10989 	TEST_ASSERT_NOT_NULL(ut_params->op,
10990 			"Failed to allocate symmetric crypto operation struct");
10991 
10992 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10993 				16);
10994 
10995 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10996 		return TEST_FAILED;
10997 
10998 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10999 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11000 			ut_params->op);
11001 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11002 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11003 				ut_params->op, 0, 1, 0, 0);
11004 	else
11005 		TEST_ASSERT_NOT_NULL(
11006 			process_crypto_request(ts_params->valid_devs[0],
11007 				ut_params->op),
11008 				"failed to process sym crypto op");
11009 
11010 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11011 			"crypto op processing failed");
11012 
11013 	if (ut_params->op->sym->m_dst) {
11014 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11015 				uint8_t *, plaintext_pad_len);
11016 	} else {
11017 		auth_tag = plaintext + plaintext_pad_len;
11018 	}
11019 
11020 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11021 			auth_tag,
11022 			test_case->auth_tag.data,
11023 			test_case->auth_tag.len,
11024 			"HMAC_MD5 generated tag not as expected");
11025 
11026 	return TEST_SUCCESS;
11027 }
11028 
11029 static int
11030 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
11031 {
11032 	uint8_t *plaintext;
11033 
11034 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11035 	struct crypto_unittest_params *ut_params = &unittest_params;
11036 	struct rte_cryptodev_info dev_info;
11037 
11038 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11039 	uint64_t feat_flags = dev_info.feature_flags;
11040 
11041 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11042 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11043 		printf("Device doesn't support RAW data-path APIs.\n");
11044 		return TEST_SKIPPED;
11045 	}
11046 
11047 	/* Verify the capabilities */
11048 	struct rte_cryptodev_sym_capability_idx cap_idx;
11049 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11050 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11051 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11052 			&cap_idx) == NULL)
11053 		return TEST_SKIPPED;
11054 
11055 	if (MD5_HMAC_create_session(ts_params, ut_params,
11056 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
11057 		return TEST_FAILED;
11058 	}
11059 
11060 	/* Generate Crypto op data structure */
11061 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11062 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11063 	TEST_ASSERT_NOT_NULL(ut_params->op,
11064 			"Failed to allocate symmetric crypto operation struct");
11065 
11066 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11067 		return TEST_FAILED;
11068 
11069 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11070 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11071 			ut_params->op);
11072 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11073 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11074 				ut_params->op, 0, 1, 0, 0);
11075 	else
11076 		TEST_ASSERT_NOT_NULL(
11077 			process_crypto_request(ts_params->valid_devs[0],
11078 				ut_params->op),
11079 				"failed to process sym crypto op");
11080 
11081 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11082 			"HMAC_MD5 crypto op processing failed");
11083 
11084 	return TEST_SUCCESS;
11085 }
11086 
11087 static int
11088 test_MD5_HMAC_generate_case_1(void)
11089 {
11090 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
11091 }
11092 
11093 static int
11094 test_MD5_HMAC_verify_case_1(void)
11095 {
11096 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
11097 }
11098 
11099 static int
11100 test_MD5_HMAC_generate_case_2(void)
11101 {
11102 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
11103 }
11104 
11105 static int
11106 test_MD5_HMAC_verify_case_2(void)
11107 {
11108 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
11109 }
11110 
11111 static int
11112 test_multi_session(void)
11113 {
11114 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11115 	struct crypto_unittest_params *ut_params = &unittest_params;
11116 
11117 	struct rte_cryptodev_info dev_info;
11118 	struct rte_cryptodev_sym_session **sessions;
11119 
11120 	uint16_t i;
11121 
11122 	/* Verify the capabilities */
11123 	struct rte_cryptodev_sym_capability_idx cap_idx;
11124 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11125 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11126 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11127 			&cap_idx) == NULL)
11128 		return TEST_SKIPPED;
11129 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11130 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11131 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11132 			&cap_idx) == NULL)
11133 		return TEST_SKIPPED;
11134 
11135 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
11136 			aes_cbc_key, hmac_sha512_key);
11137 
11138 
11139 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11140 
11141 	sessions = rte_malloc(NULL,
11142 			sizeof(struct rte_cryptodev_sym_session *) *
11143 			(MAX_NB_SESSIONS + 1), 0);
11144 
11145 	/* Create multiple crypto sessions*/
11146 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
11147 
11148 		sessions[i] = rte_cryptodev_sym_session_create(
11149 				ts_params->session_mpool);
11150 
11151 		rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11152 				sessions[i], &ut_params->auth_xform,
11153 				ts_params->session_priv_mpool);
11154 		TEST_ASSERT_NOT_NULL(sessions[i],
11155 				"Session creation failed at session number %u",
11156 				i);
11157 
11158 		/* Attempt to send a request on each session */
11159 		TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
11160 			sessions[i],
11161 			ut_params,
11162 			ts_params,
11163 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
11164 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
11165 			aes_cbc_iv),
11166 			"Failed to perform decrypt on request number %u.", i);
11167 		/* free crypto operation structure */
11168 		if (ut_params->op)
11169 			rte_crypto_op_free(ut_params->op);
11170 
11171 		/*
11172 		 * free mbuf - both obuf and ibuf are usually the same,
11173 		 * so check if they point at the same address is necessary,
11174 		 * to avoid freeing the mbuf twice.
11175 		 */
11176 		if (ut_params->obuf) {
11177 			rte_pktmbuf_free(ut_params->obuf);
11178 			if (ut_params->ibuf == ut_params->obuf)
11179 				ut_params->ibuf = 0;
11180 			ut_params->obuf = 0;
11181 		}
11182 		if (ut_params->ibuf) {
11183 			rte_pktmbuf_free(ut_params->ibuf);
11184 			ut_params->ibuf = 0;
11185 		}
11186 	}
11187 
11188 	sessions[i] = NULL;
11189 	/* Next session create should fail */
11190 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11191 			sessions[i], &ut_params->auth_xform,
11192 			ts_params->session_priv_mpool);
11193 	TEST_ASSERT_NULL(sessions[i],
11194 			"Session creation succeeded unexpectedly!");
11195 
11196 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
11197 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11198 				sessions[i]);
11199 		rte_cryptodev_sym_session_free(sessions[i]);
11200 	}
11201 
11202 	rte_free(sessions);
11203 
11204 	return TEST_SUCCESS;
11205 }
11206 
11207 struct multi_session_params {
11208 	struct crypto_unittest_params ut_params;
11209 	uint8_t *cipher_key;
11210 	uint8_t *hmac_key;
11211 	const uint8_t *cipher;
11212 	const uint8_t *digest;
11213 	uint8_t *iv;
11214 };
11215 
11216 #define MB_SESSION_NUMBER 3
11217 
11218 static int
11219 test_multi_session_random_usage(void)
11220 {
11221 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11222 	struct rte_cryptodev_info dev_info;
11223 	struct rte_cryptodev_sym_session **sessions;
11224 	uint32_t i, j;
11225 	struct multi_session_params ut_paramz[] = {
11226 
11227 		{
11228 			.cipher_key = ms_aes_cbc_key0,
11229 			.hmac_key = ms_hmac_key0,
11230 			.cipher = ms_aes_cbc_cipher0,
11231 			.digest = ms_hmac_digest0,
11232 			.iv = ms_aes_cbc_iv0
11233 		},
11234 		{
11235 			.cipher_key = ms_aes_cbc_key1,
11236 			.hmac_key = ms_hmac_key1,
11237 			.cipher = ms_aes_cbc_cipher1,
11238 			.digest = ms_hmac_digest1,
11239 			.iv = ms_aes_cbc_iv1
11240 		},
11241 		{
11242 			.cipher_key = ms_aes_cbc_key2,
11243 			.hmac_key = ms_hmac_key2,
11244 			.cipher = ms_aes_cbc_cipher2,
11245 			.digest = ms_hmac_digest2,
11246 			.iv = ms_aes_cbc_iv2
11247 		},
11248 
11249 	};
11250 
11251 	/* Verify the capabilities */
11252 	struct rte_cryptodev_sym_capability_idx cap_idx;
11253 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11254 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11255 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11256 			&cap_idx) == NULL)
11257 		return TEST_SKIPPED;
11258 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11259 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11260 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11261 			&cap_idx) == NULL)
11262 		return TEST_SKIPPED;
11263 
11264 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11265 
11266 	sessions = rte_malloc(NULL,
11267 			(sizeof(struct rte_cryptodev_sym_session *)
11268 					* MAX_NB_SESSIONS) + 1, 0);
11269 
11270 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
11271 		sessions[i] = rte_cryptodev_sym_session_create(
11272 				ts_params->session_mpool);
11273 
11274 		rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
11275 				sizeof(struct crypto_unittest_params));
11276 
11277 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
11278 				&ut_paramz[i].ut_params,
11279 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
11280 
11281 		/* Create multiple crypto sessions*/
11282 		rte_cryptodev_sym_session_init(
11283 				ts_params->valid_devs[0],
11284 				sessions[i],
11285 				&ut_paramz[i].ut_params.auth_xform,
11286 				ts_params->session_priv_mpool);
11287 
11288 		TEST_ASSERT_NOT_NULL(sessions[i],
11289 				"Session creation failed at session number %u",
11290 				i);
11291 
11292 	}
11293 
11294 	srand(time(NULL));
11295 	for (i = 0; i < 40000; i++) {
11296 
11297 		j = rand() % MB_SESSION_NUMBER;
11298 
11299 		TEST_ASSERT_SUCCESS(
11300 			test_AES_CBC_HMAC_SHA512_decrypt_perform(
11301 					sessions[j],
11302 					&ut_paramz[j].ut_params,
11303 					ts_params, ut_paramz[j].cipher,
11304 					ut_paramz[j].digest,
11305 					ut_paramz[j].iv),
11306 			"Failed to perform decrypt on request number %u.", i);
11307 
11308 		if (ut_paramz[j].ut_params.op)
11309 			rte_crypto_op_free(ut_paramz[j].ut_params.op);
11310 
11311 		/*
11312 		 * free mbuf - both obuf and ibuf are usually the same,
11313 		 * so check if they point at the same address is necessary,
11314 		 * to avoid freeing the mbuf twice.
11315 		 */
11316 		if (ut_paramz[j].ut_params.obuf) {
11317 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
11318 			if (ut_paramz[j].ut_params.ibuf
11319 					== ut_paramz[j].ut_params.obuf)
11320 				ut_paramz[j].ut_params.ibuf = 0;
11321 			ut_paramz[j].ut_params.obuf = 0;
11322 		}
11323 		if (ut_paramz[j].ut_params.ibuf) {
11324 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
11325 			ut_paramz[j].ut_params.ibuf = 0;
11326 		}
11327 	}
11328 
11329 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
11330 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11331 				sessions[i]);
11332 		rte_cryptodev_sym_session_free(sessions[i]);
11333 	}
11334 
11335 	rte_free(sessions);
11336 
11337 	return TEST_SUCCESS;
11338 }
11339 
11340 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
11341 			0xab, 0xab, 0xab, 0xab,
11342 			0xab, 0xab, 0xab, 0xab,
11343 			0xab, 0xab, 0xab, 0xab};
11344 
11345 static int
11346 test_null_invalid_operation(void)
11347 {
11348 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11349 	struct crypto_unittest_params *ut_params = &unittest_params;
11350 	int ret;
11351 
11352 	/* This test is for NULL PMD only */
11353 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
11354 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11355 		return TEST_SKIPPED;
11356 
11357 	/* Setup Cipher Parameters */
11358 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11359 	ut_params->cipher_xform.next = NULL;
11360 
11361 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
11362 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11363 
11364 	ut_params->sess = rte_cryptodev_sym_session_create(
11365 			ts_params->session_mpool);
11366 
11367 	/* Create Crypto session*/
11368 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11369 			ut_params->sess, &ut_params->cipher_xform,
11370 			ts_params->session_priv_mpool);
11371 	TEST_ASSERT(ret < 0,
11372 			"Session creation succeeded unexpectedly");
11373 
11374 
11375 	/* Setup HMAC Parameters */
11376 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11377 	ut_params->auth_xform.next = NULL;
11378 
11379 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
11380 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11381 
11382 	ut_params->sess = rte_cryptodev_sym_session_create(
11383 			ts_params->session_mpool);
11384 
11385 	/* Create Crypto session*/
11386 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11387 			ut_params->sess, &ut_params->auth_xform,
11388 			ts_params->session_priv_mpool);
11389 	TEST_ASSERT(ret < 0,
11390 			"Session creation succeeded unexpectedly");
11391 
11392 	return TEST_SUCCESS;
11393 }
11394 
11395 
11396 #define NULL_BURST_LENGTH (32)
11397 
11398 static int
11399 test_null_burst_operation(void)
11400 {
11401 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11402 	struct crypto_unittest_params *ut_params = &unittest_params;
11403 
11404 	unsigned i, burst_len = NULL_BURST_LENGTH;
11405 
11406 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
11407 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
11408 
11409 	/* This test is for NULL PMD only */
11410 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
11411 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11412 		return TEST_SKIPPED;
11413 
11414 	/* Setup Cipher Parameters */
11415 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11416 	ut_params->cipher_xform.next = &ut_params->auth_xform;
11417 
11418 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
11419 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11420 
11421 	/* Setup HMAC Parameters */
11422 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11423 	ut_params->auth_xform.next = NULL;
11424 
11425 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
11426 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11427 
11428 	ut_params->sess = rte_cryptodev_sym_session_create(
11429 			ts_params->session_mpool);
11430 
11431 	/* Create Crypto session*/
11432 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11433 			ut_params->sess, &ut_params->cipher_xform,
11434 			ts_params->session_priv_mpool);
11435 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11436 
11437 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
11438 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
11439 			burst_len, "failed to generate burst of crypto ops");
11440 
11441 	/* Generate an operation for each mbuf in burst */
11442 	for (i = 0; i < burst_len; i++) {
11443 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11444 
11445 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
11446 
11447 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
11448 				sizeof(unsigned));
11449 		*data = i;
11450 
11451 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
11452 
11453 		burst[i]->sym->m_src = m;
11454 	}
11455 
11456 	/* Process crypto operation */
11457 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
11458 			0, burst, burst_len),
11459 			burst_len,
11460 			"Error enqueuing burst");
11461 
11462 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
11463 			0, burst_dequeued, burst_len),
11464 			burst_len,
11465 			"Error dequeuing burst");
11466 
11467 
11468 	for (i = 0; i < burst_len; i++) {
11469 		TEST_ASSERT_EQUAL(
11470 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
11471 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
11472 					uint32_t *),
11473 			"data not as expected");
11474 
11475 		rte_pktmbuf_free(burst[i]->sym->m_src);
11476 		rte_crypto_op_free(burst[i]);
11477 	}
11478 
11479 	return TEST_SUCCESS;
11480 }
11481 
11482 static uint16_t
11483 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11484 		  uint16_t nb_ops, void *user_param)
11485 {
11486 	RTE_SET_USED(dev_id);
11487 	RTE_SET_USED(qp_id);
11488 	RTE_SET_USED(ops);
11489 	RTE_SET_USED(user_param);
11490 
11491 	printf("crypto enqueue callback called\n");
11492 	return nb_ops;
11493 }
11494 
11495 static uint16_t
11496 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11497 		  uint16_t nb_ops, void *user_param)
11498 {
11499 	RTE_SET_USED(dev_id);
11500 	RTE_SET_USED(qp_id);
11501 	RTE_SET_USED(ops);
11502 	RTE_SET_USED(user_param);
11503 
11504 	printf("crypto dequeue callback called\n");
11505 	return nb_ops;
11506 }
11507 
11508 /*
11509  * Thread using enqueue/dequeue callback with RCU.
11510  */
11511 static int
11512 test_enqdeq_callback_thread(void *arg)
11513 {
11514 	RTE_SET_USED(arg);
11515 	/* DP thread calls rte_cryptodev_enqueue_burst()/
11516 	 * rte_cryptodev_dequeue_burst() and invokes callback.
11517 	 */
11518 	test_null_burst_operation();
11519 	return 0;
11520 }
11521 
11522 static int
11523 test_enq_callback_setup(void)
11524 {
11525 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11526 	struct rte_cryptodev_info dev_info;
11527 	struct rte_cryptodev_qp_conf qp_conf = {
11528 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
11529 	};
11530 
11531 	struct rte_cryptodev_cb *cb;
11532 	uint16_t qp_id = 0;
11533 
11534 	/* Stop the device in case it's started so it can be configured */
11535 	rte_cryptodev_stop(ts_params->valid_devs[0]);
11536 
11537 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11538 
11539 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11540 			&ts_params->conf),
11541 			"Failed to configure cryptodev %u",
11542 			ts_params->valid_devs[0]);
11543 
11544 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11545 	qp_conf.mp_session = ts_params->session_mpool;
11546 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
11547 
11548 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11549 			ts_params->valid_devs[0], qp_id, &qp_conf,
11550 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11551 			"Failed test for "
11552 			"rte_cryptodev_queue_pair_setup: num_inflights "
11553 			"%u on qp %u on cryptodev %u",
11554 			qp_conf.nb_descriptors, qp_id,
11555 			ts_params->valid_devs[0]);
11556 
11557 	/* Test with invalid crypto device */
11558 	cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
11559 			qp_id, test_enq_callback, NULL);
11560 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11561 			"cryptodev %u did not fail",
11562 			qp_id, RTE_CRYPTO_MAX_DEVS);
11563 
11564 	/* Test with invalid queue pair */
11565 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11566 			dev_info.max_nb_queue_pairs + 1,
11567 			test_enq_callback, NULL);
11568 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11569 			"cryptodev %u did not fail",
11570 			dev_info.max_nb_queue_pairs + 1,
11571 			ts_params->valid_devs[0]);
11572 
11573 	/* Test with NULL callback */
11574 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11575 			qp_id, NULL, NULL);
11576 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11577 			"cryptodev %u did not fail",
11578 			qp_id, ts_params->valid_devs[0]);
11579 
11580 	/* Test with valid configuration */
11581 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11582 			qp_id, test_enq_callback, NULL);
11583 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11584 			"qp %u on cryptodev %u",
11585 			qp_id, ts_params->valid_devs[0]);
11586 
11587 	rte_cryptodev_start(ts_params->valid_devs[0]);
11588 
11589 	/* Launch a thread */
11590 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11591 				rte_get_next_lcore(-1, 1, 0));
11592 
11593 	/* Wait until reader exited. */
11594 	rte_eal_mp_wait_lcore();
11595 
11596 	/* Test with invalid crypto device */
11597 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11598 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11599 			"Expected call to fail as crypto device is invalid");
11600 
11601 	/* Test with invalid queue pair */
11602 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11603 			ts_params->valid_devs[0],
11604 			dev_info.max_nb_queue_pairs + 1, cb),
11605 			"Expected call to fail as queue pair is invalid");
11606 
11607 	/* Test with NULL callback */
11608 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11609 			ts_params->valid_devs[0], qp_id, NULL),
11610 			"Expected call to fail as callback is NULL");
11611 
11612 	/* Test with valid configuration */
11613 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
11614 			ts_params->valid_devs[0], qp_id, cb),
11615 			"Failed test to remove callback on "
11616 			"qp %u on cryptodev %u",
11617 			qp_id, ts_params->valid_devs[0]);
11618 
11619 	return TEST_SUCCESS;
11620 }
11621 
11622 static int
11623 test_deq_callback_setup(void)
11624 {
11625 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11626 	struct rte_cryptodev_info dev_info;
11627 	struct rte_cryptodev_qp_conf qp_conf = {
11628 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
11629 	};
11630 
11631 	struct rte_cryptodev_cb *cb;
11632 	uint16_t qp_id = 0;
11633 
11634 	/* Stop the device in case it's started so it can be configured */
11635 	rte_cryptodev_stop(ts_params->valid_devs[0]);
11636 
11637 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11638 
11639 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11640 			&ts_params->conf),
11641 			"Failed to configure cryptodev %u",
11642 			ts_params->valid_devs[0]);
11643 
11644 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11645 	qp_conf.mp_session = ts_params->session_mpool;
11646 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
11647 
11648 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11649 			ts_params->valid_devs[0], qp_id, &qp_conf,
11650 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11651 			"Failed test for "
11652 			"rte_cryptodev_queue_pair_setup: num_inflights "
11653 			"%u on qp %u on cryptodev %u",
11654 			qp_conf.nb_descriptors, qp_id,
11655 			ts_params->valid_devs[0]);
11656 
11657 	/* Test with invalid crypto device */
11658 	cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
11659 			qp_id, test_deq_callback, NULL);
11660 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11661 			"cryptodev %u did not fail",
11662 			qp_id, RTE_CRYPTO_MAX_DEVS);
11663 
11664 	/* Test with invalid queue pair */
11665 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11666 			dev_info.max_nb_queue_pairs + 1,
11667 			test_deq_callback, NULL);
11668 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11669 			"cryptodev %u did not fail",
11670 			dev_info.max_nb_queue_pairs + 1,
11671 			ts_params->valid_devs[0]);
11672 
11673 	/* Test with NULL callback */
11674 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11675 			qp_id, NULL, NULL);
11676 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11677 			"cryptodev %u did not fail",
11678 			qp_id, ts_params->valid_devs[0]);
11679 
11680 	/* Test with valid configuration */
11681 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11682 			qp_id, test_deq_callback, NULL);
11683 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11684 			"qp %u on cryptodev %u",
11685 			qp_id, ts_params->valid_devs[0]);
11686 
11687 	rte_cryptodev_start(ts_params->valid_devs[0]);
11688 
11689 	/* Launch a thread */
11690 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11691 				rte_get_next_lcore(-1, 1, 0));
11692 
11693 	/* Wait until reader exited. */
11694 	rte_eal_mp_wait_lcore();
11695 
11696 	/* Test with invalid crypto device */
11697 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11698 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11699 			"Expected call to fail as crypto device is invalid");
11700 
11701 	/* Test with invalid queue pair */
11702 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11703 			ts_params->valid_devs[0],
11704 			dev_info.max_nb_queue_pairs + 1, cb),
11705 			"Expected call to fail as queue pair is invalid");
11706 
11707 	/* Test with NULL callback */
11708 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11709 			ts_params->valid_devs[0], qp_id, NULL),
11710 			"Expected call to fail as callback is NULL");
11711 
11712 	/* Test with valid configuration */
11713 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
11714 			ts_params->valid_devs[0], qp_id, cb),
11715 			"Failed test to remove callback on "
11716 			"qp %u on cryptodev %u",
11717 			qp_id, ts_params->valid_devs[0]);
11718 
11719 	return TEST_SUCCESS;
11720 }
11721 
11722 static void
11723 generate_gmac_large_plaintext(uint8_t *data)
11724 {
11725 	uint16_t i;
11726 
11727 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
11728 		memcpy(&data[i], &data[0], 32);
11729 }
11730 
11731 static int
11732 create_gmac_operation(enum rte_crypto_auth_operation op,
11733 		const struct gmac_test_data *tdata)
11734 {
11735 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11736 	struct crypto_unittest_params *ut_params = &unittest_params;
11737 	struct rte_crypto_sym_op *sym_op;
11738 
11739 	uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11740 
11741 	/* Generate Crypto op data structure */
11742 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11743 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11744 	TEST_ASSERT_NOT_NULL(ut_params->op,
11745 			"Failed to allocate symmetric crypto operation struct");
11746 
11747 	sym_op = ut_params->op->sym;
11748 
11749 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11750 			ut_params->ibuf, tdata->gmac_tag.len);
11751 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11752 			"no room to append digest");
11753 
11754 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11755 			ut_params->ibuf, plaintext_pad_len);
11756 
11757 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11758 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11759 				tdata->gmac_tag.len);
11760 		debug_hexdump(stdout, "digest:",
11761 				sym_op->auth.digest.data,
11762 				tdata->gmac_tag.len);
11763 	}
11764 
11765 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11766 			uint8_t *, IV_OFFSET);
11767 
11768 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11769 
11770 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11771 
11772 	sym_op->cipher.data.length = 0;
11773 	sym_op->cipher.data.offset = 0;
11774 
11775 	sym_op->auth.data.offset = 0;
11776 	sym_op->auth.data.length = tdata->plaintext.len;
11777 
11778 	return 0;
11779 }
11780 
11781 static int
11782 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
11783 		const struct gmac_test_data *tdata,
11784 		void *digest_mem, uint64_t digest_phys)
11785 {
11786 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11787 	struct crypto_unittest_params *ut_params = &unittest_params;
11788 	struct rte_crypto_sym_op *sym_op;
11789 
11790 	/* Generate Crypto op data structure */
11791 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11792 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11793 	TEST_ASSERT_NOT_NULL(ut_params->op,
11794 			"Failed to allocate symmetric crypto operation struct");
11795 
11796 	sym_op = ut_params->op->sym;
11797 
11798 	sym_op->auth.digest.data = digest_mem;
11799 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11800 			"no room to append digest");
11801 
11802 	sym_op->auth.digest.phys_addr = digest_phys;
11803 
11804 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11805 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11806 				tdata->gmac_tag.len);
11807 		debug_hexdump(stdout, "digest:",
11808 				sym_op->auth.digest.data,
11809 				tdata->gmac_tag.len);
11810 	}
11811 
11812 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11813 			uint8_t *, IV_OFFSET);
11814 
11815 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11816 
11817 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11818 
11819 	sym_op->cipher.data.length = 0;
11820 	sym_op->cipher.data.offset = 0;
11821 
11822 	sym_op->auth.data.offset = 0;
11823 	sym_op->auth.data.length = tdata->plaintext.len;
11824 
11825 	return 0;
11826 }
11827 
11828 static int create_gmac_session(uint8_t dev_id,
11829 		const struct gmac_test_data *tdata,
11830 		enum rte_crypto_auth_operation auth_op)
11831 {
11832 	uint8_t auth_key[tdata->key.len];
11833 
11834 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11835 	struct crypto_unittest_params *ut_params = &unittest_params;
11836 
11837 	memcpy(auth_key, tdata->key.data, tdata->key.len);
11838 
11839 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11840 	ut_params->auth_xform.next = NULL;
11841 
11842 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
11843 	ut_params->auth_xform.auth.op = auth_op;
11844 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
11845 	ut_params->auth_xform.auth.key.length = tdata->key.len;
11846 	ut_params->auth_xform.auth.key.data = auth_key;
11847 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11848 	ut_params->auth_xform.auth.iv.length = tdata->iv.len;
11849 
11850 
11851 	ut_params->sess = rte_cryptodev_sym_session_create(
11852 			ts_params->session_mpool);
11853 
11854 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11855 			&ut_params->auth_xform,
11856 			ts_params->session_priv_mpool);
11857 
11858 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11859 
11860 	return 0;
11861 }
11862 
11863 static int
11864 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
11865 {
11866 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11867 	struct crypto_unittest_params *ut_params = &unittest_params;
11868 	struct rte_cryptodev_info dev_info;
11869 
11870 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11871 	uint64_t feat_flags = dev_info.feature_flags;
11872 
11873 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11874 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11875 		printf("Device doesn't support RAW data-path APIs.\n");
11876 		return TEST_SKIPPED;
11877 	}
11878 
11879 	int retval;
11880 
11881 	uint8_t *auth_tag, *plaintext;
11882 	uint16_t plaintext_pad_len;
11883 
11884 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11885 			      "No GMAC length in the source data");
11886 
11887 	/* Verify the capabilities */
11888 	struct rte_cryptodev_sym_capability_idx cap_idx;
11889 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11890 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11891 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11892 			&cap_idx) == NULL)
11893 		return TEST_SKIPPED;
11894 
11895 	retval = create_gmac_session(ts_params->valid_devs[0],
11896 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11897 
11898 	if (retval < 0)
11899 		return retval;
11900 
11901 	if (tdata->plaintext.len > MBUF_SIZE)
11902 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11903 	else
11904 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11905 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11906 			"Failed to allocate input buffer in mempool");
11907 
11908 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11909 			rte_pktmbuf_tailroom(ut_params->ibuf));
11910 
11911 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11912 	/*
11913 	 * Runtime generate the large plain text instead of use hard code
11914 	 * plain text vector. It is done to avoid create huge source file
11915 	 * with the test vector.
11916 	 */
11917 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11918 		generate_gmac_large_plaintext(tdata->plaintext.data);
11919 
11920 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11921 				plaintext_pad_len);
11922 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11923 
11924 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11925 	debug_hexdump(stdout, "plaintext:", plaintext,
11926 			tdata->plaintext.len);
11927 
11928 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
11929 			tdata);
11930 
11931 	if (retval < 0)
11932 		return retval;
11933 
11934 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11935 
11936 	ut_params->op->sym->m_src = ut_params->ibuf;
11937 
11938 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11939 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11940 			ut_params->op);
11941 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11942 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11943 				ut_params->op, 0, 1, 0, 0);
11944 	else
11945 		TEST_ASSERT_NOT_NULL(
11946 			process_crypto_request(ts_params->valid_devs[0],
11947 			ut_params->op), "failed to process sym crypto op");
11948 
11949 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11950 			"crypto op processing failed");
11951 
11952 	if (ut_params->op->sym->m_dst) {
11953 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11954 				uint8_t *, plaintext_pad_len);
11955 	} else {
11956 		auth_tag = plaintext + plaintext_pad_len;
11957 	}
11958 
11959 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11960 
11961 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11962 			auth_tag,
11963 			tdata->gmac_tag.data,
11964 			tdata->gmac_tag.len,
11965 			"GMAC Generated auth tag not as expected");
11966 
11967 	return 0;
11968 }
11969 
11970 static int
11971 test_AES_GMAC_authentication_test_case_1(void)
11972 {
11973 	return test_AES_GMAC_authentication(&gmac_test_case_1);
11974 }
11975 
11976 static int
11977 test_AES_GMAC_authentication_test_case_2(void)
11978 {
11979 	return test_AES_GMAC_authentication(&gmac_test_case_2);
11980 }
11981 
11982 static int
11983 test_AES_GMAC_authentication_test_case_3(void)
11984 {
11985 	return test_AES_GMAC_authentication(&gmac_test_case_3);
11986 }
11987 
11988 static int
11989 test_AES_GMAC_authentication_test_case_4(void)
11990 {
11991 	return test_AES_GMAC_authentication(&gmac_test_case_4);
11992 }
11993 
11994 static int
11995 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
11996 {
11997 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11998 	struct crypto_unittest_params *ut_params = &unittest_params;
11999 	int retval;
12000 	uint32_t plaintext_pad_len;
12001 	uint8_t *plaintext;
12002 	struct rte_cryptodev_info dev_info;
12003 
12004 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12005 	uint64_t feat_flags = dev_info.feature_flags;
12006 
12007 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12008 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12009 		printf("Device doesn't support RAW data-path APIs.\n");
12010 		return TEST_SKIPPED;
12011 	}
12012 
12013 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12014 			      "No GMAC length in the source data");
12015 
12016 	/* Verify the capabilities */
12017 	struct rte_cryptodev_sym_capability_idx cap_idx;
12018 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12019 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12020 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12021 			&cap_idx) == NULL)
12022 		return TEST_SKIPPED;
12023 
12024 	retval = create_gmac_session(ts_params->valid_devs[0],
12025 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
12026 
12027 	if (retval < 0)
12028 		return retval;
12029 
12030 	if (tdata->plaintext.len > MBUF_SIZE)
12031 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12032 	else
12033 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12034 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12035 			"Failed to allocate input buffer in mempool");
12036 
12037 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12038 			rte_pktmbuf_tailroom(ut_params->ibuf));
12039 
12040 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12041 
12042 	/*
12043 	 * Runtime generate the large plain text instead of use hard code
12044 	 * plain text vector. It is done to avoid create huge source file
12045 	 * with the test vector.
12046 	 */
12047 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12048 		generate_gmac_large_plaintext(tdata->plaintext.data);
12049 
12050 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12051 				plaintext_pad_len);
12052 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12053 
12054 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12055 	debug_hexdump(stdout, "plaintext:", plaintext,
12056 			tdata->plaintext.len);
12057 
12058 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
12059 			tdata);
12060 
12061 	if (retval < 0)
12062 		return retval;
12063 
12064 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12065 
12066 	ut_params->op->sym->m_src = ut_params->ibuf;
12067 
12068 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12069 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12070 			ut_params->op);
12071 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12072 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12073 				ut_params->op, 0, 1, 0, 0);
12074 	else
12075 		TEST_ASSERT_NOT_NULL(
12076 			process_crypto_request(ts_params->valid_devs[0],
12077 			ut_params->op), "failed to process sym crypto op");
12078 
12079 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12080 			"crypto op processing failed");
12081 
12082 	return 0;
12083 
12084 }
12085 
12086 static int
12087 test_AES_GMAC_authentication_verify_test_case_1(void)
12088 {
12089 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
12090 }
12091 
12092 static int
12093 test_AES_GMAC_authentication_verify_test_case_2(void)
12094 {
12095 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
12096 }
12097 
12098 static int
12099 test_AES_GMAC_authentication_verify_test_case_3(void)
12100 {
12101 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
12102 }
12103 
12104 static int
12105 test_AES_GMAC_authentication_verify_test_case_4(void)
12106 {
12107 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
12108 }
12109 
12110 static int
12111 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
12112 				uint32_t fragsz)
12113 {
12114 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12115 	struct crypto_unittest_params *ut_params = &unittest_params;
12116 	struct rte_cryptodev_info dev_info;
12117 	uint64_t feature_flags;
12118 	unsigned int trn_data = 0;
12119 	void *digest_mem = NULL;
12120 	uint32_t segs = 1;
12121 	unsigned int to_trn = 0;
12122 	struct rte_mbuf *buf = NULL;
12123 	uint8_t *auth_tag, *plaintext;
12124 	int retval;
12125 
12126 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12127 			      "No GMAC length in the source data");
12128 
12129 	/* Verify the capabilities */
12130 	struct rte_cryptodev_sym_capability_idx cap_idx;
12131 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12132 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12133 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12134 			&cap_idx) == NULL)
12135 		return TEST_SKIPPED;
12136 
12137 	/* Check for any input SGL support */
12138 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12139 	feature_flags = dev_info.feature_flags;
12140 
12141 	if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
12142 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
12143 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
12144 		return TEST_SKIPPED;
12145 
12146 	if (fragsz > tdata->plaintext.len)
12147 		fragsz = tdata->plaintext.len;
12148 
12149 	uint16_t plaintext_len = fragsz;
12150 
12151 	retval = create_gmac_session(ts_params->valid_devs[0],
12152 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12153 
12154 	if (retval < 0)
12155 		return retval;
12156 
12157 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12158 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12159 			"Failed to allocate input buffer in mempool");
12160 
12161 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12162 			rte_pktmbuf_tailroom(ut_params->ibuf));
12163 
12164 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12165 				plaintext_len);
12166 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12167 
12168 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12169 
12170 	trn_data += plaintext_len;
12171 
12172 	buf = ut_params->ibuf;
12173 
12174 	/*
12175 	 * Loop until no more fragments
12176 	 */
12177 
12178 	while (trn_data < tdata->plaintext.len) {
12179 		++segs;
12180 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12181 				(tdata->plaintext.len - trn_data) : fragsz;
12182 
12183 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12184 		buf = buf->next;
12185 
12186 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12187 				rte_pktmbuf_tailroom(buf));
12188 
12189 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12190 				to_trn);
12191 
12192 		memcpy(plaintext, tdata->plaintext.data + trn_data,
12193 				to_trn);
12194 		trn_data += to_trn;
12195 		if (trn_data  == tdata->plaintext.len)
12196 			digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12197 					tdata->gmac_tag.len);
12198 	}
12199 	ut_params->ibuf->nb_segs = segs;
12200 
12201 	/*
12202 	 * Place digest at the end of the last buffer
12203 	 */
12204 	uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12205 
12206 	if (!digest_mem) {
12207 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12208 				+ tdata->gmac_tag.len);
12209 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12210 				tdata->plaintext.len);
12211 	}
12212 
12213 	retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
12214 			tdata, digest_mem, digest_phys);
12215 
12216 	if (retval < 0)
12217 		return retval;
12218 
12219 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12220 
12221 	ut_params->op->sym->m_src = ut_params->ibuf;
12222 
12223 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12224 		return TEST_SKIPPED;
12225 
12226 	TEST_ASSERT_NOT_NULL(
12227 		process_crypto_request(ts_params->valid_devs[0],
12228 		ut_params->op), "failed to process sym crypto op");
12229 
12230 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12231 			"crypto op processing failed");
12232 
12233 	auth_tag = digest_mem;
12234 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12235 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12236 			auth_tag,
12237 			tdata->gmac_tag.data,
12238 			tdata->gmac_tag.len,
12239 			"GMAC Generated auth tag not as expected");
12240 
12241 	return 0;
12242 }
12243 
12244 /* Segment size not multiple of block size (16B) */
12245 static int
12246 test_AES_GMAC_authentication_SGL_40B(void)
12247 {
12248 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
12249 }
12250 
12251 static int
12252 test_AES_GMAC_authentication_SGL_80B(void)
12253 {
12254 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
12255 }
12256 
12257 static int
12258 test_AES_GMAC_authentication_SGL_2048B(void)
12259 {
12260 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
12261 }
12262 
12263 /* Segment size not multiple of block size (16B) */
12264 static int
12265 test_AES_GMAC_authentication_SGL_2047B(void)
12266 {
12267 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
12268 }
12269 
12270 struct test_crypto_vector {
12271 	enum rte_crypto_cipher_algorithm crypto_algo;
12272 	unsigned int cipher_offset;
12273 	unsigned int cipher_len;
12274 
12275 	struct {
12276 		uint8_t data[64];
12277 		unsigned int len;
12278 	} cipher_key;
12279 
12280 	struct {
12281 		uint8_t data[64];
12282 		unsigned int len;
12283 	} iv;
12284 
12285 	struct {
12286 		const uint8_t *data;
12287 		unsigned int len;
12288 	} plaintext;
12289 
12290 	struct {
12291 		const uint8_t *data;
12292 		unsigned int len;
12293 	} ciphertext;
12294 
12295 	enum rte_crypto_auth_algorithm auth_algo;
12296 	unsigned int auth_offset;
12297 
12298 	struct {
12299 		uint8_t data[128];
12300 		unsigned int len;
12301 	} auth_key;
12302 
12303 	struct {
12304 		const uint8_t *data;
12305 		unsigned int len;
12306 	} aad;
12307 
12308 	struct {
12309 		uint8_t data[128];
12310 		unsigned int len;
12311 	} digest;
12312 };
12313 
12314 static const struct test_crypto_vector
12315 hmac_sha1_test_crypto_vector = {
12316 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12317 	.plaintext = {
12318 		.data = plaintext_hash,
12319 		.len = 512
12320 	},
12321 	.auth_key = {
12322 		.data = {
12323 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12324 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12325 			0xDE, 0xF4, 0xDE, 0xAD
12326 		},
12327 		.len = 20
12328 	},
12329 	.digest = {
12330 		.data = {
12331 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
12332 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
12333 			0x3F, 0x91, 0x64, 0x59
12334 		},
12335 		.len = 20
12336 	}
12337 };
12338 
12339 static const struct test_crypto_vector
12340 aes128_gmac_test_vector = {
12341 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
12342 	.plaintext = {
12343 		.data = plaintext_hash,
12344 		.len = 512
12345 	},
12346 	.iv = {
12347 		.data = {
12348 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12349 			0x08, 0x09, 0x0A, 0x0B
12350 		},
12351 		.len = 12
12352 	},
12353 	.auth_key = {
12354 		.data = {
12355 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12356 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
12357 		},
12358 		.len = 16
12359 	},
12360 	.digest = {
12361 		.data = {
12362 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
12363 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
12364 		},
12365 		.len = 16
12366 	}
12367 };
12368 
12369 static const struct test_crypto_vector
12370 aes128cbc_hmac_sha1_test_vector = {
12371 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12372 	.cipher_offset = 0,
12373 	.cipher_len = 512,
12374 	.cipher_key = {
12375 		.data = {
12376 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12377 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12378 		},
12379 		.len = 16
12380 	},
12381 	.iv = {
12382 		.data = {
12383 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12384 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12385 		},
12386 		.len = 16
12387 	},
12388 	.plaintext = {
12389 		.data = plaintext_hash,
12390 		.len = 512
12391 	},
12392 	.ciphertext = {
12393 		.data = ciphertext512_aes128cbc,
12394 		.len = 512
12395 	},
12396 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12397 	.auth_offset = 0,
12398 	.auth_key = {
12399 		.data = {
12400 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12401 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12402 			0xDE, 0xF4, 0xDE, 0xAD
12403 		},
12404 		.len = 20
12405 	},
12406 	.digest = {
12407 		.data = {
12408 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
12409 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12410 			0x18, 0x8C, 0x1D, 0x32
12411 		},
12412 		.len = 20
12413 	}
12414 };
12415 
12416 static const struct test_crypto_vector
12417 aes128cbc_hmac_sha1_aad_test_vector = {
12418 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12419 	.cipher_offset = 8,
12420 	.cipher_len = 496,
12421 	.cipher_key = {
12422 		.data = {
12423 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12424 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12425 		},
12426 		.len = 16
12427 	},
12428 	.iv = {
12429 		.data = {
12430 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12431 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12432 		},
12433 		.len = 16
12434 	},
12435 	.plaintext = {
12436 		.data = plaintext_hash,
12437 		.len = 512
12438 	},
12439 	.ciphertext = {
12440 		.data = ciphertext512_aes128cbc_aad,
12441 		.len = 512
12442 	},
12443 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12444 	.auth_offset = 0,
12445 	.auth_key = {
12446 		.data = {
12447 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12448 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12449 			0xDE, 0xF4, 0xDE, 0xAD
12450 		},
12451 		.len = 20
12452 	},
12453 	.digest = {
12454 		.data = {
12455 			0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
12456 			0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
12457 			0x62, 0x0F, 0xFB, 0x10
12458 		},
12459 		.len = 20
12460 	}
12461 };
12462 
12463 static void
12464 data_corruption(uint8_t *data)
12465 {
12466 	data[0] += 1;
12467 }
12468 
12469 static void
12470 tag_corruption(uint8_t *data, unsigned int tag_offset)
12471 {
12472 	data[tag_offset] += 1;
12473 }
12474 
12475 static int
12476 create_auth_session(struct crypto_unittest_params *ut_params,
12477 		uint8_t dev_id,
12478 		const struct test_crypto_vector *reference,
12479 		enum rte_crypto_auth_operation auth_op)
12480 {
12481 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12482 	uint8_t auth_key[reference->auth_key.len + 1];
12483 
12484 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12485 
12486 	/* Setup Authentication Parameters */
12487 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12488 	ut_params->auth_xform.auth.op = auth_op;
12489 	ut_params->auth_xform.next = NULL;
12490 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12491 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12492 	ut_params->auth_xform.auth.key.data = auth_key;
12493 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12494 
12495 	/* Create Crypto session*/
12496 	ut_params->sess = rte_cryptodev_sym_session_create(
12497 			ts_params->session_mpool);
12498 
12499 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12500 				&ut_params->auth_xform,
12501 				ts_params->session_priv_mpool);
12502 
12503 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12504 
12505 	return 0;
12506 }
12507 
12508 static int
12509 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
12510 		uint8_t dev_id,
12511 		const struct test_crypto_vector *reference,
12512 		enum rte_crypto_auth_operation auth_op,
12513 		enum rte_crypto_cipher_operation cipher_op)
12514 {
12515 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12516 	uint8_t cipher_key[reference->cipher_key.len + 1];
12517 	uint8_t auth_key[reference->auth_key.len + 1];
12518 
12519 	memcpy(cipher_key, reference->cipher_key.data,
12520 			reference->cipher_key.len);
12521 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12522 
12523 	/* Setup Authentication Parameters */
12524 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12525 	ut_params->auth_xform.auth.op = auth_op;
12526 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12527 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12528 	ut_params->auth_xform.auth.key.data = auth_key;
12529 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12530 
12531 	if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
12532 		ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12533 		ut_params->auth_xform.auth.iv.length = reference->iv.len;
12534 	} else {
12535 		ut_params->auth_xform.next = &ut_params->cipher_xform;
12536 
12537 		/* Setup Cipher Parameters */
12538 		ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12539 		ut_params->cipher_xform.next = NULL;
12540 		ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12541 		ut_params->cipher_xform.cipher.op = cipher_op;
12542 		ut_params->cipher_xform.cipher.key.data = cipher_key;
12543 		ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12544 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12545 		ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12546 	}
12547 
12548 	/* Create Crypto session*/
12549 	ut_params->sess = rte_cryptodev_sym_session_create(
12550 			ts_params->session_mpool);
12551 
12552 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12553 				&ut_params->auth_xform,
12554 				ts_params->session_priv_mpool);
12555 
12556 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12557 
12558 	return 0;
12559 }
12560 
12561 static int
12562 create_auth_operation(struct crypto_testsuite_params *ts_params,
12563 		struct crypto_unittest_params *ut_params,
12564 		const struct test_crypto_vector *reference,
12565 		unsigned int auth_generate)
12566 {
12567 	/* Generate Crypto op data structure */
12568 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12569 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12570 	TEST_ASSERT_NOT_NULL(ut_params->op,
12571 			"Failed to allocate pktmbuf offload");
12572 
12573 	/* Set crypto operation data parameters */
12574 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12575 
12576 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12577 
12578 	/* set crypto operation source mbuf */
12579 	sym_op->m_src = ut_params->ibuf;
12580 
12581 	/* digest */
12582 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12583 			ut_params->ibuf, reference->digest.len);
12584 
12585 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12586 			"no room to append auth tag");
12587 
12588 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12589 			ut_params->ibuf, reference->plaintext.len);
12590 
12591 	if (auth_generate)
12592 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12593 	else
12594 		memcpy(sym_op->auth.digest.data,
12595 				reference->digest.data,
12596 				reference->digest.len);
12597 
12598 	debug_hexdump(stdout, "digest:",
12599 			sym_op->auth.digest.data,
12600 			reference->digest.len);
12601 
12602 	sym_op->auth.data.length = reference->plaintext.len;
12603 	sym_op->auth.data.offset = 0;
12604 
12605 	return 0;
12606 }
12607 
12608 static int
12609 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
12610 		struct crypto_unittest_params *ut_params,
12611 		const struct test_crypto_vector *reference,
12612 		unsigned int auth_generate)
12613 {
12614 	/* Generate Crypto op data structure */
12615 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12616 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12617 	TEST_ASSERT_NOT_NULL(ut_params->op,
12618 			"Failed to allocate pktmbuf offload");
12619 
12620 	/* Set crypto operation data parameters */
12621 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12622 
12623 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12624 
12625 	/* set crypto operation source mbuf */
12626 	sym_op->m_src = ut_params->ibuf;
12627 
12628 	/* digest */
12629 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12630 			ut_params->ibuf, reference->digest.len);
12631 
12632 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12633 			"no room to append auth tag");
12634 
12635 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12636 			ut_params->ibuf, reference->ciphertext.len);
12637 
12638 	if (auth_generate)
12639 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12640 	else
12641 		memcpy(sym_op->auth.digest.data,
12642 				reference->digest.data,
12643 				reference->digest.len);
12644 
12645 	debug_hexdump(stdout, "digest:",
12646 			sym_op->auth.digest.data,
12647 			reference->digest.len);
12648 
12649 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12650 			reference->iv.data, reference->iv.len);
12651 
12652 	sym_op->cipher.data.length = 0;
12653 	sym_op->cipher.data.offset = 0;
12654 
12655 	sym_op->auth.data.length = reference->plaintext.len;
12656 	sym_op->auth.data.offset = 0;
12657 
12658 	return 0;
12659 }
12660 
12661 static int
12662 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
12663 		struct crypto_unittest_params *ut_params,
12664 		const struct test_crypto_vector *reference,
12665 		unsigned int auth_generate)
12666 {
12667 	/* Generate Crypto op data structure */
12668 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12669 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12670 	TEST_ASSERT_NOT_NULL(ut_params->op,
12671 			"Failed to allocate pktmbuf offload");
12672 
12673 	/* Set crypto operation data parameters */
12674 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12675 
12676 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12677 
12678 	/* set crypto operation source mbuf */
12679 	sym_op->m_src = ut_params->ibuf;
12680 
12681 	/* digest */
12682 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12683 			ut_params->ibuf, reference->digest.len);
12684 
12685 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12686 			"no room to append auth tag");
12687 
12688 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12689 			ut_params->ibuf, reference->ciphertext.len);
12690 
12691 	if (auth_generate)
12692 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12693 	else
12694 		memcpy(sym_op->auth.digest.data,
12695 				reference->digest.data,
12696 				reference->digest.len);
12697 
12698 	debug_hexdump(stdout, "digest:",
12699 			sym_op->auth.digest.data,
12700 			reference->digest.len);
12701 
12702 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12703 			reference->iv.data, reference->iv.len);
12704 
12705 	sym_op->cipher.data.length = reference->cipher_len;
12706 	sym_op->cipher.data.offset = reference->cipher_offset;
12707 
12708 	sym_op->auth.data.length = reference->plaintext.len;
12709 	sym_op->auth.data.offset = reference->auth_offset;
12710 
12711 	return 0;
12712 }
12713 
12714 static int
12715 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12716 		struct crypto_unittest_params *ut_params,
12717 		const struct test_crypto_vector *reference)
12718 {
12719 	return create_auth_operation(ts_params, ut_params, reference, 0);
12720 }
12721 
12722 static int
12723 create_auth_verify_GMAC_operation(
12724 		struct crypto_testsuite_params *ts_params,
12725 		struct crypto_unittest_params *ut_params,
12726 		const struct test_crypto_vector *reference)
12727 {
12728 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
12729 }
12730 
12731 static int
12732 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12733 		struct crypto_unittest_params *ut_params,
12734 		const struct test_crypto_vector *reference)
12735 {
12736 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
12737 }
12738 
12739 static int
12740 test_authentication_verify_fail_when_data_corruption(
12741 		struct crypto_testsuite_params *ts_params,
12742 		struct crypto_unittest_params *ut_params,
12743 		const struct test_crypto_vector *reference,
12744 		unsigned int data_corrupted)
12745 {
12746 	int retval;
12747 
12748 	uint8_t *plaintext;
12749 	struct rte_cryptodev_info dev_info;
12750 
12751 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12752 	uint64_t feat_flags = dev_info.feature_flags;
12753 
12754 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12755 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12756 		printf("Device doesn't support RAW data-path APIs.\n");
12757 		return TEST_SKIPPED;
12758 	}
12759 
12760 	/* Verify the capabilities */
12761 	struct rte_cryptodev_sym_capability_idx cap_idx;
12762 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12763 	cap_idx.algo.auth = reference->auth_algo;
12764 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12765 			&cap_idx) == NULL)
12766 		return TEST_SKIPPED;
12767 
12768 
12769 	/* Create session */
12770 	retval = create_auth_session(ut_params,
12771 			ts_params->valid_devs[0],
12772 			reference,
12773 			RTE_CRYPTO_AUTH_OP_VERIFY);
12774 	if (retval < 0)
12775 		return retval;
12776 
12777 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12778 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12779 			"Failed to allocate input buffer in mempool");
12780 
12781 	/* clear mbuf payload */
12782 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12783 			rte_pktmbuf_tailroom(ut_params->ibuf));
12784 
12785 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12786 			reference->plaintext.len);
12787 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12788 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12789 
12790 	debug_hexdump(stdout, "plaintext:", plaintext,
12791 		reference->plaintext.len);
12792 
12793 	/* Create operation */
12794 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
12795 
12796 	if (retval < 0)
12797 		return retval;
12798 
12799 	if (data_corrupted)
12800 		data_corruption(plaintext);
12801 	else
12802 		tag_corruption(plaintext, reference->plaintext.len);
12803 
12804 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12805 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12806 			ut_params->op);
12807 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12808 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12809 			"authentication not failed");
12810 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12811 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12812 				ut_params->op, 0, 1, 0, 0);
12813 	else {
12814 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12815 			ut_params->op);
12816 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12817 	}
12818 
12819 	return 0;
12820 }
12821 
12822 static int
12823 test_authentication_verify_GMAC_fail_when_corruption(
12824 		struct crypto_testsuite_params *ts_params,
12825 		struct crypto_unittest_params *ut_params,
12826 		const struct test_crypto_vector *reference,
12827 		unsigned int data_corrupted)
12828 {
12829 	int retval;
12830 	uint8_t *plaintext;
12831 	struct rte_cryptodev_info dev_info;
12832 
12833 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12834 	uint64_t feat_flags = dev_info.feature_flags;
12835 
12836 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12837 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12838 		printf("Device doesn't support RAW data-path APIs.\n");
12839 		return TEST_SKIPPED;
12840 	}
12841 
12842 	/* Verify the capabilities */
12843 	struct rte_cryptodev_sym_capability_idx cap_idx;
12844 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12845 	cap_idx.algo.auth = reference->auth_algo;
12846 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12847 			&cap_idx) == NULL)
12848 		return TEST_SKIPPED;
12849 
12850 	/* Create session */
12851 	retval = create_auth_cipher_session(ut_params,
12852 			ts_params->valid_devs[0],
12853 			reference,
12854 			RTE_CRYPTO_AUTH_OP_VERIFY,
12855 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
12856 	if (retval < 0)
12857 		return retval;
12858 
12859 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12860 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12861 			"Failed to allocate input buffer in mempool");
12862 
12863 	/* clear mbuf payload */
12864 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12865 			rte_pktmbuf_tailroom(ut_params->ibuf));
12866 
12867 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12868 			reference->plaintext.len);
12869 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12870 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12871 
12872 	debug_hexdump(stdout, "plaintext:", plaintext,
12873 		reference->plaintext.len);
12874 
12875 	/* Create operation */
12876 	retval = create_auth_verify_GMAC_operation(ts_params,
12877 			ut_params,
12878 			reference);
12879 
12880 	if (retval < 0)
12881 		return retval;
12882 
12883 	if (data_corrupted)
12884 		data_corruption(plaintext);
12885 	else
12886 		tag_corruption(plaintext, reference->aad.len);
12887 
12888 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12889 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12890 			ut_params->op);
12891 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12892 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12893 			"authentication not failed");
12894 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12895 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12896 				ut_params->op, 0, 1, 0, 0);
12897 	else {
12898 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12899 			ut_params->op);
12900 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12901 	}
12902 
12903 	return 0;
12904 }
12905 
12906 static int
12907 test_authenticated_decryption_fail_when_corruption(
12908 		struct crypto_testsuite_params *ts_params,
12909 		struct crypto_unittest_params *ut_params,
12910 		const struct test_crypto_vector *reference,
12911 		unsigned int data_corrupted)
12912 {
12913 	int retval;
12914 
12915 	uint8_t *ciphertext;
12916 	struct rte_cryptodev_info dev_info;
12917 
12918 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12919 	uint64_t feat_flags = dev_info.feature_flags;
12920 
12921 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12922 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12923 		printf("Device doesn't support RAW data-path APIs.\n");
12924 		return TEST_SKIPPED;
12925 	}
12926 
12927 	/* Verify the capabilities */
12928 	struct rte_cryptodev_sym_capability_idx cap_idx;
12929 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12930 	cap_idx.algo.auth = reference->auth_algo;
12931 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12932 			&cap_idx) == NULL)
12933 		return TEST_SKIPPED;
12934 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12935 	cap_idx.algo.cipher = reference->crypto_algo;
12936 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12937 			&cap_idx) == NULL)
12938 		return TEST_SKIPPED;
12939 
12940 	/* Create session */
12941 	retval = create_auth_cipher_session(ut_params,
12942 			ts_params->valid_devs[0],
12943 			reference,
12944 			RTE_CRYPTO_AUTH_OP_VERIFY,
12945 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
12946 	if (retval < 0)
12947 		return retval;
12948 
12949 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12950 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12951 			"Failed to allocate input buffer in mempool");
12952 
12953 	/* clear mbuf payload */
12954 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12955 			rte_pktmbuf_tailroom(ut_params->ibuf));
12956 
12957 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12958 			reference->ciphertext.len);
12959 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12960 	memcpy(ciphertext, reference->ciphertext.data,
12961 			reference->ciphertext.len);
12962 
12963 	/* Create operation */
12964 	retval = create_cipher_auth_verify_operation(ts_params,
12965 			ut_params,
12966 			reference);
12967 
12968 	if (retval < 0)
12969 		return retval;
12970 
12971 	if (data_corrupted)
12972 		data_corruption(ciphertext);
12973 	else
12974 		tag_corruption(ciphertext, reference->ciphertext.len);
12975 
12976 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12977 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12978 			ut_params->op);
12979 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12980 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12981 			"authentication not failed");
12982 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12983 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12984 				ut_params->op, 1, 1, 0, 0);
12985 	else {
12986 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12987 			ut_params->op);
12988 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12989 	}
12990 
12991 	return 0;
12992 }
12993 
12994 static int
12995 test_authenticated_encrypt_with_esn(
12996 		struct crypto_testsuite_params *ts_params,
12997 		struct crypto_unittest_params *ut_params,
12998 		const struct test_crypto_vector *reference)
12999 {
13000 	int retval;
13001 
13002 	uint8_t *authciphertext, *plaintext, *auth_tag;
13003 	uint16_t plaintext_pad_len;
13004 	uint8_t cipher_key[reference->cipher_key.len + 1];
13005 	uint8_t auth_key[reference->auth_key.len + 1];
13006 	struct rte_cryptodev_info dev_info;
13007 
13008 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13009 	uint64_t feat_flags = dev_info.feature_flags;
13010 
13011 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13012 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13013 		printf("Device doesn't support RAW data-path APIs.\n");
13014 		return TEST_SKIPPED;
13015 	}
13016 
13017 	/* Verify the capabilities */
13018 	struct rte_cryptodev_sym_capability_idx cap_idx;
13019 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13020 	cap_idx.algo.auth = reference->auth_algo;
13021 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13022 			&cap_idx) == NULL)
13023 		return TEST_SKIPPED;
13024 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13025 	cap_idx.algo.cipher = reference->crypto_algo;
13026 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13027 			&cap_idx) == NULL)
13028 		return TEST_SKIPPED;
13029 
13030 	/* Create session */
13031 	memcpy(cipher_key, reference->cipher_key.data,
13032 			reference->cipher_key.len);
13033 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13034 
13035 	/* Setup Cipher Parameters */
13036 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13037 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13038 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13039 	ut_params->cipher_xform.cipher.key.data = cipher_key;
13040 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13041 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13042 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13043 
13044 	ut_params->cipher_xform.next = &ut_params->auth_xform;
13045 
13046 	/* Setup Authentication Parameters */
13047 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13048 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13049 	ut_params->auth_xform.auth.algo = reference->auth_algo;
13050 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13051 	ut_params->auth_xform.auth.key.data = auth_key;
13052 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
13053 	ut_params->auth_xform.next = NULL;
13054 
13055 	/* Create Crypto session*/
13056 	ut_params->sess = rte_cryptodev_sym_session_create(
13057 			ts_params->session_mpool);
13058 
13059 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13060 				ut_params->sess,
13061 				&ut_params->cipher_xform,
13062 				ts_params->session_priv_mpool);
13063 
13064 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13065 
13066 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13067 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13068 			"Failed to allocate input buffer in mempool");
13069 
13070 	/* clear mbuf payload */
13071 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13072 			rte_pktmbuf_tailroom(ut_params->ibuf));
13073 
13074 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13075 			reference->plaintext.len);
13076 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13077 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13078 
13079 	/* Create operation */
13080 	retval = create_cipher_auth_operation(ts_params,
13081 			ut_params,
13082 			reference, 0);
13083 
13084 	if (retval < 0)
13085 		return retval;
13086 
13087 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13088 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13089 			ut_params->op);
13090 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13091 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13092 				ut_params->op, 1, 1, 0, 0);
13093 	else
13094 		ut_params->op = process_crypto_request(
13095 			ts_params->valid_devs[0], ut_params->op);
13096 
13097 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
13098 
13099 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13100 			"crypto op processing failed");
13101 
13102 	plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
13103 
13104 	authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
13105 			ut_params->op->sym->auth.data.offset);
13106 	auth_tag = authciphertext + plaintext_pad_len;
13107 	debug_hexdump(stdout, "ciphertext:", authciphertext,
13108 			reference->ciphertext.len);
13109 	debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
13110 
13111 	/* Validate obuf */
13112 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13113 			authciphertext,
13114 			reference->ciphertext.data,
13115 			reference->ciphertext.len,
13116 			"Ciphertext data not as expected");
13117 
13118 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13119 			auth_tag,
13120 			reference->digest.data,
13121 			reference->digest.len,
13122 			"Generated digest not as expected");
13123 
13124 	return TEST_SUCCESS;
13125 
13126 }
13127 
13128 static int
13129 test_authenticated_decrypt_with_esn(
13130 		struct crypto_testsuite_params *ts_params,
13131 		struct crypto_unittest_params *ut_params,
13132 		const struct test_crypto_vector *reference)
13133 {
13134 	int retval;
13135 
13136 	uint8_t *ciphertext;
13137 	uint8_t cipher_key[reference->cipher_key.len + 1];
13138 	uint8_t auth_key[reference->auth_key.len + 1];
13139 	struct rte_cryptodev_info dev_info;
13140 
13141 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13142 	uint64_t feat_flags = dev_info.feature_flags;
13143 
13144 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13145 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13146 		printf("Device doesn't support RAW data-path APIs.\n");
13147 		return TEST_SKIPPED;
13148 	}
13149 
13150 	/* Verify the capabilities */
13151 	struct rte_cryptodev_sym_capability_idx cap_idx;
13152 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13153 	cap_idx.algo.auth = reference->auth_algo;
13154 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13155 			&cap_idx) == NULL)
13156 		return TEST_SKIPPED;
13157 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13158 	cap_idx.algo.cipher = reference->crypto_algo;
13159 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13160 			&cap_idx) == NULL)
13161 		return TEST_SKIPPED;
13162 
13163 	/* Create session */
13164 	memcpy(cipher_key, reference->cipher_key.data,
13165 			reference->cipher_key.len);
13166 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13167 
13168 	/* Setup Authentication Parameters */
13169 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13170 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
13171 	ut_params->auth_xform.auth.algo = reference->auth_algo;
13172 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13173 	ut_params->auth_xform.auth.key.data = auth_key;
13174 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
13175 	ut_params->auth_xform.next = &ut_params->cipher_xform;
13176 
13177 	/* Setup Cipher Parameters */
13178 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13179 	ut_params->cipher_xform.next = NULL;
13180 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13181 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
13182 	ut_params->cipher_xform.cipher.key.data = cipher_key;
13183 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13184 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13185 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13186 
13187 	/* Create Crypto session*/
13188 	ut_params->sess = rte_cryptodev_sym_session_create(
13189 			ts_params->session_mpool);
13190 
13191 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13192 				ut_params->sess,
13193 				&ut_params->auth_xform,
13194 				ts_params->session_priv_mpool);
13195 
13196 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13197 
13198 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13199 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13200 			"Failed to allocate input buffer in mempool");
13201 
13202 	/* clear mbuf payload */
13203 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13204 			rte_pktmbuf_tailroom(ut_params->ibuf));
13205 
13206 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13207 			reference->ciphertext.len);
13208 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13209 	memcpy(ciphertext, reference->ciphertext.data,
13210 			reference->ciphertext.len);
13211 
13212 	/* Create operation */
13213 	retval = create_cipher_auth_verify_operation(ts_params,
13214 			ut_params,
13215 			reference);
13216 
13217 	if (retval < 0)
13218 		return retval;
13219 
13220 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13221 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13222 			ut_params->op);
13223 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13224 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13225 				ut_params->op, 1, 1, 0, 0);
13226 	else
13227 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13228 			ut_params->op);
13229 
13230 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
13231 	TEST_ASSERT_EQUAL(ut_params->op->status,
13232 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13233 			"crypto op processing passed");
13234 
13235 	ut_params->obuf = ut_params->op->sym->m_src;
13236 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
13237 
13238 	return 0;
13239 }
13240 
13241 static int
13242 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
13243 		const struct aead_test_data *tdata,
13244 		void *digest_mem, uint64_t digest_phys)
13245 {
13246 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13247 	struct crypto_unittest_params *ut_params = &unittest_params;
13248 
13249 	const unsigned int auth_tag_len = tdata->auth_tag.len;
13250 	const unsigned int iv_len = tdata->iv.len;
13251 	unsigned int aad_len = tdata->aad.len;
13252 	unsigned int aad_len_pad = 0;
13253 
13254 	/* Generate Crypto op data structure */
13255 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13256 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13257 	TEST_ASSERT_NOT_NULL(ut_params->op,
13258 		"Failed to allocate symmetric crypto operation struct");
13259 
13260 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13261 
13262 	sym_op->aead.digest.data = digest_mem;
13263 
13264 	TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
13265 			"no room to append digest");
13266 
13267 	sym_op->aead.digest.phys_addr = digest_phys;
13268 
13269 	if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
13270 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
13271 				auth_tag_len);
13272 		debug_hexdump(stdout, "digest:",
13273 				sym_op->aead.digest.data,
13274 				auth_tag_len);
13275 	}
13276 
13277 	/* Append aad data */
13278 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
13279 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13280 				uint8_t *, IV_OFFSET);
13281 
13282 		/* Copy IV 1 byte after the IV pointer, according to the API */
13283 		rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
13284 
13285 		aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
13286 
13287 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13288 				ut_params->ibuf, aad_len);
13289 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13290 				"no room to prepend aad");
13291 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13292 				ut_params->ibuf);
13293 
13294 		memset(sym_op->aead.aad.data, 0, aad_len);
13295 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
13296 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13297 
13298 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13299 		debug_hexdump(stdout, "aad:",
13300 				sym_op->aead.aad.data, aad_len);
13301 	} else {
13302 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13303 				uint8_t *, IV_OFFSET);
13304 
13305 		rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
13306 
13307 		aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
13308 
13309 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13310 				ut_params->ibuf, aad_len_pad);
13311 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13312 				"no room to prepend aad");
13313 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13314 				ut_params->ibuf);
13315 
13316 		memset(sym_op->aead.aad.data, 0, aad_len);
13317 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13318 
13319 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13320 		debug_hexdump(stdout, "aad:",
13321 				sym_op->aead.aad.data, aad_len);
13322 	}
13323 
13324 	sym_op->aead.data.length = tdata->plaintext.len;
13325 	sym_op->aead.data.offset = aad_len_pad;
13326 
13327 	return 0;
13328 }
13329 
13330 #define SGL_MAX_NO	16
13331 
13332 static int
13333 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
13334 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
13335 {
13336 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13337 	struct crypto_unittest_params *ut_params = &unittest_params;
13338 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
13339 	int retval;
13340 	int to_trn = 0;
13341 	int to_trn_tbl[SGL_MAX_NO];
13342 	int segs = 1;
13343 	unsigned int trn_data = 0;
13344 	uint8_t *plaintext, *ciphertext, *auth_tag;
13345 	struct rte_cryptodev_info dev_info;
13346 
13347 	/* Verify the capabilities */
13348 	struct rte_cryptodev_sym_capability_idx cap_idx;
13349 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
13350 	cap_idx.algo.aead = tdata->algo;
13351 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13352 			&cap_idx) == NULL)
13353 		return TEST_SKIPPED;
13354 
13355 	/* OOP not supported with CPU crypto */
13356 	if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13357 		return TEST_SKIPPED;
13358 
13359 	/* Detailed check for the particular SGL support flag */
13360 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13361 	if (!oop) {
13362 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
13363 		if (sgl_in && (!(dev_info.feature_flags &
13364 				RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
13365 			return TEST_SKIPPED;
13366 
13367 		uint64_t feat_flags = dev_info.feature_flags;
13368 
13369 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13370 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13371 			printf("Device doesn't support RAW data-path APIs.\n");
13372 			return TEST_SKIPPED;
13373 		}
13374 	} else {
13375 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
13376 		unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
13377 				tdata->plaintext.len;
13378 		/* Raw data path API does not support OOP */
13379 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13380 			return TEST_SKIPPED;
13381 		if (sgl_in && !sgl_out) {
13382 			if (!(dev_info.feature_flags &
13383 					RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
13384 				return TEST_SKIPPED;
13385 		} else if (!sgl_in && sgl_out) {
13386 			if (!(dev_info.feature_flags &
13387 					RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
13388 				return TEST_SKIPPED;
13389 		} else if (sgl_in && sgl_out) {
13390 			if (!(dev_info.feature_flags &
13391 					RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
13392 				return TEST_SKIPPED;
13393 		}
13394 	}
13395 
13396 	if (fragsz > tdata->plaintext.len)
13397 		fragsz = tdata->plaintext.len;
13398 
13399 	uint16_t plaintext_len = fragsz;
13400 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
13401 
13402 	if (fragsz_oop > tdata->plaintext.len)
13403 		frag_size_oop = tdata->plaintext.len;
13404 
13405 	int ecx = 0;
13406 	void *digest_mem = NULL;
13407 
13408 	uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
13409 
13410 	if (tdata->plaintext.len % fragsz != 0) {
13411 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
13412 			return 1;
13413 	}	else {
13414 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
13415 			return 1;
13416 	}
13417 
13418 	/*
13419 	 * For out-op-place we need to alloc another mbuf
13420 	 */
13421 	if (oop) {
13422 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13423 		rte_pktmbuf_append(ut_params->obuf,
13424 				frag_size_oop + prepend_len);
13425 		buf_oop = ut_params->obuf;
13426 	}
13427 
13428 	/* Create AEAD session */
13429 	retval = create_aead_session(ts_params->valid_devs[0],
13430 			tdata->algo,
13431 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
13432 			tdata->key.data, tdata->key.len,
13433 			tdata->aad.len, tdata->auth_tag.len,
13434 			tdata->iv.len);
13435 	if (retval < 0)
13436 		return retval;
13437 
13438 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13439 
13440 	/* clear mbuf payload */
13441 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13442 			rte_pktmbuf_tailroom(ut_params->ibuf));
13443 
13444 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13445 			plaintext_len);
13446 
13447 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13448 
13449 	trn_data += plaintext_len;
13450 
13451 	buf = ut_params->ibuf;
13452 
13453 	/*
13454 	 * Loop until no more fragments
13455 	 */
13456 
13457 	while (trn_data < tdata->plaintext.len) {
13458 		++segs;
13459 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13460 				(tdata->plaintext.len - trn_data) : fragsz;
13461 
13462 		to_trn_tbl[ecx++] = to_trn;
13463 
13464 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13465 		buf = buf->next;
13466 
13467 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13468 				rte_pktmbuf_tailroom(buf));
13469 
13470 		/* OOP */
13471 		if (oop && !fragsz_oop) {
13472 			buf_last_oop = buf_oop->next =
13473 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
13474 			buf_oop = buf_oop->next;
13475 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13476 					0, rte_pktmbuf_tailroom(buf_oop));
13477 			rte_pktmbuf_append(buf_oop, to_trn);
13478 		}
13479 
13480 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
13481 				to_trn);
13482 
13483 		memcpy(plaintext, tdata->plaintext.data + trn_data,
13484 				to_trn);
13485 		trn_data += to_trn;
13486 		if (trn_data  == tdata->plaintext.len) {
13487 			if (oop) {
13488 				if (!fragsz_oop)
13489 					digest_mem = rte_pktmbuf_append(buf_oop,
13490 						tdata->auth_tag.len);
13491 			} else
13492 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
13493 					tdata->auth_tag.len);
13494 		}
13495 	}
13496 
13497 	uint64_t digest_phys = 0;
13498 
13499 	ut_params->ibuf->nb_segs = segs;
13500 
13501 	segs = 1;
13502 	if (fragsz_oop && oop) {
13503 		to_trn = 0;
13504 		ecx = 0;
13505 
13506 		if (frag_size_oop == tdata->plaintext.len) {
13507 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
13508 				tdata->auth_tag.len);
13509 
13510 			digest_phys = rte_pktmbuf_iova_offset(
13511 					ut_params->obuf,
13512 					tdata->plaintext.len + prepend_len);
13513 		}
13514 
13515 		trn_data = frag_size_oop;
13516 		while (trn_data < tdata->plaintext.len) {
13517 			++segs;
13518 			to_trn =
13519 				(tdata->plaintext.len - trn_data <
13520 						frag_size_oop) ?
13521 				(tdata->plaintext.len - trn_data) :
13522 						frag_size_oop;
13523 
13524 			to_trn_tbl[ecx++] = to_trn;
13525 
13526 			buf_last_oop = buf_oop->next =
13527 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
13528 			buf_oop = buf_oop->next;
13529 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13530 					0, rte_pktmbuf_tailroom(buf_oop));
13531 			rte_pktmbuf_append(buf_oop, to_trn);
13532 
13533 			trn_data += to_trn;
13534 
13535 			if (trn_data  == tdata->plaintext.len) {
13536 				digest_mem = rte_pktmbuf_append(buf_oop,
13537 					tdata->auth_tag.len);
13538 			}
13539 		}
13540 
13541 		ut_params->obuf->nb_segs = segs;
13542 	}
13543 
13544 	/*
13545 	 * Place digest at the end of the last buffer
13546 	 */
13547 	if (!digest_phys)
13548 		digest_phys = rte_pktmbuf_iova(buf) + to_trn;
13549 	if (oop && buf_last_oop)
13550 		digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
13551 
13552 	if (!digest_mem && !oop) {
13553 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13554 				+ tdata->auth_tag.len);
13555 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
13556 				tdata->plaintext.len);
13557 	}
13558 
13559 	/* Create AEAD operation */
13560 	retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
13561 			tdata, digest_mem, digest_phys);
13562 
13563 	if (retval < 0)
13564 		return retval;
13565 
13566 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13567 
13568 	ut_params->op->sym->m_src = ut_params->ibuf;
13569 	if (oop)
13570 		ut_params->op->sym->m_dst = ut_params->obuf;
13571 
13572 	/* Process crypto operation */
13573 	if (oop == IN_PLACE &&
13574 			gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13575 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
13576 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13577 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13578 				ut_params->op, 0, 0, 0, 0);
13579 	else
13580 		TEST_ASSERT_NOT_NULL(
13581 			process_crypto_request(ts_params->valid_devs[0],
13582 			ut_params->op), "failed to process sym crypto op");
13583 
13584 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13585 			"crypto op processing failed");
13586 
13587 
13588 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
13589 			uint8_t *, prepend_len);
13590 	if (oop) {
13591 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
13592 				uint8_t *, prepend_len);
13593 	}
13594 
13595 	if (fragsz_oop)
13596 		fragsz = fragsz_oop;
13597 
13598 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13599 			ciphertext,
13600 			tdata->ciphertext.data,
13601 			fragsz,
13602 			"Ciphertext data not as expected");
13603 
13604 	buf = ut_params->op->sym->m_src->next;
13605 	if (oop)
13606 		buf = ut_params->op->sym->m_dst->next;
13607 
13608 	unsigned int off = fragsz;
13609 
13610 	ecx = 0;
13611 	while (buf) {
13612 		ciphertext = rte_pktmbuf_mtod(buf,
13613 				uint8_t *);
13614 
13615 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
13616 				ciphertext,
13617 				tdata->ciphertext.data + off,
13618 				to_trn_tbl[ecx],
13619 				"Ciphertext data not as expected");
13620 
13621 		off += to_trn_tbl[ecx++];
13622 		buf = buf->next;
13623 	}
13624 
13625 	auth_tag = digest_mem;
13626 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13627 			auth_tag,
13628 			tdata->auth_tag.data,
13629 			tdata->auth_tag.len,
13630 			"Generated auth tag not as expected");
13631 
13632 	return 0;
13633 }
13634 
13635 static int
13636 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
13637 {
13638 	return test_authenticated_encryption_SGL(
13639 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
13640 }
13641 
13642 static int
13643 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
13644 {
13645 	return test_authenticated_encryption_SGL(
13646 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
13647 }
13648 
13649 static int
13650 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
13651 {
13652 	return test_authenticated_encryption_SGL(
13653 			&gcm_test_case_8, OUT_OF_PLACE, 400,
13654 			gcm_test_case_8.plaintext.len);
13655 }
13656 
13657 static int
13658 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
13659 {
13660 	/* This test is not for OPENSSL PMD */
13661 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
13662 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
13663 		return TEST_SKIPPED;
13664 
13665 	return test_authenticated_encryption_SGL(
13666 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
13667 }
13668 
13669 static int
13670 test_authentication_verify_fail_when_data_corrupted(
13671 		struct crypto_testsuite_params *ts_params,
13672 		struct crypto_unittest_params *ut_params,
13673 		const struct test_crypto_vector *reference)
13674 {
13675 	return test_authentication_verify_fail_when_data_corruption(
13676 			ts_params, ut_params, reference, 1);
13677 }
13678 
13679 static int
13680 test_authentication_verify_fail_when_tag_corrupted(
13681 		struct crypto_testsuite_params *ts_params,
13682 		struct crypto_unittest_params *ut_params,
13683 		const struct test_crypto_vector *reference)
13684 {
13685 	return test_authentication_verify_fail_when_data_corruption(
13686 			ts_params, ut_params, reference, 0);
13687 }
13688 
13689 static int
13690 test_authentication_verify_GMAC_fail_when_data_corrupted(
13691 		struct crypto_testsuite_params *ts_params,
13692 		struct crypto_unittest_params *ut_params,
13693 		const struct test_crypto_vector *reference)
13694 {
13695 	return test_authentication_verify_GMAC_fail_when_corruption(
13696 			ts_params, ut_params, reference, 1);
13697 }
13698 
13699 static int
13700 test_authentication_verify_GMAC_fail_when_tag_corrupted(
13701 		struct crypto_testsuite_params *ts_params,
13702 		struct crypto_unittest_params *ut_params,
13703 		const struct test_crypto_vector *reference)
13704 {
13705 	return test_authentication_verify_GMAC_fail_when_corruption(
13706 			ts_params, ut_params, reference, 0);
13707 }
13708 
13709 static int
13710 test_authenticated_decryption_fail_when_data_corrupted(
13711 		struct crypto_testsuite_params *ts_params,
13712 		struct crypto_unittest_params *ut_params,
13713 		const struct test_crypto_vector *reference)
13714 {
13715 	return test_authenticated_decryption_fail_when_corruption(
13716 			ts_params, ut_params, reference, 1);
13717 }
13718 
13719 static int
13720 test_authenticated_decryption_fail_when_tag_corrupted(
13721 		struct crypto_testsuite_params *ts_params,
13722 		struct crypto_unittest_params *ut_params,
13723 		const struct test_crypto_vector *reference)
13724 {
13725 	return test_authenticated_decryption_fail_when_corruption(
13726 			ts_params, ut_params, reference, 0);
13727 }
13728 
13729 static int
13730 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
13731 {
13732 	return test_authentication_verify_fail_when_data_corrupted(
13733 			&testsuite_params, &unittest_params,
13734 			&hmac_sha1_test_crypto_vector);
13735 }
13736 
13737 static int
13738 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
13739 {
13740 	return test_authentication_verify_fail_when_tag_corrupted(
13741 			&testsuite_params, &unittest_params,
13742 			&hmac_sha1_test_crypto_vector);
13743 }
13744 
13745 static int
13746 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
13747 {
13748 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
13749 			&testsuite_params, &unittest_params,
13750 			&aes128_gmac_test_vector);
13751 }
13752 
13753 static int
13754 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
13755 {
13756 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
13757 			&testsuite_params, &unittest_params,
13758 			&aes128_gmac_test_vector);
13759 }
13760 
13761 static int
13762 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
13763 {
13764 	return test_authenticated_decryption_fail_when_data_corrupted(
13765 			&testsuite_params,
13766 			&unittest_params,
13767 			&aes128cbc_hmac_sha1_test_vector);
13768 }
13769 
13770 static int
13771 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
13772 {
13773 	return test_authenticated_decryption_fail_when_tag_corrupted(
13774 			&testsuite_params,
13775 			&unittest_params,
13776 			&aes128cbc_hmac_sha1_test_vector);
13777 }
13778 
13779 static int
13780 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13781 {
13782 	return test_authenticated_encrypt_with_esn(
13783 			&testsuite_params,
13784 			&unittest_params,
13785 			&aes128cbc_hmac_sha1_aad_test_vector);
13786 }
13787 
13788 static int
13789 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13790 {
13791 	return test_authenticated_decrypt_with_esn(
13792 			&testsuite_params,
13793 			&unittest_params,
13794 			&aes128cbc_hmac_sha1_aad_test_vector);
13795 }
13796 
13797 static int
13798 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
13799 {
13800 	return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
13801 }
13802 
13803 static int
13804 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
13805 {
13806 	return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
13807 }
13808 
13809 #ifdef RTE_CRYPTO_SCHEDULER
13810 
13811 /* global AESNI worker IDs for the scheduler test */
13812 uint8_t aesni_ids[2];
13813 
13814 static int
13815 scheduler_testsuite_setup(void)
13816 {
13817 	uint32_t i = 0;
13818 	int32_t nb_devs, ret;
13819 	char vdev_args[VDEV_ARGS_SIZE] = {""};
13820 	char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
13821 		"ordering=enable,name=cryptodev_test_scheduler,corelist="};
13822 	uint16_t worker_core_count = 0;
13823 	uint16_t socket_id = 0;
13824 
13825 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
13826 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
13827 
13828 		/* Identify the Worker Cores
13829 		 * Use 2 worker cores for the device args
13830 		 */
13831 		RTE_LCORE_FOREACH_WORKER(i) {
13832 			if (worker_core_count > 1)
13833 				break;
13834 			snprintf(vdev_args, sizeof(vdev_args),
13835 					"%s%d", temp_str, i);
13836 			strcpy(temp_str, vdev_args);
13837 			strlcat(temp_str, ";", sizeof(temp_str));
13838 			worker_core_count++;
13839 			socket_id = rte_lcore_to_socket_id(i);
13840 		}
13841 		if (worker_core_count != 2) {
13842 			RTE_LOG(ERR, USER1,
13843 				"Cryptodev scheduler test require at least "
13844 				"two worker cores to run. "
13845 				"Please use the correct coremask.\n");
13846 			return TEST_FAILED;
13847 		}
13848 		strcpy(temp_str, vdev_args);
13849 		snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
13850 				temp_str, socket_id);
13851 		RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
13852 		nb_devs = rte_cryptodev_device_count_by_driver(
13853 				rte_cryptodev_driver_id_get(
13854 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
13855 		if (nb_devs < 1) {
13856 			ret = rte_vdev_init(
13857 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
13858 					vdev_args);
13859 			TEST_ASSERT(ret == 0,
13860 				"Failed to create instance %u of pmd : %s",
13861 				i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
13862 		}
13863 	}
13864 	return testsuite_setup();
13865 }
13866 
13867 static int
13868 test_scheduler_attach_worker_op(void)
13869 {
13870 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13871 	uint8_t sched_id = ts_params->valid_devs[0];
13872 	uint32_t i, nb_devs_attached = 0;
13873 	int ret;
13874 	char vdev_name[32];
13875 	unsigned int count = rte_cryptodev_count();
13876 
13877 	/* create 2 AESNI_MB vdevs on top of existing devices */
13878 	for (i = count; i < count + 2; i++) {
13879 		snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
13880 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
13881 				i);
13882 		ret = rte_vdev_init(vdev_name, NULL);
13883 
13884 		TEST_ASSERT(ret == 0,
13885 			"Failed to create instance %u of"
13886 			" pmd : %s",
13887 			i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13888 
13889 		if (ret < 0) {
13890 			RTE_LOG(ERR, USER1,
13891 				"Failed to create 2 AESNI MB PMDs.\n");
13892 			return TEST_SKIPPED;
13893 		}
13894 	}
13895 
13896 	/* attach 2 AESNI_MB cdevs */
13897 	for (i = count; i < count + 2; i++) {
13898 		struct rte_cryptodev_info info;
13899 		unsigned int session_size;
13900 
13901 		rte_cryptodev_info_get(i, &info);
13902 		if (info.driver_id != rte_cryptodev_driver_id_get(
13903 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
13904 			continue;
13905 
13906 		session_size = rte_cryptodev_sym_get_private_session_size(i);
13907 		/*
13908 		 * Create the session mempool again, since now there are new devices
13909 		 * to use the mempool.
13910 		 */
13911 		if (ts_params->session_mpool) {
13912 			rte_mempool_free(ts_params->session_mpool);
13913 			ts_params->session_mpool = NULL;
13914 		}
13915 		if (ts_params->session_priv_mpool) {
13916 			rte_mempool_free(ts_params->session_priv_mpool);
13917 			ts_params->session_priv_mpool = NULL;
13918 		}
13919 
13920 		if (info.sym.max_nb_sessions != 0 &&
13921 				info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
13922 			RTE_LOG(ERR, USER1,
13923 					"Device does not support "
13924 					"at least %u sessions\n",
13925 					MAX_NB_SESSIONS);
13926 			return TEST_FAILED;
13927 		}
13928 		/*
13929 		 * Create mempool with maximum number of sessions,
13930 		 * to include the session headers
13931 		 */
13932 		if (ts_params->session_mpool == NULL) {
13933 			ts_params->session_mpool =
13934 				rte_cryptodev_sym_session_pool_create(
13935 						"test_sess_mp",
13936 						MAX_NB_SESSIONS, 0, 0, 0,
13937 						SOCKET_ID_ANY);
13938 			TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
13939 					"session mempool allocation failed");
13940 		}
13941 
13942 		/*
13943 		 * Create mempool with maximum number of sessions,
13944 		 * to include device specific session private data
13945 		 */
13946 		if (ts_params->session_priv_mpool == NULL) {
13947 			ts_params->session_priv_mpool = rte_mempool_create(
13948 					"test_sess_mp_priv",
13949 					MAX_NB_SESSIONS,
13950 					session_size,
13951 					0, 0, NULL, NULL, NULL,
13952 					NULL, SOCKET_ID_ANY,
13953 					0);
13954 
13955 			TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
13956 					"session mempool allocation failed");
13957 		}
13958 
13959 		ts_params->qp_conf.mp_session = ts_params->session_mpool;
13960 		ts_params->qp_conf.mp_session_private =
13961 				ts_params->session_priv_mpool;
13962 
13963 		ret = rte_cryptodev_scheduler_worker_attach(sched_id,
13964 				(uint8_t)i);
13965 
13966 		TEST_ASSERT(ret == 0,
13967 			"Failed to attach device %u of pmd : %s", i,
13968 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13969 
13970 		aesni_ids[nb_devs_attached] = (uint8_t)i;
13971 
13972 		nb_devs_attached++;
13973 	}
13974 
13975 	return 0;
13976 }
13977 
13978 static int
13979 test_scheduler_detach_worker_op(void)
13980 {
13981 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13982 	uint8_t sched_id = ts_params->valid_devs[0];
13983 	uint32_t i;
13984 	int ret;
13985 
13986 	for (i = 0; i < 2; i++) {
13987 		ret = rte_cryptodev_scheduler_worker_detach(sched_id,
13988 				aesni_ids[i]);
13989 		TEST_ASSERT(ret == 0,
13990 			"Failed to detach device %u", aesni_ids[i]);
13991 	}
13992 
13993 	return 0;
13994 }
13995 
13996 static int
13997 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
13998 {
13999 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14000 	uint8_t sched_id = ts_params->valid_devs[0];
14001 	/* set mode */
14002 	return rte_cryptodev_scheduler_mode_set(sched_id,
14003 		scheduler_mode);
14004 }
14005 
14006 static int
14007 test_scheduler_mode_roundrobin_op(void)
14008 {
14009 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
14010 			0, "Failed to set roundrobin mode");
14011 	return 0;
14012 
14013 }
14014 
14015 static int
14016 test_scheduler_mode_multicore_op(void)
14017 {
14018 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
14019 			0, "Failed to set multicore mode");
14020 
14021 	return 0;
14022 }
14023 
14024 static int
14025 test_scheduler_mode_failover_op(void)
14026 {
14027 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
14028 			0, "Failed to set failover mode");
14029 
14030 	return 0;
14031 }
14032 
14033 static int
14034 test_scheduler_mode_pkt_size_distr_op(void)
14035 {
14036 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
14037 			0, "Failed to set pktsize mode");
14038 
14039 	return 0;
14040 }
14041 
14042 static int
14043 scheduler_multicore_testsuite_setup(void)
14044 {
14045 	if (test_scheduler_attach_worker_op() < 0)
14046 		return TEST_SKIPPED;
14047 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
14048 		return TEST_SKIPPED;
14049 	return 0;
14050 }
14051 
14052 static int
14053 scheduler_roundrobin_testsuite_setup(void)
14054 {
14055 	if (test_scheduler_attach_worker_op() < 0)
14056 		return TEST_SKIPPED;
14057 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
14058 		return TEST_SKIPPED;
14059 	return 0;
14060 }
14061 
14062 static int
14063 scheduler_failover_testsuite_setup(void)
14064 {
14065 	if (test_scheduler_attach_worker_op() < 0)
14066 		return TEST_SKIPPED;
14067 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
14068 		return TEST_SKIPPED;
14069 	return 0;
14070 }
14071 
14072 static int
14073 scheduler_pkt_size_distr_testsuite_setup(void)
14074 {
14075 	if (test_scheduler_attach_worker_op() < 0)
14076 		return TEST_SKIPPED;
14077 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
14078 		return TEST_SKIPPED;
14079 	return 0;
14080 }
14081 
14082 static void
14083 scheduler_mode_testsuite_teardown(void)
14084 {
14085 	test_scheduler_detach_worker_op();
14086 }
14087 
14088 #endif /* RTE_CRYPTO_SCHEDULER */
14089 
14090 static struct unit_test_suite end_testsuite = {
14091 	.suite_name = NULL,
14092 	.setup = NULL,
14093 	.teardown = NULL,
14094 	.unit_test_suites = NULL
14095 };
14096 
14097 #ifdef RTE_LIB_SECURITY
14098 static struct unit_test_suite ipsec_proto_testsuite  = {
14099 	.suite_name = "IPsec Proto Unit Test Suite",
14100 	.setup = ipsec_proto_testsuite_setup,
14101 	.unit_test_cases = {
14102 		TEST_CASE_NAMED_WITH_DATA(
14103 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14104 			ut_setup_security, ut_teardown,
14105 			test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
14106 		TEST_CASE_NAMED_WITH_DATA(
14107 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14108 			ut_setup_security, ut_teardown,
14109 			test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
14110 		TEST_CASE_NAMED_WITH_DATA(
14111 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14112 			ut_setup_security, ut_teardown,
14113 			test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
14114 		TEST_CASE_NAMED_WITH_DATA(
14115 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14116 			ut_setup_security, ut_teardown,
14117 			test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
14118 		TEST_CASE_NAMED_WITH_DATA(
14119 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14120 			ut_setup_security, ut_teardown,
14121 			test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
14122 		TEST_CASE_NAMED_WITH_DATA(
14123 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14124 			ut_setup_security, ut_teardown,
14125 			test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
14126 		TEST_CASE_NAMED_ST(
14127 			"Combined test alg list",
14128 			ut_setup_security, ut_teardown,
14129 			test_ipsec_proto_display_list),
14130 		TEST_CASE_NAMED_ST(
14131 			"IV generation",
14132 			ut_setup_security, ut_teardown,
14133 			test_ipsec_proto_iv_gen),
14134 		TEST_CASE_NAMED_ST(
14135 			"UDP encapsulation",
14136 			ut_setup_security, ut_teardown,
14137 			test_ipsec_proto_udp_encap),
14138 		TEST_CASE_NAMED_ST(
14139 			"Negative test: ICV corruption",
14140 			ut_setup_security, ut_teardown,
14141 			test_ipsec_proto_err_icv_corrupt),
14142 		TEST_CASES_END() /**< NULL terminate unit test array */
14143 	}
14144 };
14145 
14146 static struct unit_test_suite pdcp_proto_testsuite  = {
14147 	.suite_name = "PDCP Proto Unit Test Suite",
14148 	.setup = pdcp_proto_testsuite_setup,
14149 	.unit_test_cases = {
14150 		TEST_CASE_ST(ut_setup_security, ut_teardown,
14151 			test_PDCP_PROTO_all),
14152 		TEST_CASES_END() /**< NULL terminate unit test array */
14153 	}
14154 };
14155 
14156 static struct unit_test_suite docsis_proto_testsuite  = {
14157 	.suite_name = "Docsis Proto Unit Test Suite",
14158 	.setup = docsis_proto_testsuite_setup,
14159 	.unit_test_cases = {
14160 		TEST_CASE_ST(ut_setup_security, ut_teardown,
14161 			test_DOCSIS_PROTO_all),
14162 		TEST_CASES_END() /**< NULL terminate unit test array */
14163 	}
14164 };
14165 #endif
14166 
14167 static struct unit_test_suite cryptodev_gen_testsuite  = {
14168 	.suite_name = "Crypto General Unit Test Suite",
14169 	.setup = crypto_gen_testsuite_setup,
14170 	.unit_test_cases = {
14171 		TEST_CASE_ST(ut_setup, ut_teardown,
14172 				test_device_configure_invalid_dev_id),
14173 		TEST_CASE_ST(ut_setup, ut_teardown,
14174 				test_queue_pair_descriptor_setup),
14175 		TEST_CASE_ST(ut_setup, ut_teardown,
14176 				test_device_configure_invalid_queue_pair_ids),
14177 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
14178 		TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
14179 		TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
14180 		TEST_CASES_END() /**< NULL terminate unit test array */
14181 	}
14182 };
14183 
14184 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
14185 	.suite_name = "Negative HMAC SHA1 Unit Test Suite",
14186 	.setup = negative_hmac_sha1_testsuite_setup,
14187 	.unit_test_cases = {
14188 		/** Negative tests */
14189 		TEST_CASE_ST(ut_setup, ut_teardown,
14190 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
14191 		TEST_CASE_ST(ut_setup, ut_teardown,
14192 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14193 		TEST_CASE_ST(ut_setup, ut_teardown,
14194 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14195 		TEST_CASE_ST(ut_setup, ut_teardown,
14196 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14197 
14198 		TEST_CASES_END() /**< NULL terminate unit test array */
14199 	}
14200 };
14201 
14202 static struct unit_test_suite cryptodev_multi_session_testsuite = {
14203 	.suite_name = "Multi Session Unit Test Suite",
14204 	.setup = multi_session_testsuite_setup,
14205 	.unit_test_cases = {
14206 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
14207 		TEST_CASE_ST(ut_setup, ut_teardown,
14208 				test_multi_session_random_usage),
14209 
14210 		TEST_CASES_END() /**< NULL terminate unit test array */
14211 	}
14212 };
14213 
14214 static struct unit_test_suite cryptodev_null_testsuite  = {
14215 	.suite_name = "NULL Test Suite",
14216 	.setup = null_testsuite_setup,
14217 	.unit_test_cases = {
14218 		TEST_CASE_ST(ut_setup, ut_teardown,
14219 			test_null_invalid_operation),
14220 		TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
14221 		TEST_CASES_END()
14222 	}
14223 };
14224 
14225 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
14226 	.suite_name = "AES CCM Authenticated Test Suite",
14227 	.setup = aes_ccm_auth_testsuite_setup,
14228 	.unit_test_cases = {
14229 		/** AES CCM Authenticated Encryption 128 bits key*/
14230 		TEST_CASE_ST(ut_setup, ut_teardown,
14231 			test_AES_CCM_authenticated_encryption_test_case_128_1),
14232 		TEST_CASE_ST(ut_setup, ut_teardown,
14233 			test_AES_CCM_authenticated_encryption_test_case_128_2),
14234 		TEST_CASE_ST(ut_setup, ut_teardown,
14235 			test_AES_CCM_authenticated_encryption_test_case_128_3),
14236 
14237 		/** AES CCM Authenticated Decryption 128 bits key*/
14238 		TEST_CASE_ST(ut_setup, ut_teardown,
14239 			test_AES_CCM_authenticated_decryption_test_case_128_1),
14240 		TEST_CASE_ST(ut_setup, ut_teardown,
14241 			test_AES_CCM_authenticated_decryption_test_case_128_2),
14242 		TEST_CASE_ST(ut_setup, ut_teardown,
14243 			test_AES_CCM_authenticated_decryption_test_case_128_3),
14244 
14245 		/** AES CCM Authenticated Encryption 192 bits key */
14246 		TEST_CASE_ST(ut_setup, ut_teardown,
14247 			test_AES_CCM_authenticated_encryption_test_case_192_1),
14248 		TEST_CASE_ST(ut_setup, ut_teardown,
14249 			test_AES_CCM_authenticated_encryption_test_case_192_2),
14250 		TEST_CASE_ST(ut_setup, ut_teardown,
14251 			test_AES_CCM_authenticated_encryption_test_case_192_3),
14252 
14253 		/** AES CCM Authenticated Decryption 192 bits key*/
14254 		TEST_CASE_ST(ut_setup, ut_teardown,
14255 			test_AES_CCM_authenticated_decryption_test_case_192_1),
14256 		TEST_CASE_ST(ut_setup, ut_teardown,
14257 			test_AES_CCM_authenticated_decryption_test_case_192_2),
14258 		TEST_CASE_ST(ut_setup, ut_teardown,
14259 			test_AES_CCM_authenticated_decryption_test_case_192_3),
14260 
14261 		/** AES CCM Authenticated Encryption 256 bits key */
14262 		TEST_CASE_ST(ut_setup, ut_teardown,
14263 			test_AES_CCM_authenticated_encryption_test_case_256_1),
14264 		TEST_CASE_ST(ut_setup, ut_teardown,
14265 			test_AES_CCM_authenticated_encryption_test_case_256_2),
14266 		TEST_CASE_ST(ut_setup, ut_teardown,
14267 			test_AES_CCM_authenticated_encryption_test_case_256_3),
14268 
14269 		/** AES CCM Authenticated Decryption 256 bits key*/
14270 		TEST_CASE_ST(ut_setup, ut_teardown,
14271 			test_AES_CCM_authenticated_decryption_test_case_256_1),
14272 		TEST_CASE_ST(ut_setup, ut_teardown,
14273 			test_AES_CCM_authenticated_decryption_test_case_256_2),
14274 		TEST_CASE_ST(ut_setup, ut_teardown,
14275 			test_AES_CCM_authenticated_decryption_test_case_256_3),
14276 		TEST_CASES_END()
14277 	}
14278 };
14279 
14280 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
14281 	.suite_name = "AES GCM Authenticated Test Suite",
14282 	.setup = aes_gcm_auth_testsuite_setup,
14283 	.unit_test_cases = {
14284 		/** AES GCM Authenticated Encryption */
14285 		TEST_CASE_ST(ut_setup, ut_teardown,
14286 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
14287 		TEST_CASE_ST(ut_setup, ut_teardown,
14288 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
14289 		TEST_CASE_ST(ut_setup, ut_teardown,
14290 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
14291 		TEST_CASE_ST(ut_setup, ut_teardown,
14292 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
14293 		TEST_CASE_ST(ut_setup, ut_teardown,
14294 			test_AES_GCM_authenticated_encryption_test_case_1),
14295 		TEST_CASE_ST(ut_setup, ut_teardown,
14296 			test_AES_GCM_authenticated_encryption_test_case_2),
14297 		TEST_CASE_ST(ut_setup, ut_teardown,
14298 			test_AES_GCM_authenticated_encryption_test_case_3),
14299 		TEST_CASE_ST(ut_setup, ut_teardown,
14300 			test_AES_GCM_authenticated_encryption_test_case_4),
14301 		TEST_CASE_ST(ut_setup, ut_teardown,
14302 			test_AES_GCM_authenticated_encryption_test_case_5),
14303 		TEST_CASE_ST(ut_setup, ut_teardown,
14304 			test_AES_GCM_authenticated_encryption_test_case_6),
14305 		TEST_CASE_ST(ut_setup, ut_teardown,
14306 			test_AES_GCM_authenticated_encryption_test_case_7),
14307 		TEST_CASE_ST(ut_setup, ut_teardown,
14308 			test_AES_GCM_authenticated_encryption_test_case_8),
14309 		TEST_CASE_ST(ut_setup, ut_teardown,
14310 			test_AES_GCM_J0_authenticated_encryption_test_case_1),
14311 
14312 		/** AES GCM Authenticated Decryption */
14313 		TEST_CASE_ST(ut_setup, ut_teardown,
14314 			test_AES_GCM_authenticated_decryption_test_case_1),
14315 		TEST_CASE_ST(ut_setup, ut_teardown,
14316 			test_AES_GCM_authenticated_decryption_test_case_2),
14317 		TEST_CASE_ST(ut_setup, ut_teardown,
14318 			test_AES_GCM_authenticated_decryption_test_case_3),
14319 		TEST_CASE_ST(ut_setup, ut_teardown,
14320 			test_AES_GCM_authenticated_decryption_test_case_4),
14321 		TEST_CASE_ST(ut_setup, ut_teardown,
14322 			test_AES_GCM_authenticated_decryption_test_case_5),
14323 		TEST_CASE_ST(ut_setup, ut_teardown,
14324 			test_AES_GCM_authenticated_decryption_test_case_6),
14325 		TEST_CASE_ST(ut_setup, ut_teardown,
14326 			test_AES_GCM_authenticated_decryption_test_case_7),
14327 		TEST_CASE_ST(ut_setup, ut_teardown,
14328 			test_AES_GCM_authenticated_decryption_test_case_8),
14329 		TEST_CASE_ST(ut_setup, ut_teardown,
14330 			test_AES_GCM_J0_authenticated_decryption_test_case_1),
14331 
14332 		/** AES GCM Authenticated Encryption 192 bits key */
14333 		TEST_CASE_ST(ut_setup, ut_teardown,
14334 			test_AES_GCM_auth_encryption_test_case_192_1),
14335 		TEST_CASE_ST(ut_setup, ut_teardown,
14336 			test_AES_GCM_auth_encryption_test_case_192_2),
14337 		TEST_CASE_ST(ut_setup, ut_teardown,
14338 			test_AES_GCM_auth_encryption_test_case_192_3),
14339 		TEST_CASE_ST(ut_setup, ut_teardown,
14340 			test_AES_GCM_auth_encryption_test_case_192_4),
14341 		TEST_CASE_ST(ut_setup, ut_teardown,
14342 			test_AES_GCM_auth_encryption_test_case_192_5),
14343 		TEST_CASE_ST(ut_setup, ut_teardown,
14344 			test_AES_GCM_auth_encryption_test_case_192_6),
14345 		TEST_CASE_ST(ut_setup, ut_teardown,
14346 			test_AES_GCM_auth_encryption_test_case_192_7),
14347 
14348 		/** AES GCM Authenticated Decryption 192 bits key */
14349 		TEST_CASE_ST(ut_setup, ut_teardown,
14350 			test_AES_GCM_auth_decryption_test_case_192_1),
14351 		TEST_CASE_ST(ut_setup, ut_teardown,
14352 			test_AES_GCM_auth_decryption_test_case_192_2),
14353 		TEST_CASE_ST(ut_setup, ut_teardown,
14354 			test_AES_GCM_auth_decryption_test_case_192_3),
14355 		TEST_CASE_ST(ut_setup, ut_teardown,
14356 			test_AES_GCM_auth_decryption_test_case_192_4),
14357 		TEST_CASE_ST(ut_setup, ut_teardown,
14358 			test_AES_GCM_auth_decryption_test_case_192_5),
14359 		TEST_CASE_ST(ut_setup, ut_teardown,
14360 			test_AES_GCM_auth_decryption_test_case_192_6),
14361 		TEST_CASE_ST(ut_setup, ut_teardown,
14362 			test_AES_GCM_auth_decryption_test_case_192_7),
14363 
14364 		/** AES GCM Authenticated Encryption 256 bits key */
14365 		TEST_CASE_ST(ut_setup, ut_teardown,
14366 			test_AES_GCM_auth_encryption_test_case_256_1),
14367 		TEST_CASE_ST(ut_setup, ut_teardown,
14368 			test_AES_GCM_auth_encryption_test_case_256_2),
14369 		TEST_CASE_ST(ut_setup, ut_teardown,
14370 			test_AES_GCM_auth_encryption_test_case_256_3),
14371 		TEST_CASE_ST(ut_setup, ut_teardown,
14372 			test_AES_GCM_auth_encryption_test_case_256_4),
14373 		TEST_CASE_ST(ut_setup, ut_teardown,
14374 			test_AES_GCM_auth_encryption_test_case_256_5),
14375 		TEST_CASE_ST(ut_setup, ut_teardown,
14376 			test_AES_GCM_auth_encryption_test_case_256_6),
14377 		TEST_CASE_ST(ut_setup, ut_teardown,
14378 			test_AES_GCM_auth_encryption_test_case_256_7),
14379 
14380 		/** AES GCM Authenticated Decryption 256 bits key */
14381 		TEST_CASE_ST(ut_setup, ut_teardown,
14382 			test_AES_GCM_auth_decryption_test_case_256_1),
14383 		TEST_CASE_ST(ut_setup, ut_teardown,
14384 			test_AES_GCM_auth_decryption_test_case_256_2),
14385 		TEST_CASE_ST(ut_setup, ut_teardown,
14386 			test_AES_GCM_auth_decryption_test_case_256_3),
14387 		TEST_CASE_ST(ut_setup, ut_teardown,
14388 			test_AES_GCM_auth_decryption_test_case_256_4),
14389 		TEST_CASE_ST(ut_setup, ut_teardown,
14390 			test_AES_GCM_auth_decryption_test_case_256_5),
14391 		TEST_CASE_ST(ut_setup, ut_teardown,
14392 			test_AES_GCM_auth_decryption_test_case_256_6),
14393 		TEST_CASE_ST(ut_setup, ut_teardown,
14394 			test_AES_GCM_auth_decryption_test_case_256_7),
14395 
14396 		/** AES GCM Authenticated Encryption big aad size */
14397 		TEST_CASE_ST(ut_setup, ut_teardown,
14398 			test_AES_GCM_auth_encryption_test_case_aad_1),
14399 		TEST_CASE_ST(ut_setup, ut_teardown,
14400 			test_AES_GCM_auth_encryption_test_case_aad_2),
14401 
14402 		/** AES GCM Authenticated Decryption big aad size */
14403 		TEST_CASE_ST(ut_setup, ut_teardown,
14404 			test_AES_GCM_auth_decryption_test_case_aad_1),
14405 		TEST_CASE_ST(ut_setup, ut_teardown,
14406 			test_AES_GCM_auth_decryption_test_case_aad_2),
14407 
14408 		/** Out of place tests */
14409 		TEST_CASE_ST(ut_setup, ut_teardown,
14410 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
14411 		TEST_CASE_ST(ut_setup, ut_teardown,
14412 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
14413 
14414 		/** Session-less tests */
14415 		TEST_CASE_ST(ut_setup, ut_teardown,
14416 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
14417 		TEST_CASE_ST(ut_setup, ut_teardown,
14418 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
14419 
14420 		TEST_CASES_END()
14421 	}
14422 };
14423 
14424 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
14425 	.suite_name = "AES GMAC Authentication Test Suite",
14426 	.setup = aes_gmac_auth_testsuite_setup,
14427 	.unit_test_cases = {
14428 		TEST_CASE_ST(ut_setup, ut_teardown,
14429 			test_AES_GMAC_authentication_test_case_1),
14430 		TEST_CASE_ST(ut_setup, ut_teardown,
14431 			test_AES_GMAC_authentication_verify_test_case_1),
14432 		TEST_CASE_ST(ut_setup, ut_teardown,
14433 			test_AES_GMAC_authentication_test_case_2),
14434 		TEST_CASE_ST(ut_setup, ut_teardown,
14435 			test_AES_GMAC_authentication_verify_test_case_2),
14436 		TEST_CASE_ST(ut_setup, ut_teardown,
14437 			test_AES_GMAC_authentication_test_case_3),
14438 		TEST_CASE_ST(ut_setup, ut_teardown,
14439 			test_AES_GMAC_authentication_verify_test_case_3),
14440 		TEST_CASE_ST(ut_setup, ut_teardown,
14441 			test_AES_GMAC_authentication_test_case_4),
14442 		TEST_CASE_ST(ut_setup, ut_teardown,
14443 			test_AES_GMAC_authentication_verify_test_case_4),
14444 		TEST_CASE_ST(ut_setup, ut_teardown,
14445 			test_AES_GMAC_authentication_SGL_40B),
14446 		TEST_CASE_ST(ut_setup, ut_teardown,
14447 			test_AES_GMAC_authentication_SGL_80B),
14448 		TEST_CASE_ST(ut_setup, ut_teardown,
14449 			test_AES_GMAC_authentication_SGL_2048B),
14450 		TEST_CASE_ST(ut_setup, ut_teardown,
14451 			test_AES_GMAC_authentication_SGL_2047B),
14452 
14453 		TEST_CASES_END()
14454 	}
14455 };
14456 
14457 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
14458 	.suite_name = "Chacha20-Poly1305 Test Suite",
14459 	.setup = chacha20_poly1305_testsuite_setup,
14460 	.unit_test_cases = {
14461 		TEST_CASE_ST(ut_setup, ut_teardown,
14462 			test_chacha20_poly1305_encrypt_test_case_rfc8439),
14463 		TEST_CASE_ST(ut_setup, ut_teardown,
14464 			test_chacha20_poly1305_decrypt_test_case_rfc8439),
14465 		TEST_CASES_END()
14466 	}
14467 };
14468 
14469 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
14470 	.suite_name = "SNOW 3G Test Suite",
14471 	.setup = snow3g_testsuite_setup,
14472 	.unit_test_cases = {
14473 		/** SNOW 3G encrypt only (UEA2) */
14474 		TEST_CASE_ST(ut_setup, ut_teardown,
14475 			test_snow3g_encryption_test_case_1),
14476 		TEST_CASE_ST(ut_setup, ut_teardown,
14477 			test_snow3g_encryption_test_case_2),
14478 		TEST_CASE_ST(ut_setup, ut_teardown,
14479 			test_snow3g_encryption_test_case_3),
14480 		TEST_CASE_ST(ut_setup, ut_teardown,
14481 			test_snow3g_encryption_test_case_4),
14482 		TEST_CASE_ST(ut_setup, ut_teardown,
14483 			test_snow3g_encryption_test_case_5),
14484 
14485 		TEST_CASE_ST(ut_setup, ut_teardown,
14486 			test_snow3g_encryption_test_case_1_oop),
14487 		TEST_CASE_ST(ut_setup, ut_teardown,
14488 			test_snow3g_encryption_test_case_1_oop_sgl),
14489 		TEST_CASE_ST(ut_setup, ut_teardown,
14490 			test_snow3g_encryption_test_case_1_offset_oop),
14491 		TEST_CASE_ST(ut_setup, ut_teardown,
14492 			test_snow3g_decryption_test_case_1_oop),
14493 
14494 		/** SNOW 3G generate auth, then encrypt (UEA2) */
14495 		TEST_CASE_ST(ut_setup, ut_teardown,
14496 			test_snow3g_auth_cipher_test_case_1),
14497 		TEST_CASE_ST(ut_setup, ut_teardown,
14498 			test_snow3g_auth_cipher_test_case_2),
14499 		TEST_CASE_ST(ut_setup, ut_teardown,
14500 			test_snow3g_auth_cipher_test_case_2_oop),
14501 		TEST_CASE_ST(ut_setup, ut_teardown,
14502 			test_snow3g_auth_cipher_part_digest_enc),
14503 		TEST_CASE_ST(ut_setup, ut_teardown,
14504 			test_snow3g_auth_cipher_part_digest_enc_oop),
14505 		TEST_CASE_ST(ut_setup, ut_teardown,
14506 			test_snow3g_auth_cipher_test_case_3_sgl),
14507 		TEST_CASE_ST(ut_setup, ut_teardown,
14508 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
14509 		TEST_CASE_ST(ut_setup, ut_teardown,
14510 			test_snow3g_auth_cipher_part_digest_enc_sgl),
14511 		TEST_CASE_ST(ut_setup, ut_teardown,
14512 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
14513 
14514 		/** SNOW 3G decrypt (UEA2), then verify auth */
14515 		TEST_CASE_ST(ut_setup, ut_teardown,
14516 			test_snow3g_auth_cipher_verify_test_case_1),
14517 		TEST_CASE_ST(ut_setup, ut_teardown,
14518 			test_snow3g_auth_cipher_verify_test_case_2),
14519 		TEST_CASE_ST(ut_setup, ut_teardown,
14520 			test_snow3g_auth_cipher_verify_test_case_2_oop),
14521 		TEST_CASE_ST(ut_setup, ut_teardown,
14522 			test_snow3g_auth_cipher_verify_part_digest_enc),
14523 		TEST_CASE_ST(ut_setup, ut_teardown,
14524 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
14525 		TEST_CASE_ST(ut_setup, ut_teardown,
14526 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
14527 		TEST_CASE_ST(ut_setup, ut_teardown,
14528 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
14529 		TEST_CASE_ST(ut_setup, ut_teardown,
14530 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
14531 		TEST_CASE_ST(ut_setup, ut_teardown,
14532 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
14533 
14534 		/** SNOW 3G decrypt only (UEA2) */
14535 		TEST_CASE_ST(ut_setup, ut_teardown,
14536 			test_snow3g_decryption_test_case_1),
14537 		TEST_CASE_ST(ut_setup, ut_teardown,
14538 			test_snow3g_decryption_test_case_2),
14539 		TEST_CASE_ST(ut_setup, ut_teardown,
14540 			test_snow3g_decryption_test_case_3),
14541 		TEST_CASE_ST(ut_setup, ut_teardown,
14542 			test_snow3g_decryption_test_case_4),
14543 		TEST_CASE_ST(ut_setup, ut_teardown,
14544 			test_snow3g_decryption_test_case_5),
14545 		TEST_CASE_ST(ut_setup, ut_teardown,
14546 			test_snow3g_decryption_with_digest_test_case_1),
14547 		TEST_CASE_ST(ut_setup, ut_teardown,
14548 			test_snow3g_hash_generate_test_case_1),
14549 		TEST_CASE_ST(ut_setup, ut_teardown,
14550 			test_snow3g_hash_generate_test_case_2),
14551 		TEST_CASE_ST(ut_setup, ut_teardown,
14552 			test_snow3g_hash_generate_test_case_3),
14553 
14554 		/* Tests with buffers which length is not byte-aligned */
14555 		TEST_CASE_ST(ut_setup, ut_teardown,
14556 			test_snow3g_hash_generate_test_case_4),
14557 		TEST_CASE_ST(ut_setup, ut_teardown,
14558 			test_snow3g_hash_generate_test_case_5),
14559 		TEST_CASE_ST(ut_setup, ut_teardown,
14560 			test_snow3g_hash_generate_test_case_6),
14561 		TEST_CASE_ST(ut_setup, ut_teardown,
14562 			test_snow3g_hash_verify_test_case_1),
14563 		TEST_CASE_ST(ut_setup, ut_teardown,
14564 			test_snow3g_hash_verify_test_case_2),
14565 		TEST_CASE_ST(ut_setup, ut_teardown,
14566 			test_snow3g_hash_verify_test_case_3),
14567 
14568 		/* Tests with buffers which length is not byte-aligned */
14569 		TEST_CASE_ST(ut_setup, ut_teardown,
14570 			test_snow3g_hash_verify_test_case_4),
14571 		TEST_CASE_ST(ut_setup, ut_teardown,
14572 			test_snow3g_hash_verify_test_case_5),
14573 		TEST_CASE_ST(ut_setup, ut_teardown,
14574 			test_snow3g_hash_verify_test_case_6),
14575 		TEST_CASE_ST(ut_setup, ut_teardown,
14576 			test_snow3g_cipher_auth_test_case_1),
14577 		TEST_CASE_ST(ut_setup, ut_teardown,
14578 			test_snow3g_auth_cipher_with_digest_test_case_1),
14579 		TEST_CASES_END()
14580 	}
14581 };
14582 
14583 static struct unit_test_suite cryptodev_zuc_testsuite  = {
14584 	.suite_name = "ZUC Test Suite",
14585 	.setup = zuc_testsuite_setup,
14586 	.unit_test_cases = {
14587 		/** ZUC encrypt only (EEA3) */
14588 		TEST_CASE_ST(ut_setup, ut_teardown,
14589 			test_zuc_encryption_test_case_1),
14590 		TEST_CASE_ST(ut_setup, ut_teardown,
14591 			test_zuc_encryption_test_case_2),
14592 		TEST_CASE_ST(ut_setup, ut_teardown,
14593 			test_zuc_encryption_test_case_3),
14594 		TEST_CASE_ST(ut_setup, ut_teardown,
14595 			test_zuc_encryption_test_case_4),
14596 		TEST_CASE_ST(ut_setup, ut_teardown,
14597 			test_zuc_encryption_test_case_5),
14598 		TEST_CASE_ST(ut_setup, ut_teardown,
14599 			test_zuc_encryption_test_case_6_sgl),
14600 
14601 		/** ZUC authenticate (EIA3) */
14602 		TEST_CASE_ST(ut_setup, ut_teardown,
14603 			test_zuc_hash_generate_test_case_1),
14604 		TEST_CASE_ST(ut_setup, ut_teardown,
14605 			test_zuc_hash_generate_test_case_2),
14606 		TEST_CASE_ST(ut_setup, ut_teardown,
14607 			test_zuc_hash_generate_test_case_3),
14608 		TEST_CASE_ST(ut_setup, ut_teardown,
14609 			test_zuc_hash_generate_test_case_4),
14610 		TEST_CASE_ST(ut_setup, ut_teardown,
14611 			test_zuc_hash_generate_test_case_5),
14612 		TEST_CASE_ST(ut_setup, ut_teardown,
14613 			test_zuc_hash_generate_test_case_6),
14614 		TEST_CASE_ST(ut_setup, ut_teardown,
14615 			test_zuc_hash_generate_test_case_7),
14616 		TEST_CASE_ST(ut_setup, ut_teardown,
14617 			test_zuc_hash_generate_test_case_8),
14618 
14619 		/** ZUC alg-chain (EEA3/EIA3) */
14620 		TEST_CASE_ST(ut_setup, ut_teardown,
14621 			test_zuc_cipher_auth_test_case_1),
14622 		TEST_CASE_ST(ut_setup, ut_teardown,
14623 			test_zuc_cipher_auth_test_case_2),
14624 
14625 		/** ZUC generate auth, then encrypt (EEA3) */
14626 		TEST_CASE_ST(ut_setup, ut_teardown,
14627 			test_zuc_auth_cipher_test_case_1),
14628 		TEST_CASE_ST(ut_setup, ut_teardown,
14629 			test_zuc_auth_cipher_test_case_1_oop),
14630 		TEST_CASE_ST(ut_setup, ut_teardown,
14631 			test_zuc_auth_cipher_test_case_1_sgl),
14632 		TEST_CASE_ST(ut_setup, ut_teardown,
14633 			test_zuc_auth_cipher_test_case_1_oop_sgl),
14634 
14635 		/** ZUC decrypt (EEA3), then verify auth */
14636 		TEST_CASE_ST(ut_setup, ut_teardown,
14637 			test_zuc_auth_cipher_verify_test_case_1),
14638 		TEST_CASE_ST(ut_setup, ut_teardown,
14639 			test_zuc_auth_cipher_verify_test_case_1_oop),
14640 		TEST_CASE_ST(ut_setup, ut_teardown,
14641 			test_zuc_auth_cipher_verify_test_case_1_sgl),
14642 		TEST_CASE_ST(ut_setup, ut_teardown,
14643 			test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
14644 		TEST_CASES_END()
14645 	}
14646 };
14647 
14648 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
14649 	.suite_name = "HMAC_MD5 Authentication Test Suite",
14650 	.setup = hmac_md5_auth_testsuite_setup,
14651 	.unit_test_cases = {
14652 		TEST_CASE_ST(ut_setup, ut_teardown,
14653 			test_MD5_HMAC_generate_case_1),
14654 		TEST_CASE_ST(ut_setup, ut_teardown,
14655 			test_MD5_HMAC_verify_case_1),
14656 		TEST_CASE_ST(ut_setup, ut_teardown,
14657 			test_MD5_HMAC_generate_case_2),
14658 		TEST_CASE_ST(ut_setup, ut_teardown,
14659 			test_MD5_HMAC_verify_case_2),
14660 		TEST_CASES_END()
14661 	}
14662 };
14663 
14664 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
14665 	.suite_name = "Kasumi Test Suite",
14666 	.setup = kasumi_testsuite_setup,
14667 	.unit_test_cases = {
14668 		/** KASUMI hash only (UIA1) */
14669 		TEST_CASE_ST(ut_setup, ut_teardown,
14670 			test_kasumi_hash_generate_test_case_1),
14671 		TEST_CASE_ST(ut_setup, ut_teardown,
14672 			test_kasumi_hash_generate_test_case_2),
14673 		TEST_CASE_ST(ut_setup, ut_teardown,
14674 			test_kasumi_hash_generate_test_case_3),
14675 		TEST_CASE_ST(ut_setup, ut_teardown,
14676 			test_kasumi_hash_generate_test_case_4),
14677 		TEST_CASE_ST(ut_setup, ut_teardown,
14678 			test_kasumi_hash_generate_test_case_5),
14679 		TEST_CASE_ST(ut_setup, ut_teardown,
14680 			test_kasumi_hash_generate_test_case_6),
14681 
14682 		TEST_CASE_ST(ut_setup, ut_teardown,
14683 			test_kasumi_hash_verify_test_case_1),
14684 		TEST_CASE_ST(ut_setup, ut_teardown,
14685 			test_kasumi_hash_verify_test_case_2),
14686 		TEST_CASE_ST(ut_setup, ut_teardown,
14687 			test_kasumi_hash_verify_test_case_3),
14688 		TEST_CASE_ST(ut_setup, ut_teardown,
14689 			test_kasumi_hash_verify_test_case_4),
14690 		TEST_CASE_ST(ut_setup, ut_teardown,
14691 			test_kasumi_hash_verify_test_case_5),
14692 
14693 		/** KASUMI encrypt only (UEA1) */
14694 		TEST_CASE_ST(ut_setup, ut_teardown,
14695 			test_kasumi_encryption_test_case_1),
14696 		TEST_CASE_ST(ut_setup, ut_teardown,
14697 			test_kasumi_encryption_test_case_1_sgl),
14698 		TEST_CASE_ST(ut_setup, ut_teardown,
14699 			test_kasumi_encryption_test_case_1_oop),
14700 		TEST_CASE_ST(ut_setup, ut_teardown,
14701 			test_kasumi_encryption_test_case_1_oop_sgl),
14702 		TEST_CASE_ST(ut_setup, ut_teardown,
14703 			test_kasumi_encryption_test_case_2),
14704 		TEST_CASE_ST(ut_setup, ut_teardown,
14705 			test_kasumi_encryption_test_case_3),
14706 		TEST_CASE_ST(ut_setup, ut_teardown,
14707 			test_kasumi_encryption_test_case_4),
14708 		TEST_CASE_ST(ut_setup, ut_teardown,
14709 			test_kasumi_encryption_test_case_5),
14710 
14711 		/** KASUMI decrypt only (UEA1) */
14712 		TEST_CASE_ST(ut_setup, ut_teardown,
14713 			test_kasumi_decryption_test_case_1),
14714 		TEST_CASE_ST(ut_setup, ut_teardown,
14715 			test_kasumi_decryption_test_case_2),
14716 		TEST_CASE_ST(ut_setup, ut_teardown,
14717 			test_kasumi_decryption_test_case_3),
14718 		TEST_CASE_ST(ut_setup, ut_teardown,
14719 			test_kasumi_decryption_test_case_4),
14720 		TEST_CASE_ST(ut_setup, ut_teardown,
14721 			test_kasumi_decryption_test_case_5),
14722 		TEST_CASE_ST(ut_setup, ut_teardown,
14723 			test_kasumi_decryption_test_case_1_oop),
14724 		TEST_CASE_ST(ut_setup, ut_teardown,
14725 			test_kasumi_cipher_auth_test_case_1),
14726 
14727 		/** KASUMI generate auth, then encrypt (F8) */
14728 		TEST_CASE_ST(ut_setup, ut_teardown,
14729 			test_kasumi_auth_cipher_test_case_1),
14730 		TEST_CASE_ST(ut_setup, ut_teardown,
14731 			test_kasumi_auth_cipher_test_case_2),
14732 		TEST_CASE_ST(ut_setup, ut_teardown,
14733 			test_kasumi_auth_cipher_test_case_2_oop),
14734 		TEST_CASE_ST(ut_setup, ut_teardown,
14735 			test_kasumi_auth_cipher_test_case_2_sgl),
14736 		TEST_CASE_ST(ut_setup, ut_teardown,
14737 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
14738 
14739 		/** KASUMI decrypt (F8), then verify auth */
14740 		TEST_CASE_ST(ut_setup, ut_teardown,
14741 			test_kasumi_auth_cipher_verify_test_case_1),
14742 		TEST_CASE_ST(ut_setup, ut_teardown,
14743 			test_kasumi_auth_cipher_verify_test_case_2),
14744 		TEST_CASE_ST(ut_setup, ut_teardown,
14745 			test_kasumi_auth_cipher_verify_test_case_2_oop),
14746 		TEST_CASE_ST(ut_setup, ut_teardown,
14747 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
14748 		TEST_CASE_ST(ut_setup, ut_teardown,
14749 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
14750 
14751 		TEST_CASES_END()
14752 	}
14753 };
14754 
14755 static struct unit_test_suite cryptodev_esn_testsuite  = {
14756 	.suite_name = "ESN Test Suite",
14757 	.setup = esn_testsuite_setup,
14758 	.unit_test_cases = {
14759 		TEST_CASE_ST(ut_setup, ut_teardown,
14760 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
14761 		TEST_CASE_ST(ut_setup, ut_teardown,
14762 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
14763 		TEST_CASES_END()
14764 	}
14765 };
14766 
14767 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
14768 	.suite_name = "Negative AES GCM Test Suite",
14769 	.setup = negative_aes_gcm_testsuite_setup,
14770 	.unit_test_cases = {
14771 		TEST_CASE_ST(ut_setup, ut_teardown,
14772 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
14773 		TEST_CASE_ST(ut_setup, ut_teardown,
14774 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
14775 		TEST_CASE_ST(ut_setup, ut_teardown,
14776 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
14777 		TEST_CASE_ST(ut_setup, ut_teardown,
14778 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
14779 		TEST_CASE_ST(ut_setup, ut_teardown,
14780 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
14781 		TEST_CASE_ST(ut_setup, ut_teardown,
14782 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
14783 		TEST_CASE_ST(ut_setup, ut_teardown,
14784 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
14785 		TEST_CASE_ST(ut_setup, ut_teardown,
14786 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
14787 		TEST_CASE_ST(ut_setup, ut_teardown,
14788 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
14789 		TEST_CASE_ST(ut_setup, ut_teardown,
14790 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
14791 		TEST_CASE_ST(ut_setup, ut_teardown,
14792 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
14793 		TEST_CASE_ST(ut_setup, ut_teardown,
14794 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
14795 
14796 		TEST_CASES_END()
14797 	}
14798 };
14799 
14800 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
14801 	.suite_name = "Negative AES GMAC Test Suite",
14802 	.setup = negative_aes_gmac_testsuite_setup,
14803 	.unit_test_cases = {
14804 		TEST_CASE_ST(ut_setup, ut_teardown,
14805 			authentication_verify_AES128_GMAC_fail_data_corrupt),
14806 		TEST_CASE_ST(ut_setup, ut_teardown,
14807 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
14808 
14809 		TEST_CASES_END()
14810 	}
14811 };
14812 
14813 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
14814 	.suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
14815 	.setup = mixed_cipher_hash_testsuite_setup,
14816 	.unit_test_cases = {
14817 		/** AUTH AES CMAC + CIPHER AES CTR */
14818 		TEST_CASE_ST(ut_setup, ut_teardown,
14819 			test_aes_cmac_aes_ctr_digest_enc_test_case_1),
14820 		TEST_CASE_ST(ut_setup, ut_teardown,
14821 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
14822 		TEST_CASE_ST(ut_setup, ut_teardown,
14823 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
14824 		TEST_CASE_ST(ut_setup, ut_teardown,
14825 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
14826 		TEST_CASE_ST(ut_setup, ut_teardown,
14827 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
14828 		TEST_CASE_ST(ut_setup, ut_teardown,
14829 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
14830 		TEST_CASE_ST(ut_setup, ut_teardown,
14831 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
14832 		TEST_CASE_ST(ut_setup, ut_teardown,
14833 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
14834 
14835 		/** AUTH ZUC + CIPHER SNOW3G */
14836 		TEST_CASE_ST(ut_setup, ut_teardown,
14837 			test_auth_zuc_cipher_snow_test_case_1),
14838 		TEST_CASE_ST(ut_setup, ut_teardown,
14839 			test_verify_auth_zuc_cipher_snow_test_case_1),
14840 		/** AUTH AES CMAC + CIPHER SNOW3G */
14841 		TEST_CASE_ST(ut_setup, ut_teardown,
14842 			test_auth_aes_cmac_cipher_snow_test_case_1),
14843 		TEST_CASE_ST(ut_setup, ut_teardown,
14844 			test_verify_auth_aes_cmac_cipher_snow_test_case_1),
14845 		/** AUTH ZUC + CIPHER AES CTR */
14846 		TEST_CASE_ST(ut_setup, ut_teardown,
14847 			test_auth_zuc_cipher_aes_ctr_test_case_1),
14848 		TEST_CASE_ST(ut_setup, ut_teardown,
14849 			test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
14850 		/** AUTH SNOW3G + CIPHER AES CTR */
14851 		TEST_CASE_ST(ut_setup, ut_teardown,
14852 			test_auth_snow_cipher_aes_ctr_test_case_1),
14853 		TEST_CASE_ST(ut_setup, ut_teardown,
14854 			test_verify_auth_snow_cipher_aes_ctr_test_case_1),
14855 		/** AUTH SNOW3G + CIPHER ZUC */
14856 		TEST_CASE_ST(ut_setup, ut_teardown,
14857 			test_auth_snow_cipher_zuc_test_case_1),
14858 		TEST_CASE_ST(ut_setup, ut_teardown,
14859 			test_verify_auth_snow_cipher_zuc_test_case_1),
14860 		/** AUTH AES CMAC + CIPHER ZUC */
14861 		TEST_CASE_ST(ut_setup, ut_teardown,
14862 			test_auth_aes_cmac_cipher_zuc_test_case_1),
14863 		TEST_CASE_ST(ut_setup, ut_teardown,
14864 			test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
14865 
14866 		/** AUTH NULL + CIPHER SNOW3G */
14867 		TEST_CASE_ST(ut_setup, ut_teardown,
14868 			test_auth_null_cipher_snow_test_case_1),
14869 		TEST_CASE_ST(ut_setup, ut_teardown,
14870 			test_verify_auth_null_cipher_snow_test_case_1),
14871 		/** AUTH NULL + CIPHER ZUC */
14872 		TEST_CASE_ST(ut_setup, ut_teardown,
14873 			test_auth_null_cipher_zuc_test_case_1),
14874 		TEST_CASE_ST(ut_setup, ut_teardown,
14875 			test_verify_auth_null_cipher_zuc_test_case_1),
14876 		/** AUTH SNOW3G + CIPHER NULL */
14877 		TEST_CASE_ST(ut_setup, ut_teardown,
14878 			test_auth_snow_cipher_null_test_case_1),
14879 		TEST_CASE_ST(ut_setup, ut_teardown,
14880 			test_verify_auth_snow_cipher_null_test_case_1),
14881 		/** AUTH ZUC + CIPHER NULL */
14882 		TEST_CASE_ST(ut_setup, ut_teardown,
14883 			test_auth_zuc_cipher_null_test_case_1),
14884 		TEST_CASE_ST(ut_setup, ut_teardown,
14885 			test_verify_auth_zuc_cipher_null_test_case_1),
14886 		/** AUTH NULL + CIPHER AES CTR */
14887 		TEST_CASE_ST(ut_setup, ut_teardown,
14888 			test_auth_null_cipher_aes_ctr_test_case_1),
14889 		TEST_CASE_ST(ut_setup, ut_teardown,
14890 			test_verify_auth_null_cipher_aes_ctr_test_case_1),
14891 		/** AUTH AES CMAC + CIPHER NULL */
14892 		TEST_CASE_ST(ut_setup, ut_teardown,
14893 			test_auth_aes_cmac_cipher_null_test_case_1),
14894 		TEST_CASE_ST(ut_setup, ut_teardown,
14895 			test_verify_auth_aes_cmac_cipher_null_test_case_1),
14896 		TEST_CASES_END()
14897 	}
14898 };
14899 
14900 static int
14901 run_cryptodev_testsuite(const char *pmd_name)
14902 {
14903 	uint8_t ret, j, i = 0, blk_start_idx = 0;
14904 	const enum blockcipher_test_type blk_suites[] = {
14905 		BLKCIPHER_AES_CHAIN_TYPE,
14906 		BLKCIPHER_AES_CIPHERONLY_TYPE,
14907 		BLKCIPHER_AES_DOCSIS_TYPE,
14908 		BLKCIPHER_3DES_CHAIN_TYPE,
14909 		BLKCIPHER_3DES_CIPHERONLY_TYPE,
14910 		BLKCIPHER_DES_CIPHERONLY_TYPE,
14911 		BLKCIPHER_DES_DOCSIS_TYPE,
14912 		BLKCIPHER_AUTHONLY_TYPE};
14913 	struct unit_test_suite *static_suites[] = {
14914 		&cryptodev_multi_session_testsuite,
14915 		&cryptodev_null_testsuite,
14916 		&cryptodev_aes_ccm_auth_testsuite,
14917 		&cryptodev_aes_gcm_auth_testsuite,
14918 		&cryptodev_aes_gmac_auth_testsuite,
14919 		&cryptodev_snow3g_testsuite,
14920 		&cryptodev_chacha20_poly1305_testsuite,
14921 		&cryptodev_zuc_testsuite,
14922 		&cryptodev_hmac_md5_auth_testsuite,
14923 		&cryptodev_kasumi_testsuite,
14924 		&cryptodev_esn_testsuite,
14925 		&cryptodev_negative_aes_gcm_testsuite,
14926 		&cryptodev_negative_aes_gmac_testsuite,
14927 		&cryptodev_mixed_cipher_hash_testsuite,
14928 		&cryptodev_negative_hmac_sha1_testsuite,
14929 		&cryptodev_gen_testsuite,
14930 #ifdef RTE_LIB_SECURITY
14931 		&ipsec_proto_testsuite,
14932 		&pdcp_proto_testsuite,
14933 		&docsis_proto_testsuite,
14934 #endif
14935 		&end_testsuite
14936 	};
14937 	static struct unit_test_suite ts = {
14938 		.suite_name = "Cryptodev Unit Test Suite",
14939 		.setup = testsuite_setup,
14940 		.teardown = testsuite_teardown,
14941 		.unit_test_cases = {TEST_CASES_END()}
14942 	};
14943 
14944 	gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
14945 
14946 	if (gbl_driver_id == -1) {
14947 		RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
14948 		return TEST_SKIPPED;
14949 	}
14950 
14951 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
14952 			(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
14953 
14954 	ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
14955 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
14956 	ret = unit_test_suite_runner(&ts);
14957 
14958 	FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
14959 	free(ts.unit_test_suites);
14960 	return ret;
14961 }
14962 
14963 static int
14964 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
14965 {
14966 	struct rte_cryptodev_info dev_info;
14967 	uint8_t i, nb_devs;
14968 	int driver_id;
14969 
14970 	driver_id = rte_cryptodev_driver_id_get(pmd_name);
14971 	if (driver_id == -1) {
14972 		RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
14973 		return TEST_SKIPPED;
14974 	}
14975 
14976 	nb_devs = rte_cryptodev_count();
14977 	if (nb_devs < 1) {
14978 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
14979 		return TEST_SKIPPED;
14980 	}
14981 
14982 	for (i = 0; i < nb_devs; i++) {
14983 		rte_cryptodev_info_get(i, &dev_info);
14984 		if (dev_info.driver_id == driver_id) {
14985 			if (!(dev_info.feature_flags & flag)) {
14986 				RTE_LOG(INFO, USER1, "%s not supported\n",
14987 						flag_name);
14988 				return TEST_SKIPPED;
14989 			}
14990 			return 0; /* found */
14991 		}
14992 	}
14993 
14994 	RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
14995 	return TEST_SKIPPED;
14996 }
14997 
14998 static int
14999 test_cryptodev_qat(void)
15000 {
15001 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
15002 }
15003 
15004 static int
15005 test_cryptodev_virtio(void)
15006 {
15007 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
15008 }
15009 
15010 static int
15011 test_cryptodev_aesni_mb(void)
15012 {
15013 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15014 }
15015 
15016 static int
15017 test_cryptodev_cpu_aesni_mb(void)
15018 {
15019 	int32_t rc;
15020 	enum rte_security_session_action_type at = gbl_action_type;
15021 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15022 	rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15023 	gbl_action_type = at;
15024 	return rc;
15025 }
15026 
15027 static int
15028 test_cryptodev_openssl(void)
15029 {
15030 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
15031 }
15032 
15033 static int
15034 test_cryptodev_aesni_gcm(void)
15035 {
15036 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15037 }
15038 
15039 static int
15040 test_cryptodev_cpu_aesni_gcm(void)
15041 {
15042 	int32_t rc;
15043 	enum rte_security_session_action_type at = gbl_action_type;
15044 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15045 	rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15046 	gbl_action_type = at;
15047 	return rc;
15048 }
15049 
15050 static int
15051 test_cryptodev_mlx5(void)
15052 {
15053 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
15054 }
15055 
15056 static int
15057 test_cryptodev_null(void)
15058 {
15059 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
15060 }
15061 
15062 static int
15063 test_cryptodev_sw_snow3g(void)
15064 {
15065 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
15066 }
15067 
15068 static int
15069 test_cryptodev_sw_kasumi(void)
15070 {
15071 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
15072 }
15073 
15074 static int
15075 test_cryptodev_sw_zuc(void)
15076 {
15077 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
15078 }
15079 
15080 static int
15081 test_cryptodev_armv8(void)
15082 {
15083 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
15084 }
15085 
15086 static int
15087 test_cryptodev_mrvl(void)
15088 {
15089 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
15090 }
15091 
15092 #ifdef RTE_CRYPTO_SCHEDULER
15093 
15094 static int
15095 test_cryptodev_scheduler(void)
15096 {
15097 	uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
15098 	const enum blockcipher_test_type blk_suites[] = {
15099 		BLKCIPHER_AES_CHAIN_TYPE,
15100 		BLKCIPHER_AES_CIPHERONLY_TYPE,
15101 		BLKCIPHER_AUTHONLY_TYPE
15102 	};
15103 	static struct unit_test_suite scheduler_multicore = {
15104 		.suite_name = "Scheduler Multicore Unit Test Suite",
15105 		.setup = scheduler_multicore_testsuite_setup,
15106 		.teardown = scheduler_mode_testsuite_teardown,
15107 		.unit_test_cases = {TEST_CASES_END()}
15108 	};
15109 	static struct unit_test_suite scheduler_round_robin = {
15110 		.suite_name = "Scheduler Round Robin Unit Test Suite",
15111 		.setup = scheduler_roundrobin_testsuite_setup,
15112 		.teardown = scheduler_mode_testsuite_teardown,
15113 		.unit_test_cases = {TEST_CASES_END()}
15114 	};
15115 	static struct unit_test_suite scheduler_failover = {
15116 		.suite_name = "Scheduler Failover Unit Test Suite",
15117 		.setup = scheduler_failover_testsuite_setup,
15118 		.teardown = scheduler_mode_testsuite_teardown,
15119 		.unit_test_cases = {TEST_CASES_END()}
15120 	};
15121 	static struct unit_test_suite scheduler_pkt_size_distr = {
15122 		.suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
15123 		.setup = scheduler_pkt_size_distr_testsuite_setup,
15124 		.teardown = scheduler_mode_testsuite_teardown,
15125 		.unit_test_cases = {TEST_CASES_END()}
15126 	};
15127 	struct unit_test_suite *sched_mode_suites[] = {
15128 		&scheduler_multicore,
15129 		&scheduler_round_robin,
15130 		&scheduler_failover,
15131 		&scheduler_pkt_size_distr
15132 	};
15133 	static struct unit_test_suite scheduler_config = {
15134 		.suite_name = "Crypto Device Scheduler Config Unit Test Suite",
15135 		.unit_test_cases = {
15136 			TEST_CASE(test_scheduler_attach_worker_op),
15137 			TEST_CASE(test_scheduler_mode_multicore_op),
15138 			TEST_CASE(test_scheduler_mode_roundrobin_op),
15139 			TEST_CASE(test_scheduler_mode_failover_op),
15140 			TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
15141 			TEST_CASE(test_scheduler_detach_worker_op),
15142 
15143 			TEST_CASES_END() /**< NULL terminate array */
15144 		}
15145 	};
15146 	struct unit_test_suite *static_suites[] = {
15147 		&scheduler_config,
15148 		&end_testsuite
15149 	};
15150 	static struct unit_test_suite ts = {
15151 		.suite_name = "Scheduler Unit Test Suite",
15152 		.setup = scheduler_testsuite_setup,
15153 		.teardown = testsuite_teardown,
15154 		.unit_test_cases = {TEST_CASES_END()}
15155 	};
15156 
15157 	gbl_driver_id =	rte_cryptodev_driver_id_get(
15158 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
15159 
15160 	if (gbl_driver_id == -1) {
15161 		RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
15162 		return TEST_SKIPPED;
15163 	}
15164 
15165 	if (rte_cryptodev_driver_id_get(
15166 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
15167 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
15168 		return TEST_SKIPPED;
15169 	}
15170 
15171 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15172 		uint8_t blk_i = 0;
15173 		sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
15174 				(struct unit_test_suite *) *
15175 				(RTE_DIM(blk_suites) + 1));
15176 		ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
15177 				blk_suites, RTE_DIM(blk_suites));
15178 		sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
15179 	}
15180 
15181 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15182 			(RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
15183 	ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
15184 			RTE_DIM(sched_mode_suites));
15185 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15186 	ret = unit_test_suite_runner(&ts);
15187 
15188 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15189 		FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
15190 				(*sched_mode_suites[sched_i]),
15191 				RTE_DIM(blk_suites));
15192 		free(sched_mode_suites[sched_i]->unit_test_suites);
15193 	}
15194 	free(ts.unit_test_suites);
15195 	return ret;
15196 }
15197 
15198 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
15199 
15200 #endif
15201 
15202 static int
15203 test_cryptodev_dpaa2_sec(void)
15204 {
15205 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
15206 }
15207 
15208 static int
15209 test_cryptodev_dpaa_sec(void)
15210 {
15211 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
15212 }
15213 
15214 static int
15215 test_cryptodev_ccp(void)
15216 {
15217 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
15218 }
15219 
15220 static int
15221 test_cryptodev_octeontx(void)
15222 {
15223 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
15224 }
15225 
15226 static int
15227 test_cryptodev_octeontx2(void)
15228 {
15229 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
15230 }
15231 
15232 static int
15233 test_cryptodev_caam_jr(void)
15234 {
15235 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
15236 }
15237 
15238 static int
15239 test_cryptodev_nitrox(void)
15240 {
15241 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
15242 }
15243 
15244 static int
15245 test_cryptodev_bcmfs(void)
15246 {
15247 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
15248 }
15249 
15250 static int
15251 test_cryptodev_qat_raw_api(void)
15252 {
15253 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
15254 	int ret;
15255 
15256 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15257 			"RAW API");
15258 	if (ret)
15259 		return ret;
15260 
15261 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
15262 	ret = run_cryptodev_testsuite(pmd_name);
15263 	global_api_test_type = CRYPTODEV_API_TEST;
15264 
15265 	return ret;
15266 }
15267 
15268 static int
15269 test_cryptodev_cn9k(void)
15270 {
15271 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
15272 }
15273 
15274 static int
15275 test_cryptodev_cn10k(void)
15276 {
15277 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
15278 }
15279 
15280 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
15281 		test_cryptodev_qat_raw_api);
15282 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
15283 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
15284 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
15285 	test_cryptodev_cpu_aesni_mb);
15286 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
15287 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
15288 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
15289 	test_cryptodev_cpu_aesni_gcm);
15290 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
15291 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
15292 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
15293 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
15294 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
15295 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
15296 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
15297 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
15298 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
15299 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
15300 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
15301 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
15302 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
15303 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
15304 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
15305 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
15306 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
15307 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);
15308