xref: /dpdk/app/test/test_cryptodev.c (revision f93fce6de4aa9c5cf90212d5d33ef0c0335c259e)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2015-2020 Intel Corporation
3  * Copyright 2020 NXP
4  */
5 
6 #include <time.h>
7 
8 #include <rte_common.h>
9 #include <rte_hexdump.h>
10 #include <rte_mbuf.h>
11 #include <rte_malloc.h>
12 #include <rte_memcpy.h>
13 #include <rte_pause.h>
14 #include <rte_bus_vdev.h>
15 #include <rte_ether.h>
16 
17 #include <rte_crypto.h>
18 #include <rte_cryptodev.h>
19 #include <rte_ip.h>
20 #include <rte_string_fns.h>
21 #include <rte_tcp.h>
22 #include <rte_udp.h>
23 
24 #ifdef RTE_CRYPTO_SCHEDULER
25 #include <rte_cryptodev_scheduler.h>
26 #include <rte_cryptodev_scheduler_operations.h>
27 #endif
28 
29 #include <rte_lcore.h>
30 
31 #include "test.h"
32 #include "test_cryptodev.h"
33 
34 #include "test_cryptodev_blockcipher.h"
35 #include "test_cryptodev_aes_test_vectors.h"
36 #include "test_cryptodev_des_test_vectors.h"
37 #include "test_cryptodev_hash_test_vectors.h"
38 #include "test_cryptodev_kasumi_test_vectors.h"
39 #include "test_cryptodev_kasumi_hash_test_vectors.h"
40 #include "test_cryptodev_snow3g_test_vectors.h"
41 #include "test_cryptodev_snow3g_hash_test_vectors.h"
42 #include "test_cryptodev_zuc_test_vectors.h"
43 #include "test_cryptodev_aead_test_vectors.h"
44 #include "test_cryptodev_hmac_test_vectors.h"
45 #include "test_cryptodev_mixed_test_vectors.h"
46 #ifdef RTE_LIB_SECURITY
47 #include "test_cryptodev_security_ipsec.h"
48 #include "test_cryptodev_security_ipsec_test_vectors.h"
49 #include "test_cryptodev_security_pdcp_test_vectors.h"
50 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
51 #include "test_cryptodev_security_pdcp_test_func.h"
52 #include "test_cryptodev_security_docsis_test_vectors.h"
53 
54 #define SDAP_DISABLED	0
55 #define SDAP_ENABLED	1
56 #endif
57 
58 #define VDEV_ARGS_SIZE 100
59 #define MAX_NB_SESSIONS 4
60 
61 #define MAX_DRV_SERVICE_CTX_SIZE 256
62 
63 #define MAX_RAW_DEQUEUE_COUNT	65535
64 
65 #define IN_PLACE 0
66 #define OUT_OF_PLACE 1
67 
68 static int gbl_driver_id;
69 
70 static enum rte_security_session_action_type gbl_action_type =
71 	RTE_SECURITY_ACTION_TYPE_NONE;
72 
73 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
74 
75 struct crypto_unittest_params {
76 	struct rte_crypto_sym_xform cipher_xform;
77 	struct rte_crypto_sym_xform auth_xform;
78 	struct rte_crypto_sym_xform aead_xform;
79 #ifdef RTE_LIB_SECURITY
80 	struct rte_security_docsis_xform docsis_xform;
81 #endif
82 
83 	union {
84 		struct rte_cryptodev_sym_session *sess;
85 #ifdef RTE_LIB_SECURITY
86 		struct rte_security_session *sec_session;
87 #endif
88 	};
89 #ifdef RTE_LIB_SECURITY
90 	enum rte_security_session_action_type type;
91 #endif
92 	struct rte_crypto_op *op;
93 
94 	struct rte_mbuf *obuf, *ibuf;
95 
96 	uint8_t *digest;
97 };
98 
99 #define ALIGN_POW2_ROUNDUP(num, align) \
100 	(((num) + (align) - 1) & ~((align) - 1))
101 
102 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts)	\
103 	for (j = 0; j < num_child_ts; index++, j++)			\
104 		parent_ts.unit_test_suites[index] = child_ts[j]
105 
106 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types)	\
107 	for (j = 0; j < num_blk_types; index++, j++)				\
108 		parent_ts.unit_test_suites[index] =				\
109 				build_blockcipher_test_suite(blk_types[j])
110 
111 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types)		\
112 	for (j = index; j < index + num_blk_types; j++)				\
113 		free_blockcipher_test_suite(parent_ts.unit_test_suites[j])
114 
115 /*
116  * Forward declarations.
117  */
118 static int
119 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
120 		struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
121 		uint8_t *hmac_key);
122 
123 static int
124 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
125 		struct crypto_unittest_params *ut_params,
126 		struct crypto_testsuite_params *ts_param,
127 		const uint8_t *cipher,
128 		const uint8_t *digest,
129 		const uint8_t *iv);
130 
131 static int
132 security_proto_supported(enum rte_security_session_action_type action,
133 	enum rte_security_session_protocol proto);
134 
135 static int
136 dev_configure_and_start(uint64_t ff_disable);
137 
138 static struct rte_mbuf *
139 setup_test_string(struct rte_mempool *mpool,
140 		const char *string, size_t len, uint8_t blocksize)
141 {
142 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
143 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
144 
145 	if (m) {
146 		char *dst;
147 
148 		memset(m->buf_addr, 0, m->buf_len);
149 		dst = rte_pktmbuf_append(m, t_len);
150 		if (!dst) {
151 			rte_pktmbuf_free(m);
152 			return NULL;
153 		}
154 		if (string != NULL)
155 			rte_memcpy(dst, string, t_len);
156 		else
157 			memset(dst, 0, t_len);
158 	}
159 
160 	return m;
161 }
162 
163 /* Get number of bytes in X bits (rounding up) */
164 static uint32_t
165 ceil_byte_length(uint32_t num_bits)
166 {
167 	if (num_bits % 8)
168 		return ((num_bits >> 3) + 1);
169 	else
170 		return (num_bits >> 3);
171 }
172 
173 static void
174 post_process_raw_dp_op(void *user_data,	uint32_t index __rte_unused,
175 		uint8_t is_op_success)
176 {
177 	struct rte_crypto_op *op = user_data;
178 	op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
179 			RTE_CRYPTO_OP_STATUS_ERROR;
180 }
181 
182 void
183 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
184 		struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
185 		uint8_t len_in_bits, uint8_t cipher_iv_len)
186 {
187 	struct rte_crypto_sym_op *sop = op->sym;
188 	struct rte_crypto_op *ret_op = NULL;
189 	struct rte_crypto_vec data_vec[UINT8_MAX], dest_data_vec[UINT8_MAX];
190 	struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
191 	union rte_crypto_sym_ofs ofs;
192 	struct rte_crypto_sym_vec vec;
193 	struct rte_crypto_sgl sgl, dest_sgl;
194 	uint32_t max_len;
195 	union rte_cryptodev_session_ctx sess;
196 	uint32_t count = 0;
197 	struct rte_crypto_raw_dp_ctx *ctx;
198 	uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
199 			auth_len = 0;
200 	int32_t n;
201 	uint32_t n_success;
202 	int ctx_service_size;
203 	int32_t status = 0;
204 	int enqueue_status, dequeue_status;
205 
206 	ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
207 	if (ctx_service_size < 0) {
208 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
209 		return;
210 	}
211 
212 	ctx = malloc(ctx_service_size);
213 	if (!ctx) {
214 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
215 		return;
216 	}
217 
218 	/* Both are enums, setting crypto_sess will suit any session type */
219 	sess.crypto_sess = op->sym->session;
220 
221 	if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
222 			op->sess_type, sess, 0) < 0) {
223 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
224 		goto exit;
225 	}
226 
227 	cipher_iv.iova = 0;
228 	cipher_iv.va = NULL;
229 	aad_auth_iv.iova = 0;
230 	aad_auth_iv.va = NULL;
231 	digest.iova = 0;
232 	digest.va = NULL;
233 	sgl.vec = data_vec;
234 	vec.num = 1;
235 	vec.src_sgl = &sgl;
236 	vec.iv = &cipher_iv;
237 	vec.digest = &digest;
238 	vec.aad = &aad_auth_iv;
239 	vec.status = &status;
240 
241 	ofs.raw = 0;
242 
243 	if (is_cipher && is_auth) {
244 		cipher_offset = sop->cipher.data.offset;
245 		cipher_len = sop->cipher.data.length;
246 		auth_offset = sop->auth.data.offset;
247 		auth_len = sop->auth.data.length;
248 		max_len = RTE_MAX(cipher_offset + cipher_len,
249 				auth_offset + auth_len);
250 		if (len_in_bits) {
251 			max_len = max_len >> 3;
252 			cipher_offset = cipher_offset >> 3;
253 			auth_offset = auth_offset >> 3;
254 			cipher_len = cipher_len >> 3;
255 			auth_len = auth_len >> 3;
256 		}
257 		ofs.ofs.cipher.head = cipher_offset;
258 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
259 		ofs.ofs.auth.head = auth_offset;
260 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
261 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
262 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
263 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
264 				op, void *, IV_OFFSET + cipher_iv_len);
265 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
266 				cipher_iv_len);
267 		digest.va = (void *)sop->auth.digest.data;
268 		digest.iova = sop->auth.digest.phys_addr;
269 
270 	} else if (is_cipher) {
271 		cipher_offset = sop->cipher.data.offset;
272 		cipher_len = sop->cipher.data.length;
273 		max_len = cipher_len + cipher_offset;
274 		if (len_in_bits) {
275 			max_len = max_len >> 3;
276 			cipher_offset = cipher_offset >> 3;
277 			cipher_len = cipher_len >> 3;
278 		}
279 		ofs.ofs.cipher.head = cipher_offset;
280 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
281 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
282 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
283 
284 	} else if (is_auth) {
285 		auth_offset = sop->auth.data.offset;
286 		auth_len = sop->auth.data.length;
287 		max_len = auth_len + auth_offset;
288 		if (len_in_bits) {
289 			max_len = max_len >> 3;
290 			auth_offset = auth_offset >> 3;
291 			auth_len = auth_len >> 3;
292 		}
293 		ofs.ofs.auth.head = auth_offset;
294 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
295 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
296 				op, void *, IV_OFFSET + cipher_iv_len);
297 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
298 				cipher_iv_len);
299 		digest.va = (void *)sop->auth.digest.data;
300 		digest.iova = sop->auth.digest.phys_addr;
301 
302 	} else { /* aead */
303 		cipher_offset = sop->aead.data.offset;
304 		cipher_len = sop->aead.data.length;
305 		max_len = cipher_len + cipher_offset;
306 		if (len_in_bits) {
307 			max_len = max_len >> 3;
308 			cipher_offset = cipher_offset >> 3;
309 			cipher_len = cipher_len >> 3;
310 		}
311 		ofs.ofs.cipher.head = cipher_offset;
312 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
313 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
314 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
315 		aad_auth_iv.va = (void *)sop->aead.aad.data;
316 		aad_auth_iv.iova = sop->aead.aad.phys_addr;
317 		digest.va = (void *)sop->aead.digest.data;
318 		digest.iova = sop->aead.digest.phys_addr;
319 	}
320 
321 	n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
322 			data_vec, RTE_DIM(data_vec));
323 	if (n < 0 || n > sop->m_src->nb_segs) {
324 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
325 		goto exit;
326 	}
327 
328 	sgl.num = n;
329 	/* Out of place */
330 	if (sop->m_dst != NULL) {
331 		dest_sgl.vec = dest_data_vec;
332 		vec.dest_sgl = &dest_sgl;
333 		n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
334 				dest_data_vec, RTE_DIM(dest_data_vec));
335 		if (n < 0 || n > sop->m_dst->nb_segs) {
336 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
337 			goto exit;
338 		}
339 		dest_sgl.num = n;
340 	} else
341 		vec.dest_sgl = NULL;
342 
343 	if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
344 			&enqueue_status) < 1) {
345 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
346 		goto exit;
347 	}
348 
349 	if (enqueue_status == 0) {
350 		status = rte_cryptodev_raw_enqueue_done(ctx, 1);
351 		if (status < 0) {
352 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
353 			goto exit;
354 		}
355 	} else if (enqueue_status < 0) {
356 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
357 		goto exit;
358 	}
359 
360 	n = n_success = 0;
361 	while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
362 		n = rte_cryptodev_raw_dequeue_burst(ctx,
363 			NULL, 1, post_process_raw_dp_op,
364 				(void **)&ret_op, 0, &n_success,
365 				&dequeue_status);
366 		if (dequeue_status < 0) {
367 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
368 			goto exit;
369 		}
370 		if (n == 0)
371 			rte_pause();
372 	}
373 
374 	if (n == 1 && dequeue_status == 0) {
375 		if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
376 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
377 			goto exit;
378 		}
379 	}
380 
381 	op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
382 			ret_op->status == RTE_CRYPTO_OP_STATUS_ERROR ||
383 			n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
384 					RTE_CRYPTO_OP_STATUS_SUCCESS;
385 
386 exit:
387 	free(ctx);
388 }
389 
390 static void
391 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
392 {
393 	int32_t n, st;
394 	struct rte_crypto_sym_op *sop;
395 	union rte_crypto_sym_ofs ofs;
396 	struct rte_crypto_sgl sgl;
397 	struct rte_crypto_sym_vec symvec;
398 	struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
399 	struct rte_crypto_vec vec[UINT8_MAX];
400 
401 	sop = op->sym;
402 
403 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
404 		sop->aead.data.length, vec, RTE_DIM(vec));
405 
406 	if (n < 0 || n != sop->m_src->nb_segs) {
407 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
408 		return;
409 	}
410 
411 	sgl.vec = vec;
412 	sgl.num = n;
413 	symvec.src_sgl = &sgl;
414 	symvec.iv = &iv_ptr;
415 	symvec.digest = &digest_ptr;
416 	symvec.aad = &aad_ptr;
417 	symvec.status = &st;
418 	symvec.num = 1;
419 
420 	/* for CPU crypto the IOVA address is not required */
421 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
422 	digest_ptr.va = (void *)sop->aead.digest.data;
423 	aad_ptr.va = (void *)sop->aead.aad.data;
424 
425 	ofs.raw = 0;
426 
427 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
428 		&symvec);
429 
430 	if (n != 1)
431 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
432 	else
433 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
434 }
435 
436 static void
437 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
438 {
439 	int32_t n, st;
440 	struct rte_crypto_sym_op *sop;
441 	union rte_crypto_sym_ofs ofs;
442 	struct rte_crypto_sgl sgl;
443 	struct rte_crypto_sym_vec symvec;
444 	struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
445 	struct rte_crypto_vec vec[UINT8_MAX];
446 
447 	sop = op->sym;
448 
449 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
450 		sop->auth.data.length, vec, RTE_DIM(vec));
451 
452 	if (n < 0 || n != sop->m_src->nb_segs) {
453 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
454 		return;
455 	}
456 
457 	sgl.vec = vec;
458 	sgl.num = n;
459 	symvec.src_sgl = &sgl;
460 	symvec.iv = &iv_ptr;
461 	symvec.digest = &digest_ptr;
462 	symvec.status = &st;
463 	symvec.num = 1;
464 
465 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
466 	digest_ptr.va = (void *)sop->auth.digest.data;
467 
468 	ofs.raw = 0;
469 	ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
470 	ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
471 		(sop->cipher.data.offset + sop->cipher.data.length);
472 
473 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
474 		&symvec);
475 
476 	if (n != 1)
477 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
478 	else
479 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
480 }
481 
482 static struct rte_crypto_op *
483 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
484 {
485 
486 	RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
487 
488 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
489 		RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
490 		return NULL;
491 	}
492 
493 	op = NULL;
494 
495 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
496 		rte_pause();
497 
498 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
499 		RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
500 		return NULL;
501 	}
502 
503 	return op;
504 }
505 
506 static struct crypto_testsuite_params testsuite_params = { NULL };
507 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
508 static struct crypto_unittest_params unittest_params;
509 
510 static int
511 testsuite_setup(void)
512 {
513 	struct crypto_testsuite_params *ts_params = &testsuite_params;
514 	struct rte_cryptodev_info info;
515 	uint32_t i = 0, nb_devs, dev_id;
516 	uint16_t qp_id;
517 
518 	memset(ts_params, 0, sizeof(*ts_params));
519 
520 	ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
521 	if (ts_params->mbuf_pool == NULL) {
522 		/* Not already created so create */
523 		ts_params->mbuf_pool = rte_pktmbuf_pool_create(
524 				"CRYPTO_MBUFPOOL",
525 				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
526 				rte_socket_id());
527 		if (ts_params->mbuf_pool == NULL) {
528 			RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
529 			return TEST_FAILED;
530 		}
531 	}
532 
533 	ts_params->large_mbuf_pool = rte_mempool_lookup(
534 			"CRYPTO_LARGE_MBUFPOOL");
535 	if (ts_params->large_mbuf_pool == NULL) {
536 		/* Not already created so create */
537 		ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
538 				"CRYPTO_LARGE_MBUFPOOL",
539 				1, 0, 0, UINT16_MAX,
540 				rte_socket_id());
541 		if (ts_params->large_mbuf_pool == NULL) {
542 			RTE_LOG(ERR, USER1,
543 				"Can't create CRYPTO_LARGE_MBUFPOOL\n");
544 			return TEST_FAILED;
545 		}
546 	}
547 
548 	ts_params->op_mpool = rte_crypto_op_pool_create(
549 			"MBUF_CRYPTO_SYM_OP_POOL",
550 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
551 			NUM_MBUFS, MBUF_CACHE_SIZE,
552 			DEFAULT_NUM_XFORMS *
553 			sizeof(struct rte_crypto_sym_xform) +
554 			MAXIMUM_IV_LENGTH,
555 			rte_socket_id());
556 	if (ts_params->op_mpool == NULL) {
557 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
558 		return TEST_FAILED;
559 	}
560 
561 	nb_devs = rte_cryptodev_count();
562 	if (nb_devs < 1) {
563 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
564 		return TEST_SKIPPED;
565 	}
566 
567 	if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
568 		RTE_LOG(WARNING, USER1, "No %s devices found?\n",
569 				rte_cryptodev_driver_name_get(gbl_driver_id));
570 		return TEST_SKIPPED;
571 	}
572 
573 	/* Create list of valid crypto devs */
574 	for (i = 0; i < nb_devs; i++) {
575 		rte_cryptodev_info_get(i, &info);
576 		if (info.driver_id == gbl_driver_id)
577 			ts_params->valid_devs[ts_params->valid_dev_count++] = i;
578 	}
579 
580 	if (ts_params->valid_dev_count < 1)
581 		return TEST_FAILED;
582 
583 	/* Set up all the qps on the first of the valid devices found */
584 
585 	dev_id = ts_params->valid_devs[0];
586 
587 	rte_cryptodev_info_get(dev_id, &info);
588 
589 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
590 	ts_params->conf.socket_id = SOCKET_ID_ANY;
591 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
592 
593 	unsigned int session_size =
594 		rte_cryptodev_sym_get_private_session_size(dev_id);
595 
596 #ifdef RTE_LIB_SECURITY
597 	unsigned int security_session_size = rte_security_session_get_size(
598 			rte_cryptodev_get_sec_ctx(dev_id));
599 
600 	if (session_size < security_session_size)
601 		session_size = security_session_size;
602 #endif
603 	/*
604 	 * Create mempool with maximum number of sessions.
605 	 */
606 	if (info.sym.max_nb_sessions != 0 &&
607 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
608 		RTE_LOG(ERR, USER1, "Device does not support "
609 				"at least %u sessions\n",
610 				MAX_NB_SESSIONS);
611 		return TEST_FAILED;
612 	}
613 
614 	ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
615 			"test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
616 			SOCKET_ID_ANY);
617 	TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
618 			"session mempool allocation failed");
619 
620 	ts_params->session_priv_mpool = rte_mempool_create(
621 			"test_sess_mp_priv",
622 			MAX_NB_SESSIONS,
623 			session_size,
624 			0, 0, NULL, NULL, NULL,
625 			NULL, SOCKET_ID_ANY,
626 			0);
627 	TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
628 			"session mempool allocation failed");
629 
630 
631 
632 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
633 			&ts_params->conf),
634 			"Failed to configure cryptodev %u with %u qps",
635 			dev_id, ts_params->conf.nb_queue_pairs);
636 
637 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
638 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
639 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
640 
641 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
642 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
643 			dev_id, qp_id, &ts_params->qp_conf,
644 			rte_cryptodev_socket_id(dev_id)),
645 			"Failed to setup queue pair %u on cryptodev %u",
646 			qp_id, dev_id);
647 	}
648 
649 	return TEST_SUCCESS;
650 }
651 
652 static void
653 testsuite_teardown(void)
654 {
655 	struct crypto_testsuite_params *ts_params = &testsuite_params;
656 	int res;
657 
658 	if (ts_params->mbuf_pool != NULL) {
659 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
660 		rte_mempool_avail_count(ts_params->mbuf_pool));
661 	}
662 
663 	if (ts_params->op_mpool != NULL) {
664 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
665 		rte_mempool_avail_count(ts_params->op_mpool));
666 	}
667 
668 	/* Free session mempools */
669 	if (ts_params->session_priv_mpool != NULL) {
670 		rte_mempool_free(ts_params->session_priv_mpool);
671 		ts_params->session_priv_mpool = NULL;
672 	}
673 
674 	if (ts_params->session_mpool != NULL) {
675 		rte_mempool_free(ts_params->session_mpool);
676 		ts_params->session_mpool = NULL;
677 	}
678 
679 	res = rte_cryptodev_close(ts_params->valid_devs[0]);
680 	if (res)
681 		RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
682 }
683 
684 static int
685 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
686 		const int *algs, uint16_t num_algs)
687 {
688 	uint8_t dev_id = testsuite_params.valid_devs[0];
689 	bool some_alg_supported = FALSE;
690 	uint16_t i;
691 
692 	for (i = 0; i < num_algs && !some_alg_supported; i++) {
693 		struct rte_cryptodev_sym_capability_idx alg = {
694 			type, {algs[i]}
695 		};
696 		if (rte_cryptodev_sym_capability_get(dev_id,
697 				&alg) != NULL)
698 			some_alg_supported = TRUE;
699 	}
700 	if (!some_alg_supported)
701 		return TEST_SKIPPED;
702 
703 	return 0;
704 }
705 
706 int
707 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
708 		uint16_t num_ciphers)
709 {
710 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
711 			(const int *) ciphers, num_ciphers);
712 }
713 
714 int
715 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
716 		uint16_t num_auths)
717 {
718 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
719 			(const int *) auths, num_auths);
720 }
721 
722 int
723 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
724 		uint16_t num_aeads)
725 {
726 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
727 			(const int *) aeads, num_aeads);
728 }
729 
730 static int
731 null_testsuite_setup(void)
732 {
733 	struct crypto_testsuite_params *ts_params = &testsuite_params;
734 	uint8_t dev_id = ts_params->valid_devs[0];
735 	struct rte_cryptodev_info dev_info;
736 	const enum rte_crypto_cipher_algorithm ciphers[] = {
737 		RTE_CRYPTO_CIPHER_NULL
738 	};
739 	const enum rte_crypto_auth_algorithm auths[] = {
740 		RTE_CRYPTO_AUTH_NULL
741 	};
742 
743 	rte_cryptodev_info_get(dev_id, &dev_info);
744 
745 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
746 		RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
747 				"testsuite not met\n");
748 		return TEST_SKIPPED;
749 	}
750 
751 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
752 			&& check_auth_capabilities_supported(auths,
753 			RTE_DIM(auths)) != 0) {
754 		RTE_LOG(INFO, USER1, "Capability requirements for NULL "
755 				"testsuite not met\n");
756 		return TEST_SKIPPED;
757 	}
758 
759 	return 0;
760 }
761 
762 static int
763 crypto_gen_testsuite_setup(void)
764 {
765 	struct crypto_testsuite_params *ts_params = &testsuite_params;
766 	uint8_t dev_id = ts_params->valid_devs[0];
767 	struct rte_cryptodev_info dev_info;
768 
769 	rte_cryptodev_info_get(dev_id, &dev_info);
770 
771 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
772 		RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
773 				"testsuite not met\n");
774 		return TEST_SKIPPED;
775 	}
776 
777 	return 0;
778 }
779 
780 #ifdef RTE_LIB_SECURITY
781 static int
782 ipsec_proto_testsuite_setup(void)
783 {
784 	struct crypto_testsuite_params *ts_params = &testsuite_params;
785 	struct crypto_unittest_params *ut_params = &unittest_params;
786 	struct rte_cryptodev_info dev_info;
787 	int ret = 0;
788 
789 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
790 
791 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
792 		RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto "
793 				"testsuite not met\n");
794 		return TEST_SKIPPED;
795 	}
796 
797 	/* Reconfigure to enable security */
798 	ret = dev_configure_and_start(0);
799 	if (ret != TEST_SUCCESS)
800 		return ret;
801 
802 	/* Set action type */
803 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
804 
805 	if (security_proto_supported(
806 			RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
807 			RTE_SECURITY_PROTOCOL_IPSEC) < 0) {
808 		RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto "
809 				"test not met\n");
810 		ret = TEST_SKIPPED;
811 	}
812 
813 	/*
814 	 * Stop the device. Device would be started again by individual test
815 	 * case setup routine.
816 	 */
817 	rte_cryptodev_stop(ts_params->valid_devs[0]);
818 
819 	return ret;
820 }
821 
822 static int
823 pdcp_proto_testsuite_setup(void)
824 {
825 	struct crypto_testsuite_params *ts_params = &testsuite_params;
826 	uint8_t dev_id = ts_params->valid_devs[0];
827 	struct rte_cryptodev_info dev_info;
828 	const enum rte_crypto_cipher_algorithm ciphers[] = {
829 		RTE_CRYPTO_CIPHER_NULL,
830 		RTE_CRYPTO_CIPHER_AES_CTR,
831 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
832 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
833 	};
834 	const enum rte_crypto_auth_algorithm auths[] = {
835 		RTE_CRYPTO_AUTH_NULL,
836 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
837 		RTE_CRYPTO_AUTH_AES_CMAC,
838 		RTE_CRYPTO_AUTH_ZUC_EIA3
839 	};
840 
841 	rte_cryptodev_info_get(dev_id, &dev_info);
842 
843 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
844 			!(dev_info.feature_flags &
845 			RTE_CRYPTODEV_FF_SECURITY)) {
846 		RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
847 				"testsuite not met\n");
848 		return TEST_SKIPPED;
849 	}
850 
851 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
852 			&& check_auth_capabilities_supported(auths,
853 			RTE_DIM(auths)) != 0) {
854 		RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
855 				"testsuite not met\n");
856 		return TEST_SKIPPED;
857 	}
858 
859 	return 0;
860 }
861 
862 static int
863 docsis_proto_testsuite_setup(void)
864 {
865 	struct crypto_testsuite_params *ts_params = &testsuite_params;
866 	uint8_t dev_id = ts_params->valid_devs[0];
867 	struct rte_cryptodev_info dev_info;
868 	const enum rte_crypto_cipher_algorithm ciphers[] = {
869 		RTE_CRYPTO_CIPHER_AES_DOCSISBPI
870 	};
871 
872 	rte_cryptodev_info_get(dev_id, &dev_info);
873 
874 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
875 			!(dev_info.feature_flags &
876 			RTE_CRYPTODEV_FF_SECURITY)) {
877 		RTE_LOG(INFO, USER1, "Feature flag requirements for Docsis "
878 				"Proto testsuite not met\n");
879 		return TEST_SKIPPED;
880 	}
881 
882 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
883 		RTE_LOG(INFO, USER1, "Capability requirements for Docsis Proto "
884 				"testsuite not met\n");
885 		return TEST_SKIPPED;
886 	}
887 
888 	return 0;
889 }
890 #endif
891 
892 static int
893 aes_ccm_auth_testsuite_setup(void)
894 {
895 	struct crypto_testsuite_params *ts_params = &testsuite_params;
896 	uint8_t dev_id = ts_params->valid_devs[0];
897 	struct rte_cryptodev_info dev_info;
898 	const enum rte_crypto_aead_algorithm aeads[] = {
899 		RTE_CRYPTO_AEAD_AES_CCM
900 	};
901 
902 	rte_cryptodev_info_get(dev_id, &dev_info);
903 
904 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
905 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
906 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
907 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
908 				"testsuite not met\n");
909 		return TEST_SKIPPED;
910 	}
911 
912 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
913 		RTE_LOG(INFO, USER1, "Capability requirements for AES CCM "
914 				"testsuite not met\n");
915 		return TEST_SKIPPED;
916 	}
917 
918 	return 0;
919 }
920 
921 static int
922 aes_gcm_auth_testsuite_setup(void)
923 {
924 	struct crypto_testsuite_params *ts_params = &testsuite_params;
925 	uint8_t dev_id = ts_params->valid_devs[0];
926 	struct rte_cryptodev_info dev_info;
927 	const enum rte_crypto_aead_algorithm aeads[] = {
928 		RTE_CRYPTO_AEAD_AES_GCM
929 	};
930 
931 	rte_cryptodev_info_get(dev_id, &dev_info);
932 
933 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
934 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
935 				"testsuite not met\n");
936 		return TEST_SKIPPED;
937 	}
938 
939 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
940 		RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
941 				"testsuite not met\n");
942 		return TEST_SKIPPED;
943 	}
944 
945 	return 0;
946 }
947 
948 static int
949 aes_gmac_auth_testsuite_setup(void)
950 {
951 	struct crypto_testsuite_params *ts_params = &testsuite_params;
952 	uint8_t dev_id = ts_params->valid_devs[0];
953 	struct rte_cryptodev_info dev_info;
954 	const enum rte_crypto_auth_algorithm auths[] = {
955 		RTE_CRYPTO_AUTH_AES_GMAC
956 	};
957 
958 	rte_cryptodev_info_get(dev_id, &dev_info);
959 
960 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
961 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
962 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
963 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
964 				"testsuite not met\n");
965 		return TEST_SKIPPED;
966 	}
967 
968 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
969 		RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
970 				"testsuite not met\n");
971 		return TEST_SKIPPED;
972 	}
973 
974 	return 0;
975 }
976 
977 static int
978 chacha20_poly1305_testsuite_setup(void)
979 {
980 	struct crypto_testsuite_params *ts_params = &testsuite_params;
981 	uint8_t dev_id = ts_params->valid_devs[0];
982 	struct rte_cryptodev_info dev_info;
983 	const enum rte_crypto_aead_algorithm aeads[] = {
984 		RTE_CRYPTO_AEAD_CHACHA20_POLY1305
985 	};
986 
987 	rte_cryptodev_info_get(dev_id, &dev_info);
988 
989 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
990 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
991 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
992 		RTE_LOG(INFO, USER1, "Feature flag requirements for "
993 				"Chacha20-Poly1305 testsuite not met\n");
994 		return TEST_SKIPPED;
995 	}
996 
997 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
998 		RTE_LOG(INFO, USER1, "Capability requirements for "
999 				"Chacha20-Poly1305 testsuite not met\n");
1000 		return TEST_SKIPPED;
1001 	}
1002 
1003 	return 0;
1004 }
1005 
1006 static int
1007 snow3g_testsuite_setup(void)
1008 {
1009 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1010 	uint8_t dev_id = ts_params->valid_devs[0];
1011 	struct rte_cryptodev_info dev_info;
1012 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1013 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1014 
1015 	};
1016 	const enum rte_crypto_auth_algorithm auths[] = {
1017 		RTE_CRYPTO_AUTH_SNOW3G_UIA2
1018 	};
1019 
1020 	rte_cryptodev_info_get(dev_id, &dev_info);
1021 
1022 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1023 		RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
1024 				"testsuite not met\n");
1025 		return TEST_SKIPPED;
1026 	}
1027 
1028 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1029 			&& check_auth_capabilities_supported(auths,
1030 			RTE_DIM(auths)) != 0) {
1031 		RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
1032 				"testsuite not met\n");
1033 		return TEST_SKIPPED;
1034 	}
1035 
1036 	return 0;
1037 }
1038 
1039 static int
1040 zuc_testsuite_setup(void)
1041 {
1042 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1043 	uint8_t dev_id = ts_params->valid_devs[0];
1044 	struct rte_cryptodev_info dev_info;
1045 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1046 		RTE_CRYPTO_CIPHER_ZUC_EEA3
1047 	};
1048 	const enum rte_crypto_auth_algorithm auths[] = {
1049 		RTE_CRYPTO_AUTH_ZUC_EIA3
1050 	};
1051 
1052 	rte_cryptodev_info_get(dev_id, &dev_info);
1053 
1054 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1055 		RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
1056 				"testsuite not met\n");
1057 		return TEST_SKIPPED;
1058 	}
1059 
1060 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1061 			&& check_auth_capabilities_supported(auths,
1062 			RTE_DIM(auths)) != 0) {
1063 		RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
1064 				"testsuite not met\n");
1065 		return TEST_SKIPPED;
1066 	}
1067 
1068 	return 0;
1069 }
1070 
1071 static int
1072 hmac_md5_auth_testsuite_setup(void)
1073 {
1074 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1075 	uint8_t dev_id = ts_params->valid_devs[0];
1076 	struct rte_cryptodev_info dev_info;
1077 	const enum rte_crypto_auth_algorithm auths[] = {
1078 		RTE_CRYPTO_AUTH_MD5_HMAC
1079 	};
1080 
1081 	rte_cryptodev_info_get(dev_id, &dev_info);
1082 
1083 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1084 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1085 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1086 		RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1087 				"Auth testsuite not met\n");
1088 		return TEST_SKIPPED;
1089 	}
1090 
1091 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1092 		RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1093 				"testsuite not met\n");
1094 		return TEST_SKIPPED;
1095 	}
1096 
1097 	return 0;
1098 }
1099 
1100 static int
1101 kasumi_testsuite_setup(void)
1102 {
1103 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1104 	uint8_t dev_id = ts_params->valid_devs[0];
1105 	struct rte_cryptodev_info dev_info;
1106 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1107 		RTE_CRYPTO_CIPHER_KASUMI_F8
1108 	};
1109 	const enum rte_crypto_auth_algorithm auths[] = {
1110 		RTE_CRYPTO_AUTH_KASUMI_F9
1111 	};
1112 
1113 	rte_cryptodev_info_get(dev_id, &dev_info);
1114 
1115 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1116 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1117 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1118 		RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1119 				"testsuite not met\n");
1120 		return TEST_SKIPPED;
1121 	}
1122 
1123 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1124 			&& check_auth_capabilities_supported(auths,
1125 			RTE_DIM(auths)) != 0) {
1126 		RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1127 				"testsuite not met\n");
1128 		return TEST_SKIPPED;
1129 	}
1130 
1131 	return 0;
1132 }
1133 
1134 static int
1135 negative_aes_gcm_testsuite_setup(void)
1136 {
1137 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1138 	uint8_t dev_id = ts_params->valid_devs[0];
1139 	struct rte_cryptodev_info dev_info;
1140 	const enum rte_crypto_aead_algorithm aeads[] = {
1141 		RTE_CRYPTO_AEAD_AES_GCM
1142 	};
1143 
1144 	rte_cryptodev_info_get(dev_id, &dev_info);
1145 
1146 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1147 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1148 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1149 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1150 				"AES GCM testsuite not met\n");
1151 		return TEST_SKIPPED;
1152 	}
1153 
1154 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1155 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1156 				"AES GCM testsuite not met\n");
1157 		return TEST_SKIPPED;
1158 	}
1159 
1160 	return 0;
1161 }
1162 
1163 static int
1164 negative_aes_gmac_testsuite_setup(void)
1165 {
1166 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1167 	uint8_t dev_id = ts_params->valid_devs[0];
1168 	struct rte_cryptodev_info dev_info;
1169 	const enum rte_crypto_auth_algorithm auths[] = {
1170 		RTE_CRYPTO_AUTH_AES_GMAC
1171 	};
1172 
1173 	rte_cryptodev_info_get(dev_id, &dev_info);
1174 
1175 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1176 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1177 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1178 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1179 				"AES GMAC testsuite not met\n");
1180 		return TEST_SKIPPED;
1181 	}
1182 
1183 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1184 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1185 				"AES GMAC testsuite not met\n");
1186 		return TEST_SKIPPED;
1187 	}
1188 
1189 	return 0;
1190 }
1191 
1192 static int
1193 mixed_cipher_hash_testsuite_setup(void)
1194 {
1195 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1196 	uint8_t dev_id = ts_params->valid_devs[0];
1197 	struct rte_cryptodev_info dev_info;
1198 	uint64_t feat_flags;
1199 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1200 		RTE_CRYPTO_CIPHER_NULL,
1201 		RTE_CRYPTO_CIPHER_AES_CTR,
1202 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
1203 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1204 	};
1205 	const enum rte_crypto_auth_algorithm auths[] = {
1206 		RTE_CRYPTO_AUTH_NULL,
1207 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1208 		RTE_CRYPTO_AUTH_AES_CMAC,
1209 		RTE_CRYPTO_AUTH_ZUC_EIA3
1210 	};
1211 
1212 	rte_cryptodev_info_get(dev_id, &dev_info);
1213 	feat_flags = dev_info.feature_flags;
1214 
1215 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1216 			(global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1217 		RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1218 				"Cipher Hash testsuite not met\n");
1219 		return TEST_SKIPPED;
1220 	}
1221 
1222 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1223 			&& check_auth_capabilities_supported(auths,
1224 			RTE_DIM(auths)) != 0) {
1225 		RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1226 				"Cipher Hash testsuite not met\n");
1227 		return TEST_SKIPPED;
1228 	}
1229 
1230 	return 0;
1231 }
1232 
1233 static int
1234 esn_testsuite_setup(void)
1235 {
1236 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1237 	uint8_t dev_id = ts_params->valid_devs[0];
1238 	struct rte_cryptodev_info dev_info;
1239 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1240 		RTE_CRYPTO_CIPHER_AES_CBC
1241 	};
1242 	const enum rte_crypto_auth_algorithm auths[] = {
1243 		RTE_CRYPTO_AUTH_SHA1_HMAC
1244 	};
1245 
1246 	rte_cryptodev_info_get(dev_id, &dev_info);
1247 
1248 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1249 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1250 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1251 		RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1252 				"testsuite not met\n");
1253 		return TEST_SKIPPED;
1254 	}
1255 
1256 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1257 			&& check_auth_capabilities_supported(auths,
1258 			RTE_DIM(auths)) != 0) {
1259 		RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1260 				"testsuite not met\n");
1261 		return TEST_SKIPPED;
1262 	}
1263 
1264 	return 0;
1265 }
1266 
1267 static int
1268 multi_session_testsuite_setup(void)
1269 {
1270 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1271 	uint8_t dev_id = ts_params->valid_devs[0];
1272 	struct rte_cryptodev_info dev_info;
1273 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1274 		RTE_CRYPTO_CIPHER_AES_CBC
1275 	};
1276 	const enum rte_crypto_auth_algorithm auths[] = {
1277 		RTE_CRYPTO_AUTH_SHA512_HMAC
1278 	};
1279 
1280 	rte_cryptodev_info_get(dev_id, &dev_info);
1281 
1282 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1283 		RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1284 				"Session testsuite not met\n");
1285 		return TEST_SKIPPED;
1286 	}
1287 
1288 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1289 			&& check_auth_capabilities_supported(auths,
1290 			RTE_DIM(auths)) != 0) {
1291 		RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1292 				"Session testsuite not met\n");
1293 		return TEST_SKIPPED;
1294 	}
1295 
1296 	return 0;
1297 }
1298 
1299 static int
1300 negative_hmac_sha1_testsuite_setup(void)
1301 {
1302 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1303 	uint8_t dev_id = ts_params->valid_devs[0];
1304 	struct rte_cryptodev_info dev_info;
1305 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1306 		RTE_CRYPTO_CIPHER_AES_CBC
1307 	};
1308 	const enum rte_crypto_auth_algorithm auths[] = {
1309 		RTE_CRYPTO_AUTH_SHA1_HMAC
1310 	};
1311 
1312 	rte_cryptodev_info_get(dev_id, &dev_info);
1313 
1314 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1315 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1316 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1317 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1318 				"HMAC SHA1 testsuite not met\n");
1319 		return TEST_SKIPPED;
1320 	}
1321 
1322 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1323 			&& check_auth_capabilities_supported(auths,
1324 			RTE_DIM(auths)) != 0) {
1325 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1326 				"HMAC SHA1 testsuite not met\n");
1327 		return TEST_SKIPPED;
1328 	}
1329 
1330 	return 0;
1331 }
1332 
1333 static int
1334 dev_configure_and_start(uint64_t ff_disable)
1335 {
1336 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1337 	struct crypto_unittest_params *ut_params = &unittest_params;
1338 
1339 	uint16_t qp_id;
1340 
1341 	/* Clear unit test parameters before running test */
1342 	memset(ut_params, 0, sizeof(*ut_params));
1343 
1344 	/* Reconfigure device to default parameters */
1345 	ts_params->conf.socket_id = SOCKET_ID_ANY;
1346 	ts_params->conf.ff_disable = ff_disable;
1347 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1348 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
1349 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
1350 
1351 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1352 			&ts_params->conf),
1353 			"Failed to configure cryptodev %u",
1354 			ts_params->valid_devs[0]);
1355 
1356 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1357 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1358 			ts_params->valid_devs[0], qp_id,
1359 			&ts_params->qp_conf,
1360 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1361 			"Failed to setup queue pair %u on cryptodev %u",
1362 			qp_id, ts_params->valid_devs[0]);
1363 	}
1364 
1365 
1366 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1367 
1368 	/* Start the device */
1369 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1370 			"Failed to start cryptodev %u",
1371 			ts_params->valid_devs[0]);
1372 
1373 	return TEST_SUCCESS;
1374 }
1375 
1376 int
1377 ut_setup(void)
1378 {
1379 	/* Configure and start the device with security feature disabled */
1380 	return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1381 }
1382 
1383 static int
1384 ut_setup_security(void)
1385 {
1386 	/* Configure and start the device with no features disabled */
1387 	return dev_configure_and_start(0);
1388 }
1389 
1390 void
1391 ut_teardown(void)
1392 {
1393 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1394 	struct crypto_unittest_params *ut_params = &unittest_params;
1395 	struct rte_cryptodev_stats stats;
1396 
1397 	/* free crypto session structure */
1398 #ifdef RTE_LIB_SECURITY
1399 	if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1400 		if (ut_params->sec_session) {
1401 			rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1402 						(ts_params->valid_devs[0]),
1403 						ut_params->sec_session);
1404 			ut_params->sec_session = NULL;
1405 		}
1406 	} else
1407 #endif
1408 	{
1409 		if (ut_params->sess) {
1410 			rte_cryptodev_sym_session_clear(
1411 					ts_params->valid_devs[0],
1412 					ut_params->sess);
1413 			rte_cryptodev_sym_session_free(ut_params->sess);
1414 			ut_params->sess = NULL;
1415 		}
1416 	}
1417 
1418 	/* free crypto operation structure */
1419 	if (ut_params->op)
1420 		rte_crypto_op_free(ut_params->op);
1421 
1422 	/*
1423 	 * free mbuf - both obuf and ibuf are usually the same,
1424 	 * so check if they point at the same address is necessary,
1425 	 * to avoid freeing the mbuf twice.
1426 	 */
1427 	if (ut_params->obuf) {
1428 		rte_pktmbuf_free(ut_params->obuf);
1429 		if (ut_params->ibuf == ut_params->obuf)
1430 			ut_params->ibuf = 0;
1431 		ut_params->obuf = 0;
1432 	}
1433 	if (ut_params->ibuf) {
1434 		rte_pktmbuf_free(ut_params->ibuf);
1435 		ut_params->ibuf = 0;
1436 	}
1437 
1438 	if (ts_params->mbuf_pool != NULL)
1439 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1440 			rte_mempool_avail_count(ts_params->mbuf_pool));
1441 
1442 	rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
1443 
1444 	/* Stop the device */
1445 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1446 }
1447 
1448 static int
1449 test_device_configure_invalid_dev_id(void)
1450 {
1451 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1452 	uint16_t dev_id, num_devs = 0;
1453 
1454 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1455 			"Need at least %d devices for test", 1);
1456 
1457 	/* valid dev_id values */
1458 	dev_id = ts_params->valid_devs[0];
1459 
1460 	/* Stop the device in case it's started so it can be configured */
1461 	rte_cryptodev_stop(dev_id);
1462 
1463 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1464 			"Failed test for rte_cryptodev_configure: "
1465 			"invalid dev_num %u", dev_id);
1466 
1467 	/* invalid dev_id values */
1468 	dev_id = num_devs;
1469 
1470 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1471 			"Failed test for rte_cryptodev_configure: "
1472 			"invalid dev_num %u", dev_id);
1473 
1474 	dev_id = 0xff;
1475 
1476 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1477 			"Failed test for rte_cryptodev_configure:"
1478 			"invalid dev_num %u", dev_id);
1479 
1480 	return TEST_SUCCESS;
1481 }
1482 
1483 static int
1484 test_device_configure_invalid_queue_pair_ids(void)
1485 {
1486 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1487 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1488 
1489 	/* Stop the device in case it's started so it can be configured */
1490 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1491 
1492 	/* valid - max value queue pairs */
1493 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1494 
1495 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1496 			&ts_params->conf),
1497 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1498 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1499 
1500 	/* valid - one queue pairs */
1501 	ts_params->conf.nb_queue_pairs = 1;
1502 
1503 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1504 			&ts_params->conf),
1505 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1506 			ts_params->valid_devs[0],
1507 			ts_params->conf.nb_queue_pairs);
1508 
1509 
1510 	/* invalid - zero queue pairs */
1511 	ts_params->conf.nb_queue_pairs = 0;
1512 
1513 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1514 			&ts_params->conf),
1515 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1516 			" invalid qps: %u",
1517 			ts_params->valid_devs[0],
1518 			ts_params->conf.nb_queue_pairs);
1519 
1520 
1521 	/* invalid - max value supported by field queue pairs */
1522 	ts_params->conf.nb_queue_pairs = UINT16_MAX;
1523 
1524 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1525 			&ts_params->conf),
1526 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1527 			" invalid qps: %u",
1528 			ts_params->valid_devs[0],
1529 			ts_params->conf.nb_queue_pairs);
1530 
1531 
1532 	/* invalid - max value + 1 queue pairs */
1533 	ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1534 
1535 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1536 			&ts_params->conf),
1537 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1538 			" invalid qps: %u",
1539 			ts_params->valid_devs[0],
1540 			ts_params->conf.nb_queue_pairs);
1541 
1542 	/* revert to original testsuite value */
1543 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1544 
1545 	return TEST_SUCCESS;
1546 }
1547 
1548 static int
1549 test_queue_pair_descriptor_setup(void)
1550 {
1551 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1552 	struct rte_cryptodev_qp_conf qp_conf = {
1553 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
1554 	};
1555 	uint16_t qp_id;
1556 
1557 	/* Stop the device in case it's started so it can be configured */
1558 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1559 
1560 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1561 			&ts_params->conf),
1562 			"Failed to configure cryptodev %u",
1563 			ts_params->valid_devs[0]);
1564 
1565 	/*
1566 	 * Test various ring sizes on this device. memzones can't be
1567 	 * freed so are re-used if ring is released and re-created.
1568 	 */
1569 	qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1570 	qp_conf.mp_session = ts_params->session_mpool;
1571 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
1572 
1573 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1574 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1575 				ts_params->valid_devs[0], qp_id, &qp_conf,
1576 				rte_cryptodev_socket_id(
1577 						ts_params->valid_devs[0])),
1578 				"Failed test for "
1579 				"rte_cryptodev_queue_pair_setup: num_inflights "
1580 				"%u on qp %u on cryptodev %u",
1581 				qp_conf.nb_descriptors, qp_id,
1582 				ts_params->valid_devs[0]);
1583 	}
1584 
1585 	qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1586 
1587 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1588 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1589 				ts_params->valid_devs[0], qp_id, &qp_conf,
1590 				rte_cryptodev_socket_id(
1591 						ts_params->valid_devs[0])),
1592 				"Failed test for"
1593 				" rte_cryptodev_queue_pair_setup: num_inflights"
1594 				" %u on qp %u on cryptodev %u",
1595 				qp_conf.nb_descriptors, qp_id,
1596 				ts_params->valid_devs[0]);
1597 	}
1598 
1599 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1600 
1601 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1602 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1603 				ts_params->valid_devs[0], qp_id, &qp_conf,
1604 				rte_cryptodev_socket_id(
1605 						ts_params->valid_devs[0])),
1606 				"Failed test for "
1607 				"rte_cryptodev_queue_pair_setup: num_inflights"
1608 				" %u on qp %u on cryptodev %u",
1609 				qp_conf.nb_descriptors, qp_id,
1610 				ts_params->valid_devs[0]);
1611 	}
1612 
1613 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1614 
1615 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1616 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1617 				ts_params->valid_devs[0], qp_id, &qp_conf,
1618 				rte_cryptodev_socket_id(
1619 						ts_params->valid_devs[0])),
1620 				"Failed test for"
1621 				" rte_cryptodev_queue_pair_setup:"
1622 				"num_inflights %u on qp %u on cryptodev %u",
1623 				qp_conf.nb_descriptors, qp_id,
1624 				ts_params->valid_devs[0]);
1625 	}
1626 
1627 	/* test invalid queue pair id */
1628 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;	/*valid */
1629 
1630 	qp_id = ts_params->conf.nb_queue_pairs;		/*invalid */
1631 
1632 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1633 			ts_params->valid_devs[0],
1634 			qp_id, &qp_conf,
1635 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1636 			"Failed test for rte_cryptodev_queue_pair_setup:"
1637 			"invalid qp %u on cryptodev %u",
1638 			qp_id, ts_params->valid_devs[0]);
1639 
1640 	qp_id = 0xffff; /*invalid*/
1641 
1642 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1643 			ts_params->valid_devs[0],
1644 			qp_id, &qp_conf,
1645 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1646 			"Failed test for rte_cryptodev_queue_pair_setup:"
1647 			"invalid qp %u on cryptodev %u",
1648 			qp_id, ts_params->valid_devs[0]);
1649 
1650 	return TEST_SUCCESS;
1651 }
1652 
1653 /* ***** Plaintext data for tests ***** */
1654 
1655 const char catch_22_quote_1[] =
1656 		"There was only one catch and that was Catch-22, which "
1657 		"specified that a concern for one's safety in the face of "
1658 		"dangers that were real and immediate was the process of a "
1659 		"rational mind. Orr was crazy and could be grounded. All he "
1660 		"had to do was ask; and as soon as he did, he would no longer "
1661 		"be crazy and would have to fly more missions. Orr would be "
1662 		"crazy to fly more missions and sane if he didn't, but if he "
1663 		"was sane he had to fly them. If he flew them he was crazy "
1664 		"and didn't have to; but if he didn't want to he was sane and "
1665 		"had to. Yossarian was moved very deeply by the absolute "
1666 		"simplicity of this clause of Catch-22 and let out a "
1667 		"respectful whistle. \"That's some catch, that Catch-22\", he "
1668 		"observed. \"It's the best there is,\" Doc Daneeka agreed.";
1669 
1670 const char catch_22_quote[] =
1671 		"What a lousy earth! He wondered how many people were "
1672 		"destitute that same night even in his own prosperous country, "
1673 		"how many homes were shanties, how many husbands were drunk "
1674 		"and wives socked, and how many children were bullied, abused, "
1675 		"or abandoned. How many families hungered for food they could "
1676 		"not afford to buy? How many hearts were broken? How many "
1677 		"suicides would take place that same night, how many people "
1678 		"would go insane? How many cockroaches and landlords would "
1679 		"triumph? How many winners were losers, successes failures, "
1680 		"and rich men poor men? How many wise guys were stupid? How "
1681 		"many happy endings were unhappy endings? How many honest men "
1682 		"were liars, brave men cowards, loyal men traitors, how many "
1683 		"sainted men were corrupt, how many people in positions of "
1684 		"trust had sold their souls to bodyguards, how many had never "
1685 		"had souls? How many straight-and-narrow paths were crooked "
1686 		"paths? How many best families were worst families and how "
1687 		"many good people were bad people? When you added them all up "
1688 		"and then subtracted, you might be left with only the children, "
1689 		"and perhaps with Albert Einstein and an old violinist or "
1690 		"sculptor somewhere.";
1691 
1692 #define QUOTE_480_BYTES		(480)
1693 #define QUOTE_512_BYTES		(512)
1694 #define QUOTE_768_BYTES		(768)
1695 #define QUOTE_1024_BYTES	(1024)
1696 
1697 
1698 
1699 /* ***** SHA1 Hash Tests ***** */
1700 
1701 #define HMAC_KEY_LENGTH_SHA1	(DIGEST_BYTE_LENGTH_SHA1)
1702 
1703 static uint8_t hmac_sha1_key[] = {
1704 	0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1705 	0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1706 	0xDE, 0xF4, 0xDE, 0xAD };
1707 
1708 /* ***** SHA224 Hash Tests ***** */
1709 
1710 #define HMAC_KEY_LENGTH_SHA224	(DIGEST_BYTE_LENGTH_SHA224)
1711 
1712 
1713 /* ***** AES-CBC Cipher Tests ***** */
1714 
1715 #define CIPHER_KEY_LENGTH_AES_CBC	(16)
1716 #define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
1717 
1718 static uint8_t aes_cbc_key[] = {
1719 	0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1720 	0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1721 
1722 static uint8_t aes_cbc_iv[] = {
1723 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1724 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1725 
1726 
1727 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1728 
1729 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1730 	0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1731 	0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1732 	0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1733 	0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1734 	0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1735 	0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1736 	0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1737 	0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1738 	0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1739 	0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1740 	0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1741 	0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1742 	0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1743 	0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1744 	0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1745 	0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1746 	0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1747 	0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1748 	0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1749 	0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1750 	0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1751 	0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1752 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1753 	0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1754 	0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1755 	0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1756 	0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1757 	0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1758 	0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1759 	0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1760 	0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1761 	0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1762 	0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1763 	0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1764 	0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1765 	0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1766 	0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1767 	0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1768 	0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1769 	0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1770 	0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1771 	0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1772 	0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1773 	0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1774 	0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1775 	0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1776 	0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1777 	0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1778 	0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1779 	0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1780 	0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1781 	0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1782 	0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1783 	0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1784 	0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1785 	0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1786 	0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1787 	0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1788 	0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1789 	0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1790 	0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1791 	0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1792 	0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1793 	0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1794 };
1795 
1796 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1797 	0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1798 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1799 	0x18, 0x8c, 0x1d, 0x32
1800 };
1801 
1802 
1803 /* Multisession Vector context Test */
1804 /*Begin Session 0 */
1805 static uint8_t ms_aes_cbc_key0[] = {
1806 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1807 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1808 };
1809 
1810 static uint8_t ms_aes_cbc_iv0[] = {
1811 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1812 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1813 };
1814 
1815 static const uint8_t ms_aes_cbc_cipher0[] = {
1816 		0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1817 		0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1818 		0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1819 		0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1820 		0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1821 		0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1822 		0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1823 		0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1824 		0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1825 		0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1826 		0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1827 		0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1828 		0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1829 		0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1830 		0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1831 		0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1832 		0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1833 		0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1834 		0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1835 		0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1836 		0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1837 		0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1838 		0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1839 		0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1840 		0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1841 		0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1842 		0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1843 		0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1844 		0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1845 		0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1846 		0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1847 		0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1848 		0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1849 		0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1850 		0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1851 		0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1852 		0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1853 		0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1854 		0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1855 		0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1856 		0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1857 		0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1858 		0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1859 		0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1860 		0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1861 		0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1862 		0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1863 		0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1864 		0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1865 		0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1866 		0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1867 		0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1868 		0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1869 		0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1870 		0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1871 		0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1872 		0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1873 		0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1874 		0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1875 		0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1876 		0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1877 		0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1878 		0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1879 		0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1880 };
1881 
1882 
1883 static  uint8_t ms_hmac_key0[] = {
1884 		0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1885 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1886 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1887 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1888 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1889 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1890 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1891 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1892 };
1893 
1894 static const uint8_t ms_hmac_digest0[] = {
1895 		0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1896 		0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1897 		0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1898 		0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1899 		0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1900 		0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1901 		0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1902 		0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1903 		};
1904 
1905 /* End Session 0 */
1906 /* Begin session 1 */
1907 
1908 static  uint8_t ms_aes_cbc_key1[] = {
1909 		0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1910 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1911 };
1912 
1913 static  uint8_t ms_aes_cbc_iv1[] = {
1914 	0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1915 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1916 };
1917 
1918 static const uint8_t ms_aes_cbc_cipher1[] = {
1919 		0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1920 		0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1921 		0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1922 		0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1923 		0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1924 		0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1925 		0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1926 		0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1927 		0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1928 		0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1929 		0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1930 		0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1931 		0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1932 		0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1933 		0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1934 		0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1935 		0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1936 		0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1937 		0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1938 		0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1939 		0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1940 		0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1941 		0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1942 		0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1943 		0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1944 		0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1945 		0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1946 		0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1947 		0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1948 		0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1949 		0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1950 		0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1951 		0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1952 		0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1953 		0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1954 		0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1955 		0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1956 		0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1957 		0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1958 		0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1959 		0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1960 		0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1961 		0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1962 		0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1963 		0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1964 		0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1965 		0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1966 		0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1967 		0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1968 		0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1969 		0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1970 		0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1971 		0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1972 		0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1973 		0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1974 		0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1975 		0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1976 		0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1977 		0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1978 		0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1979 		0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1980 		0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1981 		0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1982 		0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1983 
1984 };
1985 
1986 static uint8_t ms_hmac_key1[] = {
1987 		0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1988 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1989 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1990 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1991 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1992 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1993 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1994 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1995 };
1996 
1997 static const uint8_t ms_hmac_digest1[] = {
1998 		0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1999 		0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
2000 		0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
2001 		0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
2002 		0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
2003 		0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
2004 		0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
2005 		0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
2006 };
2007 /* End Session 1  */
2008 /* Begin Session 2 */
2009 static  uint8_t ms_aes_cbc_key2[] = {
2010 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2011 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2012 };
2013 
2014 static  uint8_t ms_aes_cbc_iv2[] = {
2015 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2016 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2017 };
2018 
2019 static const uint8_t ms_aes_cbc_cipher2[] = {
2020 		0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
2021 		0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
2022 		0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
2023 		0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
2024 		0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
2025 		0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
2026 		0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
2027 		0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
2028 		0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
2029 		0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
2030 		0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
2031 		0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
2032 		0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
2033 		0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
2034 		0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
2035 		0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
2036 		0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
2037 		0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
2038 		0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
2039 		0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
2040 		0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
2041 		0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
2042 		0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
2043 		0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
2044 		0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
2045 		0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
2046 		0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
2047 		0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
2048 		0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
2049 		0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
2050 		0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
2051 		0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
2052 		0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
2053 		0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
2054 		0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
2055 		0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
2056 		0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
2057 		0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
2058 		0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
2059 		0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
2060 		0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
2061 		0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
2062 		0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
2063 		0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
2064 		0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
2065 		0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
2066 		0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2067 		0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2068 		0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2069 		0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2070 		0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2071 		0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2072 		0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2073 		0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2074 		0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2075 		0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2076 		0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2077 		0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2078 		0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2079 		0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2080 		0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2081 		0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2082 		0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2083 		0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2084 };
2085 
2086 static  uint8_t ms_hmac_key2[] = {
2087 		0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2088 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2089 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2090 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2091 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2092 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2093 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2094 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2095 };
2096 
2097 static const uint8_t ms_hmac_digest2[] = {
2098 		0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2099 		0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2100 		0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2101 		0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2102 		0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2103 		0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2104 		0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2105 		0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2106 };
2107 
2108 /* End Session 2 */
2109 
2110 
2111 static int
2112 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2113 {
2114 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2115 	struct crypto_unittest_params *ut_params = &unittest_params;
2116 
2117 	/* Verify the capabilities */
2118 	struct rte_cryptodev_sym_capability_idx cap_idx;
2119 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2120 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2121 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2122 			&cap_idx) == NULL)
2123 		return TEST_SKIPPED;
2124 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2125 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2126 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2127 			&cap_idx) == NULL)
2128 		return TEST_SKIPPED;
2129 
2130 	/* Generate test mbuf data and space for digest */
2131 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2132 			catch_22_quote,	QUOTE_512_BYTES, 0);
2133 
2134 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2135 			DIGEST_BYTE_LENGTH_SHA1);
2136 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2137 
2138 	/* Setup Cipher Parameters */
2139 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2140 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2141 
2142 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2143 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2144 	ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2145 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2146 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2147 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2148 
2149 	/* Setup HMAC Parameters */
2150 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2151 
2152 	ut_params->auth_xform.next = NULL;
2153 
2154 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2155 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2156 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2157 	ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2158 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2159 
2160 	ut_params->sess = rte_cryptodev_sym_session_create(
2161 			ts_params->session_mpool);
2162 
2163 	/* Create crypto session*/
2164 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
2165 			ut_params->sess, &ut_params->cipher_xform,
2166 			ts_params->session_priv_mpool);
2167 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2168 
2169 	/* Generate crypto op data structure */
2170 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2171 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2172 	TEST_ASSERT_NOT_NULL(ut_params->op,
2173 			"Failed to allocate symmetric crypto operation struct");
2174 
2175 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2176 
2177 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2178 
2179 	/* set crypto operation source mbuf */
2180 	sym_op->m_src = ut_params->ibuf;
2181 
2182 	/* Set crypto operation authentication parameters */
2183 	sym_op->auth.digest.data = ut_params->digest;
2184 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2185 			ut_params->ibuf, QUOTE_512_BYTES);
2186 
2187 	sym_op->auth.data.offset = 0;
2188 	sym_op->auth.data.length = QUOTE_512_BYTES;
2189 
2190 	/* Copy IV at the end of the crypto operation */
2191 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2192 			aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2193 
2194 	/* Set crypto operation cipher parameters */
2195 	sym_op->cipher.data.offset = 0;
2196 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2197 
2198 	/* Process crypto operation */
2199 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2200 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2201 			ut_params->op);
2202 	else
2203 		TEST_ASSERT_NOT_NULL(
2204 			process_crypto_request(ts_params->valid_devs[0],
2205 				ut_params->op),
2206 				"failed to process sym crypto op");
2207 
2208 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2209 			"crypto op processing failed");
2210 
2211 	/* Validate obuf */
2212 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2213 			uint8_t *);
2214 
2215 	TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2216 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2217 			QUOTE_512_BYTES,
2218 			"ciphertext data not as expected");
2219 
2220 	uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2221 
2222 	TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2223 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2224 			gbl_driver_id == rte_cryptodev_driver_id_get(
2225 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2226 					TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2227 					DIGEST_BYTE_LENGTH_SHA1,
2228 			"Generated digest data not as expected");
2229 
2230 	return TEST_SUCCESS;
2231 }
2232 
2233 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2234 
2235 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
2236 
2237 static uint8_t hmac_sha512_key[] = {
2238 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2239 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2240 	0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2241 	0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2242 	0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2243 	0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2244 	0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2245 	0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2246 
2247 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2248 	0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2249 	0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2250 	0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2251 	0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2252 	0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2253 	0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2254 	0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2255 	0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2256 
2257 
2258 
2259 static int
2260 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2261 		struct crypto_unittest_params *ut_params,
2262 		uint8_t *cipher_key,
2263 		uint8_t *hmac_key);
2264 
2265 static int
2266 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2267 		struct crypto_unittest_params *ut_params,
2268 		struct crypto_testsuite_params *ts_params,
2269 		const uint8_t *cipher,
2270 		const uint8_t *digest,
2271 		const uint8_t *iv);
2272 
2273 
2274 static int
2275 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2276 		struct crypto_unittest_params *ut_params,
2277 		uint8_t *cipher_key,
2278 		uint8_t *hmac_key)
2279 {
2280 
2281 	/* Setup Cipher Parameters */
2282 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2283 	ut_params->cipher_xform.next = NULL;
2284 
2285 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2286 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2287 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2288 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2289 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2290 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2291 
2292 	/* Setup HMAC Parameters */
2293 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2294 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2295 
2296 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2297 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2298 	ut_params->auth_xform.auth.key.data = hmac_key;
2299 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2300 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2301 
2302 	return TEST_SUCCESS;
2303 }
2304 
2305 
2306 static int
2307 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2308 		struct crypto_unittest_params *ut_params,
2309 		struct crypto_testsuite_params *ts_params,
2310 		const uint8_t *cipher,
2311 		const uint8_t *digest,
2312 		const uint8_t *iv)
2313 {
2314 	/* Generate test mbuf data and digest */
2315 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2316 			(const char *)
2317 			cipher,
2318 			QUOTE_512_BYTES, 0);
2319 
2320 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2321 			DIGEST_BYTE_LENGTH_SHA512);
2322 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2323 
2324 	rte_memcpy(ut_params->digest,
2325 			digest,
2326 			DIGEST_BYTE_LENGTH_SHA512);
2327 
2328 	/* Generate Crypto op data structure */
2329 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2330 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2331 	TEST_ASSERT_NOT_NULL(ut_params->op,
2332 			"Failed to allocate symmetric crypto operation struct");
2333 
2334 	rte_crypto_op_attach_sym_session(ut_params->op, sess);
2335 
2336 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2337 
2338 	/* set crypto operation source mbuf */
2339 	sym_op->m_src = ut_params->ibuf;
2340 
2341 	sym_op->auth.digest.data = ut_params->digest;
2342 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2343 			ut_params->ibuf, QUOTE_512_BYTES);
2344 
2345 	sym_op->auth.data.offset = 0;
2346 	sym_op->auth.data.length = QUOTE_512_BYTES;
2347 
2348 	/* Copy IV at the end of the crypto operation */
2349 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2350 			iv, CIPHER_IV_LENGTH_AES_CBC);
2351 
2352 	sym_op->cipher.data.offset = 0;
2353 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2354 
2355 	/* Process crypto operation */
2356 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2357 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2358 			ut_params->op);
2359 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2360 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2361 				ut_params->op, 1, 1, 0, 0);
2362 	else
2363 		TEST_ASSERT_NOT_NULL(
2364 				process_crypto_request(ts_params->valid_devs[0],
2365 					ut_params->op),
2366 					"failed to process sym crypto op");
2367 
2368 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2369 			"crypto op processing failed");
2370 
2371 	ut_params->obuf = ut_params->op->sym->m_src;
2372 
2373 	/* Validate obuf */
2374 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2375 			rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2376 			catch_22_quote,
2377 			QUOTE_512_BYTES,
2378 			"Plaintext data not as expected");
2379 
2380 	/* Validate obuf */
2381 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2382 			"Digest verification failed");
2383 
2384 	return TEST_SUCCESS;
2385 }
2386 
2387 /* ***** SNOW 3G Tests ***** */
2388 static int
2389 create_wireless_algo_hash_session(uint8_t dev_id,
2390 	const uint8_t *key, const uint8_t key_len,
2391 	const uint8_t iv_len, const uint8_t auth_len,
2392 	enum rte_crypto_auth_operation op,
2393 	enum rte_crypto_auth_algorithm algo)
2394 {
2395 	uint8_t hash_key[key_len];
2396 	int status;
2397 
2398 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2399 	struct crypto_unittest_params *ut_params = &unittest_params;
2400 
2401 	memcpy(hash_key, key, key_len);
2402 
2403 	debug_hexdump(stdout, "key:", key, key_len);
2404 
2405 	/* Setup Authentication Parameters */
2406 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2407 	ut_params->auth_xform.next = NULL;
2408 
2409 	ut_params->auth_xform.auth.op = op;
2410 	ut_params->auth_xform.auth.algo = algo;
2411 	ut_params->auth_xform.auth.key.length = key_len;
2412 	ut_params->auth_xform.auth.key.data = hash_key;
2413 	ut_params->auth_xform.auth.digest_length = auth_len;
2414 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2415 	ut_params->auth_xform.auth.iv.length = iv_len;
2416 	ut_params->sess = rte_cryptodev_sym_session_create(
2417 			ts_params->session_mpool);
2418 
2419 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2420 			&ut_params->auth_xform,
2421 			ts_params->session_priv_mpool);
2422 	if (status == -ENOTSUP)
2423 		return TEST_SKIPPED;
2424 
2425 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2426 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2427 	return 0;
2428 }
2429 
2430 static int
2431 create_wireless_algo_cipher_session(uint8_t dev_id,
2432 			enum rte_crypto_cipher_operation op,
2433 			enum rte_crypto_cipher_algorithm algo,
2434 			const uint8_t *key, const uint8_t key_len,
2435 			uint8_t iv_len)
2436 {
2437 	uint8_t cipher_key[key_len];
2438 	int status;
2439 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2440 	struct crypto_unittest_params *ut_params = &unittest_params;
2441 
2442 	memcpy(cipher_key, key, key_len);
2443 
2444 	/* Setup Cipher Parameters */
2445 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2446 	ut_params->cipher_xform.next = NULL;
2447 
2448 	ut_params->cipher_xform.cipher.algo = algo;
2449 	ut_params->cipher_xform.cipher.op = op;
2450 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2451 	ut_params->cipher_xform.cipher.key.length = key_len;
2452 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2453 	ut_params->cipher_xform.cipher.iv.length = iv_len;
2454 
2455 	debug_hexdump(stdout, "key:", key, key_len);
2456 
2457 	/* Create Crypto session */
2458 	ut_params->sess = rte_cryptodev_sym_session_create(
2459 			ts_params->session_mpool);
2460 
2461 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2462 			&ut_params->cipher_xform,
2463 			ts_params->session_priv_mpool);
2464 	if (status == -ENOTSUP)
2465 		return TEST_SKIPPED;
2466 
2467 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2468 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2469 	return 0;
2470 }
2471 
2472 static int
2473 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2474 			unsigned int cipher_len,
2475 			unsigned int cipher_offset)
2476 {
2477 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2478 	struct crypto_unittest_params *ut_params = &unittest_params;
2479 
2480 	/* Generate Crypto op data structure */
2481 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2482 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2483 	TEST_ASSERT_NOT_NULL(ut_params->op,
2484 				"Failed to allocate pktmbuf offload");
2485 
2486 	/* Set crypto operation data parameters */
2487 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2488 
2489 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2490 
2491 	/* set crypto operation source mbuf */
2492 	sym_op->m_src = ut_params->ibuf;
2493 
2494 	/* iv */
2495 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2496 			iv, iv_len);
2497 	sym_op->cipher.data.length = cipher_len;
2498 	sym_op->cipher.data.offset = cipher_offset;
2499 	return 0;
2500 }
2501 
2502 static int
2503 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2504 			unsigned int cipher_len,
2505 			unsigned int cipher_offset)
2506 {
2507 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2508 	struct crypto_unittest_params *ut_params = &unittest_params;
2509 
2510 	/* Generate Crypto op data structure */
2511 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2512 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2513 	TEST_ASSERT_NOT_NULL(ut_params->op,
2514 				"Failed to allocate pktmbuf offload");
2515 
2516 	/* Set crypto operation data parameters */
2517 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2518 
2519 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2520 
2521 	/* set crypto operation source mbuf */
2522 	sym_op->m_src = ut_params->ibuf;
2523 	sym_op->m_dst = ut_params->obuf;
2524 
2525 	/* iv */
2526 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2527 			iv, iv_len);
2528 	sym_op->cipher.data.length = cipher_len;
2529 	sym_op->cipher.data.offset = cipher_offset;
2530 	return 0;
2531 }
2532 
2533 static int
2534 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2535 		enum rte_crypto_cipher_operation cipher_op,
2536 		enum rte_crypto_auth_operation auth_op,
2537 		enum rte_crypto_auth_algorithm auth_algo,
2538 		enum rte_crypto_cipher_algorithm cipher_algo,
2539 		const uint8_t *key, uint8_t key_len,
2540 		uint8_t auth_iv_len, uint8_t auth_len,
2541 		uint8_t cipher_iv_len)
2542 
2543 {
2544 	uint8_t cipher_auth_key[key_len];
2545 	int status;
2546 
2547 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2548 	struct crypto_unittest_params *ut_params = &unittest_params;
2549 
2550 	memcpy(cipher_auth_key, key, key_len);
2551 
2552 	/* Setup Authentication Parameters */
2553 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2554 	ut_params->auth_xform.next = NULL;
2555 
2556 	ut_params->auth_xform.auth.op = auth_op;
2557 	ut_params->auth_xform.auth.algo = auth_algo;
2558 	ut_params->auth_xform.auth.key.length = key_len;
2559 	/* Hash key = cipher key */
2560 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2561 	ut_params->auth_xform.auth.digest_length = auth_len;
2562 	/* Auth IV will be after cipher IV */
2563 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2564 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2565 
2566 	/* Setup Cipher Parameters */
2567 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2568 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2569 
2570 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2571 	ut_params->cipher_xform.cipher.op = cipher_op;
2572 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2573 	ut_params->cipher_xform.cipher.key.length = key_len;
2574 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2575 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2576 
2577 	debug_hexdump(stdout, "key:", key, key_len);
2578 
2579 	/* Create Crypto session*/
2580 	ut_params->sess = rte_cryptodev_sym_session_create(
2581 			ts_params->session_mpool);
2582 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2583 
2584 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2585 			&ut_params->cipher_xform,
2586 			ts_params->session_priv_mpool);
2587 	if (status == -ENOTSUP)
2588 		return TEST_SKIPPED;
2589 
2590 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2591 	return 0;
2592 }
2593 
2594 static int
2595 create_wireless_cipher_auth_session(uint8_t dev_id,
2596 		enum rte_crypto_cipher_operation cipher_op,
2597 		enum rte_crypto_auth_operation auth_op,
2598 		enum rte_crypto_auth_algorithm auth_algo,
2599 		enum rte_crypto_cipher_algorithm cipher_algo,
2600 		const struct wireless_test_data *tdata)
2601 {
2602 	const uint8_t key_len = tdata->key.len;
2603 	uint8_t cipher_auth_key[key_len];
2604 	int status;
2605 
2606 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2607 	struct crypto_unittest_params *ut_params = &unittest_params;
2608 	const uint8_t *key = tdata->key.data;
2609 	const uint8_t auth_len = tdata->digest.len;
2610 	uint8_t cipher_iv_len = tdata->cipher_iv.len;
2611 	uint8_t auth_iv_len = tdata->auth_iv.len;
2612 
2613 	memcpy(cipher_auth_key, key, key_len);
2614 
2615 	/* Setup Authentication Parameters */
2616 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2617 	ut_params->auth_xform.next = NULL;
2618 
2619 	ut_params->auth_xform.auth.op = auth_op;
2620 	ut_params->auth_xform.auth.algo = auth_algo;
2621 	ut_params->auth_xform.auth.key.length = key_len;
2622 	/* Hash key = cipher key */
2623 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2624 	ut_params->auth_xform.auth.digest_length = auth_len;
2625 	/* Auth IV will be after cipher IV */
2626 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2627 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2628 
2629 	/* Setup Cipher Parameters */
2630 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2631 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2632 
2633 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2634 	ut_params->cipher_xform.cipher.op = cipher_op;
2635 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2636 	ut_params->cipher_xform.cipher.key.length = key_len;
2637 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2638 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2639 
2640 
2641 	debug_hexdump(stdout, "key:", key, key_len);
2642 
2643 	/* Create Crypto session*/
2644 	ut_params->sess = rte_cryptodev_sym_session_create(
2645 			ts_params->session_mpool);
2646 
2647 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2648 			&ut_params->cipher_xform,
2649 			ts_params->session_priv_mpool);
2650 	if (status == -ENOTSUP)
2651 		return TEST_SKIPPED;
2652 
2653 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2654 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2655 	return 0;
2656 }
2657 
2658 static int
2659 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2660 		const struct wireless_test_data *tdata)
2661 {
2662 	return create_wireless_cipher_auth_session(dev_id,
2663 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2664 		RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2665 		RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2666 }
2667 
2668 static int
2669 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2670 		enum rte_crypto_cipher_operation cipher_op,
2671 		enum rte_crypto_auth_operation auth_op,
2672 		enum rte_crypto_auth_algorithm auth_algo,
2673 		enum rte_crypto_cipher_algorithm cipher_algo,
2674 		const uint8_t *key, const uint8_t key_len,
2675 		uint8_t auth_iv_len, uint8_t auth_len,
2676 		uint8_t cipher_iv_len)
2677 {
2678 	uint8_t auth_cipher_key[key_len];
2679 	int status;
2680 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2681 	struct crypto_unittest_params *ut_params = &unittest_params;
2682 
2683 	memcpy(auth_cipher_key, key, key_len);
2684 
2685 	/* Setup Authentication Parameters */
2686 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2687 	ut_params->auth_xform.auth.op = auth_op;
2688 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2689 	ut_params->auth_xform.auth.algo = auth_algo;
2690 	ut_params->auth_xform.auth.key.length = key_len;
2691 	ut_params->auth_xform.auth.key.data = auth_cipher_key;
2692 	ut_params->auth_xform.auth.digest_length = auth_len;
2693 	/* Auth IV will be after cipher IV */
2694 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2695 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2696 
2697 	/* Setup Cipher Parameters */
2698 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2699 	ut_params->cipher_xform.next = NULL;
2700 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2701 	ut_params->cipher_xform.cipher.op = cipher_op;
2702 	ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2703 	ut_params->cipher_xform.cipher.key.length = key_len;
2704 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2705 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2706 
2707 	debug_hexdump(stdout, "key:", key, key_len);
2708 
2709 	/* Create Crypto session*/
2710 	ut_params->sess = rte_cryptodev_sym_session_create(
2711 			ts_params->session_mpool);
2712 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2713 
2714 	if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2715 		ut_params->auth_xform.next = NULL;
2716 		ut_params->cipher_xform.next = &ut_params->auth_xform;
2717 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2718 				&ut_params->cipher_xform,
2719 				ts_params->session_priv_mpool);
2720 
2721 	} else
2722 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2723 				&ut_params->auth_xform,
2724 				ts_params->session_priv_mpool);
2725 
2726 	if (status == -ENOTSUP)
2727 		return TEST_SKIPPED;
2728 
2729 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2730 
2731 	return 0;
2732 }
2733 
2734 static int
2735 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2736 		unsigned int auth_tag_len,
2737 		const uint8_t *iv, unsigned int iv_len,
2738 		unsigned int data_pad_len,
2739 		enum rte_crypto_auth_operation op,
2740 		unsigned int auth_len, unsigned int auth_offset)
2741 {
2742 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2743 
2744 	struct crypto_unittest_params *ut_params = &unittest_params;
2745 
2746 	/* Generate Crypto op data structure */
2747 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2748 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2749 	TEST_ASSERT_NOT_NULL(ut_params->op,
2750 		"Failed to allocate pktmbuf offload");
2751 
2752 	/* Set crypto operation data parameters */
2753 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2754 
2755 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2756 
2757 	/* set crypto operation source mbuf */
2758 	sym_op->m_src = ut_params->ibuf;
2759 
2760 	/* iv */
2761 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2762 			iv, iv_len);
2763 	/* digest */
2764 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2765 					ut_params->ibuf, auth_tag_len);
2766 
2767 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2768 				"no room to append auth tag");
2769 	ut_params->digest = sym_op->auth.digest.data;
2770 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2771 			ut_params->ibuf, data_pad_len);
2772 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2773 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2774 	else
2775 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2776 
2777 	debug_hexdump(stdout, "digest:",
2778 		sym_op->auth.digest.data,
2779 		auth_tag_len);
2780 
2781 	sym_op->auth.data.length = auth_len;
2782 	sym_op->auth.data.offset = auth_offset;
2783 
2784 	return 0;
2785 }
2786 
2787 static int
2788 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2789 	enum rte_crypto_auth_operation op)
2790 {
2791 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2792 	struct crypto_unittest_params *ut_params = &unittest_params;
2793 
2794 	const uint8_t *auth_tag = tdata->digest.data;
2795 	const unsigned int auth_tag_len = tdata->digest.len;
2796 	unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2797 	unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2798 
2799 	const uint8_t *cipher_iv = tdata->cipher_iv.data;
2800 	const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2801 	const uint8_t *auth_iv = tdata->auth_iv.data;
2802 	const uint8_t auth_iv_len = tdata->auth_iv.len;
2803 	const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2804 	const unsigned int auth_len = tdata->validAuthLenInBits.len;
2805 
2806 	/* Generate Crypto op data structure */
2807 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2808 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2809 	TEST_ASSERT_NOT_NULL(ut_params->op,
2810 			"Failed to allocate pktmbuf offload");
2811 	/* Set crypto operation data parameters */
2812 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2813 
2814 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2815 
2816 	/* set crypto operation source mbuf */
2817 	sym_op->m_src = ut_params->ibuf;
2818 
2819 	/* digest */
2820 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2821 			ut_params->ibuf, auth_tag_len);
2822 
2823 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2824 			"no room to append auth tag");
2825 	ut_params->digest = sym_op->auth.digest.data;
2826 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2827 			ut_params->ibuf, data_pad_len);
2828 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2829 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2830 	else
2831 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2832 
2833 	debug_hexdump(stdout, "digest:",
2834 		sym_op->auth.digest.data,
2835 		auth_tag_len);
2836 
2837 	/* Copy cipher and auth IVs at the end of the crypto operation */
2838 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2839 						IV_OFFSET);
2840 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2841 	iv_ptr += cipher_iv_len;
2842 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2843 
2844 	sym_op->cipher.data.length = cipher_len;
2845 	sym_op->cipher.data.offset = 0;
2846 	sym_op->auth.data.length = auth_len;
2847 	sym_op->auth.data.offset = 0;
2848 
2849 	return 0;
2850 }
2851 
2852 static int
2853 create_zuc_cipher_hash_generate_operation(
2854 		const struct wireless_test_data *tdata)
2855 {
2856 	return create_wireless_cipher_hash_operation(tdata,
2857 		RTE_CRYPTO_AUTH_OP_GENERATE);
2858 }
2859 
2860 static int
2861 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2862 		const unsigned auth_tag_len,
2863 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2864 		unsigned data_pad_len,
2865 		enum rte_crypto_auth_operation op,
2866 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2867 		const unsigned cipher_len, const unsigned cipher_offset,
2868 		const unsigned auth_len, const unsigned auth_offset)
2869 {
2870 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2871 	struct crypto_unittest_params *ut_params = &unittest_params;
2872 
2873 	enum rte_crypto_cipher_algorithm cipher_algo =
2874 			ut_params->cipher_xform.cipher.algo;
2875 	enum rte_crypto_auth_algorithm auth_algo =
2876 			ut_params->auth_xform.auth.algo;
2877 
2878 	/* Generate Crypto op data structure */
2879 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2880 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2881 	TEST_ASSERT_NOT_NULL(ut_params->op,
2882 			"Failed to allocate pktmbuf offload");
2883 	/* Set crypto operation data parameters */
2884 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2885 
2886 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2887 
2888 	/* set crypto operation source mbuf */
2889 	sym_op->m_src = ut_params->ibuf;
2890 
2891 	/* digest */
2892 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2893 			ut_params->ibuf, auth_tag_len);
2894 
2895 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2896 			"no room to append auth tag");
2897 	ut_params->digest = sym_op->auth.digest.data;
2898 
2899 	if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2900 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2901 				ut_params->ibuf, data_pad_len);
2902 	} else {
2903 		struct rte_mbuf *m = ut_params->ibuf;
2904 		unsigned int offset = data_pad_len;
2905 
2906 		while (offset > m->data_len && m->next != NULL) {
2907 			offset -= m->data_len;
2908 			m = m->next;
2909 		}
2910 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2911 			m, offset);
2912 	}
2913 
2914 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2915 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2916 	else
2917 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2918 
2919 	debug_hexdump(stdout, "digest:",
2920 		sym_op->auth.digest.data,
2921 		auth_tag_len);
2922 
2923 	/* Copy cipher and auth IVs at the end of the crypto operation */
2924 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2925 						IV_OFFSET);
2926 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2927 	iv_ptr += cipher_iv_len;
2928 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2929 
2930 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2931 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2932 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2933 		sym_op->cipher.data.length = cipher_len;
2934 		sym_op->cipher.data.offset = cipher_offset;
2935 	} else {
2936 		sym_op->cipher.data.length = cipher_len >> 3;
2937 		sym_op->cipher.data.offset = cipher_offset >> 3;
2938 	}
2939 
2940 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2941 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2942 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2943 		sym_op->auth.data.length = auth_len;
2944 		sym_op->auth.data.offset = auth_offset;
2945 	} else {
2946 		sym_op->auth.data.length = auth_len >> 3;
2947 		sym_op->auth.data.offset = auth_offset >> 3;
2948 	}
2949 
2950 	return 0;
2951 }
2952 
2953 static int
2954 create_wireless_algo_auth_cipher_operation(
2955 		const uint8_t *auth_tag, unsigned int auth_tag_len,
2956 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2957 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2958 		unsigned int data_pad_len,
2959 		unsigned int cipher_len, unsigned int cipher_offset,
2960 		unsigned int auth_len, unsigned int auth_offset,
2961 		uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2962 {
2963 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2964 	struct crypto_unittest_params *ut_params = &unittest_params;
2965 
2966 	enum rte_crypto_cipher_algorithm cipher_algo =
2967 			ut_params->cipher_xform.cipher.algo;
2968 	enum rte_crypto_auth_algorithm auth_algo =
2969 			ut_params->auth_xform.auth.algo;
2970 
2971 	/* Generate Crypto op data structure */
2972 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2973 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2974 	TEST_ASSERT_NOT_NULL(ut_params->op,
2975 			"Failed to allocate pktmbuf offload");
2976 
2977 	/* Set crypto operation data parameters */
2978 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2979 
2980 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2981 
2982 	/* set crypto operation mbufs */
2983 	sym_op->m_src = ut_params->ibuf;
2984 	if (op_mode == OUT_OF_PLACE)
2985 		sym_op->m_dst = ut_params->obuf;
2986 
2987 	/* digest */
2988 	if (!do_sgl) {
2989 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
2990 			(op_mode == IN_PLACE ?
2991 				ut_params->ibuf : ut_params->obuf),
2992 			uint8_t *, data_pad_len);
2993 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2994 			(op_mode == IN_PLACE ?
2995 				ut_params->ibuf : ut_params->obuf),
2996 			data_pad_len);
2997 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2998 	} else {
2999 		uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
3000 		struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
3001 				sym_op->m_src : sym_op->m_dst);
3002 		while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
3003 			remaining_off -= rte_pktmbuf_data_len(sgl_buf);
3004 			sgl_buf = sgl_buf->next;
3005 		}
3006 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
3007 				uint8_t *, remaining_off);
3008 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
3009 				remaining_off);
3010 		memset(sym_op->auth.digest.data, 0, remaining_off);
3011 		while (sgl_buf->next != NULL) {
3012 			memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
3013 				0, rte_pktmbuf_data_len(sgl_buf));
3014 			sgl_buf = sgl_buf->next;
3015 		}
3016 	}
3017 
3018 	/* Copy digest for the verification */
3019 	if (verify)
3020 		memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
3021 
3022 	/* Copy cipher and auth IVs at the end of the crypto operation */
3023 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
3024 			ut_params->op, uint8_t *, IV_OFFSET);
3025 
3026 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3027 	iv_ptr += cipher_iv_len;
3028 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3029 
3030 	/* Only copy over the offset data needed from src to dst in OOP,
3031 	 * if the auth and cipher offsets are not aligned
3032 	 */
3033 	if (op_mode == OUT_OF_PLACE) {
3034 		if (cipher_offset > auth_offset)
3035 			rte_memcpy(
3036 				rte_pktmbuf_mtod_offset(
3037 					sym_op->m_dst,
3038 					uint8_t *, auth_offset >> 3),
3039 				rte_pktmbuf_mtod_offset(
3040 					sym_op->m_src,
3041 					uint8_t *, auth_offset >> 3),
3042 				((cipher_offset >> 3) - (auth_offset >> 3)));
3043 	}
3044 
3045 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3046 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3047 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3048 		sym_op->cipher.data.length = cipher_len;
3049 		sym_op->cipher.data.offset = cipher_offset;
3050 	} else {
3051 		sym_op->cipher.data.length = cipher_len >> 3;
3052 		sym_op->cipher.data.offset = cipher_offset >> 3;
3053 	}
3054 
3055 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3056 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3057 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3058 		sym_op->auth.data.length = auth_len;
3059 		sym_op->auth.data.offset = auth_offset;
3060 	} else {
3061 		sym_op->auth.data.length = auth_len >> 3;
3062 		sym_op->auth.data.offset = auth_offset >> 3;
3063 	}
3064 
3065 	return 0;
3066 }
3067 
3068 static int
3069 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
3070 {
3071 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3072 	struct crypto_unittest_params *ut_params = &unittest_params;
3073 
3074 	int retval;
3075 	unsigned plaintext_pad_len;
3076 	unsigned plaintext_len;
3077 	uint8_t *plaintext;
3078 	struct rte_cryptodev_info dev_info;
3079 
3080 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3081 	uint64_t feat_flags = dev_info.feature_flags;
3082 
3083 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3084 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3085 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3086 		return TEST_SKIPPED;
3087 	}
3088 
3089 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3090 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3091 		printf("Device doesn't support RAW data-path APIs.\n");
3092 		return TEST_SKIPPED;
3093 	}
3094 
3095 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3096 		return TEST_SKIPPED;
3097 
3098 	/* Verify the capabilities */
3099 	struct rte_cryptodev_sym_capability_idx cap_idx;
3100 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3101 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3102 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3103 			&cap_idx) == NULL)
3104 		return TEST_SKIPPED;
3105 
3106 	/* Create SNOW 3G session */
3107 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3108 			tdata->key.data, tdata->key.len,
3109 			tdata->auth_iv.len, tdata->digest.len,
3110 			RTE_CRYPTO_AUTH_OP_GENERATE,
3111 			RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3112 	if (retval < 0)
3113 		return retval;
3114 
3115 	/* alloc mbuf and set payload */
3116 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3117 
3118 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3119 	rte_pktmbuf_tailroom(ut_params->ibuf));
3120 
3121 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3122 	/* Append data which is padded to a multiple of */
3123 	/* the algorithms block size */
3124 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3125 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3126 				plaintext_pad_len);
3127 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3128 
3129 	/* Create SNOW 3G operation */
3130 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3131 			tdata->auth_iv.data, tdata->auth_iv.len,
3132 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3133 			tdata->validAuthLenInBits.len,
3134 			0);
3135 	if (retval < 0)
3136 		return retval;
3137 
3138 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3139 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3140 				ut_params->op, 0, 1, 1, 0);
3141 	else
3142 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3143 				ut_params->op);
3144 	ut_params->obuf = ut_params->op->sym->m_src;
3145 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3146 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3147 			+ plaintext_pad_len;
3148 
3149 	/* Validate obuf */
3150 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3151 	ut_params->digest,
3152 	tdata->digest.data,
3153 	DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3154 	"SNOW 3G Generated auth tag not as expected");
3155 
3156 	return 0;
3157 }
3158 
3159 static int
3160 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3161 {
3162 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3163 	struct crypto_unittest_params *ut_params = &unittest_params;
3164 
3165 	int retval;
3166 	unsigned plaintext_pad_len;
3167 	unsigned plaintext_len;
3168 	uint8_t *plaintext;
3169 	struct rte_cryptodev_info dev_info;
3170 
3171 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3172 	uint64_t feat_flags = dev_info.feature_flags;
3173 
3174 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3175 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3176 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3177 		return TEST_SKIPPED;
3178 	}
3179 
3180 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3181 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3182 		printf("Device doesn't support RAW data-path APIs.\n");
3183 		return TEST_SKIPPED;
3184 	}
3185 
3186 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3187 		return TEST_SKIPPED;
3188 
3189 	/* Verify the capabilities */
3190 	struct rte_cryptodev_sym_capability_idx cap_idx;
3191 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3192 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3193 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3194 			&cap_idx) == NULL)
3195 		return TEST_SKIPPED;
3196 
3197 	/* Create SNOW 3G session */
3198 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3199 				tdata->key.data, tdata->key.len,
3200 				tdata->auth_iv.len, tdata->digest.len,
3201 				RTE_CRYPTO_AUTH_OP_VERIFY,
3202 				RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3203 	if (retval < 0)
3204 		return retval;
3205 	/* alloc mbuf and set payload */
3206 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3207 
3208 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3209 	rte_pktmbuf_tailroom(ut_params->ibuf));
3210 
3211 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3212 	/* Append data which is padded to a multiple of */
3213 	/* the algorithms block size */
3214 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3215 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3216 				plaintext_pad_len);
3217 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3218 
3219 	/* Create SNOW 3G operation */
3220 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3221 			tdata->digest.len,
3222 			tdata->auth_iv.data, tdata->auth_iv.len,
3223 			plaintext_pad_len,
3224 			RTE_CRYPTO_AUTH_OP_VERIFY,
3225 			tdata->validAuthLenInBits.len,
3226 			0);
3227 	if (retval < 0)
3228 		return retval;
3229 
3230 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3231 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3232 				ut_params->op, 0, 1, 1, 0);
3233 	else
3234 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3235 				ut_params->op);
3236 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3237 	ut_params->obuf = ut_params->op->sym->m_src;
3238 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3239 				+ plaintext_pad_len;
3240 
3241 	/* Validate obuf */
3242 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3243 		return 0;
3244 	else
3245 		return -1;
3246 
3247 	return 0;
3248 }
3249 
3250 static int
3251 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3252 {
3253 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3254 	struct crypto_unittest_params *ut_params = &unittest_params;
3255 
3256 	int retval;
3257 	unsigned plaintext_pad_len;
3258 	unsigned plaintext_len;
3259 	uint8_t *plaintext;
3260 	struct rte_cryptodev_info dev_info;
3261 
3262 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3263 	uint64_t feat_flags = dev_info.feature_flags;
3264 
3265 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3266 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3267 		printf("Device doesn't support RAW data-path APIs.\n");
3268 		return TEST_SKIPPED;
3269 	}
3270 
3271 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3272 		return TEST_SKIPPED;
3273 
3274 	/* Verify the capabilities */
3275 	struct rte_cryptodev_sym_capability_idx cap_idx;
3276 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3277 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3278 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3279 			&cap_idx) == NULL)
3280 		return TEST_SKIPPED;
3281 
3282 	/* Create KASUMI session */
3283 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3284 			tdata->key.data, tdata->key.len,
3285 			0, tdata->digest.len,
3286 			RTE_CRYPTO_AUTH_OP_GENERATE,
3287 			RTE_CRYPTO_AUTH_KASUMI_F9);
3288 	if (retval < 0)
3289 		return retval;
3290 
3291 	/* alloc mbuf and set payload */
3292 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3293 
3294 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3295 	rte_pktmbuf_tailroom(ut_params->ibuf));
3296 
3297 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3298 	/* Append data which is padded to a multiple of */
3299 	/* the algorithms block size */
3300 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3301 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3302 				plaintext_pad_len);
3303 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3304 
3305 	/* Create KASUMI operation */
3306 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3307 			NULL, 0,
3308 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3309 			tdata->plaintext.len,
3310 			0);
3311 	if (retval < 0)
3312 		return retval;
3313 
3314 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3315 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3316 			ut_params->op);
3317 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3318 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3319 				ut_params->op, 0, 1, 1, 0);
3320 	else
3321 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3322 			ut_params->op);
3323 
3324 	ut_params->obuf = ut_params->op->sym->m_src;
3325 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3326 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3327 			+ plaintext_pad_len;
3328 
3329 	/* Validate obuf */
3330 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3331 	ut_params->digest,
3332 	tdata->digest.data,
3333 	DIGEST_BYTE_LENGTH_KASUMI_F9,
3334 	"KASUMI Generated auth tag not as expected");
3335 
3336 	return 0;
3337 }
3338 
3339 static int
3340 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3341 {
3342 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3343 	struct crypto_unittest_params *ut_params = &unittest_params;
3344 
3345 	int retval;
3346 	unsigned plaintext_pad_len;
3347 	unsigned plaintext_len;
3348 	uint8_t *plaintext;
3349 	struct rte_cryptodev_info dev_info;
3350 
3351 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3352 	uint64_t feat_flags = dev_info.feature_flags;
3353 
3354 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3355 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3356 		printf("Device doesn't support RAW data-path APIs.\n");
3357 		return TEST_SKIPPED;
3358 	}
3359 
3360 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3361 		return TEST_SKIPPED;
3362 
3363 	/* Verify the capabilities */
3364 	struct rte_cryptodev_sym_capability_idx cap_idx;
3365 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3366 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3367 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3368 			&cap_idx) == NULL)
3369 		return TEST_SKIPPED;
3370 
3371 	/* Create KASUMI session */
3372 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3373 				tdata->key.data, tdata->key.len,
3374 				0, tdata->digest.len,
3375 				RTE_CRYPTO_AUTH_OP_VERIFY,
3376 				RTE_CRYPTO_AUTH_KASUMI_F9);
3377 	if (retval < 0)
3378 		return retval;
3379 	/* alloc mbuf and set payload */
3380 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3381 
3382 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3383 	rte_pktmbuf_tailroom(ut_params->ibuf));
3384 
3385 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3386 	/* Append data which is padded to a multiple */
3387 	/* of the algorithms block size */
3388 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3389 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3390 				plaintext_pad_len);
3391 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3392 
3393 	/* Create KASUMI operation */
3394 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3395 			tdata->digest.len,
3396 			NULL, 0,
3397 			plaintext_pad_len,
3398 			RTE_CRYPTO_AUTH_OP_VERIFY,
3399 			tdata->plaintext.len,
3400 			0);
3401 	if (retval < 0)
3402 		return retval;
3403 
3404 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3405 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3406 				ut_params->op, 0, 1, 1, 0);
3407 	else
3408 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3409 				ut_params->op);
3410 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3411 	ut_params->obuf = ut_params->op->sym->m_src;
3412 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3413 				+ plaintext_pad_len;
3414 
3415 	/* Validate obuf */
3416 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3417 		return 0;
3418 	else
3419 		return -1;
3420 
3421 	return 0;
3422 }
3423 
3424 static int
3425 test_snow3g_hash_generate_test_case_1(void)
3426 {
3427 	return test_snow3g_authentication(&snow3g_hash_test_case_1);
3428 }
3429 
3430 static int
3431 test_snow3g_hash_generate_test_case_2(void)
3432 {
3433 	return test_snow3g_authentication(&snow3g_hash_test_case_2);
3434 }
3435 
3436 static int
3437 test_snow3g_hash_generate_test_case_3(void)
3438 {
3439 	return test_snow3g_authentication(&snow3g_hash_test_case_3);
3440 }
3441 
3442 static int
3443 test_snow3g_hash_generate_test_case_4(void)
3444 {
3445 	return test_snow3g_authentication(&snow3g_hash_test_case_4);
3446 }
3447 
3448 static int
3449 test_snow3g_hash_generate_test_case_5(void)
3450 {
3451 	return test_snow3g_authentication(&snow3g_hash_test_case_5);
3452 }
3453 
3454 static int
3455 test_snow3g_hash_generate_test_case_6(void)
3456 {
3457 	return test_snow3g_authentication(&snow3g_hash_test_case_6);
3458 }
3459 
3460 static int
3461 test_snow3g_hash_verify_test_case_1(void)
3462 {
3463 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3464 
3465 }
3466 
3467 static int
3468 test_snow3g_hash_verify_test_case_2(void)
3469 {
3470 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3471 }
3472 
3473 static int
3474 test_snow3g_hash_verify_test_case_3(void)
3475 {
3476 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3477 }
3478 
3479 static int
3480 test_snow3g_hash_verify_test_case_4(void)
3481 {
3482 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3483 }
3484 
3485 static int
3486 test_snow3g_hash_verify_test_case_5(void)
3487 {
3488 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3489 }
3490 
3491 static int
3492 test_snow3g_hash_verify_test_case_6(void)
3493 {
3494 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3495 }
3496 
3497 static int
3498 test_kasumi_hash_generate_test_case_1(void)
3499 {
3500 	return test_kasumi_authentication(&kasumi_hash_test_case_1);
3501 }
3502 
3503 static int
3504 test_kasumi_hash_generate_test_case_2(void)
3505 {
3506 	return test_kasumi_authentication(&kasumi_hash_test_case_2);
3507 }
3508 
3509 static int
3510 test_kasumi_hash_generate_test_case_3(void)
3511 {
3512 	return test_kasumi_authentication(&kasumi_hash_test_case_3);
3513 }
3514 
3515 static int
3516 test_kasumi_hash_generate_test_case_4(void)
3517 {
3518 	return test_kasumi_authentication(&kasumi_hash_test_case_4);
3519 }
3520 
3521 static int
3522 test_kasumi_hash_generate_test_case_5(void)
3523 {
3524 	return test_kasumi_authentication(&kasumi_hash_test_case_5);
3525 }
3526 
3527 static int
3528 test_kasumi_hash_generate_test_case_6(void)
3529 {
3530 	return test_kasumi_authentication(&kasumi_hash_test_case_6);
3531 }
3532 
3533 static int
3534 test_kasumi_hash_verify_test_case_1(void)
3535 {
3536 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3537 }
3538 
3539 static int
3540 test_kasumi_hash_verify_test_case_2(void)
3541 {
3542 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3543 }
3544 
3545 static int
3546 test_kasumi_hash_verify_test_case_3(void)
3547 {
3548 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3549 }
3550 
3551 static int
3552 test_kasumi_hash_verify_test_case_4(void)
3553 {
3554 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3555 }
3556 
3557 static int
3558 test_kasumi_hash_verify_test_case_5(void)
3559 {
3560 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3561 }
3562 
3563 static int
3564 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3565 {
3566 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3567 	struct crypto_unittest_params *ut_params = &unittest_params;
3568 
3569 	int retval;
3570 	uint8_t *plaintext, *ciphertext;
3571 	unsigned plaintext_pad_len;
3572 	unsigned plaintext_len;
3573 	struct rte_cryptodev_info dev_info;
3574 
3575 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3576 	uint64_t feat_flags = dev_info.feature_flags;
3577 
3578 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3579 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3580 		printf("Device doesn't support RAW data-path APIs.\n");
3581 		return TEST_SKIPPED;
3582 	}
3583 
3584 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3585 		return TEST_SKIPPED;
3586 
3587 	/* Verify the capabilities */
3588 	struct rte_cryptodev_sym_capability_idx cap_idx;
3589 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3590 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3591 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3592 			&cap_idx) == NULL)
3593 		return TEST_SKIPPED;
3594 
3595 	/* Create KASUMI session */
3596 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3597 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3598 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3599 					tdata->key.data, tdata->key.len,
3600 					tdata->cipher_iv.len);
3601 	if (retval < 0)
3602 		return retval;
3603 
3604 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3605 
3606 	/* Clear mbuf payload */
3607 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3608 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3609 
3610 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3611 	/* Append data which is padded to a multiple */
3612 	/* of the algorithms block size */
3613 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3614 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3615 				plaintext_pad_len);
3616 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3617 
3618 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3619 
3620 	/* Create KASUMI operation */
3621 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3622 				tdata->cipher_iv.len,
3623 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3624 				tdata->validCipherOffsetInBits.len);
3625 	if (retval < 0)
3626 		return retval;
3627 
3628 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3629 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3630 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3631 	else
3632 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3633 				ut_params->op);
3634 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3635 
3636 	ut_params->obuf = ut_params->op->sym->m_dst;
3637 	if (ut_params->obuf)
3638 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3639 	else
3640 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3641 
3642 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3643 
3644 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3645 				(tdata->validCipherOffsetInBits.len >> 3);
3646 	/* Validate obuf */
3647 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3648 		ciphertext,
3649 		reference_ciphertext,
3650 		tdata->validCipherLenInBits.len,
3651 		"KASUMI Ciphertext data not as expected");
3652 	return 0;
3653 }
3654 
3655 static int
3656 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3657 {
3658 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3659 	struct crypto_unittest_params *ut_params = &unittest_params;
3660 
3661 	int retval;
3662 
3663 	unsigned int plaintext_pad_len;
3664 	unsigned int plaintext_len;
3665 
3666 	uint8_t buffer[10000];
3667 	const uint8_t *ciphertext;
3668 
3669 	struct rte_cryptodev_info dev_info;
3670 
3671 	/* Verify the capabilities */
3672 	struct rte_cryptodev_sym_capability_idx cap_idx;
3673 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3674 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3675 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3676 			&cap_idx) == NULL)
3677 		return TEST_SKIPPED;
3678 
3679 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3680 
3681 	uint64_t feat_flags = dev_info.feature_flags;
3682 
3683 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3684 		printf("Device doesn't support in-place scatter-gather. "
3685 				"Test Skipped.\n");
3686 		return TEST_SKIPPED;
3687 	}
3688 
3689 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3690 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3691 		printf("Device doesn't support RAW data-path APIs.\n");
3692 		return TEST_SKIPPED;
3693 	}
3694 
3695 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3696 		return TEST_SKIPPED;
3697 
3698 	/* Create KASUMI session */
3699 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3700 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3701 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3702 					tdata->key.data, tdata->key.len,
3703 					tdata->cipher_iv.len);
3704 	if (retval < 0)
3705 		return retval;
3706 
3707 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3708 
3709 
3710 	/* Append data which is padded to a multiple */
3711 	/* of the algorithms block size */
3712 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3713 
3714 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3715 			plaintext_pad_len, 10, 0);
3716 
3717 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3718 
3719 	/* Create KASUMI operation */
3720 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3721 				tdata->cipher_iv.len,
3722 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3723 				tdata->validCipherOffsetInBits.len);
3724 	if (retval < 0)
3725 		return retval;
3726 
3727 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3728 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3729 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3730 	else
3731 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3732 						ut_params->op);
3733 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3734 
3735 	ut_params->obuf = ut_params->op->sym->m_dst;
3736 
3737 	if (ut_params->obuf)
3738 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3739 				plaintext_len, buffer);
3740 	else
3741 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3742 				tdata->validCipherOffsetInBits.len >> 3,
3743 				plaintext_len, buffer);
3744 
3745 	/* Validate obuf */
3746 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3747 
3748 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3749 				(tdata->validCipherOffsetInBits.len >> 3);
3750 	/* Validate obuf */
3751 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3752 		ciphertext,
3753 		reference_ciphertext,
3754 		tdata->validCipherLenInBits.len,
3755 		"KASUMI Ciphertext data not as expected");
3756 	return 0;
3757 }
3758 
3759 static int
3760 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3761 {
3762 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3763 	struct crypto_unittest_params *ut_params = &unittest_params;
3764 
3765 	int retval;
3766 	uint8_t *plaintext, *ciphertext;
3767 	unsigned plaintext_pad_len;
3768 	unsigned plaintext_len;
3769 
3770 	/* Verify the capabilities */
3771 	struct rte_cryptodev_sym_capability_idx cap_idx;
3772 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3773 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3774 	/* Data-path service does not support OOP */
3775 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3776 			&cap_idx) == NULL)
3777 		return TEST_SKIPPED;
3778 
3779 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3780 		return TEST_SKIPPED;
3781 
3782 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3783 		return TEST_SKIPPED;
3784 
3785 	/* Create KASUMI session */
3786 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3787 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3788 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3789 					tdata->key.data, tdata->key.len,
3790 					tdata->cipher_iv.len);
3791 	if (retval < 0)
3792 		return retval;
3793 
3794 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3795 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3796 
3797 	/* Clear mbuf payload */
3798 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3799 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3800 
3801 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3802 	/* Append data which is padded to a multiple */
3803 	/* of the algorithms block size */
3804 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3805 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3806 				plaintext_pad_len);
3807 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3808 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3809 
3810 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3811 
3812 	/* Create KASUMI operation */
3813 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3814 				tdata->cipher_iv.len,
3815 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3816 				tdata->validCipherOffsetInBits.len);
3817 	if (retval < 0)
3818 		return retval;
3819 
3820 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3821 						ut_params->op);
3822 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3823 
3824 	ut_params->obuf = ut_params->op->sym->m_dst;
3825 	if (ut_params->obuf)
3826 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3827 	else
3828 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3829 
3830 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3831 
3832 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3833 				(tdata->validCipherOffsetInBits.len >> 3);
3834 	/* Validate obuf */
3835 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3836 		ciphertext,
3837 		reference_ciphertext,
3838 		tdata->validCipherLenInBits.len,
3839 		"KASUMI Ciphertext data not as expected");
3840 	return 0;
3841 }
3842 
3843 static int
3844 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3845 {
3846 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3847 	struct crypto_unittest_params *ut_params = &unittest_params;
3848 
3849 	int retval;
3850 	unsigned int plaintext_pad_len;
3851 	unsigned int plaintext_len;
3852 
3853 	const uint8_t *ciphertext;
3854 	uint8_t buffer[2048];
3855 
3856 	struct rte_cryptodev_info dev_info;
3857 
3858 	/* Verify the capabilities */
3859 	struct rte_cryptodev_sym_capability_idx cap_idx;
3860 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3861 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3862 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3863 			&cap_idx) == NULL)
3864 		return TEST_SKIPPED;
3865 
3866 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3867 		return TEST_SKIPPED;
3868 
3869 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3870 		return TEST_SKIPPED;
3871 
3872 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3873 
3874 	uint64_t feat_flags = dev_info.feature_flags;
3875 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3876 		printf("Device doesn't support out-of-place scatter-gather "
3877 				"in both input and output mbufs. "
3878 				"Test Skipped.\n");
3879 		return TEST_SKIPPED;
3880 	}
3881 
3882 	/* Create KASUMI session */
3883 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3884 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3885 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3886 					tdata->key.data, tdata->key.len,
3887 					tdata->cipher_iv.len);
3888 	if (retval < 0)
3889 		return retval;
3890 
3891 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3892 	/* Append data which is padded to a multiple */
3893 	/* of the algorithms block size */
3894 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3895 
3896 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3897 			plaintext_pad_len, 10, 0);
3898 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3899 			plaintext_pad_len, 3, 0);
3900 
3901 	/* Append data which is padded to a multiple */
3902 	/* of the algorithms block size */
3903 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3904 
3905 	/* Create KASUMI operation */
3906 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3907 				tdata->cipher_iv.len,
3908 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3909 				tdata->validCipherOffsetInBits.len);
3910 	if (retval < 0)
3911 		return retval;
3912 
3913 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3914 						ut_params->op);
3915 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3916 
3917 	ut_params->obuf = ut_params->op->sym->m_dst;
3918 	if (ut_params->obuf)
3919 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3920 				plaintext_pad_len, buffer);
3921 	else
3922 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3923 				tdata->validCipherOffsetInBits.len >> 3,
3924 				plaintext_pad_len, buffer);
3925 
3926 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3927 				(tdata->validCipherOffsetInBits.len >> 3);
3928 	/* Validate obuf */
3929 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3930 		ciphertext,
3931 		reference_ciphertext,
3932 		tdata->validCipherLenInBits.len,
3933 		"KASUMI Ciphertext data not as expected");
3934 	return 0;
3935 }
3936 
3937 
3938 static int
3939 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3940 {
3941 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3942 	struct crypto_unittest_params *ut_params = &unittest_params;
3943 
3944 	int retval;
3945 	uint8_t *ciphertext, *plaintext;
3946 	unsigned ciphertext_pad_len;
3947 	unsigned ciphertext_len;
3948 
3949 	/* Verify the capabilities */
3950 	struct rte_cryptodev_sym_capability_idx cap_idx;
3951 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3952 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3953 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3954 			&cap_idx) == NULL)
3955 		return TEST_SKIPPED;
3956 
3957 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3958 		return TEST_SKIPPED;
3959 
3960 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3961 		return TEST_SKIPPED;
3962 
3963 	/* Create KASUMI session */
3964 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3965 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3966 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3967 					tdata->key.data, tdata->key.len,
3968 					tdata->cipher_iv.len);
3969 	if (retval < 0)
3970 		return retval;
3971 
3972 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3973 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3974 
3975 	/* Clear mbuf payload */
3976 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3977 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3978 
3979 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3980 	/* Append data which is padded to a multiple */
3981 	/* of the algorithms block size */
3982 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3983 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3984 				ciphertext_pad_len);
3985 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3986 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3987 
3988 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3989 
3990 	/* Create KASUMI operation */
3991 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3992 				tdata->cipher_iv.len,
3993 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3994 				tdata->validCipherOffsetInBits.len);
3995 	if (retval < 0)
3996 		return retval;
3997 
3998 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3999 						ut_params->op);
4000 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4001 
4002 	ut_params->obuf = ut_params->op->sym->m_dst;
4003 	if (ut_params->obuf)
4004 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4005 	else
4006 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4007 
4008 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4009 
4010 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4011 				(tdata->validCipherOffsetInBits.len >> 3);
4012 	/* Validate obuf */
4013 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4014 		plaintext,
4015 		reference_plaintext,
4016 		tdata->validCipherLenInBits.len,
4017 		"KASUMI Plaintext data not as expected");
4018 	return 0;
4019 }
4020 
4021 static int
4022 test_kasumi_decryption(const struct kasumi_test_data *tdata)
4023 {
4024 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4025 	struct crypto_unittest_params *ut_params = &unittest_params;
4026 
4027 	int retval;
4028 	uint8_t *ciphertext, *plaintext;
4029 	unsigned ciphertext_pad_len;
4030 	unsigned ciphertext_len;
4031 	struct rte_cryptodev_info dev_info;
4032 
4033 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4034 	uint64_t feat_flags = dev_info.feature_flags;
4035 
4036 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4037 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4038 		printf("Device doesn't support RAW data-path APIs.\n");
4039 		return TEST_SKIPPED;
4040 	}
4041 
4042 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4043 		return TEST_SKIPPED;
4044 
4045 	/* Verify the capabilities */
4046 	struct rte_cryptodev_sym_capability_idx cap_idx;
4047 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4048 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4049 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4050 			&cap_idx) == NULL)
4051 		return TEST_SKIPPED;
4052 
4053 	/* Create KASUMI session */
4054 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4055 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4056 					RTE_CRYPTO_CIPHER_KASUMI_F8,
4057 					tdata->key.data, tdata->key.len,
4058 					tdata->cipher_iv.len);
4059 	if (retval < 0)
4060 		return retval;
4061 
4062 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4063 
4064 	/* Clear mbuf payload */
4065 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4066 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4067 
4068 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4069 	/* Append data which is padded to a multiple */
4070 	/* of the algorithms block size */
4071 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4072 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4073 				ciphertext_pad_len);
4074 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4075 
4076 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4077 
4078 	/* Create KASUMI operation */
4079 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4080 					tdata->cipher_iv.len,
4081 					tdata->ciphertext.len,
4082 					tdata->validCipherOffsetInBits.len);
4083 	if (retval < 0)
4084 		return retval;
4085 
4086 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4087 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4088 				ut_params->op, 1, 0, 1, 0);
4089 	else
4090 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4091 						ut_params->op);
4092 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4093 
4094 	ut_params->obuf = ut_params->op->sym->m_dst;
4095 	if (ut_params->obuf)
4096 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4097 	else
4098 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4099 
4100 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4101 
4102 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4103 				(tdata->validCipherOffsetInBits.len >> 3);
4104 	/* Validate obuf */
4105 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4106 		plaintext,
4107 		reference_plaintext,
4108 		tdata->validCipherLenInBits.len,
4109 		"KASUMI Plaintext data not as expected");
4110 	return 0;
4111 }
4112 
4113 static int
4114 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4115 {
4116 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4117 	struct crypto_unittest_params *ut_params = &unittest_params;
4118 
4119 	int retval;
4120 	uint8_t *plaintext, *ciphertext;
4121 	unsigned plaintext_pad_len;
4122 	unsigned plaintext_len;
4123 	struct rte_cryptodev_info dev_info;
4124 
4125 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4126 	uint64_t feat_flags = dev_info.feature_flags;
4127 
4128 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4129 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4130 		printf("Device doesn't support RAW data-path APIs.\n");
4131 		return TEST_SKIPPED;
4132 	}
4133 
4134 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4135 		return TEST_SKIPPED;
4136 
4137 	/* Verify the capabilities */
4138 	struct rte_cryptodev_sym_capability_idx cap_idx;
4139 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4140 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4141 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4142 			&cap_idx) == NULL)
4143 		return TEST_SKIPPED;
4144 
4145 	/* Create SNOW 3G session */
4146 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4147 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4148 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4149 					tdata->key.data, tdata->key.len,
4150 					tdata->cipher_iv.len);
4151 	if (retval < 0)
4152 		return retval;
4153 
4154 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4155 
4156 	/* Clear mbuf payload */
4157 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4158 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4159 
4160 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4161 	/* Append data which is padded to a multiple of */
4162 	/* the algorithms block size */
4163 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4164 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4165 				plaintext_pad_len);
4166 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4167 
4168 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4169 
4170 	/* Create SNOW 3G operation */
4171 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4172 					tdata->cipher_iv.len,
4173 					tdata->validCipherLenInBits.len,
4174 					0);
4175 	if (retval < 0)
4176 		return retval;
4177 
4178 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4179 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4180 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4181 	else
4182 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4183 						ut_params->op);
4184 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4185 
4186 	ut_params->obuf = ut_params->op->sym->m_dst;
4187 	if (ut_params->obuf)
4188 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4189 	else
4190 		ciphertext = plaintext;
4191 
4192 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4193 
4194 	/* Validate obuf */
4195 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4196 		ciphertext,
4197 		tdata->ciphertext.data,
4198 		tdata->validDataLenInBits.len,
4199 		"SNOW 3G Ciphertext data not as expected");
4200 	return 0;
4201 }
4202 
4203 
4204 static int
4205 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4206 {
4207 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4208 	struct crypto_unittest_params *ut_params = &unittest_params;
4209 	uint8_t *plaintext, *ciphertext;
4210 
4211 	int retval;
4212 	unsigned plaintext_pad_len;
4213 	unsigned plaintext_len;
4214 	struct rte_cryptodev_info dev_info;
4215 
4216 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4217 	uint64_t feat_flags = dev_info.feature_flags;
4218 
4219 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4220 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4221 		printf("Device does not support RAW data-path APIs.\n");
4222 		return -ENOTSUP;
4223 	}
4224 
4225 	/* Verify the capabilities */
4226 	struct rte_cryptodev_sym_capability_idx cap_idx;
4227 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4228 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4229 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4230 			&cap_idx) == NULL)
4231 		return TEST_SKIPPED;
4232 
4233 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4234 		return TEST_SKIPPED;
4235 
4236 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4237 		return TEST_SKIPPED;
4238 
4239 	/* Create SNOW 3G session */
4240 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4241 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4242 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4243 					tdata->key.data, tdata->key.len,
4244 					tdata->cipher_iv.len);
4245 	if (retval < 0)
4246 		return retval;
4247 
4248 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4249 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4250 
4251 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4252 			"Failed to allocate input buffer in mempool");
4253 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4254 			"Failed to allocate output buffer in mempool");
4255 
4256 	/* Clear mbuf payload */
4257 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4258 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4259 
4260 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4261 	/* Append data which is padded to a multiple of */
4262 	/* the algorithms block size */
4263 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4264 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4265 				plaintext_pad_len);
4266 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4267 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4268 
4269 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4270 
4271 	/* Create SNOW 3G operation */
4272 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4273 					tdata->cipher_iv.len,
4274 					tdata->validCipherLenInBits.len,
4275 					0);
4276 	if (retval < 0)
4277 		return retval;
4278 
4279 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4280 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4281 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4282 	else
4283 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4284 						ut_params->op);
4285 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4286 
4287 	ut_params->obuf = ut_params->op->sym->m_dst;
4288 	if (ut_params->obuf)
4289 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4290 	else
4291 		ciphertext = plaintext;
4292 
4293 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4294 
4295 	/* Validate obuf */
4296 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4297 		ciphertext,
4298 		tdata->ciphertext.data,
4299 		tdata->validDataLenInBits.len,
4300 		"SNOW 3G Ciphertext data not as expected");
4301 	return 0;
4302 }
4303 
4304 static int
4305 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4306 {
4307 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4308 	struct crypto_unittest_params *ut_params = &unittest_params;
4309 
4310 	int retval;
4311 	unsigned int plaintext_pad_len;
4312 	unsigned int plaintext_len;
4313 	uint8_t buffer[10000];
4314 	const uint8_t *ciphertext;
4315 
4316 	struct rte_cryptodev_info dev_info;
4317 
4318 	/* Verify the capabilities */
4319 	struct rte_cryptodev_sym_capability_idx cap_idx;
4320 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4321 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4322 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4323 			&cap_idx) == NULL)
4324 		return TEST_SKIPPED;
4325 
4326 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4327 		return TEST_SKIPPED;
4328 
4329 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4330 		return TEST_SKIPPED;
4331 
4332 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4333 
4334 	uint64_t feat_flags = dev_info.feature_flags;
4335 
4336 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4337 		printf("Device doesn't support out-of-place scatter-gather "
4338 				"in both input and output mbufs. "
4339 				"Test Skipped.\n");
4340 		return TEST_SKIPPED;
4341 	}
4342 
4343 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4344 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4345 		printf("Device does not support RAW data-path APIs.\n");
4346 		return -ENOTSUP;
4347 	}
4348 
4349 	/* Create SNOW 3G session */
4350 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4351 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4352 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4353 					tdata->key.data, tdata->key.len,
4354 					tdata->cipher_iv.len);
4355 	if (retval < 0)
4356 		return retval;
4357 
4358 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4359 	/* Append data which is padded to a multiple of */
4360 	/* the algorithms block size */
4361 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4362 
4363 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4364 			plaintext_pad_len, 10, 0);
4365 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4366 			plaintext_pad_len, 3, 0);
4367 
4368 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4369 			"Failed to allocate input buffer in mempool");
4370 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4371 			"Failed to allocate output buffer in mempool");
4372 
4373 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4374 
4375 	/* Create SNOW 3G operation */
4376 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4377 					tdata->cipher_iv.len,
4378 					tdata->validCipherLenInBits.len,
4379 					0);
4380 	if (retval < 0)
4381 		return retval;
4382 
4383 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4384 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4385 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4386 	else
4387 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4388 						ut_params->op);
4389 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4390 
4391 	ut_params->obuf = ut_params->op->sym->m_dst;
4392 	if (ut_params->obuf)
4393 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4394 				plaintext_len, buffer);
4395 	else
4396 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4397 				plaintext_len, buffer);
4398 
4399 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4400 
4401 	/* Validate obuf */
4402 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4403 		ciphertext,
4404 		tdata->ciphertext.data,
4405 		tdata->validDataLenInBits.len,
4406 		"SNOW 3G Ciphertext data not as expected");
4407 
4408 	return 0;
4409 }
4410 
4411 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4412 static void
4413 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4414 {
4415 	uint8_t curr_byte, prev_byte;
4416 	uint32_t length_in_bytes = ceil_byte_length(length + offset);
4417 	uint8_t lower_byte_mask = (1 << offset) - 1;
4418 	unsigned i;
4419 
4420 	prev_byte = buffer[0];
4421 	buffer[0] >>= offset;
4422 
4423 	for (i = 1; i < length_in_bytes; i++) {
4424 		curr_byte = buffer[i];
4425 		buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4426 				(curr_byte >> offset);
4427 		prev_byte = curr_byte;
4428 	}
4429 }
4430 
4431 static int
4432 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4433 {
4434 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4435 	struct crypto_unittest_params *ut_params = &unittest_params;
4436 	uint8_t *plaintext, *ciphertext;
4437 	int retval;
4438 	uint32_t plaintext_len;
4439 	uint32_t plaintext_pad_len;
4440 	uint8_t extra_offset = 4;
4441 	uint8_t *expected_ciphertext_shifted;
4442 	struct rte_cryptodev_info dev_info;
4443 
4444 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4445 	uint64_t feat_flags = dev_info.feature_flags;
4446 
4447 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4448 			((tdata->validDataLenInBits.len % 8) != 0)) {
4449 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4450 		return TEST_SKIPPED;
4451 	}
4452 
4453 	/* Verify the capabilities */
4454 	struct rte_cryptodev_sym_capability_idx cap_idx;
4455 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4456 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4457 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4458 			&cap_idx) == NULL)
4459 		return TEST_SKIPPED;
4460 
4461 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4462 		return TEST_SKIPPED;
4463 
4464 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4465 		return TEST_SKIPPED;
4466 
4467 	/* Create SNOW 3G session */
4468 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4469 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4470 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4471 					tdata->key.data, tdata->key.len,
4472 					tdata->cipher_iv.len);
4473 	if (retval < 0)
4474 		return retval;
4475 
4476 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4477 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4478 
4479 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4480 			"Failed to allocate input buffer in mempool");
4481 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4482 			"Failed to allocate output buffer in mempool");
4483 
4484 	/* Clear mbuf payload */
4485 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4486 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4487 
4488 	plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4489 	/*
4490 	 * Append data which is padded to a
4491 	 * multiple of the algorithms block size
4492 	 */
4493 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4494 
4495 	plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4496 						plaintext_pad_len);
4497 
4498 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4499 
4500 	memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4501 	buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4502 
4503 #ifdef RTE_APP_TEST_DEBUG
4504 	rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4505 #endif
4506 	/* Create SNOW 3G operation */
4507 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4508 					tdata->cipher_iv.len,
4509 					tdata->validCipherLenInBits.len,
4510 					extra_offset);
4511 	if (retval < 0)
4512 		return retval;
4513 
4514 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4515 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4516 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4517 	else
4518 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4519 						ut_params->op);
4520 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4521 
4522 	ut_params->obuf = ut_params->op->sym->m_dst;
4523 	if (ut_params->obuf)
4524 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4525 	else
4526 		ciphertext = plaintext;
4527 
4528 #ifdef RTE_APP_TEST_DEBUG
4529 	rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4530 #endif
4531 
4532 	expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4533 
4534 	TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4535 			"failed to reserve memory for ciphertext shifted\n");
4536 
4537 	memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4538 			ceil_byte_length(tdata->ciphertext.len));
4539 	buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4540 			extra_offset);
4541 	/* Validate obuf */
4542 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4543 		ciphertext,
4544 		expected_ciphertext_shifted,
4545 		tdata->validDataLenInBits.len,
4546 		extra_offset,
4547 		"SNOW 3G Ciphertext data not as expected");
4548 	return 0;
4549 }
4550 
4551 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4552 {
4553 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4554 	struct crypto_unittest_params *ut_params = &unittest_params;
4555 
4556 	int retval;
4557 
4558 	uint8_t *plaintext, *ciphertext;
4559 	unsigned ciphertext_pad_len;
4560 	unsigned ciphertext_len;
4561 	struct rte_cryptodev_info dev_info;
4562 
4563 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4564 	uint64_t feat_flags = dev_info.feature_flags;
4565 
4566 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4567 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4568 		printf("Device doesn't support RAW data-path APIs.\n");
4569 		return TEST_SKIPPED;
4570 	}
4571 
4572 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4573 		return TEST_SKIPPED;
4574 
4575 	/* Verify the capabilities */
4576 	struct rte_cryptodev_sym_capability_idx cap_idx;
4577 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4578 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4579 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4580 			&cap_idx) == NULL)
4581 		return TEST_SKIPPED;
4582 
4583 	/* Create SNOW 3G session */
4584 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4585 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4586 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4587 					tdata->key.data, tdata->key.len,
4588 					tdata->cipher_iv.len);
4589 	if (retval < 0)
4590 		return retval;
4591 
4592 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4593 
4594 	/* Clear mbuf payload */
4595 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4596 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4597 
4598 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4599 	/* Append data which is padded to a multiple of */
4600 	/* the algorithms block size */
4601 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4602 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4603 				ciphertext_pad_len);
4604 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4605 
4606 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4607 
4608 	/* Create SNOW 3G operation */
4609 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4610 					tdata->cipher_iv.len,
4611 					tdata->validCipherLenInBits.len,
4612 					tdata->cipher.offset_bits);
4613 	if (retval < 0)
4614 		return retval;
4615 
4616 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4617 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4618 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4619 	else
4620 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4621 						ut_params->op);
4622 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4623 	ut_params->obuf = ut_params->op->sym->m_dst;
4624 	if (ut_params->obuf)
4625 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4626 	else
4627 		plaintext = ciphertext;
4628 
4629 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4630 
4631 	/* Validate obuf */
4632 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4633 				tdata->plaintext.data,
4634 				tdata->validDataLenInBits.len,
4635 				"SNOW 3G Plaintext data not as expected");
4636 	return 0;
4637 }
4638 
4639 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4640 {
4641 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4642 	struct crypto_unittest_params *ut_params = &unittest_params;
4643 
4644 	int retval;
4645 
4646 	uint8_t *plaintext, *ciphertext;
4647 	unsigned ciphertext_pad_len;
4648 	unsigned ciphertext_len;
4649 	struct rte_cryptodev_info dev_info;
4650 
4651 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4652 	uint64_t feat_flags = dev_info.feature_flags;
4653 
4654 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4655 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4656 		printf("Device does not support RAW data-path APIs.\n");
4657 		return -ENOTSUP;
4658 	}
4659 	/* Verify the capabilities */
4660 	struct rte_cryptodev_sym_capability_idx cap_idx;
4661 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4662 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4663 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4664 			&cap_idx) == NULL)
4665 		return TEST_SKIPPED;
4666 
4667 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4668 		return TEST_SKIPPED;
4669 
4670 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4671 		return TEST_SKIPPED;
4672 
4673 	/* Create SNOW 3G session */
4674 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4675 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4676 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4677 					tdata->key.data, tdata->key.len,
4678 					tdata->cipher_iv.len);
4679 	if (retval < 0)
4680 		return retval;
4681 
4682 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4683 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4684 
4685 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4686 			"Failed to allocate input buffer");
4687 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4688 			"Failed to allocate output buffer");
4689 
4690 	/* Clear mbuf payload */
4691 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4692 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4693 
4694 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4695 		       rte_pktmbuf_tailroom(ut_params->obuf));
4696 
4697 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4698 	/* Append data which is padded to a multiple of */
4699 	/* the algorithms block size */
4700 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4701 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4702 				ciphertext_pad_len);
4703 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4704 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4705 
4706 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4707 
4708 	/* Create SNOW 3G operation */
4709 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4710 					tdata->cipher_iv.len,
4711 					tdata->validCipherLenInBits.len,
4712 					0);
4713 	if (retval < 0)
4714 		return retval;
4715 
4716 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4717 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4718 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4719 	else
4720 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4721 						ut_params->op);
4722 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4723 	ut_params->obuf = ut_params->op->sym->m_dst;
4724 	if (ut_params->obuf)
4725 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4726 	else
4727 		plaintext = ciphertext;
4728 
4729 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4730 
4731 	/* Validate obuf */
4732 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4733 				tdata->plaintext.data,
4734 				tdata->validDataLenInBits.len,
4735 				"SNOW 3G Plaintext data not as expected");
4736 	return 0;
4737 }
4738 
4739 static int
4740 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4741 {
4742 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4743 	struct crypto_unittest_params *ut_params = &unittest_params;
4744 
4745 	int retval;
4746 
4747 	uint8_t *plaintext, *ciphertext;
4748 	unsigned int plaintext_pad_len;
4749 	unsigned int plaintext_len;
4750 
4751 	struct rte_cryptodev_info dev_info;
4752 	struct rte_cryptodev_sym_capability_idx cap_idx;
4753 
4754 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4755 	uint64_t feat_flags = dev_info.feature_flags;
4756 
4757 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4758 			((tdata->validAuthLenInBits.len % 8 != 0) ||
4759 			(tdata->validDataLenInBits.len % 8 != 0))) {
4760 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4761 		return TEST_SKIPPED;
4762 	}
4763 
4764 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4765 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4766 		printf("Device doesn't support RAW data-path APIs.\n");
4767 		return TEST_SKIPPED;
4768 	}
4769 
4770 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4771 		return TEST_SKIPPED;
4772 
4773 	/* Check if device supports ZUC EEA3 */
4774 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4775 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4776 
4777 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4778 			&cap_idx) == NULL)
4779 		return TEST_SKIPPED;
4780 
4781 	/* Check if device supports ZUC EIA3 */
4782 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4783 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4784 
4785 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4786 			&cap_idx) == NULL)
4787 		return TEST_SKIPPED;
4788 
4789 	/* Create ZUC session */
4790 	retval = create_zuc_cipher_auth_encrypt_generate_session(
4791 			ts_params->valid_devs[0],
4792 			tdata);
4793 	if (retval != 0)
4794 		return retval;
4795 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4796 
4797 	/* clear mbuf payload */
4798 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4799 			rte_pktmbuf_tailroom(ut_params->ibuf));
4800 
4801 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4802 	/* Append data which is padded to a multiple of */
4803 	/* the algorithms block size */
4804 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4805 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4806 				plaintext_pad_len);
4807 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4808 
4809 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4810 
4811 	/* Create ZUC operation */
4812 	retval = create_zuc_cipher_hash_generate_operation(tdata);
4813 	if (retval < 0)
4814 		return retval;
4815 
4816 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4817 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4818 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4819 	else
4820 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4821 			ut_params->op);
4822 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4823 	ut_params->obuf = ut_params->op->sym->m_src;
4824 	if (ut_params->obuf)
4825 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4826 	else
4827 		ciphertext = plaintext;
4828 
4829 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4830 	/* Validate obuf */
4831 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4832 			ciphertext,
4833 			tdata->ciphertext.data,
4834 			tdata->validDataLenInBits.len,
4835 			"ZUC Ciphertext data not as expected");
4836 
4837 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4838 	    + plaintext_pad_len;
4839 
4840 	/* Validate obuf */
4841 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4842 			ut_params->digest,
4843 			tdata->digest.data,
4844 			4,
4845 			"ZUC Generated auth tag not as expected");
4846 	return 0;
4847 }
4848 
4849 static int
4850 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4851 {
4852 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4853 	struct crypto_unittest_params *ut_params = &unittest_params;
4854 
4855 	int retval;
4856 
4857 	uint8_t *plaintext, *ciphertext;
4858 	unsigned plaintext_pad_len;
4859 	unsigned plaintext_len;
4860 	struct rte_cryptodev_info dev_info;
4861 
4862 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4863 	uint64_t feat_flags = dev_info.feature_flags;
4864 
4865 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4866 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4867 		printf("Device doesn't support RAW data-path APIs.\n");
4868 		return TEST_SKIPPED;
4869 	}
4870 
4871 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4872 		return TEST_SKIPPED;
4873 
4874 	/* Verify the capabilities */
4875 	struct rte_cryptodev_sym_capability_idx cap_idx;
4876 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4877 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4878 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4879 			&cap_idx) == NULL)
4880 		return TEST_SKIPPED;
4881 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4882 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4883 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4884 			&cap_idx) == NULL)
4885 		return TEST_SKIPPED;
4886 
4887 	/* Create SNOW 3G session */
4888 	retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4889 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4890 			RTE_CRYPTO_AUTH_OP_GENERATE,
4891 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4892 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4893 			tdata->key.data, tdata->key.len,
4894 			tdata->auth_iv.len, tdata->digest.len,
4895 			tdata->cipher_iv.len);
4896 	if (retval != 0)
4897 		return retval;
4898 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4899 
4900 	/* clear mbuf payload */
4901 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4902 			rte_pktmbuf_tailroom(ut_params->ibuf));
4903 
4904 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4905 	/* Append data which is padded to a multiple of */
4906 	/* the algorithms block size */
4907 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4908 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4909 				plaintext_pad_len);
4910 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4911 
4912 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4913 
4914 	/* Create SNOW 3G operation */
4915 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4916 			tdata->digest.len, tdata->auth_iv.data,
4917 			tdata->auth_iv.len,
4918 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4919 			tdata->cipher_iv.data, tdata->cipher_iv.len,
4920 			tdata->validCipherLenInBits.len,
4921 			0,
4922 			tdata->validAuthLenInBits.len,
4923 			0
4924 			);
4925 	if (retval < 0)
4926 		return retval;
4927 
4928 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4929 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4930 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4931 	else
4932 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4933 			ut_params->op);
4934 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4935 	ut_params->obuf = ut_params->op->sym->m_src;
4936 	if (ut_params->obuf)
4937 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4938 	else
4939 		ciphertext = plaintext;
4940 
4941 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4942 	/* Validate obuf */
4943 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4944 			ciphertext,
4945 			tdata->ciphertext.data,
4946 			tdata->validDataLenInBits.len,
4947 			"SNOW 3G Ciphertext data not as expected");
4948 
4949 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4950 	    + plaintext_pad_len;
4951 
4952 	/* Validate obuf */
4953 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4954 			ut_params->digest,
4955 			tdata->digest.data,
4956 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4957 			"SNOW 3G Generated auth tag not as expected");
4958 	return 0;
4959 }
4960 
4961 static int
4962 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4963 	uint8_t op_mode, uint8_t verify)
4964 {
4965 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4966 	struct crypto_unittest_params *ut_params = &unittest_params;
4967 
4968 	int retval;
4969 
4970 	uint8_t *plaintext = NULL, *ciphertext = NULL;
4971 	unsigned int plaintext_pad_len;
4972 	unsigned int plaintext_len;
4973 	unsigned int ciphertext_pad_len;
4974 	unsigned int ciphertext_len;
4975 
4976 	struct rte_cryptodev_info dev_info;
4977 
4978 	/* Verify the capabilities */
4979 	struct rte_cryptodev_sym_capability_idx cap_idx;
4980 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4981 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4982 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4983 			&cap_idx) == NULL)
4984 		return TEST_SKIPPED;
4985 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4986 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4987 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4988 			&cap_idx) == NULL)
4989 		return TEST_SKIPPED;
4990 
4991 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4992 		return TEST_SKIPPED;
4993 
4994 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4995 
4996 	uint64_t feat_flags = dev_info.feature_flags;
4997 
4998 	if (op_mode == OUT_OF_PLACE) {
4999 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5000 			printf("Device doesn't support digest encrypted.\n");
5001 			return TEST_SKIPPED;
5002 		}
5003 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5004 			return TEST_SKIPPED;
5005 	}
5006 
5007 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5008 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5009 		printf("Device doesn't support RAW data-path APIs.\n");
5010 		return TEST_SKIPPED;
5011 	}
5012 
5013 	/* Create SNOW 3G session */
5014 	retval = create_wireless_algo_auth_cipher_session(
5015 			ts_params->valid_devs[0],
5016 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5017 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5018 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5019 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5020 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5021 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5022 			tdata->key.data, tdata->key.len,
5023 			tdata->auth_iv.len, tdata->digest.len,
5024 			tdata->cipher_iv.len);
5025 	if (retval != 0)
5026 		return retval;
5027 
5028 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5029 	if (op_mode == OUT_OF_PLACE)
5030 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5031 
5032 	/* clear mbuf payload */
5033 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5034 		rte_pktmbuf_tailroom(ut_params->ibuf));
5035 	if (op_mode == OUT_OF_PLACE)
5036 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5037 			rte_pktmbuf_tailroom(ut_params->obuf));
5038 
5039 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5040 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5041 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5042 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5043 
5044 	if (verify) {
5045 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5046 					ciphertext_pad_len);
5047 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5048 		if (op_mode == OUT_OF_PLACE)
5049 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5050 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5051 			ciphertext_len);
5052 	} else {
5053 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5054 					plaintext_pad_len);
5055 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5056 		if (op_mode == OUT_OF_PLACE)
5057 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5058 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5059 	}
5060 
5061 	/* Create SNOW 3G operation */
5062 	retval = create_wireless_algo_auth_cipher_operation(
5063 		tdata->digest.data, tdata->digest.len,
5064 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5065 		tdata->auth_iv.data, tdata->auth_iv.len,
5066 		(tdata->digest.offset_bytes == 0 ?
5067 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5068 			: tdata->digest.offset_bytes),
5069 		tdata->validCipherLenInBits.len,
5070 		tdata->cipher.offset_bits,
5071 		tdata->validAuthLenInBits.len,
5072 		tdata->auth.offset_bits,
5073 		op_mode, 0, verify);
5074 
5075 	if (retval < 0)
5076 		return retval;
5077 
5078 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5079 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5080 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5081 	else
5082 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5083 			ut_params->op);
5084 
5085 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5086 
5087 	ut_params->obuf = (op_mode == IN_PLACE ?
5088 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5089 
5090 	if (verify) {
5091 		if (ut_params->obuf)
5092 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5093 							uint8_t *);
5094 		else
5095 			plaintext = ciphertext +
5096 				(tdata->cipher.offset_bits >> 3);
5097 
5098 		debug_hexdump(stdout, "plaintext:", plaintext,
5099 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5100 		debug_hexdump(stdout, "plaintext expected:",
5101 			tdata->plaintext.data,
5102 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5103 	} else {
5104 		if (ut_params->obuf)
5105 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5106 							uint8_t *);
5107 		else
5108 			ciphertext = plaintext;
5109 
5110 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5111 			ciphertext_len);
5112 		debug_hexdump(stdout, "ciphertext expected:",
5113 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5114 
5115 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5116 			+ (tdata->digest.offset_bytes == 0 ?
5117 		plaintext_pad_len : tdata->digest.offset_bytes);
5118 
5119 		debug_hexdump(stdout, "digest:", ut_params->digest,
5120 			tdata->digest.len);
5121 		debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5122 				tdata->digest.len);
5123 	}
5124 
5125 	/* Validate obuf */
5126 	if (verify) {
5127 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5128 			plaintext,
5129 			tdata->plaintext.data,
5130 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5131 			 (tdata->digest.len << 3)),
5132 			tdata->cipher.offset_bits,
5133 			"SNOW 3G Plaintext data not as expected");
5134 	} else {
5135 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5136 			ciphertext,
5137 			tdata->ciphertext.data,
5138 			(tdata->validDataLenInBits.len -
5139 			 tdata->cipher.offset_bits),
5140 			tdata->cipher.offset_bits,
5141 			"SNOW 3G Ciphertext data not as expected");
5142 
5143 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5144 			ut_params->digest,
5145 			tdata->digest.data,
5146 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5147 			"SNOW 3G Generated auth tag not as expected");
5148 	}
5149 	return 0;
5150 }
5151 
5152 static int
5153 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5154 	uint8_t op_mode, uint8_t verify)
5155 {
5156 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5157 	struct crypto_unittest_params *ut_params = &unittest_params;
5158 
5159 	int retval;
5160 
5161 	const uint8_t *plaintext = NULL;
5162 	const uint8_t *ciphertext = NULL;
5163 	const uint8_t *digest = NULL;
5164 	unsigned int plaintext_pad_len;
5165 	unsigned int plaintext_len;
5166 	unsigned int ciphertext_pad_len;
5167 	unsigned int ciphertext_len;
5168 	uint8_t buffer[10000];
5169 	uint8_t digest_buffer[10000];
5170 
5171 	struct rte_cryptodev_info dev_info;
5172 
5173 	/* Verify the capabilities */
5174 	struct rte_cryptodev_sym_capability_idx cap_idx;
5175 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5176 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5177 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5178 			&cap_idx) == NULL)
5179 		return TEST_SKIPPED;
5180 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5181 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5182 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5183 			&cap_idx) == NULL)
5184 		return TEST_SKIPPED;
5185 
5186 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5187 		return TEST_SKIPPED;
5188 
5189 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5190 
5191 	uint64_t feat_flags = dev_info.feature_flags;
5192 
5193 	if (op_mode == IN_PLACE) {
5194 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5195 			printf("Device doesn't support in-place scatter-gather "
5196 					"in both input and output mbufs.\n");
5197 			return TEST_SKIPPED;
5198 		}
5199 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5200 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5201 			printf("Device doesn't support RAW data-path APIs.\n");
5202 			return TEST_SKIPPED;
5203 		}
5204 	} else {
5205 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5206 			return TEST_SKIPPED;
5207 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5208 			printf("Device doesn't support out-of-place scatter-gather "
5209 					"in both input and output mbufs.\n");
5210 			return TEST_SKIPPED;
5211 		}
5212 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5213 			printf("Device doesn't support digest encrypted.\n");
5214 			return TEST_SKIPPED;
5215 		}
5216 	}
5217 
5218 	/* Create SNOW 3G session */
5219 	retval = create_wireless_algo_auth_cipher_session(
5220 			ts_params->valid_devs[0],
5221 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5222 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5223 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5224 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5225 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5226 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5227 			tdata->key.data, tdata->key.len,
5228 			tdata->auth_iv.len, tdata->digest.len,
5229 			tdata->cipher_iv.len);
5230 
5231 	if (retval != 0)
5232 		return retval;
5233 
5234 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5235 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5236 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5237 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5238 
5239 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5240 			plaintext_pad_len, 15, 0);
5241 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5242 			"Failed to allocate input buffer in mempool");
5243 
5244 	if (op_mode == OUT_OF_PLACE) {
5245 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5246 				plaintext_pad_len, 15, 0);
5247 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5248 				"Failed to allocate output buffer in mempool");
5249 	}
5250 
5251 	if (verify) {
5252 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5253 			tdata->ciphertext.data);
5254 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5255 					ciphertext_len, buffer);
5256 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5257 			ciphertext_len);
5258 	} else {
5259 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5260 			tdata->plaintext.data);
5261 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5262 					plaintext_len, buffer);
5263 		debug_hexdump(stdout, "plaintext:", plaintext,
5264 			plaintext_len);
5265 	}
5266 	memset(buffer, 0, sizeof(buffer));
5267 
5268 	/* Create SNOW 3G operation */
5269 	retval = create_wireless_algo_auth_cipher_operation(
5270 		tdata->digest.data, tdata->digest.len,
5271 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5272 		tdata->auth_iv.data, tdata->auth_iv.len,
5273 		(tdata->digest.offset_bytes == 0 ?
5274 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5275 			: tdata->digest.offset_bytes),
5276 		tdata->validCipherLenInBits.len,
5277 		tdata->cipher.offset_bits,
5278 		tdata->validAuthLenInBits.len,
5279 		tdata->auth.offset_bits,
5280 		op_mode, 1, verify);
5281 
5282 	if (retval < 0)
5283 		return retval;
5284 
5285 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5286 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5287 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5288 	else
5289 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5290 			ut_params->op);
5291 
5292 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5293 
5294 	ut_params->obuf = (op_mode == IN_PLACE ?
5295 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5296 
5297 	if (verify) {
5298 		if (ut_params->obuf)
5299 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5300 					plaintext_len, buffer);
5301 		else
5302 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5303 					plaintext_len, buffer);
5304 
5305 		debug_hexdump(stdout, "plaintext:", plaintext,
5306 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5307 		debug_hexdump(stdout, "plaintext expected:",
5308 			tdata->plaintext.data,
5309 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5310 	} else {
5311 		if (ut_params->obuf)
5312 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5313 					ciphertext_len, buffer);
5314 		else
5315 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5316 					ciphertext_len, buffer);
5317 
5318 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5319 			ciphertext_len);
5320 		debug_hexdump(stdout, "ciphertext expected:",
5321 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5322 
5323 		if (ut_params->obuf)
5324 			digest = rte_pktmbuf_read(ut_params->obuf,
5325 				(tdata->digest.offset_bytes == 0 ?
5326 				plaintext_pad_len : tdata->digest.offset_bytes),
5327 				tdata->digest.len, digest_buffer);
5328 		else
5329 			digest = rte_pktmbuf_read(ut_params->ibuf,
5330 				(tdata->digest.offset_bytes == 0 ?
5331 				plaintext_pad_len : tdata->digest.offset_bytes),
5332 				tdata->digest.len, digest_buffer);
5333 
5334 		debug_hexdump(stdout, "digest:", digest,
5335 			tdata->digest.len);
5336 		debug_hexdump(stdout, "digest expected:",
5337 			tdata->digest.data, tdata->digest.len);
5338 	}
5339 
5340 	/* Validate obuf */
5341 	if (verify) {
5342 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5343 			plaintext,
5344 			tdata->plaintext.data,
5345 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5346 			 (tdata->digest.len << 3)),
5347 			tdata->cipher.offset_bits,
5348 			"SNOW 3G Plaintext data not as expected");
5349 	} else {
5350 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5351 			ciphertext,
5352 			tdata->ciphertext.data,
5353 			(tdata->validDataLenInBits.len -
5354 			 tdata->cipher.offset_bits),
5355 			tdata->cipher.offset_bits,
5356 			"SNOW 3G Ciphertext data not as expected");
5357 
5358 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5359 			digest,
5360 			tdata->digest.data,
5361 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5362 			"SNOW 3G Generated auth tag not as expected");
5363 	}
5364 	return 0;
5365 }
5366 
5367 static int
5368 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5369 	uint8_t op_mode, uint8_t verify)
5370 {
5371 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5372 	struct crypto_unittest_params *ut_params = &unittest_params;
5373 
5374 	int retval;
5375 
5376 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5377 	unsigned int plaintext_pad_len;
5378 	unsigned int plaintext_len;
5379 	unsigned int ciphertext_pad_len;
5380 	unsigned int ciphertext_len;
5381 
5382 	struct rte_cryptodev_info dev_info;
5383 
5384 	/* Verify the capabilities */
5385 	struct rte_cryptodev_sym_capability_idx cap_idx;
5386 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5387 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5388 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5389 			&cap_idx) == NULL)
5390 		return TEST_SKIPPED;
5391 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5392 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5393 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5394 			&cap_idx) == NULL)
5395 		return TEST_SKIPPED;
5396 
5397 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5398 
5399 	uint64_t feat_flags = dev_info.feature_flags;
5400 
5401 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5402 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5403 		printf("Device doesn't support RAW data-path APIs.\n");
5404 		return TEST_SKIPPED;
5405 	}
5406 
5407 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5408 		return TEST_SKIPPED;
5409 
5410 	if (op_mode == OUT_OF_PLACE) {
5411 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5412 			return TEST_SKIPPED;
5413 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5414 			printf("Device doesn't support digest encrypted.\n");
5415 			return TEST_SKIPPED;
5416 		}
5417 	}
5418 
5419 	/* Create KASUMI session */
5420 	retval = create_wireless_algo_auth_cipher_session(
5421 			ts_params->valid_devs[0],
5422 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5423 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5424 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5425 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5426 			RTE_CRYPTO_AUTH_KASUMI_F9,
5427 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5428 			tdata->key.data, tdata->key.len,
5429 			0, tdata->digest.len,
5430 			tdata->cipher_iv.len);
5431 
5432 	if (retval != 0)
5433 		return retval;
5434 
5435 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5436 	if (op_mode == OUT_OF_PLACE)
5437 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5438 
5439 	/* clear mbuf payload */
5440 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5441 		rte_pktmbuf_tailroom(ut_params->ibuf));
5442 	if (op_mode == OUT_OF_PLACE)
5443 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5444 			rte_pktmbuf_tailroom(ut_params->obuf));
5445 
5446 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5447 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5448 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5449 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5450 
5451 	if (verify) {
5452 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5453 					ciphertext_pad_len);
5454 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5455 		if (op_mode == OUT_OF_PLACE)
5456 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5457 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5458 			ciphertext_len);
5459 	} else {
5460 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5461 					plaintext_pad_len);
5462 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5463 		if (op_mode == OUT_OF_PLACE)
5464 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5465 		debug_hexdump(stdout, "plaintext:", plaintext,
5466 			plaintext_len);
5467 	}
5468 
5469 	/* Create KASUMI operation */
5470 	retval = create_wireless_algo_auth_cipher_operation(
5471 		tdata->digest.data, tdata->digest.len,
5472 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5473 		NULL, 0,
5474 		(tdata->digest.offset_bytes == 0 ?
5475 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5476 			: tdata->digest.offset_bytes),
5477 		tdata->validCipherLenInBits.len,
5478 		tdata->validCipherOffsetInBits.len,
5479 		tdata->validAuthLenInBits.len,
5480 		0,
5481 		op_mode, 0, verify);
5482 
5483 	if (retval < 0)
5484 		return retval;
5485 
5486 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5487 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5488 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5489 	else
5490 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5491 			ut_params->op);
5492 
5493 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5494 
5495 	ut_params->obuf = (op_mode == IN_PLACE ?
5496 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5497 
5498 
5499 	if (verify) {
5500 		if (ut_params->obuf)
5501 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5502 							uint8_t *);
5503 		else
5504 			plaintext = ciphertext;
5505 
5506 		debug_hexdump(stdout, "plaintext:", plaintext,
5507 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5508 		debug_hexdump(stdout, "plaintext expected:",
5509 			tdata->plaintext.data,
5510 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5511 	} else {
5512 		if (ut_params->obuf)
5513 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5514 							uint8_t *);
5515 		else
5516 			ciphertext = plaintext;
5517 
5518 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5519 			ciphertext_len);
5520 		debug_hexdump(stdout, "ciphertext expected:",
5521 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5522 
5523 		ut_params->digest = rte_pktmbuf_mtod(
5524 			ut_params->obuf, uint8_t *) +
5525 			(tdata->digest.offset_bytes == 0 ?
5526 			plaintext_pad_len : tdata->digest.offset_bytes);
5527 
5528 		debug_hexdump(stdout, "digest:", ut_params->digest,
5529 			tdata->digest.len);
5530 		debug_hexdump(stdout, "digest expected:",
5531 			tdata->digest.data, tdata->digest.len);
5532 	}
5533 
5534 	/* Validate obuf */
5535 	if (verify) {
5536 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5537 			plaintext,
5538 			tdata->plaintext.data,
5539 			tdata->plaintext.len >> 3,
5540 			"KASUMI Plaintext data not as expected");
5541 	} else {
5542 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5543 			ciphertext,
5544 			tdata->ciphertext.data,
5545 			tdata->ciphertext.len >> 3,
5546 			"KASUMI Ciphertext data not as expected");
5547 
5548 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5549 			ut_params->digest,
5550 			tdata->digest.data,
5551 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5552 			"KASUMI Generated auth tag not as expected");
5553 	}
5554 	return 0;
5555 }
5556 
5557 static int
5558 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5559 	uint8_t op_mode, uint8_t verify)
5560 {
5561 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5562 	struct crypto_unittest_params *ut_params = &unittest_params;
5563 
5564 	int retval;
5565 
5566 	const uint8_t *plaintext = NULL;
5567 	const uint8_t *ciphertext = NULL;
5568 	const uint8_t *digest = NULL;
5569 	unsigned int plaintext_pad_len;
5570 	unsigned int plaintext_len;
5571 	unsigned int ciphertext_pad_len;
5572 	unsigned int ciphertext_len;
5573 	uint8_t buffer[10000];
5574 	uint8_t digest_buffer[10000];
5575 
5576 	struct rte_cryptodev_info dev_info;
5577 
5578 	/* Verify the capabilities */
5579 	struct rte_cryptodev_sym_capability_idx cap_idx;
5580 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5581 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5582 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5583 			&cap_idx) == NULL)
5584 		return TEST_SKIPPED;
5585 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5586 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5587 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5588 			&cap_idx) == NULL)
5589 		return TEST_SKIPPED;
5590 
5591 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5592 		return TEST_SKIPPED;
5593 
5594 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5595 
5596 	uint64_t feat_flags = dev_info.feature_flags;
5597 
5598 	if (op_mode == IN_PLACE) {
5599 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5600 			printf("Device doesn't support in-place scatter-gather "
5601 					"in both input and output mbufs.\n");
5602 			return TEST_SKIPPED;
5603 		}
5604 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5605 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5606 			printf("Device doesn't support RAW data-path APIs.\n");
5607 			return TEST_SKIPPED;
5608 		}
5609 	} else {
5610 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5611 			return TEST_SKIPPED;
5612 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5613 			printf("Device doesn't support out-of-place scatter-gather "
5614 					"in both input and output mbufs.\n");
5615 			return TEST_SKIPPED;
5616 		}
5617 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5618 			printf("Device doesn't support digest encrypted.\n");
5619 			return TEST_SKIPPED;
5620 		}
5621 	}
5622 
5623 	/* Create KASUMI session */
5624 	retval = create_wireless_algo_auth_cipher_session(
5625 			ts_params->valid_devs[0],
5626 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5627 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5628 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5629 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5630 			RTE_CRYPTO_AUTH_KASUMI_F9,
5631 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5632 			tdata->key.data, tdata->key.len,
5633 			0, tdata->digest.len,
5634 			tdata->cipher_iv.len);
5635 
5636 	if (retval != 0)
5637 		return retval;
5638 
5639 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5640 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5641 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5642 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5643 
5644 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5645 			plaintext_pad_len, 15, 0);
5646 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5647 			"Failed to allocate input buffer in mempool");
5648 
5649 	if (op_mode == OUT_OF_PLACE) {
5650 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5651 				plaintext_pad_len, 15, 0);
5652 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5653 				"Failed to allocate output buffer in mempool");
5654 	}
5655 
5656 	if (verify) {
5657 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5658 			tdata->ciphertext.data);
5659 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5660 					ciphertext_len, buffer);
5661 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5662 			ciphertext_len);
5663 	} else {
5664 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5665 			tdata->plaintext.data);
5666 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5667 					plaintext_len, buffer);
5668 		debug_hexdump(stdout, "plaintext:", plaintext,
5669 			plaintext_len);
5670 	}
5671 	memset(buffer, 0, sizeof(buffer));
5672 
5673 	/* Create KASUMI operation */
5674 	retval = create_wireless_algo_auth_cipher_operation(
5675 		tdata->digest.data, tdata->digest.len,
5676 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5677 		NULL, 0,
5678 		(tdata->digest.offset_bytes == 0 ?
5679 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5680 			: tdata->digest.offset_bytes),
5681 		tdata->validCipherLenInBits.len,
5682 		tdata->validCipherOffsetInBits.len,
5683 		tdata->validAuthLenInBits.len,
5684 		0,
5685 		op_mode, 1, verify);
5686 
5687 	if (retval < 0)
5688 		return retval;
5689 
5690 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5691 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5692 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5693 	else
5694 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5695 			ut_params->op);
5696 
5697 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5698 
5699 	ut_params->obuf = (op_mode == IN_PLACE ?
5700 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5701 
5702 	if (verify) {
5703 		if (ut_params->obuf)
5704 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5705 					plaintext_len, buffer);
5706 		else
5707 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5708 					plaintext_len, buffer);
5709 
5710 		debug_hexdump(stdout, "plaintext:", plaintext,
5711 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5712 		debug_hexdump(stdout, "plaintext expected:",
5713 			tdata->plaintext.data,
5714 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5715 	} else {
5716 		if (ut_params->obuf)
5717 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5718 					ciphertext_len, buffer);
5719 		else
5720 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5721 					ciphertext_len, buffer);
5722 
5723 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5724 			ciphertext_len);
5725 		debug_hexdump(stdout, "ciphertext expected:",
5726 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5727 
5728 		if (ut_params->obuf)
5729 			digest = rte_pktmbuf_read(ut_params->obuf,
5730 				(tdata->digest.offset_bytes == 0 ?
5731 				plaintext_pad_len : tdata->digest.offset_bytes),
5732 				tdata->digest.len, digest_buffer);
5733 		else
5734 			digest = rte_pktmbuf_read(ut_params->ibuf,
5735 				(tdata->digest.offset_bytes == 0 ?
5736 				plaintext_pad_len : tdata->digest.offset_bytes),
5737 				tdata->digest.len, digest_buffer);
5738 
5739 		debug_hexdump(stdout, "digest:", digest,
5740 			tdata->digest.len);
5741 		debug_hexdump(stdout, "digest expected:",
5742 			tdata->digest.data, tdata->digest.len);
5743 	}
5744 
5745 	/* Validate obuf */
5746 	if (verify) {
5747 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5748 			plaintext,
5749 			tdata->plaintext.data,
5750 			tdata->plaintext.len >> 3,
5751 			"KASUMI Plaintext data not as expected");
5752 	} else {
5753 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5754 			ciphertext,
5755 			tdata->ciphertext.data,
5756 			tdata->validDataLenInBits.len,
5757 			"KASUMI Ciphertext data not as expected");
5758 
5759 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5760 			digest,
5761 			tdata->digest.data,
5762 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5763 			"KASUMI Generated auth tag not as expected");
5764 	}
5765 	return 0;
5766 }
5767 
5768 static int
5769 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5770 {
5771 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5772 	struct crypto_unittest_params *ut_params = &unittest_params;
5773 
5774 	int retval;
5775 
5776 	uint8_t *plaintext, *ciphertext;
5777 	unsigned plaintext_pad_len;
5778 	unsigned plaintext_len;
5779 	struct rte_cryptodev_info dev_info;
5780 
5781 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5782 	uint64_t feat_flags = dev_info.feature_flags;
5783 
5784 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5785 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5786 		printf("Device doesn't support RAW data-path APIs.\n");
5787 		return TEST_SKIPPED;
5788 	}
5789 
5790 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5791 		return TEST_SKIPPED;
5792 
5793 	/* Verify the capabilities */
5794 	struct rte_cryptodev_sym_capability_idx cap_idx;
5795 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5796 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5797 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5798 			&cap_idx) == NULL)
5799 		return TEST_SKIPPED;
5800 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5801 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5802 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5803 			&cap_idx) == NULL)
5804 		return TEST_SKIPPED;
5805 
5806 	/* Create KASUMI session */
5807 	retval = create_wireless_algo_cipher_auth_session(
5808 			ts_params->valid_devs[0],
5809 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5810 			RTE_CRYPTO_AUTH_OP_GENERATE,
5811 			RTE_CRYPTO_AUTH_KASUMI_F9,
5812 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5813 			tdata->key.data, tdata->key.len,
5814 			0, tdata->digest.len,
5815 			tdata->cipher_iv.len);
5816 	if (retval != 0)
5817 		return retval;
5818 
5819 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5820 
5821 	/* clear mbuf payload */
5822 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5823 			rte_pktmbuf_tailroom(ut_params->ibuf));
5824 
5825 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5826 	/* Append data which is padded to a multiple of */
5827 	/* the algorithms block size */
5828 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5829 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5830 				plaintext_pad_len);
5831 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5832 
5833 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5834 
5835 	/* Create KASUMI operation */
5836 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5837 				tdata->digest.len, NULL, 0,
5838 				plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5839 				tdata->cipher_iv.data, tdata->cipher_iv.len,
5840 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5841 				tdata->validCipherOffsetInBits.len,
5842 				tdata->validAuthLenInBits.len,
5843 				0
5844 				);
5845 	if (retval < 0)
5846 		return retval;
5847 
5848 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5849 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5850 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5851 	else
5852 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5853 			ut_params->op);
5854 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5855 
5856 	if (ut_params->op->sym->m_dst)
5857 		ut_params->obuf = ut_params->op->sym->m_dst;
5858 	else
5859 		ut_params->obuf = ut_params->op->sym->m_src;
5860 
5861 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5862 				tdata->validCipherOffsetInBits.len >> 3);
5863 
5864 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5865 			+ plaintext_pad_len;
5866 
5867 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5868 				(tdata->validCipherOffsetInBits.len >> 3);
5869 	/* Validate obuf */
5870 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5871 		ciphertext,
5872 		reference_ciphertext,
5873 		tdata->validCipherLenInBits.len,
5874 		"KASUMI Ciphertext data not as expected");
5875 
5876 	/* Validate obuf */
5877 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5878 		ut_params->digest,
5879 		tdata->digest.data,
5880 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5881 		"KASUMI Generated auth tag not as expected");
5882 	return 0;
5883 }
5884 
5885 static int
5886 check_cipher_capability(const struct crypto_testsuite_params *ts_params,
5887 			const enum rte_crypto_cipher_algorithm cipher_algo,
5888 			const uint16_t key_size, const uint16_t iv_size)
5889 {
5890 	struct rte_cryptodev_sym_capability_idx cap_idx;
5891 	const struct rte_cryptodev_symmetric_capability *cap;
5892 
5893 	/* Check if device supports the algorithm */
5894 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5895 	cap_idx.algo.cipher = cipher_algo;
5896 
5897 	cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5898 			&cap_idx);
5899 
5900 	if (cap == NULL)
5901 		return -1;
5902 
5903 	/* Check if device supports key size and IV size */
5904 	if (rte_cryptodev_sym_capability_check_cipher(cap, key_size,
5905 			iv_size) < 0) {
5906 		return -1;
5907 	}
5908 
5909 	return 0;
5910 }
5911 
5912 static int
5913 check_auth_capability(const struct crypto_testsuite_params *ts_params,
5914 			const enum rte_crypto_auth_algorithm auth_algo,
5915 			const uint16_t key_size, const uint16_t iv_size,
5916 			const uint16_t tag_size)
5917 {
5918 	struct rte_cryptodev_sym_capability_idx cap_idx;
5919 	const struct rte_cryptodev_symmetric_capability *cap;
5920 
5921 	/* Check if device supports the algorithm */
5922 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5923 	cap_idx.algo.auth = auth_algo;
5924 
5925 	cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5926 			&cap_idx);
5927 
5928 	if (cap == NULL)
5929 		return -1;
5930 
5931 	/* Check if device supports key size and IV size */
5932 	if (rte_cryptodev_sym_capability_check_auth(cap, key_size,
5933 			tag_size, iv_size) < 0) {
5934 		return -1;
5935 	}
5936 
5937 	return 0;
5938 }
5939 
5940 static int
5941 test_zuc_encryption(const struct wireless_test_data *tdata)
5942 {
5943 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5944 	struct crypto_unittest_params *ut_params = &unittest_params;
5945 
5946 	int retval;
5947 	uint8_t *plaintext, *ciphertext;
5948 	unsigned plaintext_pad_len;
5949 	unsigned plaintext_len;
5950 	struct rte_cryptodev_info dev_info;
5951 
5952 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5953 	uint64_t feat_flags = dev_info.feature_flags;
5954 
5955 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5956 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5957 		printf("Device doesn't support RAW data-path APIs.\n");
5958 		return TEST_SKIPPED;
5959 	}
5960 
5961 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5962 		return TEST_SKIPPED;
5963 
5964 	/* Check if device supports ZUC EEA3 */
5965 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
5966 			tdata->key.len, tdata->cipher_iv.len) < 0)
5967 		return TEST_SKIPPED;
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 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5979 
5980 	/* Clear mbuf payload */
5981 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5982 	       rte_pktmbuf_tailroom(ut_params->ibuf));
5983 
5984 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5985 	/* Append data which is padded to a multiple */
5986 	/* of the algorithms block size */
5987 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5988 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5989 				plaintext_pad_len);
5990 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5991 
5992 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5993 
5994 	/* Create ZUC operation */
5995 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5996 					tdata->cipher_iv.len,
5997 					tdata->plaintext.len,
5998 					0);
5999 	if (retval < 0)
6000 		return retval;
6001 
6002 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6003 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6004 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6005 	else
6006 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6007 						ut_params->op);
6008 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6009 
6010 	ut_params->obuf = ut_params->op->sym->m_dst;
6011 	if (ut_params->obuf)
6012 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
6013 	else
6014 		ciphertext = plaintext;
6015 
6016 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6017 
6018 	/* Validate obuf */
6019 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6020 		ciphertext,
6021 		tdata->ciphertext.data,
6022 		tdata->validCipherLenInBits.len,
6023 		"ZUC Ciphertext data not as expected");
6024 	return 0;
6025 }
6026 
6027 static int
6028 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
6029 {
6030 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6031 	struct crypto_unittest_params *ut_params = &unittest_params;
6032 
6033 	int retval;
6034 
6035 	unsigned int plaintext_pad_len;
6036 	unsigned int plaintext_len;
6037 	const uint8_t *ciphertext;
6038 	uint8_t ciphertext_buffer[2048];
6039 	struct rte_cryptodev_info dev_info;
6040 
6041 	/* Check if device supports ZUC EEA3 */
6042 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6043 			tdata->key.len, tdata->cipher_iv.len) < 0)
6044 		return TEST_SKIPPED;
6045 
6046 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6047 		return TEST_SKIPPED;
6048 
6049 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6050 
6051 	uint64_t feat_flags = dev_info.feature_flags;
6052 
6053 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6054 		printf("Device doesn't support in-place scatter-gather. "
6055 				"Test Skipped.\n");
6056 		return TEST_SKIPPED;
6057 	}
6058 
6059 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6060 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6061 		printf("Device doesn't support RAW data-path APIs.\n");
6062 		return TEST_SKIPPED;
6063 	}
6064 
6065 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6066 
6067 	/* Append data which is padded to a multiple */
6068 	/* of the algorithms block size */
6069 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6070 
6071 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6072 			plaintext_pad_len, 10, 0);
6073 
6074 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6075 			tdata->plaintext.data);
6076 
6077 	/* Create ZUC session */
6078 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6079 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6080 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6081 			tdata->key.data, tdata->key.len,
6082 			tdata->cipher_iv.len);
6083 	if (retval < 0)
6084 		return retval;
6085 
6086 	/* Clear mbuf payload */
6087 
6088 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
6089 
6090 	/* Create ZUC operation */
6091 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6092 			tdata->cipher_iv.len, tdata->plaintext.len,
6093 			0);
6094 	if (retval < 0)
6095 		return retval;
6096 
6097 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6098 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6099 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6100 	else
6101 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6102 						ut_params->op);
6103 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6104 
6105 	ut_params->obuf = ut_params->op->sym->m_dst;
6106 	if (ut_params->obuf)
6107 		ciphertext = rte_pktmbuf_read(ut_params->obuf,
6108 			0, plaintext_len, ciphertext_buffer);
6109 	else
6110 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
6111 			0, plaintext_len, ciphertext_buffer);
6112 
6113 	/* Validate obuf */
6114 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6115 
6116 	/* Validate obuf */
6117 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6118 		ciphertext,
6119 		tdata->ciphertext.data,
6120 		tdata->validCipherLenInBits.len,
6121 		"ZUC Ciphertext data not as expected");
6122 
6123 	return 0;
6124 }
6125 
6126 static int
6127 test_zuc_authentication(const struct wireless_test_data *tdata)
6128 {
6129 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6130 	struct crypto_unittest_params *ut_params = &unittest_params;
6131 
6132 	int retval;
6133 	unsigned plaintext_pad_len;
6134 	unsigned plaintext_len;
6135 	uint8_t *plaintext;
6136 
6137 	struct rte_cryptodev_info dev_info;
6138 
6139 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6140 	uint64_t feat_flags = dev_info.feature_flags;
6141 
6142 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
6143 			(tdata->validAuthLenInBits.len % 8 != 0)) {
6144 		printf("Device doesn't support NON-Byte Aligned Data.\n");
6145 		return TEST_SKIPPED;
6146 	}
6147 
6148 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6149 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6150 		printf("Device doesn't support RAW data-path APIs.\n");
6151 		return TEST_SKIPPED;
6152 	}
6153 
6154 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6155 		return TEST_SKIPPED;
6156 
6157 	/* Check if device supports ZUC EIA3 */
6158 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6159 			tdata->key.len, tdata->auth_iv.len,
6160 			tdata->digest.len) < 0)
6161 		return TEST_SKIPPED;
6162 
6163 	/* Create ZUC session */
6164 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6165 			tdata->key.data, tdata->key.len,
6166 			tdata->auth_iv.len, tdata->digest.len,
6167 			RTE_CRYPTO_AUTH_OP_GENERATE,
6168 			RTE_CRYPTO_AUTH_ZUC_EIA3);
6169 	if (retval != 0)
6170 		return retval;
6171 
6172 	/* alloc mbuf and set payload */
6173 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6174 
6175 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6176 	rte_pktmbuf_tailroom(ut_params->ibuf));
6177 
6178 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6179 	/* Append data which is padded to a multiple of */
6180 	/* the algorithms block size */
6181 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6182 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6183 				plaintext_pad_len);
6184 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6185 
6186 	/* Create ZUC operation */
6187 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6188 			tdata->auth_iv.data, tdata->auth_iv.len,
6189 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6190 			tdata->validAuthLenInBits.len,
6191 			0);
6192 	if (retval < 0)
6193 		return retval;
6194 
6195 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6196 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6197 				ut_params->op, 0, 1, 1, 0);
6198 	else
6199 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6200 				ut_params->op);
6201 	ut_params->obuf = ut_params->op->sym->m_src;
6202 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6203 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6204 			+ plaintext_pad_len;
6205 
6206 	/* Validate obuf */
6207 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
6208 	ut_params->digest,
6209 	tdata->digest.data,
6210 	tdata->digest.len,
6211 	"ZUC Generated auth tag not as expected");
6212 
6213 	return 0;
6214 }
6215 
6216 static int
6217 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6218 	uint8_t op_mode, uint8_t verify)
6219 {
6220 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6221 	struct crypto_unittest_params *ut_params = &unittest_params;
6222 
6223 	int retval;
6224 
6225 	uint8_t *plaintext = NULL, *ciphertext = NULL;
6226 	unsigned int plaintext_pad_len;
6227 	unsigned int plaintext_len;
6228 	unsigned int ciphertext_pad_len;
6229 	unsigned int ciphertext_len;
6230 
6231 	struct rte_cryptodev_info dev_info;
6232 
6233 	/* Check if device supports ZUC EEA3 */
6234 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6235 			tdata->key.len, tdata->cipher_iv.len) < 0)
6236 		return TEST_SKIPPED;
6237 
6238 	/* Check if device supports ZUC EIA3 */
6239 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6240 			tdata->key.len, tdata->auth_iv.len,
6241 			tdata->digest.len) < 0)
6242 		return TEST_SKIPPED;
6243 
6244 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6245 
6246 	uint64_t feat_flags = dev_info.feature_flags;
6247 
6248 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6249 		printf("Device doesn't support digest encrypted.\n");
6250 		return TEST_SKIPPED;
6251 	}
6252 	if (op_mode == IN_PLACE) {
6253 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6254 			printf("Device doesn't support in-place scatter-gather "
6255 					"in both input and output mbufs.\n");
6256 			return TEST_SKIPPED;
6257 		}
6258 
6259 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6260 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6261 			printf("Device doesn't support RAW data-path APIs.\n");
6262 			return TEST_SKIPPED;
6263 		}
6264 	} else {
6265 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6266 			return TEST_SKIPPED;
6267 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6268 			printf("Device doesn't support out-of-place scatter-gather "
6269 					"in both input and output mbufs.\n");
6270 			return TEST_SKIPPED;
6271 		}
6272 	}
6273 
6274 	/* Create ZUC session */
6275 	retval = create_wireless_algo_auth_cipher_session(
6276 			ts_params->valid_devs[0],
6277 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6278 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6279 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6280 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6281 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6282 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6283 			tdata->key.data, tdata->key.len,
6284 			tdata->auth_iv.len, tdata->digest.len,
6285 			tdata->cipher_iv.len);
6286 
6287 	if (retval != 0)
6288 		return retval;
6289 
6290 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6291 	if (op_mode == OUT_OF_PLACE)
6292 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6293 
6294 	/* clear mbuf payload */
6295 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6296 		rte_pktmbuf_tailroom(ut_params->ibuf));
6297 	if (op_mode == OUT_OF_PLACE)
6298 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6299 			rte_pktmbuf_tailroom(ut_params->obuf));
6300 
6301 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6302 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6303 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6304 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6305 
6306 	if (verify) {
6307 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6308 					ciphertext_pad_len);
6309 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6310 		if (op_mode == OUT_OF_PLACE)
6311 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6312 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6313 			ciphertext_len);
6314 	} else {
6315 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6316 					plaintext_pad_len);
6317 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6318 		if (op_mode == OUT_OF_PLACE)
6319 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6320 		debug_hexdump(stdout, "plaintext:", plaintext,
6321 			plaintext_len);
6322 	}
6323 
6324 	/* Create ZUC operation */
6325 	retval = create_wireless_algo_auth_cipher_operation(
6326 		tdata->digest.data, tdata->digest.len,
6327 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6328 		tdata->auth_iv.data, tdata->auth_iv.len,
6329 		(tdata->digest.offset_bytes == 0 ?
6330 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6331 			: tdata->digest.offset_bytes),
6332 		tdata->validCipherLenInBits.len,
6333 		tdata->validCipherOffsetInBits.len,
6334 		tdata->validAuthLenInBits.len,
6335 		0,
6336 		op_mode, 0, verify);
6337 
6338 	if (retval < 0)
6339 		return retval;
6340 
6341 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6342 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6343 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6344 	else
6345 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6346 			ut_params->op);
6347 
6348 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6349 
6350 	ut_params->obuf = (op_mode == IN_PLACE ?
6351 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6352 
6353 
6354 	if (verify) {
6355 		if (ut_params->obuf)
6356 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6357 							uint8_t *);
6358 		else
6359 			plaintext = ciphertext;
6360 
6361 		debug_hexdump(stdout, "plaintext:", plaintext,
6362 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6363 		debug_hexdump(stdout, "plaintext expected:",
6364 			tdata->plaintext.data,
6365 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6366 	} else {
6367 		if (ut_params->obuf)
6368 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6369 							uint8_t *);
6370 		else
6371 			ciphertext = plaintext;
6372 
6373 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6374 			ciphertext_len);
6375 		debug_hexdump(stdout, "ciphertext expected:",
6376 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6377 
6378 		ut_params->digest = rte_pktmbuf_mtod(
6379 			ut_params->obuf, uint8_t *) +
6380 			(tdata->digest.offset_bytes == 0 ?
6381 			plaintext_pad_len : tdata->digest.offset_bytes);
6382 
6383 		debug_hexdump(stdout, "digest:", ut_params->digest,
6384 			tdata->digest.len);
6385 		debug_hexdump(stdout, "digest expected:",
6386 			tdata->digest.data, tdata->digest.len);
6387 	}
6388 
6389 	/* Validate obuf */
6390 	if (verify) {
6391 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6392 			plaintext,
6393 			tdata->plaintext.data,
6394 			tdata->plaintext.len >> 3,
6395 			"ZUC Plaintext data not as expected");
6396 	} else {
6397 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6398 			ciphertext,
6399 			tdata->ciphertext.data,
6400 			tdata->ciphertext.len >> 3,
6401 			"ZUC Ciphertext data not as expected");
6402 
6403 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6404 			ut_params->digest,
6405 			tdata->digest.data,
6406 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6407 			"ZUC Generated auth tag not as expected");
6408 	}
6409 	return 0;
6410 }
6411 
6412 static int
6413 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6414 	uint8_t op_mode, uint8_t verify)
6415 {
6416 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6417 	struct crypto_unittest_params *ut_params = &unittest_params;
6418 
6419 	int retval;
6420 
6421 	const uint8_t *plaintext = NULL;
6422 	const uint8_t *ciphertext = NULL;
6423 	const uint8_t *digest = NULL;
6424 	unsigned int plaintext_pad_len;
6425 	unsigned int plaintext_len;
6426 	unsigned int ciphertext_pad_len;
6427 	unsigned int ciphertext_len;
6428 	uint8_t buffer[10000];
6429 	uint8_t digest_buffer[10000];
6430 
6431 	struct rte_cryptodev_info dev_info;
6432 
6433 	/* Check if device supports ZUC EEA3 */
6434 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6435 			tdata->key.len, tdata->cipher_iv.len) < 0)
6436 		return TEST_SKIPPED;
6437 
6438 	/* Check if device supports ZUC EIA3 */
6439 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6440 			tdata->key.len, tdata->auth_iv.len,
6441 			tdata->digest.len) < 0)
6442 		return TEST_SKIPPED;
6443 
6444 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6445 
6446 	uint64_t feat_flags = dev_info.feature_flags;
6447 
6448 	if (op_mode == IN_PLACE) {
6449 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6450 			printf("Device doesn't support in-place scatter-gather "
6451 					"in both input and output mbufs.\n");
6452 			return TEST_SKIPPED;
6453 		}
6454 
6455 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6456 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6457 			printf("Device doesn't support RAW data-path APIs.\n");
6458 			return TEST_SKIPPED;
6459 		}
6460 	} else {
6461 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6462 			return TEST_SKIPPED;
6463 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6464 			printf("Device doesn't support out-of-place scatter-gather "
6465 					"in both input and output mbufs.\n");
6466 			return TEST_SKIPPED;
6467 		}
6468 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6469 			printf("Device doesn't support digest encrypted.\n");
6470 			return TEST_SKIPPED;
6471 		}
6472 	}
6473 
6474 	/* Create ZUC session */
6475 	retval = create_wireless_algo_auth_cipher_session(
6476 			ts_params->valid_devs[0],
6477 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6478 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6479 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6480 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6481 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6482 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6483 			tdata->key.data, tdata->key.len,
6484 			tdata->auth_iv.len, tdata->digest.len,
6485 			tdata->cipher_iv.len);
6486 
6487 	if (retval != 0)
6488 		return retval;
6489 
6490 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6491 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6492 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6493 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6494 
6495 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6496 			plaintext_pad_len, 15, 0);
6497 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6498 			"Failed to allocate input buffer in mempool");
6499 
6500 	if (op_mode == OUT_OF_PLACE) {
6501 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6502 				plaintext_pad_len, 15, 0);
6503 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
6504 				"Failed to allocate output buffer in mempool");
6505 	}
6506 
6507 	if (verify) {
6508 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6509 			tdata->ciphertext.data);
6510 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6511 					ciphertext_len, buffer);
6512 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6513 			ciphertext_len);
6514 	} else {
6515 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6516 			tdata->plaintext.data);
6517 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6518 					plaintext_len, buffer);
6519 		debug_hexdump(stdout, "plaintext:", plaintext,
6520 			plaintext_len);
6521 	}
6522 	memset(buffer, 0, sizeof(buffer));
6523 
6524 	/* Create ZUC operation */
6525 	retval = create_wireless_algo_auth_cipher_operation(
6526 		tdata->digest.data, tdata->digest.len,
6527 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6528 		NULL, 0,
6529 		(tdata->digest.offset_bytes == 0 ?
6530 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6531 			: tdata->digest.offset_bytes),
6532 		tdata->validCipherLenInBits.len,
6533 		tdata->validCipherOffsetInBits.len,
6534 		tdata->validAuthLenInBits.len,
6535 		0,
6536 		op_mode, 1, verify);
6537 
6538 	if (retval < 0)
6539 		return retval;
6540 
6541 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6542 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6543 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6544 	else
6545 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6546 			ut_params->op);
6547 
6548 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6549 
6550 	ut_params->obuf = (op_mode == IN_PLACE ?
6551 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6552 
6553 	if (verify) {
6554 		if (ut_params->obuf)
6555 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6556 					plaintext_len, buffer);
6557 		else
6558 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6559 					plaintext_len, buffer);
6560 
6561 		debug_hexdump(stdout, "plaintext:", plaintext,
6562 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6563 		debug_hexdump(stdout, "plaintext expected:",
6564 			tdata->plaintext.data,
6565 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6566 	} else {
6567 		if (ut_params->obuf)
6568 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6569 					ciphertext_len, buffer);
6570 		else
6571 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6572 					ciphertext_len, buffer);
6573 
6574 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6575 			ciphertext_len);
6576 		debug_hexdump(stdout, "ciphertext expected:",
6577 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6578 
6579 		if (ut_params->obuf)
6580 			digest = rte_pktmbuf_read(ut_params->obuf,
6581 				(tdata->digest.offset_bytes == 0 ?
6582 				plaintext_pad_len : tdata->digest.offset_bytes),
6583 				tdata->digest.len, digest_buffer);
6584 		else
6585 			digest = rte_pktmbuf_read(ut_params->ibuf,
6586 				(tdata->digest.offset_bytes == 0 ?
6587 				plaintext_pad_len : tdata->digest.offset_bytes),
6588 				tdata->digest.len, digest_buffer);
6589 
6590 		debug_hexdump(stdout, "digest:", digest,
6591 			tdata->digest.len);
6592 		debug_hexdump(stdout, "digest expected:",
6593 			tdata->digest.data, tdata->digest.len);
6594 	}
6595 
6596 	/* Validate obuf */
6597 	if (verify) {
6598 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6599 			plaintext,
6600 			tdata->plaintext.data,
6601 			tdata->plaintext.len >> 3,
6602 			"ZUC Plaintext data not as expected");
6603 	} else {
6604 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6605 			ciphertext,
6606 			tdata->ciphertext.data,
6607 			tdata->validDataLenInBits.len,
6608 			"ZUC Ciphertext data not as expected");
6609 
6610 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6611 			digest,
6612 			tdata->digest.data,
6613 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6614 			"ZUC Generated auth tag not as expected");
6615 	}
6616 	return 0;
6617 }
6618 
6619 static int
6620 test_kasumi_encryption_test_case_1(void)
6621 {
6622 	return test_kasumi_encryption(&kasumi_test_case_1);
6623 }
6624 
6625 static int
6626 test_kasumi_encryption_test_case_1_sgl(void)
6627 {
6628 	return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6629 }
6630 
6631 static int
6632 test_kasumi_encryption_test_case_1_oop(void)
6633 {
6634 	return test_kasumi_encryption_oop(&kasumi_test_case_1);
6635 }
6636 
6637 static int
6638 test_kasumi_encryption_test_case_1_oop_sgl(void)
6639 {
6640 	return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6641 }
6642 
6643 static int
6644 test_kasumi_encryption_test_case_2(void)
6645 {
6646 	return test_kasumi_encryption(&kasumi_test_case_2);
6647 }
6648 
6649 static int
6650 test_kasumi_encryption_test_case_3(void)
6651 {
6652 	return test_kasumi_encryption(&kasumi_test_case_3);
6653 }
6654 
6655 static int
6656 test_kasumi_encryption_test_case_4(void)
6657 {
6658 	return test_kasumi_encryption(&kasumi_test_case_4);
6659 }
6660 
6661 static int
6662 test_kasumi_encryption_test_case_5(void)
6663 {
6664 	return test_kasumi_encryption(&kasumi_test_case_5);
6665 }
6666 
6667 static int
6668 test_kasumi_decryption_test_case_1(void)
6669 {
6670 	return test_kasumi_decryption(&kasumi_test_case_1);
6671 }
6672 
6673 static int
6674 test_kasumi_decryption_test_case_1_oop(void)
6675 {
6676 	return test_kasumi_decryption_oop(&kasumi_test_case_1);
6677 }
6678 
6679 static int
6680 test_kasumi_decryption_test_case_2(void)
6681 {
6682 	return test_kasumi_decryption(&kasumi_test_case_2);
6683 }
6684 
6685 static int
6686 test_kasumi_decryption_test_case_3(void)
6687 {
6688 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6689 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6690 		return TEST_SKIPPED;
6691 	return test_kasumi_decryption(&kasumi_test_case_3);
6692 }
6693 
6694 static int
6695 test_kasumi_decryption_test_case_4(void)
6696 {
6697 	return test_kasumi_decryption(&kasumi_test_case_4);
6698 }
6699 
6700 static int
6701 test_kasumi_decryption_test_case_5(void)
6702 {
6703 	return test_kasumi_decryption(&kasumi_test_case_5);
6704 }
6705 static int
6706 test_snow3g_encryption_test_case_1(void)
6707 {
6708 	return test_snow3g_encryption(&snow3g_test_case_1);
6709 }
6710 
6711 static int
6712 test_snow3g_encryption_test_case_1_oop(void)
6713 {
6714 	return test_snow3g_encryption_oop(&snow3g_test_case_1);
6715 }
6716 
6717 static int
6718 test_snow3g_encryption_test_case_1_oop_sgl(void)
6719 {
6720 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6721 }
6722 
6723 
6724 static int
6725 test_snow3g_encryption_test_case_1_offset_oop(void)
6726 {
6727 	return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6728 }
6729 
6730 static int
6731 test_snow3g_encryption_test_case_2(void)
6732 {
6733 	return test_snow3g_encryption(&snow3g_test_case_2);
6734 }
6735 
6736 static int
6737 test_snow3g_encryption_test_case_3(void)
6738 {
6739 	return test_snow3g_encryption(&snow3g_test_case_3);
6740 }
6741 
6742 static int
6743 test_snow3g_encryption_test_case_4(void)
6744 {
6745 	return test_snow3g_encryption(&snow3g_test_case_4);
6746 }
6747 
6748 static int
6749 test_snow3g_encryption_test_case_5(void)
6750 {
6751 	return test_snow3g_encryption(&snow3g_test_case_5);
6752 }
6753 
6754 static int
6755 test_snow3g_decryption_test_case_1(void)
6756 {
6757 	return test_snow3g_decryption(&snow3g_test_case_1);
6758 }
6759 
6760 static int
6761 test_snow3g_decryption_test_case_1_oop(void)
6762 {
6763 	return test_snow3g_decryption_oop(&snow3g_test_case_1);
6764 }
6765 
6766 static int
6767 test_snow3g_decryption_test_case_2(void)
6768 {
6769 	return test_snow3g_decryption(&snow3g_test_case_2);
6770 }
6771 
6772 static int
6773 test_snow3g_decryption_test_case_3(void)
6774 {
6775 	return test_snow3g_decryption(&snow3g_test_case_3);
6776 }
6777 
6778 static int
6779 test_snow3g_decryption_test_case_4(void)
6780 {
6781 	return test_snow3g_decryption(&snow3g_test_case_4);
6782 }
6783 
6784 static int
6785 test_snow3g_decryption_test_case_5(void)
6786 {
6787 	return test_snow3g_decryption(&snow3g_test_case_5);
6788 }
6789 
6790 /*
6791  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6792  * Pattern digest from snow3g_test_data must be allocated as
6793  * 4 last bytes in plaintext.
6794  */
6795 static void
6796 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6797 		struct snow3g_hash_test_data *output)
6798 {
6799 	if ((pattern != NULL) && (output != NULL)) {
6800 		output->key.len = pattern->key.len;
6801 
6802 		memcpy(output->key.data,
6803 		pattern->key.data, pattern->key.len);
6804 
6805 		output->auth_iv.len = pattern->auth_iv.len;
6806 
6807 		memcpy(output->auth_iv.data,
6808 		pattern->auth_iv.data, pattern->auth_iv.len);
6809 
6810 		output->plaintext.len = pattern->plaintext.len;
6811 
6812 		memcpy(output->plaintext.data,
6813 		pattern->plaintext.data, pattern->plaintext.len >> 3);
6814 
6815 		output->digest.len = pattern->digest.len;
6816 
6817 		memcpy(output->digest.data,
6818 		&pattern->plaintext.data[pattern->digest.offset_bytes],
6819 		pattern->digest.len);
6820 
6821 		output->validAuthLenInBits.len =
6822 		pattern->validAuthLenInBits.len;
6823 	}
6824 }
6825 
6826 /*
6827  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6828  */
6829 static int
6830 test_snow3g_decryption_with_digest_test_case_1(void)
6831 {
6832 	struct snow3g_hash_test_data snow3g_hash_data;
6833 	struct rte_cryptodev_info dev_info;
6834 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6835 
6836 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6837 	uint64_t feat_flags = dev_info.feature_flags;
6838 
6839 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6840 		printf("Device doesn't support encrypted digest operations.\n");
6841 		return TEST_SKIPPED;
6842 	}
6843 
6844 	/*
6845 	 * Function prepare data for hash veryfication test case.
6846 	 * Digest is allocated in 4 last bytes in plaintext, pattern.
6847 	 */
6848 	snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6849 
6850 	return test_snow3g_decryption(&snow3g_test_case_7) &
6851 			test_snow3g_authentication_verify(&snow3g_hash_data);
6852 }
6853 
6854 static int
6855 test_snow3g_cipher_auth_test_case_1(void)
6856 {
6857 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
6858 }
6859 
6860 static int
6861 test_snow3g_auth_cipher_test_case_1(void)
6862 {
6863 	return test_snow3g_auth_cipher(
6864 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6865 }
6866 
6867 static int
6868 test_snow3g_auth_cipher_test_case_2(void)
6869 {
6870 	return test_snow3g_auth_cipher(
6871 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6872 }
6873 
6874 static int
6875 test_snow3g_auth_cipher_test_case_2_oop(void)
6876 {
6877 	return test_snow3g_auth_cipher(
6878 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6879 }
6880 
6881 static int
6882 test_snow3g_auth_cipher_part_digest_enc(void)
6883 {
6884 	return test_snow3g_auth_cipher(
6885 		&snow3g_auth_cipher_partial_digest_encryption,
6886 			IN_PLACE, 0);
6887 }
6888 
6889 static int
6890 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6891 {
6892 	return test_snow3g_auth_cipher(
6893 		&snow3g_auth_cipher_partial_digest_encryption,
6894 			OUT_OF_PLACE, 0);
6895 }
6896 
6897 static int
6898 test_snow3g_auth_cipher_test_case_3_sgl(void)
6899 {
6900 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6901 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6902 		return TEST_SKIPPED;
6903 	return test_snow3g_auth_cipher_sgl(
6904 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6905 }
6906 
6907 static int
6908 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6909 {
6910 	return test_snow3g_auth_cipher_sgl(
6911 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6912 }
6913 
6914 static int
6915 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6916 {
6917 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6918 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6919 		return TEST_SKIPPED;
6920 	return test_snow3g_auth_cipher_sgl(
6921 		&snow3g_auth_cipher_partial_digest_encryption,
6922 			IN_PLACE, 0);
6923 }
6924 
6925 static int
6926 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6927 {
6928 	return test_snow3g_auth_cipher_sgl(
6929 		&snow3g_auth_cipher_partial_digest_encryption,
6930 			OUT_OF_PLACE, 0);
6931 }
6932 
6933 static int
6934 test_snow3g_auth_cipher_verify_test_case_1(void)
6935 {
6936 	return test_snow3g_auth_cipher(
6937 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6938 }
6939 
6940 static int
6941 test_snow3g_auth_cipher_verify_test_case_2(void)
6942 {
6943 	return test_snow3g_auth_cipher(
6944 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6945 }
6946 
6947 static int
6948 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6949 {
6950 	return test_snow3g_auth_cipher(
6951 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6952 }
6953 
6954 static int
6955 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6956 {
6957 	return test_snow3g_auth_cipher(
6958 		&snow3g_auth_cipher_partial_digest_encryption,
6959 			IN_PLACE, 1);
6960 }
6961 
6962 static int
6963 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6964 {
6965 	return test_snow3g_auth_cipher(
6966 		&snow3g_auth_cipher_partial_digest_encryption,
6967 			OUT_OF_PLACE, 1);
6968 }
6969 
6970 static int
6971 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6972 {
6973 	return test_snow3g_auth_cipher_sgl(
6974 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6975 }
6976 
6977 static int
6978 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6979 {
6980 	return test_snow3g_auth_cipher_sgl(
6981 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6982 }
6983 
6984 static int
6985 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6986 {
6987 	return test_snow3g_auth_cipher_sgl(
6988 		&snow3g_auth_cipher_partial_digest_encryption,
6989 			IN_PLACE, 1);
6990 }
6991 
6992 static int
6993 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6994 {
6995 	return test_snow3g_auth_cipher_sgl(
6996 		&snow3g_auth_cipher_partial_digest_encryption,
6997 			OUT_OF_PLACE, 1);
6998 }
6999 
7000 static int
7001 test_snow3g_auth_cipher_with_digest_test_case_1(void)
7002 {
7003 	return test_snow3g_auth_cipher(
7004 		&snow3g_test_case_7, IN_PLACE, 0);
7005 }
7006 
7007 static int
7008 test_kasumi_auth_cipher_test_case_1(void)
7009 {
7010 	return test_kasumi_auth_cipher(
7011 		&kasumi_test_case_3, IN_PLACE, 0);
7012 }
7013 
7014 static int
7015 test_kasumi_auth_cipher_test_case_2(void)
7016 {
7017 	return test_kasumi_auth_cipher(
7018 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7019 }
7020 
7021 static int
7022 test_kasumi_auth_cipher_test_case_2_oop(void)
7023 {
7024 	return test_kasumi_auth_cipher(
7025 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7026 }
7027 
7028 static int
7029 test_kasumi_auth_cipher_test_case_2_sgl(void)
7030 {
7031 	return test_kasumi_auth_cipher_sgl(
7032 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7033 }
7034 
7035 static int
7036 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
7037 {
7038 	return test_kasumi_auth_cipher_sgl(
7039 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7040 }
7041 
7042 static int
7043 test_kasumi_auth_cipher_verify_test_case_1(void)
7044 {
7045 	return test_kasumi_auth_cipher(
7046 		&kasumi_test_case_3, IN_PLACE, 1);
7047 }
7048 
7049 static int
7050 test_kasumi_auth_cipher_verify_test_case_2(void)
7051 {
7052 	return test_kasumi_auth_cipher(
7053 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7054 }
7055 
7056 static int
7057 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
7058 {
7059 	return test_kasumi_auth_cipher(
7060 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7061 }
7062 
7063 static int
7064 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
7065 {
7066 	return test_kasumi_auth_cipher_sgl(
7067 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7068 }
7069 
7070 static int
7071 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
7072 {
7073 	return test_kasumi_auth_cipher_sgl(
7074 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7075 }
7076 
7077 static int
7078 test_kasumi_cipher_auth_test_case_1(void)
7079 {
7080 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
7081 }
7082 
7083 static int
7084 test_zuc_encryption_test_case_1(void)
7085 {
7086 	return test_zuc_encryption(&zuc_test_case_cipher_193b);
7087 }
7088 
7089 static int
7090 test_zuc_encryption_test_case_2(void)
7091 {
7092 	return test_zuc_encryption(&zuc_test_case_cipher_800b);
7093 }
7094 
7095 static int
7096 test_zuc_encryption_test_case_3(void)
7097 {
7098 	return test_zuc_encryption(&zuc_test_case_cipher_1570b);
7099 }
7100 
7101 static int
7102 test_zuc_encryption_test_case_4(void)
7103 {
7104 	return test_zuc_encryption(&zuc_test_case_cipher_2798b);
7105 }
7106 
7107 static int
7108 test_zuc_encryption_test_case_5(void)
7109 {
7110 	return test_zuc_encryption(&zuc_test_case_cipher_4019b);
7111 }
7112 
7113 static int
7114 test_zuc_encryption_test_case_6_sgl(void)
7115 {
7116 	return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
7117 }
7118 
7119 static int
7120 test_zuc_encryption_test_case_7(void)
7121 {
7122 	return test_zuc_encryption(&zuc_test_case_cipher_800b_key_256b);
7123 }
7124 
7125 static int
7126 test_zuc_hash_generate_test_case_1(void)
7127 {
7128 	return test_zuc_authentication(&zuc_test_case_auth_1b);
7129 }
7130 
7131 static int
7132 test_zuc_hash_generate_test_case_2(void)
7133 {
7134 	return test_zuc_authentication(&zuc_test_case_auth_90b);
7135 }
7136 
7137 static int
7138 test_zuc_hash_generate_test_case_3(void)
7139 {
7140 	return test_zuc_authentication(&zuc_test_case_auth_577b);
7141 }
7142 
7143 static int
7144 test_zuc_hash_generate_test_case_4(void)
7145 {
7146 	return test_zuc_authentication(&zuc_test_case_auth_2079b);
7147 }
7148 
7149 static int
7150 test_zuc_hash_generate_test_case_5(void)
7151 {
7152 	return test_zuc_authentication(&zuc_test_auth_5670b);
7153 }
7154 
7155 static int
7156 test_zuc_hash_generate_test_case_6(void)
7157 {
7158 	return test_zuc_authentication(&zuc_test_case_auth_128b);
7159 }
7160 
7161 static int
7162 test_zuc_hash_generate_test_case_7(void)
7163 {
7164 	return test_zuc_authentication(&zuc_test_case_auth_2080b);
7165 }
7166 
7167 static int
7168 test_zuc_hash_generate_test_case_8(void)
7169 {
7170 	return test_zuc_authentication(&zuc_test_case_auth_584b);
7171 }
7172 
7173 static int
7174 test_zuc_hash_generate_test_case_9(void)
7175 {
7176 	return test_zuc_authentication(&zuc_test_case_auth_584b_mac_64b);
7177 }
7178 
7179 static int
7180 test_zuc_hash_generate_test_case_10(void)
7181 {
7182 	return test_zuc_authentication(&zuc_test_case_auth_2080b_mac_128b);
7183 }
7184 
7185 static int
7186 test_zuc_cipher_auth_test_case_1(void)
7187 {
7188 	return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7189 }
7190 
7191 static int
7192 test_zuc_cipher_auth_test_case_2(void)
7193 {
7194 	return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7195 }
7196 
7197 static int
7198 test_zuc_auth_cipher_test_case_1(void)
7199 {
7200 	return test_zuc_auth_cipher(
7201 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7202 }
7203 
7204 static int
7205 test_zuc_auth_cipher_test_case_1_oop(void)
7206 {
7207 	return test_zuc_auth_cipher(
7208 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7209 }
7210 
7211 static int
7212 test_zuc_auth_cipher_test_case_1_sgl(void)
7213 {
7214 	return test_zuc_auth_cipher_sgl(
7215 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7216 }
7217 
7218 static int
7219 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7220 {
7221 	return test_zuc_auth_cipher_sgl(
7222 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7223 }
7224 
7225 static int
7226 test_zuc_auth_cipher_verify_test_case_1(void)
7227 {
7228 	return test_zuc_auth_cipher(
7229 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7230 }
7231 
7232 static int
7233 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7234 {
7235 	return test_zuc_auth_cipher(
7236 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7237 }
7238 
7239 static int
7240 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7241 {
7242 	return test_zuc_auth_cipher_sgl(
7243 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7244 }
7245 
7246 static int
7247 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7248 {
7249 	return test_zuc_auth_cipher_sgl(
7250 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7251 }
7252 
7253 static int
7254 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7255 {
7256 	uint8_t dev_id = testsuite_params.valid_devs[0];
7257 
7258 	struct rte_cryptodev_sym_capability_idx cap_idx;
7259 
7260 	/* Check if device supports particular cipher algorithm */
7261 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7262 	cap_idx.algo.cipher = tdata->cipher_algo;
7263 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7264 		return TEST_SKIPPED;
7265 
7266 	/* Check if device supports particular hash algorithm */
7267 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7268 	cap_idx.algo.auth = tdata->auth_algo;
7269 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7270 		return TEST_SKIPPED;
7271 
7272 	return 0;
7273 }
7274 
7275 static int
7276 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7277 	uint8_t op_mode, uint8_t verify)
7278 {
7279 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7280 	struct crypto_unittest_params *ut_params = &unittest_params;
7281 
7282 	int retval;
7283 
7284 	uint8_t *plaintext = NULL, *ciphertext = NULL;
7285 	unsigned int plaintext_pad_len;
7286 	unsigned int plaintext_len;
7287 	unsigned int ciphertext_pad_len;
7288 	unsigned int ciphertext_len;
7289 
7290 	struct rte_cryptodev_info dev_info;
7291 	struct rte_crypto_op *op;
7292 
7293 	/* Check if device supports particular algorithms separately */
7294 	if (test_mixed_check_if_unsupported(tdata))
7295 		return TEST_SKIPPED;
7296 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7297 		return TEST_SKIPPED;
7298 
7299 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7300 
7301 	uint64_t feat_flags = dev_info.feature_flags;
7302 
7303 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7304 		printf("Device doesn't support digest encrypted.\n");
7305 		return TEST_SKIPPED;
7306 	}
7307 
7308 	/* Create the session */
7309 	if (verify)
7310 		retval = create_wireless_algo_cipher_auth_session(
7311 				ts_params->valid_devs[0],
7312 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7313 				RTE_CRYPTO_AUTH_OP_VERIFY,
7314 				tdata->auth_algo,
7315 				tdata->cipher_algo,
7316 				tdata->auth_key.data, tdata->auth_key.len,
7317 				tdata->auth_iv.len, tdata->digest_enc.len,
7318 				tdata->cipher_iv.len);
7319 	else
7320 		retval = create_wireless_algo_auth_cipher_session(
7321 				ts_params->valid_devs[0],
7322 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7323 				RTE_CRYPTO_AUTH_OP_GENERATE,
7324 				tdata->auth_algo,
7325 				tdata->cipher_algo,
7326 				tdata->auth_key.data, tdata->auth_key.len,
7327 				tdata->auth_iv.len, tdata->digest_enc.len,
7328 				tdata->cipher_iv.len);
7329 	if (retval != 0)
7330 		return retval;
7331 
7332 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7333 	if (op_mode == OUT_OF_PLACE)
7334 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7335 
7336 	/* clear mbuf payload */
7337 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7338 		rte_pktmbuf_tailroom(ut_params->ibuf));
7339 	if (op_mode == OUT_OF_PLACE) {
7340 
7341 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7342 				rte_pktmbuf_tailroom(ut_params->obuf));
7343 	}
7344 
7345 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7346 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7347 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7348 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7349 
7350 	if (verify) {
7351 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7352 				ciphertext_pad_len);
7353 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7354 		if (op_mode == OUT_OF_PLACE)
7355 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7356 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7357 				ciphertext_len);
7358 	} else {
7359 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7360 				plaintext_pad_len);
7361 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7362 		if (op_mode == OUT_OF_PLACE)
7363 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
7364 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7365 	}
7366 
7367 	/* Create the operation */
7368 	retval = create_wireless_algo_auth_cipher_operation(
7369 			tdata->digest_enc.data, tdata->digest_enc.len,
7370 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7371 			tdata->auth_iv.data, tdata->auth_iv.len,
7372 			(tdata->digest_enc.offset == 0 ?
7373 				plaintext_pad_len
7374 				: tdata->digest_enc.offset),
7375 			tdata->validCipherLen.len_bits,
7376 			tdata->cipher.offset_bits,
7377 			tdata->validAuthLen.len_bits,
7378 			tdata->auth.offset_bits,
7379 			op_mode, 0, verify);
7380 
7381 	if (retval < 0)
7382 		return retval;
7383 
7384 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7385 
7386 	/* Check if the op failed because the device doesn't */
7387 	/* support this particular combination of algorithms */
7388 	if (op == NULL && ut_params->op->status ==
7389 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7390 		printf("Device doesn't support this mixed combination. "
7391 				"Test Skipped.\n");
7392 		return TEST_SKIPPED;
7393 	}
7394 	ut_params->op = op;
7395 
7396 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7397 
7398 	ut_params->obuf = (op_mode == IN_PLACE ?
7399 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7400 
7401 	if (verify) {
7402 		if (ut_params->obuf)
7403 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7404 							uint8_t *);
7405 		else
7406 			plaintext = ciphertext +
7407 					(tdata->cipher.offset_bits >> 3);
7408 
7409 		debug_hexdump(stdout, "plaintext:", plaintext,
7410 				tdata->plaintext.len_bits >> 3);
7411 		debug_hexdump(stdout, "plaintext expected:",
7412 				tdata->plaintext.data,
7413 				tdata->plaintext.len_bits >> 3);
7414 	} else {
7415 		if (ut_params->obuf)
7416 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7417 					uint8_t *);
7418 		else
7419 			ciphertext = plaintext;
7420 
7421 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7422 				ciphertext_len);
7423 		debug_hexdump(stdout, "ciphertext expected:",
7424 				tdata->ciphertext.data,
7425 				tdata->ciphertext.len_bits >> 3);
7426 
7427 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7428 				+ (tdata->digest_enc.offset == 0 ?
7429 		plaintext_pad_len : tdata->digest_enc.offset);
7430 
7431 		debug_hexdump(stdout, "digest:", ut_params->digest,
7432 				tdata->digest_enc.len);
7433 		debug_hexdump(stdout, "digest expected:",
7434 				tdata->digest_enc.data,
7435 				tdata->digest_enc.len);
7436 	}
7437 
7438 	/* Validate obuf */
7439 	if (verify) {
7440 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7441 				plaintext,
7442 				tdata->plaintext.data,
7443 				tdata->plaintext.len_bits >> 3,
7444 				"Plaintext data not as expected");
7445 	} else {
7446 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7447 				ciphertext,
7448 				tdata->ciphertext.data,
7449 				tdata->validDataLen.len_bits,
7450 				"Ciphertext data not as expected");
7451 
7452 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7453 				ut_params->digest,
7454 				tdata->digest_enc.data,
7455 				DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
7456 				"Generated auth tag not as expected");
7457 	}
7458 
7459 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7460 			"crypto op processing failed");
7461 
7462 	return 0;
7463 }
7464 
7465 static int
7466 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7467 	uint8_t op_mode, uint8_t verify)
7468 {
7469 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7470 	struct crypto_unittest_params *ut_params = &unittest_params;
7471 
7472 	int retval;
7473 
7474 	const uint8_t *plaintext = NULL;
7475 	const uint8_t *ciphertext = NULL;
7476 	const uint8_t *digest = NULL;
7477 	unsigned int plaintext_pad_len;
7478 	unsigned int plaintext_len;
7479 	unsigned int ciphertext_pad_len;
7480 	unsigned int ciphertext_len;
7481 	uint8_t buffer[10000];
7482 	uint8_t digest_buffer[10000];
7483 
7484 	struct rte_cryptodev_info dev_info;
7485 	struct rte_crypto_op *op;
7486 
7487 	/* Check if device supports particular algorithms */
7488 	if (test_mixed_check_if_unsupported(tdata))
7489 		return TEST_SKIPPED;
7490 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7491 		return TEST_SKIPPED;
7492 
7493 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7494 
7495 	uint64_t feat_flags = dev_info.feature_flags;
7496 
7497 	if (op_mode == IN_PLACE) {
7498 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7499 			printf("Device doesn't support in-place scatter-gather "
7500 					"in both input and output mbufs.\n");
7501 			return TEST_SKIPPED;
7502 		}
7503 	} else {
7504 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7505 			printf("Device doesn't support out-of-place scatter-gather "
7506 					"in both input and output mbufs.\n");
7507 			return TEST_SKIPPED;
7508 		}
7509 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7510 			printf("Device doesn't support digest encrypted.\n");
7511 			return TEST_SKIPPED;
7512 		}
7513 	}
7514 
7515 	/* Create the session */
7516 	if (verify)
7517 		retval = create_wireless_algo_cipher_auth_session(
7518 				ts_params->valid_devs[0],
7519 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7520 				RTE_CRYPTO_AUTH_OP_VERIFY,
7521 				tdata->auth_algo,
7522 				tdata->cipher_algo,
7523 				tdata->auth_key.data, tdata->auth_key.len,
7524 				tdata->auth_iv.len, tdata->digest_enc.len,
7525 				tdata->cipher_iv.len);
7526 	else
7527 		retval = create_wireless_algo_auth_cipher_session(
7528 				ts_params->valid_devs[0],
7529 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7530 				RTE_CRYPTO_AUTH_OP_GENERATE,
7531 				tdata->auth_algo,
7532 				tdata->cipher_algo,
7533 				tdata->auth_key.data, tdata->auth_key.len,
7534 				tdata->auth_iv.len, tdata->digest_enc.len,
7535 				tdata->cipher_iv.len);
7536 	if (retval != 0)
7537 		return retval;
7538 
7539 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7540 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7541 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7542 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7543 
7544 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7545 			ciphertext_pad_len, 15, 0);
7546 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7547 			"Failed to allocate input buffer in mempool");
7548 
7549 	if (op_mode == OUT_OF_PLACE) {
7550 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7551 				plaintext_pad_len, 15, 0);
7552 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
7553 				"Failed to allocate output buffer in mempool");
7554 	}
7555 
7556 	if (verify) {
7557 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7558 			tdata->ciphertext.data);
7559 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7560 					ciphertext_len, buffer);
7561 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7562 			ciphertext_len);
7563 	} else {
7564 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7565 			tdata->plaintext.data);
7566 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7567 					plaintext_len, buffer);
7568 		debug_hexdump(stdout, "plaintext:", plaintext,
7569 			plaintext_len);
7570 	}
7571 	memset(buffer, 0, sizeof(buffer));
7572 
7573 	/* Create the operation */
7574 	retval = create_wireless_algo_auth_cipher_operation(
7575 			tdata->digest_enc.data, tdata->digest_enc.len,
7576 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7577 			tdata->auth_iv.data, tdata->auth_iv.len,
7578 			(tdata->digest_enc.offset == 0 ?
7579 				plaintext_pad_len
7580 				: tdata->digest_enc.offset),
7581 			tdata->validCipherLen.len_bits,
7582 			tdata->cipher.offset_bits,
7583 			tdata->validAuthLen.len_bits,
7584 			tdata->auth.offset_bits,
7585 			op_mode, 1, verify);
7586 
7587 	if (retval < 0)
7588 		return retval;
7589 
7590 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7591 
7592 	/* Check if the op failed because the device doesn't */
7593 	/* support this particular combination of algorithms */
7594 	if (op == NULL && ut_params->op->status ==
7595 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7596 		printf("Device doesn't support this mixed combination. "
7597 				"Test Skipped.\n");
7598 		return TEST_SKIPPED;
7599 	}
7600 	ut_params->op = op;
7601 
7602 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7603 
7604 	ut_params->obuf = (op_mode == IN_PLACE ?
7605 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7606 
7607 	if (verify) {
7608 		if (ut_params->obuf)
7609 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7610 					plaintext_len, buffer);
7611 		else
7612 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7613 					plaintext_len, buffer);
7614 
7615 		debug_hexdump(stdout, "plaintext:", plaintext,
7616 				(tdata->plaintext.len_bits >> 3) -
7617 				tdata->digest_enc.len);
7618 		debug_hexdump(stdout, "plaintext expected:",
7619 				tdata->plaintext.data,
7620 				(tdata->plaintext.len_bits >> 3) -
7621 				tdata->digest_enc.len);
7622 	} else {
7623 		if (ut_params->obuf)
7624 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7625 					ciphertext_len, buffer);
7626 		else
7627 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7628 					ciphertext_len, buffer);
7629 
7630 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7631 			ciphertext_len);
7632 		debug_hexdump(stdout, "ciphertext expected:",
7633 			tdata->ciphertext.data,
7634 			tdata->ciphertext.len_bits >> 3);
7635 
7636 		if (ut_params->obuf)
7637 			digest = rte_pktmbuf_read(ut_params->obuf,
7638 					(tdata->digest_enc.offset == 0 ?
7639 						plaintext_pad_len :
7640 						tdata->digest_enc.offset),
7641 					tdata->digest_enc.len, digest_buffer);
7642 		else
7643 			digest = rte_pktmbuf_read(ut_params->ibuf,
7644 					(tdata->digest_enc.offset == 0 ?
7645 						plaintext_pad_len :
7646 						tdata->digest_enc.offset),
7647 					tdata->digest_enc.len, digest_buffer);
7648 
7649 		debug_hexdump(stdout, "digest:", digest,
7650 				tdata->digest_enc.len);
7651 		debug_hexdump(stdout, "digest expected:",
7652 				tdata->digest_enc.data, tdata->digest_enc.len);
7653 	}
7654 
7655 	/* Validate obuf */
7656 	if (verify) {
7657 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7658 				plaintext,
7659 				tdata->plaintext.data,
7660 				tdata->plaintext.len_bits >> 3,
7661 				"Plaintext data not as expected");
7662 	} else {
7663 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7664 				ciphertext,
7665 				tdata->ciphertext.data,
7666 				tdata->validDataLen.len_bits,
7667 				"Ciphertext data not as expected");
7668 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7669 				digest,
7670 				tdata->digest_enc.data,
7671 				tdata->digest_enc.len,
7672 				"Generated auth tag not as expected");
7673 	}
7674 
7675 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7676 			"crypto op processing failed");
7677 
7678 	return 0;
7679 }
7680 
7681 /** AUTH AES CMAC + CIPHER AES CTR */
7682 
7683 static int
7684 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7685 {
7686 	return test_mixed_auth_cipher(
7687 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7688 }
7689 
7690 static int
7691 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7692 {
7693 	return test_mixed_auth_cipher(
7694 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7695 }
7696 
7697 static int
7698 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7699 {
7700 	return test_mixed_auth_cipher_sgl(
7701 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7702 }
7703 
7704 static int
7705 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7706 {
7707 	return test_mixed_auth_cipher_sgl(
7708 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7709 }
7710 
7711 static int
7712 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7713 {
7714 	return test_mixed_auth_cipher(
7715 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7716 }
7717 
7718 static int
7719 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7720 {
7721 	return test_mixed_auth_cipher(
7722 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7723 }
7724 
7725 static int
7726 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7727 {
7728 	return test_mixed_auth_cipher_sgl(
7729 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7730 }
7731 
7732 static int
7733 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7734 {
7735 	return test_mixed_auth_cipher_sgl(
7736 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7737 }
7738 
7739 /** MIXED AUTH + CIPHER */
7740 
7741 static int
7742 test_auth_zuc_cipher_snow_test_case_1(void)
7743 {
7744 	return test_mixed_auth_cipher(
7745 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7746 }
7747 
7748 static int
7749 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7750 {
7751 	return test_mixed_auth_cipher(
7752 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7753 }
7754 
7755 static int
7756 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7757 {
7758 	return test_mixed_auth_cipher(
7759 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7760 }
7761 
7762 static int
7763 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7764 {
7765 	return test_mixed_auth_cipher(
7766 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7767 }
7768 
7769 static int
7770 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7771 {
7772 	return test_mixed_auth_cipher(
7773 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7774 }
7775 
7776 static int
7777 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7778 {
7779 	return test_mixed_auth_cipher(
7780 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7781 }
7782 
7783 static int
7784 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7785 {
7786 	return test_mixed_auth_cipher(
7787 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7788 }
7789 
7790 static int
7791 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7792 {
7793 	return test_mixed_auth_cipher(
7794 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7795 }
7796 
7797 static int
7798 test_auth_snow_cipher_zuc_test_case_1(void)
7799 {
7800 	return test_mixed_auth_cipher(
7801 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7802 }
7803 
7804 static int
7805 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7806 {
7807 	return test_mixed_auth_cipher(
7808 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7809 }
7810 
7811 static int
7812 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7813 {
7814 	return test_mixed_auth_cipher(
7815 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7816 }
7817 
7818 static int
7819 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7820 {
7821 	return test_mixed_auth_cipher(
7822 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7823 }
7824 
7825 static int
7826 test_auth_null_cipher_snow_test_case_1(void)
7827 {
7828 	return test_mixed_auth_cipher(
7829 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7830 }
7831 
7832 static int
7833 test_verify_auth_null_cipher_snow_test_case_1(void)
7834 {
7835 	return test_mixed_auth_cipher(
7836 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7837 }
7838 
7839 static int
7840 test_auth_null_cipher_zuc_test_case_1(void)
7841 {
7842 	return test_mixed_auth_cipher(
7843 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7844 }
7845 
7846 static int
7847 test_verify_auth_null_cipher_zuc_test_case_1(void)
7848 {
7849 	return test_mixed_auth_cipher(
7850 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7851 }
7852 
7853 static int
7854 test_auth_snow_cipher_null_test_case_1(void)
7855 {
7856 	return test_mixed_auth_cipher(
7857 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7858 }
7859 
7860 static int
7861 test_verify_auth_snow_cipher_null_test_case_1(void)
7862 {
7863 	return test_mixed_auth_cipher(
7864 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7865 }
7866 
7867 static int
7868 test_auth_zuc_cipher_null_test_case_1(void)
7869 {
7870 	return test_mixed_auth_cipher(
7871 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7872 }
7873 
7874 static int
7875 test_verify_auth_zuc_cipher_null_test_case_1(void)
7876 {
7877 	return test_mixed_auth_cipher(
7878 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7879 }
7880 
7881 static int
7882 test_auth_null_cipher_aes_ctr_test_case_1(void)
7883 {
7884 	return test_mixed_auth_cipher(
7885 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7886 }
7887 
7888 static int
7889 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7890 {
7891 	return test_mixed_auth_cipher(
7892 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7893 }
7894 
7895 static int
7896 test_auth_aes_cmac_cipher_null_test_case_1(void)
7897 {
7898 	return test_mixed_auth_cipher(
7899 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7900 }
7901 
7902 static int
7903 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7904 {
7905 	return test_mixed_auth_cipher(
7906 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7907 }
7908 
7909 /* ***** AEAD algorithm Tests ***** */
7910 
7911 static int
7912 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7913 		enum rte_crypto_aead_operation op,
7914 		const uint8_t *key, const uint8_t key_len,
7915 		const uint16_t aad_len, const uint8_t auth_len,
7916 		uint8_t iv_len)
7917 {
7918 	uint8_t aead_key[key_len];
7919 
7920 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7921 	struct crypto_unittest_params *ut_params = &unittest_params;
7922 
7923 	memcpy(aead_key, key, key_len);
7924 
7925 	/* Setup AEAD Parameters */
7926 	ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7927 	ut_params->aead_xform.next = NULL;
7928 	ut_params->aead_xform.aead.algo = algo;
7929 	ut_params->aead_xform.aead.op = op;
7930 	ut_params->aead_xform.aead.key.data = aead_key;
7931 	ut_params->aead_xform.aead.key.length = key_len;
7932 	ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7933 	ut_params->aead_xform.aead.iv.length = iv_len;
7934 	ut_params->aead_xform.aead.digest_length = auth_len;
7935 	ut_params->aead_xform.aead.aad_length = aad_len;
7936 
7937 	debug_hexdump(stdout, "key:", key, key_len);
7938 
7939 	/* Create Crypto session*/
7940 	ut_params->sess = rte_cryptodev_sym_session_create(
7941 			ts_params->session_mpool);
7942 
7943 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7944 			&ut_params->aead_xform,
7945 			ts_params->session_priv_mpool);
7946 
7947 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7948 
7949 	return 0;
7950 }
7951 
7952 static int
7953 create_aead_xform(struct rte_crypto_op *op,
7954 		enum rte_crypto_aead_algorithm algo,
7955 		enum rte_crypto_aead_operation aead_op,
7956 		uint8_t *key, const uint8_t key_len,
7957 		const uint8_t aad_len, const uint8_t auth_len,
7958 		uint8_t iv_len)
7959 {
7960 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7961 			"failed to allocate space for crypto transform");
7962 
7963 	struct rte_crypto_sym_op *sym_op = op->sym;
7964 
7965 	/* Setup AEAD Parameters */
7966 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7967 	sym_op->xform->next = NULL;
7968 	sym_op->xform->aead.algo = algo;
7969 	sym_op->xform->aead.op = aead_op;
7970 	sym_op->xform->aead.key.data = key;
7971 	sym_op->xform->aead.key.length = key_len;
7972 	sym_op->xform->aead.iv.offset = IV_OFFSET;
7973 	sym_op->xform->aead.iv.length = iv_len;
7974 	sym_op->xform->aead.digest_length = auth_len;
7975 	sym_op->xform->aead.aad_length = aad_len;
7976 
7977 	debug_hexdump(stdout, "key:", key, key_len);
7978 
7979 	return 0;
7980 }
7981 
7982 static int
7983 create_aead_operation(enum rte_crypto_aead_operation op,
7984 		const struct aead_test_data *tdata)
7985 {
7986 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7987 	struct crypto_unittest_params *ut_params = &unittest_params;
7988 
7989 	uint8_t *plaintext, *ciphertext;
7990 	unsigned int aad_pad_len, plaintext_pad_len;
7991 
7992 	/* Generate Crypto op data structure */
7993 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7994 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7995 	TEST_ASSERT_NOT_NULL(ut_params->op,
7996 			"Failed to allocate symmetric crypto operation struct");
7997 
7998 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7999 
8000 	/* Append aad data */
8001 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
8002 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
8003 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8004 				aad_pad_len);
8005 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8006 				"no room to append aad");
8007 
8008 		sym_op->aead.aad.phys_addr =
8009 				rte_pktmbuf_iova(ut_params->ibuf);
8010 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
8011 		memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
8012 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8013 			tdata->aad.len);
8014 
8015 		/* Append IV at the end of the crypto operation*/
8016 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8017 				uint8_t *, IV_OFFSET);
8018 
8019 		/* Copy IV 1 byte after the IV pointer, according to the API */
8020 		rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
8021 		debug_hexdump(stdout, "iv:", iv_ptr,
8022 			tdata->iv.len);
8023 	} else {
8024 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
8025 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8026 				aad_pad_len);
8027 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8028 				"no room to append aad");
8029 
8030 		sym_op->aead.aad.phys_addr =
8031 				rte_pktmbuf_iova(ut_params->ibuf);
8032 		memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
8033 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8034 			tdata->aad.len);
8035 
8036 		/* Append IV at the end of the crypto operation*/
8037 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8038 				uint8_t *, IV_OFFSET);
8039 
8040 		if (tdata->iv.len == 0) {
8041 			rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
8042 			debug_hexdump(stdout, "iv:", iv_ptr,
8043 				AES_GCM_J0_LENGTH);
8044 		} else {
8045 			rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
8046 			debug_hexdump(stdout, "iv:", iv_ptr,
8047 				tdata->iv.len);
8048 		}
8049 	}
8050 
8051 	/* Append plaintext/ciphertext */
8052 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8053 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8054 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8055 				plaintext_pad_len);
8056 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
8057 
8058 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
8059 		debug_hexdump(stdout, "plaintext:", plaintext,
8060 				tdata->plaintext.len);
8061 
8062 		if (ut_params->obuf) {
8063 			ciphertext = (uint8_t *)rte_pktmbuf_append(
8064 					ut_params->obuf,
8065 					plaintext_pad_len + aad_pad_len);
8066 			TEST_ASSERT_NOT_NULL(ciphertext,
8067 					"no room to append ciphertext");
8068 
8069 			memset(ciphertext + aad_pad_len, 0,
8070 					tdata->ciphertext.len);
8071 		}
8072 	} else {
8073 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
8074 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8075 				plaintext_pad_len);
8076 		TEST_ASSERT_NOT_NULL(ciphertext,
8077 				"no room to append ciphertext");
8078 
8079 		memcpy(ciphertext, tdata->ciphertext.data,
8080 				tdata->ciphertext.len);
8081 		debug_hexdump(stdout, "ciphertext:", ciphertext,
8082 				tdata->ciphertext.len);
8083 
8084 		if (ut_params->obuf) {
8085 			plaintext = (uint8_t *)rte_pktmbuf_append(
8086 					ut_params->obuf,
8087 					plaintext_pad_len + aad_pad_len);
8088 			TEST_ASSERT_NOT_NULL(plaintext,
8089 					"no room to append plaintext");
8090 
8091 			memset(plaintext + aad_pad_len, 0,
8092 					tdata->plaintext.len);
8093 		}
8094 	}
8095 
8096 	/* Append digest data */
8097 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8098 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8099 				ut_params->obuf ? ut_params->obuf :
8100 						ut_params->ibuf,
8101 						tdata->auth_tag.len);
8102 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8103 				"no room to append digest");
8104 		memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
8105 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8106 				ut_params->obuf ? ut_params->obuf :
8107 						ut_params->ibuf,
8108 						plaintext_pad_len +
8109 						aad_pad_len);
8110 	} else {
8111 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8112 				ut_params->ibuf, tdata->auth_tag.len);
8113 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8114 				"no room to append digest");
8115 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8116 				ut_params->ibuf,
8117 				plaintext_pad_len + aad_pad_len);
8118 
8119 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
8120 			tdata->auth_tag.len);
8121 		debug_hexdump(stdout, "digest:",
8122 			sym_op->aead.digest.data,
8123 			tdata->auth_tag.len);
8124 	}
8125 
8126 	sym_op->aead.data.length = tdata->plaintext.len;
8127 	sym_op->aead.data.offset = aad_pad_len;
8128 
8129 	return 0;
8130 }
8131 
8132 static int
8133 test_authenticated_encryption(const struct aead_test_data *tdata)
8134 {
8135 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8136 	struct crypto_unittest_params *ut_params = &unittest_params;
8137 
8138 	int retval;
8139 	uint8_t *ciphertext, *auth_tag;
8140 	uint16_t plaintext_pad_len;
8141 	uint32_t i;
8142 	struct rte_cryptodev_info dev_info;
8143 
8144 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8145 	uint64_t feat_flags = dev_info.feature_flags;
8146 
8147 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8148 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8149 		printf("Device doesn't support RAW data-path APIs.\n");
8150 		return TEST_SKIPPED;
8151 	}
8152 
8153 	/* Verify the capabilities */
8154 	struct rte_cryptodev_sym_capability_idx cap_idx;
8155 	const struct rte_cryptodev_symmetric_capability *capability;
8156 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8157 	cap_idx.algo.aead = tdata->algo;
8158 	capability = rte_cryptodev_sym_capability_get(
8159 			ts_params->valid_devs[0], &cap_idx);
8160 	if (capability == NULL)
8161 		return TEST_SKIPPED;
8162 	if (rte_cryptodev_sym_capability_check_aead(
8163 			capability, tdata->key.len, tdata->auth_tag.len,
8164 			tdata->aad.len, tdata->iv.len))
8165 		return TEST_SKIPPED;
8166 
8167 	/* Create AEAD session */
8168 	retval = create_aead_session(ts_params->valid_devs[0],
8169 			tdata->algo,
8170 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
8171 			tdata->key.data, tdata->key.len,
8172 			tdata->aad.len, tdata->auth_tag.len,
8173 			tdata->iv.len);
8174 	if (retval < 0)
8175 		return retval;
8176 
8177 	if (tdata->aad.len > MBUF_SIZE) {
8178 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8179 		/* Populate full size of add data */
8180 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8181 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8182 	} else
8183 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8184 
8185 	/* clear mbuf payload */
8186 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8187 			rte_pktmbuf_tailroom(ut_params->ibuf));
8188 
8189 	/* Create AEAD operation */
8190 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8191 	if (retval < 0)
8192 		return retval;
8193 
8194 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8195 
8196 	ut_params->op->sym->m_src = ut_params->ibuf;
8197 
8198 	/* Process crypto operation */
8199 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8200 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8201 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8202 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8203 				ut_params->op, 0, 0, 0, 0);
8204 	else
8205 		TEST_ASSERT_NOT_NULL(
8206 			process_crypto_request(ts_params->valid_devs[0],
8207 			ut_params->op), "failed to process sym crypto op");
8208 
8209 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8210 			"crypto op processing failed");
8211 
8212 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8213 
8214 	if (ut_params->op->sym->m_dst) {
8215 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8216 				uint8_t *);
8217 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8218 				uint8_t *, plaintext_pad_len);
8219 	} else {
8220 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8221 				uint8_t *,
8222 				ut_params->op->sym->cipher.data.offset);
8223 		auth_tag = ciphertext + plaintext_pad_len;
8224 	}
8225 
8226 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8227 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8228 
8229 	/* Validate obuf */
8230 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8231 			ciphertext,
8232 			tdata->ciphertext.data,
8233 			tdata->ciphertext.len,
8234 			"Ciphertext data not as expected");
8235 
8236 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8237 			auth_tag,
8238 			tdata->auth_tag.data,
8239 			tdata->auth_tag.len,
8240 			"Generated auth tag not as expected");
8241 
8242 	return 0;
8243 
8244 }
8245 
8246 #ifdef RTE_LIB_SECURITY
8247 static int
8248 security_proto_supported(enum rte_security_session_action_type action,
8249 	enum rte_security_session_protocol proto)
8250 {
8251 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8252 
8253 	const struct rte_security_capability *capabilities;
8254 	const struct rte_security_capability *capability;
8255 	uint16_t i = 0;
8256 
8257 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8258 				rte_cryptodev_get_sec_ctx(
8259 				ts_params->valid_devs[0]);
8260 
8261 
8262 	capabilities = rte_security_capabilities_get(ctx);
8263 
8264 	if (capabilities == NULL)
8265 		return -ENOTSUP;
8266 
8267 	while ((capability = &capabilities[i++])->action !=
8268 			RTE_SECURITY_ACTION_TYPE_NONE) {
8269 		if (capability->action == action &&
8270 				capability->protocol == proto)
8271 			return 0;
8272 	}
8273 
8274 	return -ENOTSUP;
8275 }
8276 
8277 /* Basic algorithm run function for async inplace mode.
8278  * Creates a session from input parameters and runs one operation
8279  * on input_vec. Checks the output of the crypto operation against
8280  * output_vec.
8281  */
8282 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8283 			   enum rte_crypto_auth_operation opa,
8284 			   const uint8_t *input_vec, unsigned int input_vec_len,
8285 			   const uint8_t *output_vec,
8286 			   unsigned int output_vec_len,
8287 			   enum rte_crypto_cipher_algorithm cipher_alg,
8288 			   const uint8_t *cipher_key, uint32_t cipher_key_len,
8289 			   enum rte_crypto_auth_algorithm auth_alg,
8290 			   const uint8_t *auth_key, uint32_t auth_key_len,
8291 			   uint8_t bearer, enum rte_security_pdcp_domain domain,
8292 			   uint8_t packet_direction, uint8_t sn_size,
8293 			   uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8294 {
8295 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8296 	struct crypto_unittest_params *ut_params = &unittest_params;
8297 	uint8_t *plaintext;
8298 	int ret = TEST_SUCCESS;
8299 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8300 				rte_cryptodev_get_sec_ctx(
8301 				ts_params->valid_devs[0]);
8302 
8303 	/* Verify the capabilities */
8304 	struct rte_security_capability_idx sec_cap_idx;
8305 
8306 	sec_cap_idx.action = ut_params->type;
8307 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8308 	sec_cap_idx.pdcp.domain = domain;
8309 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8310 		return TEST_SKIPPED;
8311 
8312 	/* Generate test mbuf data */
8313 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8314 
8315 	/* clear mbuf payload */
8316 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8317 			rte_pktmbuf_tailroom(ut_params->ibuf));
8318 
8319 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8320 						  input_vec_len);
8321 	memcpy(plaintext, input_vec, input_vec_len);
8322 
8323 	/* Out of place support */
8324 	if (oop) {
8325 		/*
8326 		 * For out-op-place we need to alloc another mbuf
8327 		 */
8328 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8329 		rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8330 	}
8331 
8332 	/* Setup Cipher Parameters */
8333 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8334 	ut_params->cipher_xform.cipher.algo = cipher_alg;
8335 	ut_params->cipher_xform.cipher.op = opc;
8336 	ut_params->cipher_xform.cipher.key.data = cipher_key;
8337 	ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8338 	ut_params->cipher_xform.cipher.iv.length =
8339 				packet_direction ? 4 : 0;
8340 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8341 
8342 	/* Setup HMAC Parameters if ICV header is required */
8343 	if (auth_alg != 0) {
8344 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8345 		ut_params->auth_xform.next = NULL;
8346 		ut_params->auth_xform.auth.algo = auth_alg;
8347 		ut_params->auth_xform.auth.op = opa;
8348 		ut_params->auth_xform.auth.key.data = auth_key;
8349 		ut_params->auth_xform.auth.key.length = auth_key_len;
8350 
8351 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8352 	} else {
8353 		ut_params->cipher_xform.next = NULL;
8354 	}
8355 
8356 	struct rte_security_session_conf sess_conf = {
8357 		.action_type = ut_params->type,
8358 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8359 		{.pdcp = {
8360 			.bearer = bearer,
8361 			.domain = domain,
8362 			.pkt_dir = packet_direction,
8363 			.sn_size = sn_size,
8364 			.hfn = packet_direction ? 0 : hfn,
8365 			/**
8366 			 * hfn can be set as pdcp_test_hfn[i]
8367 			 * if hfn_ovrd is not set. Here, PDCP
8368 			 * packet direction is just used to
8369 			 * run half of the cases with session
8370 			 * HFN and other half with per packet
8371 			 * HFN.
8372 			 */
8373 			.hfn_threshold = hfn_threshold,
8374 			.hfn_ovrd = packet_direction ? 1 : 0,
8375 			.sdap_enabled = sdap,
8376 		} },
8377 		.crypto_xform = &ut_params->cipher_xform
8378 	};
8379 
8380 	/* Create security session */
8381 	ut_params->sec_session = rte_security_session_create(ctx,
8382 				&sess_conf, ts_params->session_mpool,
8383 				ts_params->session_priv_mpool);
8384 
8385 	if (!ut_params->sec_session) {
8386 		printf("TestCase %s()-%d line %d failed %s: ",
8387 			__func__, i, __LINE__, "Failed to allocate session");
8388 		ret = TEST_FAILED;
8389 		goto on_err;
8390 	}
8391 
8392 	/* Generate crypto op data structure */
8393 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8394 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8395 	if (!ut_params->op) {
8396 		printf("TestCase %s()-%d line %d failed %s: ",
8397 			__func__, i, __LINE__,
8398 			"Failed to allocate symmetric crypto operation struct");
8399 		ret = TEST_FAILED;
8400 		goto on_err;
8401 	}
8402 
8403 	uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8404 					uint32_t *, IV_OFFSET);
8405 	*per_pkt_hfn = packet_direction ? hfn : 0;
8406 
8407 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8408 
8409 	/* set crypto operation source mbuf */
8410 	ut_params->op->sym->m_src = ut_params->ibuf;
8411 	if (oop)
8412 		ut_params->op->sym->m_dst = ut_params->obuf;
8413 
8414 	/* Process crypto operation */
8415 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8416 		== NULL) {
8417 		printf("TestCase %s()-%d line %d failed %s: ",
8418 			__func__, i, __LINE__,
8419 			"failed to process sym crypto op");
8420 		ret = TEST_FAILED;
8421 		goto on_err;
8422 	}
8423 
8424 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8425 		printf("TestCase %s()-%d line %d failed %s: ",
8426 			__func__, i, __LINE__, "crypto op processing failed");
8427 		ret = TEST_FAILED;
8428 		goto on_err;
8429 	}
8430 
8431 	/* Validate obuf */
8432 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8433 			uint8_t *);
8434 	if (oop) {
8435 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8436 				uint8_t *);
8437 	}
8438 
8439 	if (memcmp(ciphertext, output_vec, output_vec_len)) {
8440 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8441 		rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8442 		rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8443 		ret = TEST_FAILED;
8444 		goto on_err;
8445 	}
8446 
8447 on_err:
8448 	rte_crypto_op_free(ut_params->op);
8449 	ut_params->op = NULL;
8450 
8451 	if (ut_params->sec_session)
8452 		rte_security_session_destroy(ctx, ut_params->sec_session);
8453 	ut_params->sec_session = NULL;
8454 
8455 	rte_pktmbuf_free(ut_params->ibuf);
8456 	ut_params->ibuf = NULL;
8457 	if (oop) {
8458 		rte_pktmbuf_free(ut_params->obuf);
8459 		ut_params->obuf = NULL;
8460 	}
8461 
8462 	return ret;
8463 }
8464 
8465 static int
8466 test_pdcp_proto_SGL(int i, int oop,
8467 	enum rte_crypto_cipher_operation opc,
8468 	enum rte_crypto_auth_operation opa,
8469 	uint8_t *input_vec,
8470 	unsigned int input_vec_len,
8471 	uint8_t *output_vec,
8472 	unsigned int output_vec_len,
8473 	uint32_t fragsz,
8474 	uint32_t fragsz_oop)
8475 {
8476 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8477 	struct crypto_unittest_params *ut_params = &unittest_params;
8478 	uint8_t *plaintext;
8479 	struct rte_mbuf *buf, *buf_oop = NULL;
8480 	int ret = TEST_SUCCESS;
8481 	int to_trn = 0;
8482 	int to_trn_tbl[16];
8483 	int segs = 1;
8484 	unsigned int trn_data = 0;
8485 	struct rte_cryptodev_info dev_info;
8486 	uint64_t feat_flags;
8487 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8488 				rte_cryptodev_get_sec_ctx(
8489 				ts_params->valid_devs[0]);
8490 	struct rte_mbuf *temp_mbuf;
8491 
8492 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8493 	feat_flags = dev_info.feature_flags;
8494 
8495 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8496 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8497 		printf("Device does not support RAW data-path APIs.\n");
8498 		return -ENOTSUP;
8499 	}
8500 	/* Verify the capabilities */
8501 	struct rte_security_capability_idx sec_cap_idx;
8502 
8503 	sec_cap_idx.action = ut_params->type;
8504 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8505 	sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8506 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8507 		return TEST_SKIPPED;
8508 
8509 	if (fragsz > input_vec_len)
8510 		fragsz = input_vec_len;
8511 
8512 	uint16_t plaintext_len = fragsz;
8513 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8514 
8515 	if (fragsz_oop > output_vec_len)
8516 		frag_size_oop = output_vec_len;
8517 
8518 	int ecx = 0;
8519 	if (input_vec_len % fragsz != 0) {
8520 		if (input_vec_len / fragsz + 1 > 16)
8521 			return 1;
8522 	} else if (input_vec_len / fragsz > 16)
8523 		return 1;
8524 
8525 	/* Out of place support */
8526 	if (oop) {
8527 		/*
8528 		 * For out-op-place we need to alloc another mbuf
8529 		 */
8530 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8531 		rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8532 		buf_oop = ut_params->obuf;
8533 	}
8534 
8535 	/* Generate test mbuf data */
8536 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8537 
8538 	/* clear mbuf payload */
8539 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8540 			rte_pktmbuf_tailroom(ut_params->ibuf));
8541 
8542 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8543 						  plaintext_len);
8544 	memcpy(plaintext, input_vec, plaintext_len);
8545 	trn_data += plaintext_len;
8546 
8547 	buf = ut_params->ibuf;
8548 
8549 	/*
8550 	 * Loop until no more fragments
8551 	 */
8552 
8553 	while (trn_data < input_vec_len) {
8554 		++segs;
8555 		to_trn = (input_vec_len - trn_data < fragsz) ?
8556 				(input_vec_len - trn_data) : fragsz;
8557 
8558 		to_trn_tbl[ecx++] = to_trn;
8559 
8560 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8561 		buf = buf->next;
8562 
8563 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8564 				rte_pktmbuf_tailroom(buf));
8565 
8566 		/* OOP */
8567 		if (oop && !fragsz_oop) {
8568 			buf_oop->next =
8569 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
8570 			buf_oop = buf_oop->next;
8571 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8572 					0, rte_pktmbuf_tailroom(buf_oop));
8573 			rte_pktmbuf_append(buf_oop, to_trn);
8574 		}
8575 
8576 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8577 				to_trn);
8578 
8579 		memcpy(plaintext, input_vec + trn_data, to_trn);
8580 		trn_data += to_trn;
8581 	}
8582 
8583 	ut_params->ibuf->nb_segs = segs;
8584 
8585 	segs = 1;
8586 	if (fragsz_oop && oop) {
8587 		to_trn = 0;
8588 		ecx = 0;
8589 
8590 		trn_data = frag_size_oop;
8591 		while (trn_data < output_vec_len) {
8592 			++segs;
8593 			to_trn =
8594 				(output_vec_len - trn_data <
8595 						frag_size_oop) ?
8596 				(output_vec_len - trn_data) :
8597 						frag_size_oop;
8598 
8599 			to_trn_tbl[ecx++] = to_trn;
8600 
8601 			buf_oop->next =
8602 				rte_pktmbuf_alloc(ts_params->mbuf_pool);
8603 			buf_oop = buf_oop->next;
8604 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8605 					0, rte_pktmbuf_tailroom(buf_oop));
8606 			rte_pktmbuf_append(buf_oop, to_trn);
8607 
8608 			trn_data += to_trn;
8609 		}
8610 		ut_params->obuf->nb_segs = segs;
8611 	}
8612 
8613 	/* Setup Cipher Parameters */
8614 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8615 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8616 	ut_params->cipher_xform.cipher.op = opc;
8617 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8618 	ut_params->cipher_xform.cipher.key.length =
8619 					pdcp_test_params[i].cipher_key_len;
8620 	ut_params->cipher_xform.cipher.iv.length = 0;
8621 
8622 	/* Setup HMAC Parameters if ICV header is required */
8623 	if (pdcp_test_params[i].auth_alg != 0) {
8624 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8625 		ut_params->auth_xform.next = NULL;
8626 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8627 		ut_params->auth_xform.auth.op = opa;
8628 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8629 		ut_params->auth_xform.auth.key.length =
8630 					pdcp_test_params[i].auth_key_len;
8631 
8632 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8633 	} else {
8634 		ut_params->cipher_xform.next = NULL;
8635 	}
8636 
8637 	struct rte_security_session_conf sess_conf = {
8638 		.action_type = ut_params->type,
8639 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8640 		{.pdcp = {
8641 			.bearer = pdcp_test_bearer[i],
8642 			.domain = pdcp_test_params[i].domain,
8643 			.pkt_dir = pdcp_test_packet_direction[i],
8644 			.sn_size = pdcp_test_data_sn_size[i],
8645 			.hfn = pdcp_test_hfn[i],
8646 			.hfn_threshold = pdcp_test_hfn_threshold[i],
8647 			.hfn_ovrd = 0,
8648 		} },
8649 		.crypto_xform = &ut_params->cipher_xform
8650 	};
8651 
8652 	/* Create security session */
8653 	ut_params->sec_session = rte_security_session_create(ctx,
8654 				&sess_conf, ts_params->session_mpool,
8655 				ts_params->session_priv_mpool);
8656 
8657 	if (!ut_params->sec_session) {
8658 		printf("TestCase %s()-%d line %d failed %s: ",
8659 			__func__, i, __LINE__, "Failed to allocate session");
8660 		ret = TEST_FAILED;
8661 		goto on_err;
8662 	}
8663 
8664 	/* Generate crypto op data structure */
8665 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8666 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8667 	if (!ut_params->op) {
8668 		printf("TestCase %s()-%d line %d failed %s: ",
8669 			__func__, i, __LINE__,
8670 			"Failed to allocate symmetric crypto operation struct");
8671 		ret = TEST_FAILED;
8672 		goto on_err;
8673 	}
8674 
8675 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8676 
8677 	/* set crypto operation source mbuf */
8678 	ut_params->op->sym->m_src = ut_params->ibuf;
8679 	if (oop)
8680 		ut_params->op->sym->m_dst = ut_params->obuf;
8681 
8682 	/* Process crypto operation */
8683 	temp_mbuf = ut_params->op->sym->m_src;
8684 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
8685 		/* filling lengths */
8686 		while (temp_mbuf) {
8687 			ut_params->op->sym->cipher.data.length
8688 				+= temp_mbuf->pkt_len;
8689 			ut_params->op->sym->auth.data.length
8690 				+= temp_mbuf->pkt_len;
8691 			temp_mbuf = temp_mbuf->next;
8692 		}
8693 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8694 			ut_params->op, 1, 1, 0, 0);
8695 	} else {
8696 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
8697 							ut_params->op);
8698 	}
8699 	if (ut_params->op == NULL) {
8700 		printf("TestCase %s()-%d line %d failed %s: ",
8701 			__func__, i, __LINE__,
8702 			"failed to process sym crypto op");
8703 		ret = TEST_FAILED;
8704 		goto on_err;
8705 	}
8706 
8707 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8708 		printf("TestCase %s()-%d line %d failed %s: ",
8709 			__func__, i, __LINE__, "crypto op processing failed");
8710 		ret = TEST_FAILED;
8711 		goto on_err;
8712 	}
8713 
8714 	/* Validate obuf */
8715 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8716 			uint8_t *);
8717 	if (oop) {
8718 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8719 				uint8_t *);
8720 	}
8721 	if (fragsz_oop)
8722 		fragsz = frag_size_oop;
8723 	if (memcmp(ciphertext, output_vec, fragsz)) {
8724 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8725 		rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8726 		rte_hexdump(stdout, "reference", output_vec, fragsz);
8727 		ret = TEST_FAILED;
8728 		goto on_err;
8729 	}
8730 
8731 	buf = ut_params->op->sym->m_src->next;
8732 	if (oop)
8733 		buf = ut_params->op->sym->m_dst->next;
8734 
8735 	unsigned int off = fragsz;
8736 
8737 	ecx = 0;
8738 	while (buf) {
8739 		ciphertext = rte_pktmbuf_mtod(buf,
8740 				uint8_t *);
8741 		if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8742 			printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8743 			rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8744 			rte_hexdump(stdout, "reference", output_vec + off,
8745 					to_trn_tbl[ecx]);
8746 			ret = TEST_FAILED;
8747 			goto on_err;
8748 		}
8749 		off += to_trn_tbl[ecx++];
8750 		buf = buf->next;
8751 	}
8752 on_err:
8753 	rte_crypto_op_free(ut_params->op);
8754 	ut_params->op = NULL;
8755 
8756 	if (ut_params->sec_session)
8757 		rte_security_session_destroy(ctx, ut_params->sec_session);
8758 	ut_params->sec_session = NULL;
8759 
8760 	rte_pktmbuf_free(ut_params->ibuf);
8761 	ut_params->ibuf = NULL;
8762 	if (oop) {
8763 		rte_pktmbuf_free(ut_params->obuf);
8764 		ut_params->obuf = NULL;
8765 	}
8766 
8767 	return ret;
8768 }
8769 
8770 int
8771 test_pdcp_proto_cplane_encap(int i)
8772 {
8773 	return test_pdcp_proto(
8774 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8775 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8776 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8777 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8778 		pdcp_test_params[i].cipher_key_len,
8779 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8780 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8781 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8782 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8783 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8784 }
8785 
8786 int
8787 test_pdcp_proto_uplane_encap(int i)
8788 {
8789 	return test_pdcp_proto(
8790 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8791 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8792 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8793 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8794 		pdcp_test_params[i].cipher_key_len,
8795 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8796 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8797 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8798 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8799 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8800 }
8801 
8802 int
8803 test_pdcp_proto_uplane_encap_with_int(int i)
8804 {
8805 	return test_pdcp_proto(
8806 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8807 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8808 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8809 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8810 		pdcp_test_params[i].cipher_key_len,
8811 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8812 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8813 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8814 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8815 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8816 }
8817 
8818 int
8819 test_pdcp_proto_cplane_decap(int i)
8820 {
8821 	return test_pdcp_proto(
8822 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8823 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8824 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8825 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8826 		pdcp_test_params[i].cipher_key_len,
8827 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8828 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8829 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8830 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8831 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8832 }
8833 
8834 int
8835 test_pdcp_proto_uplane_decap(int i)
8836 {
8837 	return test_pdcp_proto(
8838 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8839 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8840 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8841 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8842 		pdcp_test_params[i].cipher_key_len,
8843 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8844 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8845 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8846 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8847 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8848 }
8849 
8850 int
8851 test_pdcp_proto_uplane_decap_with_int(int i)
8852 {
8853 	return test_pdcp_proto(
8854 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8855 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8856 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8857 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8858 		pdcp_test_params[i].cipher_key_len,
8859 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8860 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8861 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8862 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8863 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8864 }
8865 
8866 static int
8867 test_PDCP_PROTO_SGL_in_place_32B(void)
8868 {
8869 	/* i can be used for running any PDCP case
8870 	 * In this case it is uplane 12-bit AES-SNOW DL encap
8871 	 */
8872 	int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8873 	return test_pdcp_proto_SGL(i, IN_PLACE,
8874 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8875 			RTE_CRYPTO_AUTH_OP_GENERATE,
8876 			pdcp_test_data_in[i],
8877 			pdcp_test_data_in_len[i],
8878 			pdcp_test_data_out[i],
8879 			pdcp_test_data_in_len[i]+4,
8880 			32, 0);
8881 }
8882 static int
8883 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8884 {
8885 	/* i can be used for running any PDCP case
8886 	 * In this case it is uplane 18-bit NULL-NULL DL encap
8887 	 */
8888 	int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8889 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8890 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8891 			RTE_CRYPTO_AUTH_OP_GENERATE,
8892 			pdcp_test_data_in[i],
8893 			pdcp_test_data_in_len[i],
8894 			pdcp_test_data_out[i],
8895 			pdcp_test_data_in_len[i]+4,
8896 			32, 128);
8897 }
8898 static int
8899 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8900 {
8901 	/* i can be used for running any PDCP case
8902 	 * In this case it is uplane 18-bit AES DL encap
8903 	 */
8904 	int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8905 			+ DOWNLINK;
8906 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8907 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8908 			RTE_CRYPTO_AUTH_OP_GENERATE,
8909 			pdcp_test_data_in[i],
8910 			pdcp_test_data_in_len[i],
8911 			pdcp_test_data_out[i],
8912 			pdcp_test_data_in_len[i],
8913 			32, 40);
8914 }
8915 static int
8916 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8917 {
8918 	/* i can be used for running any PDCP case
8919 	 * In this case it is cplane 12-bit AES-ZUC DL encap
8920 	 */
8921 	int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8922 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8923 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8924 			RTE_CRYPTO_AUTH_OP_GENERATE,
8925 			pdcp_test_data_in[i],
8926 			pdcp_test_data_in_len[i],
8927 			pdcp_test_data_out[i],
8928 			pdcp_test_data_in_len[i]+4,
8929 			128, 32);
8930 }
8931 
8932 static int
8933 test_PDCP_SDAP_PROTO_encap_all(void)
8934 {
8935 	int i = 0, size = 0;
8936 	int err, all_err = TEST_SUCCESS;
8937 	const struct pdcp_sdap_test *cur_test;
8938 
8939 	size = RTE_DIM(list_pdcp_sdap_tests);
8940 
8941 	for (i = 0; i < size; i++) {
8942 		cur_test = &list_pdcp_sdap_tests[i];
8943 		err = test_pdcp_proto(
8944 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8945 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8946 			cur_test->in_len, cur_test->data_out,
8947 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8948 			cur_test->param.cipher_alg, cur_test->cipher_key,
8949 			cur_test->param.cipher_key_len,
8950 			cur_test->param.auth_alg,
8951 			cur_test->auth_key, cur_test->param.auth_key_len,
8952 			cur_test->bearer, cur_test->param.domain,
8953 			cur_test->packet_direction, cur_test->sn_size,
8954 			cur_test->hfn,
8955 			cur_test->hfn_threshold, SDAP_ENABLED);
8956 		if (err) {
8957 			printf("\t%d) %s: Encapsulation failed\n",
8958 					cur_test->test_idx,
8959 					cur_test->param.name);
8960 			err = TEST_FAILED;
8961 		} else {
8962 			printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
8963 					cur_test->param.name);
8964 			err = TEST_SUCCESS;
8965 		}
8966 		all_err += err;
8967 	}
8968 
8969 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8970 
8971 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8972 }
8973 
8974 static int
8975 test_PDCP_PROTO_short_mac(void)
8976 {
8977 	int i = 0, size = 0;
8978 	int err, all_err = TEST_SUCCESS;
8979 	const struct pdcp_short_mac_test *cur_test;
8980 
8981 	size = RTE_DIM(list_pdcp_smac_tests);
8982 
8983 	for (i = 0; i < size; i++) {
8984 		cur_test = &list_pdcp_smac_tests[i];
8985 		err = test_pdcp_proto(
8986 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8987 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8988 			cur_test->in_len, cur_test->data_out,
8989 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8990 			RTE_CRYPTO_CIPHER_NULL, NULL,
8991 			0, cur_test->param.auth_alg,
8992 			cur_test->auth_key, cur_test->param.auth_key_len,
8993 			0, cur_test->param.domain, 0, 0,
8994 			0, 0, 0);
8995 		if (err) {
8996 			printf("\t%d) %s: Short MAC test failed\n",
8997 					cur_test->test_idx,
8998 					cur_test->param.name);
8999 			err = TEST_FAILED;
9000 		} else {
9001 			printf("\t%d) %s: Short MAC test PASS\n",
9002 					cur_test->test_idx,
9003 					cur_test->param.name);
9004 			rte_hexdump(stdout, "MAC I",
9005 				    cur_test->data_out + cur_test->in_len + 2,
9006 				    2);
9007 			err = TEST_SUCCESS;
9008 		}
9009 		all_err += err;
9010 	}
9011 
9012 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9013 
9014 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9015 
9016 }
9017 
9018 static int
9019 test_PDCP_SDAP_PROTO_decap_all(void)
9020 {
9021 	int i = 0, size = 0;
9022 	int err, all_err = TEST_SUCCESS;
9023 	const struct pdcp_sdap_test *cur_test;
9024 
9025 	size = RTE_DIM(list_pdcp_sdap_tests);
9026 
9027 	for (i = 0; i < size; i++) {
9028 		cur_test = &list_pdcp_sdap_tests[i];
9029 		err = test_pdcp_proto(
9030 			i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
9031 			RTE_CRYPTO_AUTH_OP_VERIFY,
9032 			cur_test->data_out,
9033 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9034 			cur_test->data_in, cur_test->in_len,
9035 			cur_test->param.cipher_alg,
9036 			cur_test->cipher_key, cur_test->param.cipher_key_len,
9037 			cur_test->param.auth_alg, cur_test->auth_key,
9038 			cur_test->param.auth_key_len, cur_test->bearer,
9039 			cur_test->param.domain, cur_test->packet_direction,
9040 			cur_test->sn_size, cur_test->hfn,
9041 			cur_test->hfn_threshold, SDAP_ENABLED);
9042 		if (err) {
9043 			printf("\t%d) %s: Decapsulation failed\n",
9044 					cur_test->test_idx,
9045 					cur_test->param.name);
9046 			err = TEST_FAILED;
9047 		} else {
9048 			printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
9049 					cur_test->param.name);
9050 			err = TEST_SUCCESS;
9051 		}
9052 		all_err += err;
9053 	}
9054 
9055 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9056 
9057 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9058 }
9059 
9060 static int
9061 test_ipsec_proto_process(const struct ipsec_test_data td[],
9062 			 struct ipsec_test_data res_d[],
9063 			 int nb_td,
9064 			 bool silent,
9065 			 const struct ipsec_test_flags *flags)
9066 {
9067 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9068 	struct crypto_unittest_params *ut_params = &unittest_params;
9069 	struct rte_security_capability_idx sec_cap_idx;
9070 	const struct rte_security_capability *sec_cap;
9071 	struct rte_security_ipsec_xform ipsec_xform;
9072 	uint8_t dev_id = ts_params->valid_devs[0];
9073 	enum rte_security_ipsec_sa_direction dir;
9074 	struct ipsec_test_data *res_d_tmp = NULL;
9075 	uint32_t src = RTE_IPV4(192, 168, 1, 0);
9076 	uint32_t dst = RTE_IPV4(192, 168, 1, 1);
9077 	int salt_len, i, ret = TEST_SUCCESS;
9078 	struct rte_security_ctx *ctx;
9079 	uint8_t *input_text;
9080 	uint32_t verify;
9081 
9082 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9083 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9084 
9085 	/* Use first test data to create session */
9086 
9087 	/* Copy IPsec xform */
9088 	memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform));
9089 
9090 	dir = ipsec_xform.direction;
9091 	verify = flags->tunnel_hdr_verify;
9092 
9093 	if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) {
9094 		if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR)
9095 			src += 1;
9096 		else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR)
9097 			dst += 1;
9098 	}
9099 
9100 	memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src, sizeof(src));
9101 	memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst, sizeof(dst));
9102 
9103 	ctx = rte_cryptodev_get_sec_ctx(dev_id);
9104 
9105 	sec_cap_idx.action = ut_params->type;
9106 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
9107 	sec_cap_idx.ipsec.proto = ipsec_xform.proto;
9108 	sec_cap_idx.ipsec.mode = ipsec_xform.mode;
9109 	sec_cap_idx.ipsec.direction = ipsec_xform.direction;
9110 
9111 	if (flags->udp_encap)
9112 		ipsec_xform.options.udp_encap = 1;
9113 
9114 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9115 	if (sec_cap == NULL)
9116 		return TEST_SKIPPED;
9117 
9118 	/* Copy cipher session parameters */
9119 	if (td[0].aead) {
9120 		memcpy(&ut_params->aead_xform, &td[0].xform.aead,
9121 		       sizeof(ut_params->aead_xform));
9122 		ut_params->aead_xform.aead.key.data = td[0].key.data;
9123 		ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
9124 
9125 		/* Verify crypto capabilities */
9126 		if (test_ipsec_crypto_caps_aead_verify(
9127 				sec_cap,
9128 				&ut_params->aead_xform) != 0) {
9129 			if (!silent)
9130 				RTE_LOG(INFO, USER1,
9131 					"Crypto capabilities not supported\n");
9132 			return TEST_SKIPPED;
9133 		}
9134 	} else {
9135 		/* Only AEAD supported now */
9136 		return TEST_SKIPPED;
9137 	}
9138 
9139 	if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
9140 		return TEST_SKIPPED;
9141 
9142 	salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
9143 	memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
9144 
9145 	struct rte_security_session_conf sess_conf = {
9146 		.action_type = ut_params->type,
9147 		.protocol = RTE_SECURITY_PROTOCOL_IPSEC,
9148 		.ipsec = ipsec_xform,
9149 		.crypto_xform = &ut_params->aead_xform,
9150 	};
9151 
9152 	/* Create security session */
9153 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9154 					ts_params->session_mpool,
9155 					ts_params->session_priv_mpool);
9156 
9157 	if (ut_params->sec_session == NULL)
9158 		return TEST_SKIPPED;
9159 
9160 	for (i = 0; i < nb_td; i++) {
9161 		/* Setup source mbuf payload */
9162 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9163 		memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9164 				rte_pktmbuf_tailroom(ut_params->ibuf));
9165 
9166 		input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9167 				td[i].input_text.len);
9168 
9169 		memcpy(input_text, td[i].input_text.data,
9170 		       td[i].input_text.len);
9171 
9172 		/* Generate crypto op data structure */
9173 		ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9174 					RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9175 		if (!ut_params->op) {
9176 			printf("TestCase %s line %d: %s\n",
9177 				__func__, __LINE__,
9178 				"failed to allocate crypto op");
9179 			ret = TEST_FAILED;
9180 			goto crypto_op_free;
9181 		}
9182 
9183 		/* Attach session to operation */
9184 		rte_security_attach_session(ut_params->op,
9185 					    ut_params->sec_session);
9186 
9187 		/* Set crypto operation mbufs */
9188 		ut_params->op->sym->m_src = ut_params->ibuf;
9189 		ut_params->op->sym->m_dst = NULL;
9190 
9191 		/* Copy IV in crypto operation when IV generation is disabled */
9192 		if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
9193 		    ipsec_xform.options.iv_gen_disable == 1) {
9194 			uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
9195 								uint8_t *,
9196 								IV_OFFSET);
9197 			int len;
9198 
9199 			if (td[i].aead)
9200 				len = td[i].xform.aead.aead.iv.length;
9201 			else
9202 				len = td[i].xform.chain.cipher.cipher.iv.length;
9203 
9204 			memcpy(iv, td[i].iv.data, len);
9205 		}
9206 
9207 		/* Process crypto operation */
9208 		process_crypto_request(dev_id, ut_params->op);
9209 
9210 		ret = test_ipsec_status_check(ut_params->op, flags, dir, i + 1);
9211 		if (ret != TEST_SUCCESS)
9212 			goto crypto_op_free;
9213 
9214 		if (res_d != NULL)
9215 			res_d_tmp = &res_d[i];
9216 
9217 		ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
9218 					      res_d_tmp, silent, flags);
9219 		if (ret != TEST_SUCCESS)
9220 			goto crypto_op_free;
9221 
9222 		rte_crypto_op_free(ut_params->op);
9223 		ut_params->op = NULL;
9224 
9225 		rte_pktmbuf_free(ut_params->ibuf);
9226 		ut_params->ibuf = NULL;
9227 	}
9228 
9229 crypto_op_free:
9230 	rte_crypto_op_free(ut_params->op);
9231 	ut_params->op = NULL;
9232 
9233 	rte_pktmbuf_free(ut_params->ibuf);
9234 	ut_params->ibuf = NULL;
9235 
9236 	if (ut_params->sec_session)
9237 		rte_security_session_destroy(ctx, ut_params->sec_session);
9238 	ut_params->sec_session = NULL;
9239 
9240 	return ret;
9241 }
9242 
9243 static int
9244 test_ipsec_proto_known_vec(const void *test_data)
9245 {
9246 	struct ipsec_test_data td_outb;
9247 	struct ipsec_test_flags flags;
9248 
9249 	memset(&flags, 0, sizeof(flags));
9250 
9251 	memcpy(&td_outb, test_data, sizeof(td_outb));
9252 
9253 	/* Disable IV gen to be able to test with known vectors */
9254 	td_outb.ipsec_xform.options.iv_gen_disable = 1;
9255 
9256 	return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9257 }
9258 
9259 static int
9260 test_ipsec_proto_known_vec_inb(const void *td_outb)
9261 {
9262 	struct ipsec_test_flags flags;
9263 	struct ipsec_test_data td_inb;
9264 
9265 	memset(&flags, 0, sizeof(flags));
9266 
9267 	test_ipsec_td_in_from_out(td_outb, &td_inb);
9268 
9269 	return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
9270 }
9271 
9272 static int
9273 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
9274 {
9275 	struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9276 	struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9277 	unsigned int i, nb_pkts = 1, pass_cnt = 0;
9278 	int ret;
9279 
9280 	if (flags->iv_gen ||
9281 	    flags->sa_expiry_pkts_soft ||
9282 	    flags->sa_expiry_pkts_hard)
9283 		nb_pkts = IPSEC_TEST_PACKETS_MAX;
9284 
9285 	for (i = 0; i < RTE_DIM(aead_list); i++) {
9286 		test_ipsec_td_prepare(&aead_list[i],
9287 				      NULL,
9288 				      flags,
9289 				      td_outb,
9290 				      nb_pkts);
9291 
9292 		ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9293 					       flags);
9294 		if (ret == TEST_SKIPPED)
9295 			continue;
9296 
9297 		if (ret == TEST_FAILED)
9298 			return TEST_FAILED;
9299 
9300 		test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9301 
9302 		ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9303 					       flags);
9304 		if (ret == TEST_SKIPPED)
9305 			continue;
9306 
9307 		if (ret == TEST_FAILED)
9308 			return TEST_FAILED;
9309 
9310 		if (flags->display_alg)
9311 			test_ipsec_display_alg(&aead_list[i], NULL);
9312 
9313 		pass_cnt++;
9314 	}
9315 
9316 	if (pass_cnt > 0)
9317 		return TEST_SUCCESS;
9318 	else
9319 		return TEST_SKIPPED;
9320 }
9321 
9322 static int
9323 test_ipsec_proto_display_list(const void *data __rte_unused)
9324 {
9325 	struct ipsec_test_flags flags;
9326 
9327 	memset(&flags, 0, sizeof(flags));
9328 
9329 	flags.display_alg = true;
9330 
9331 	return test_ipsec_proto_all(&flags);
9332 }
9333 
9334 static int
9335 test_ipsec_proto_iv_gen(const void *data __rte_unused)
9336 {
9337 	struct ipsec_test_flags flags;
9338 
9339 	memset(&flags, 0, sizeof(flags));
9340 
9341 	flags.iv_gen = true;
9342 
9343 	return test_ipsec_proto_all(&flags);
9344 }
9345 
9346 static int
9347 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused)
9348 {
9349 	struct ipsec_test_flags flags;
9350 
9351 	memset(&flags, 0, sizeof(flags));
9352 
9353 	flags.sa_expiry_pkts_soft = true;
9354 
9355 	return test_ipsec_proto_all(&flags);
9356 }
9357 
9358 static int
9359 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused)
9360 {
9361 	struct ipsec_test_flags flags;
9362 
9363 	memset(&flags, 0, sizeof(flags));
9364 
9365 	flags.sa_expiry_pkts_hard = true;
9366 
9367 	return test_ipsec_proto_all(&flags);
9368 }
9369 
9370 static int
9371 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused)
9372 {
9373 	struct ipsec_test_flags flags;
9374 
9375 	memset(&flags, 0, sizeof(flags));
9376 
9377 	flags.icv_corrupt = true;
9378 
9379 	return test_ipsec_proto_all(&flags);
9380 }
9381 
9382 static int
9383 test_ipsec_proto_udp_encap(const void *data __rte_unused)
9384 {
9385 	struct ipsec_test_flags flags;
9386 
9387 	memset(&flags, 0, sizeof(flags));
9388 
9389 	flags.udp_encap = true;
9390 
9391 	return test_ipsec_proto_all(&flags);
9392 }
9393 
9394 static int
9395 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused)
9396 {
9397 	struct ipsec_test_flags flags;
9398 
9399 	memset(&flags, 0, sizeof(flags));
9400 
9401 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
9402 
9403 	return test_ipsec_proto_all(&flags);
9404 }
9405 
9406 static int
9407 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
9408 {
9409 	struct ipsec_test_flags flags;
9410 
9411 	memset(&flags, 0, sizeof(flags));
9412 
9413 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
9414 
9415 	return test_ipsec_proto_all(&flags);
9416 }
9417 
9418 static int
9419 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused)
9420 {
9421 	struct ipsec_test_flags flags;
9422 
9423 	memset(&flags, 0, sizeof(flags));
9424 
9425 	flags.udp_encap = true;
9426 	flags.udp_ports_verify = true;
9427 
9428 	return test_ipsec_proto_all(&flags);
9429 }
9430 
9431 static int
9432 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused)
9433 {
9434 	struct ipsec_test_flags flags;
9435 
9436 	memset(&flags, 0, sizeof(flags));
9437 
9438 	flags.ip_csum = true;
9439 
9440 	return test_ipsec_proto_all(&flags);
9441 }
9442 
9443 static int
9444 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused)
9445 {
9446 	struct ipsec_test_flags flags;
9447 
9448 	memset(&flags, 0, sizeof(flags));
9449 
9450 	flags.l4_csum = true;
9451 
9452 	return test_ipsec_proto_all(&flags);
9453 }
9454 
9455 static int
9456 test_PDCP_PROTO_all(void)
9457 {
9458 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9459 	struct crypto_unittest_params *ut_params = &unittest_params;
9460 	struct rte_cryptodev_info dev_info;
9461 	int status;
9462 
9463 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9464 	uint64_t feat_flags = dev_info.feature_flags;
9465 
9466 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9467 		return TEST_SKIPPED;
9468 
9469 	/* Set action type */
9470 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9471 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9472 		gbl_action_type;
9473 
9474 	if (security_proto_supported(ut_params->type,
9475 			RTE_SECURITY_PROTOCOL_PDCP) < 0)
9476 		return TEST_SKIPPED;
9477 
9478 	status = test_PDCP_PROTO_cplane_encap_all();
9479 	status += test_PDCP_PROTO_cplane_decap_all();
9480 	status += test_PDCP_PROTO_uplane_encap_all();
9481 	status += test_PDCP_PROTO_uplane_decap_all();
9482 	status += test_PDCP_PROTO_SGL_in_place_32B();
9483 	status += test_PDCP_PROTO_SGL_oop_32B_128B();
9484 	status += test_PDCP_PROTO_SGL_oop_32B_40B();
9485 	status += test_PDCP_PROTO_SGL_oop_128B_32B();
9486 	status += test_PDCP_SDAP_PROTO_encap_all();
9487 	status += test_PDCP_SDAP_PROTO_decap_all();
9488 	status += test_PDCP_PROTO_short_mac();
9489 
9490 	if (status)
9491 		return TEST_FAILED;
9492 	else
9493 		return TEST_SUCCESS;
9494 }
9495 
9496 static int
9497 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td)
9498 {
9499 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9500 	struct crypto_unittest_params *ut_params = &unittest_params;
9501 	uint8_t *plaintext, *ciphertext;
9502 	uint8_t *iv_ptr;
9503 	int32_t cipher_len, crc_len;
9504 	uint32_t crc_data_len;
9505 	int ret = TEST_SUCCESS;
9506 
9507 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9508 					rte_cryptodev_get_sec_ctx(
9509 						ts_params->valid_devs[0]);
9510 
9511 	/* Verify the capabilities */
9512 	struct rte_security_capability_idx sec_cap_idx;
9513 	const struct rte_security_capability *sec_cap;
9514 	const struct rte_cryptodev_capabilities *crypto_cap;
9515 	const struct rte_cryptodev_symmetric_capability *sym_cap;
9516 	int j = 0;
9517 
9518 	sec_cap_idx.action = ut_params->type;
9519 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9520 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
9521 
9522 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9523 	if (sec_cap == NULL)
9524 		return TEST_SKIPPED;
9525 
9526 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9527 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9528 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9529 				crypto_cap->sym.xform_type ==
9530 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
9531 				crypto_cap->sym.cipher.algo ==
9532 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9533 			sym_cap = &crypto_cap->sym;
9534 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9535 						d_td->key.len,
9536 						d_td->iv.len) == 0)
9537 				break;
9538 		}
9539 	}
9540 
9541 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9542 		return TEST_SKIPPED;
9543 
9544 	/* Setup source mbuf payload */
9545 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9546 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9547 			rte_pktmbuf_tailroom(ut_params->ibuf));
9548 
9549 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9550 			d_td->ciphertext.len);
9551 
9552 	memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
9553 
9554 	/* Setup cipher session parameters */
9555 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9556 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9557 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
9558 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9559 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9560 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9561 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9562 	ut_params->cipher_xform.next = NULL;
9563 
9564 	/* Setup DOCSIS session parameters */
9565 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
9566 
9567 	struct rte_security_session_conf sess_conf = {
9568 		.action_type = ut_params->type,
9569 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9570 		.docsis = ut_params->docsis_xform,
9571 		.crypto_xform = &ut_params->cipher_xform,
9572 	};
9573 
9574 	/* Create security session */
9575 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9576 					ts_params->session_mpool,
9577 					ts_params->session_priv_mpool);
9578 
9579 	if (!ut_params->sec_session) {
9580 		printf("TestCase %s(%d) line %d: %s\n",
9581 			__func__, i, __LINE__, "failed to allocate session");
9582 		ret = TEST_FAILED;
9583 		goto on_err;
9584 	}
9585 
9586 	/* Generate crypto op data structure */
9587 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9588 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9589 	if (!ut_params->op) {
9590 		printf("TestCase %s(%d) line %d: %s\n",
9591 			__func__, i, __LINE__,
9592 			"failed to allocate symmetric crypto operation");
9593 		ret = TEST_FAILED;
9594 		goto on_err;
9595 	}
9596 
9597 	/* Setup CRC operation parameters */
9598 	crc_len = d_td->ciphertext.no_crc == false ?
9599 			(d_td->ciphertext.len -
9600 				d_td->ciphertext.crc_offset -
9601 				RTE_ETHER_CRC_LEN) :
9602 			0;
9603 	crc_len = crc_len > 0 ? crc_len : 0;
9604 	crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
9605 	ut_params->op->sym->auth.data.length = crc_len;
9606 	ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
9607 
9608 	/* Setup cipher operation parameters */
9609 	cipher_len = d_td->ciphertext.no_cipher == false ?
9610 			(d_td->ciphertext.len -
9611 				d_td->ciphertext.cipher_offset) :
9612 			0;
9613 	cipher_len = cipher_len > 0 ? cipher_len : 0;
9614 	ut_params->op->sym->cipher.data.length = cipher_len;
9615 	ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
9616 
9617 	/* Setup cipher IV */
9618 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9619 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9620 
9621 	/* Attach session to operation */
9622 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
9623 
9624 	/* Set crypto operation mbufs */
9625 	ut_params->op->sym->m_src = ut_params->ibuf;
9626 	ut_params->op->sym->m_dst = NULL;
9627 
9628 	/* Process crypto operation */
9629 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9630 			NULL) {
9631 		printf("TestCase %s(%d) line %d: %s\n",
9632 			__func__, i, __LINE__,
9633 			"failed to process security crypto op");
9634 		ret = TEST_FAILED;
9635 		goto on_err;
9636 	}
9637 
9638 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9639 		printf("TestCase %s(%d) line %d: %s\n",
9640 			__func__, i, __LINE__, "crypto op processing failed");
9641 		ret = TEST_FAILED;
9642 		goto on_err;
9643 	}
9644 
9645 	/* Validate plaintext */
9646 	plaintext = ciphertext;
9647 
9648 	if (memcmp(plaintext, d_td->plaintext.data,
9649 			d_td->plaintext.len - crc_data_len)) {
9650 		printf("TestCase %s(%d) line %d: %s\n",
9651 			__func__, i, __LINE__, "plaintext not as expected\n");
9652 		rte_hexdump(stdout, "expected", d_td->plaintext.data,
9653 				d_td->plaintext.len);
9654 		rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
9655 		ret = TEST_FAILED;
9656 		goto on_err;
9657 	}
9658 
9659 on_err:
9660 	rte_crypto_op_free(ut_params->op);
9661 	ut_params->op = NULL;
9662 
9663 	if (ut_params->sec_session)
9664 		rte_security_session_destroy(ctx, ut_params->sec_session);
9665 	ut_params->sec_session = NULL;
9666 
9667 	rte_pktmbuf_free(ut_params->ibuf);
9668 	ut_params->ibuf = NULL;
9669 
9670 	return ret;
9671 }
9672 
9673 static int
9674 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td)
9675 {
9676 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9677 	struct crypto_unittest_params *ut_params = &unittest_params;
9678 	uint8_t *plaintext, *ciphertext;
9679 	uint8_t *iv_ptr;
9680 	int32_t cipher_len, crc_len;
9681 	int ret = TEST_SUCCESS;
9682 
9683 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9684 					rte_cryptodev_get_sec_ctx(
9685 						ts_params->valid_devs[0]);
9686 
9687 	/* Verify the capabilities */
9688 	struct rte_security_capability_idx sec_cap_idx;
9689 	const struct rte_security_capability *sec_cap;
9690 	const struct rte_cryptodev_capabilities *crypto_cap;
9691 	const struct rte_cryptodev_symmetric_capability *sym_cap;
9692 	int j = 0;
9693 
9694 	sec_cap_idx.action = ut_params->type;
9695 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9696 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9697 
9698 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9699 	if (sec_cap == NULL)
9700 		return TEST_SKIPPED;
9701 
9702 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9703 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9704 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9705 				crypto_cap->sym.xform_type ==
9706 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
9707 				crypto_cap->sym.cipher.algo ==
9708 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9709 			sym_cap = &crypto_cap->sym;
9710 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9711 						d_td->key.len,
9712 						d_td->iv.len) == 0)
9713 				break;
9714 		}
9715 	}
9716 
9717 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9718 		return TEST_SKIPPED;
9719 
9720 	/* Setup source mbuf payload */
9721 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9722 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9723 			rte_pktmbuf_tailroom(ut_params->ibuf));
9724 
9725 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9726 			d_td->plaintext.len);
9727 
9728 	memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
9729 
9730 	/* Setup cipher session parameters */
9731 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9732 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9733 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9734 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9735 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9736 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9737 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9738 	ut_params->cipher_xform.next = NULL;
9739 
9740 	/* Setup DOCSIS session parameters */
9741 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9742 
9743 	struct rte_security_session_conf sess_conf = {
9744 		.action_type = ut_params->type,
9745 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9746 		.docsis = ut_params->docsis_xform,
9747 		.crypto_xform = &ut_params->cipher_xform,
9748 	};
9749 
9750 	/* Create security session */
9751 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9752 					ts_params->session_mpool,
9753 					ts_params->session_priv_mpool);
9754 
9755 	if (!ut_params->sec_session) {
9756 		printf("TestCase %s(%d) line %d: %s\n",
9757 			__func__, i, __LINE__, "failed to allocate session");
9758 		ret = TEST_FAILED;
9759 		goto on_err;
9760 	}
9761 
9762 	/* Generate crypto op data structure */
9763 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9764 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9765 	if (!ut_params->op) {
9766 		printf("TestCase %s(%d) line %d: %s\n",
9767 			__func__, i, __LINE__,
9768 			"failed to allocate security crypto operation");
9769 		ret = TEST_FAILED;
9770 		goto on_err;
9771 	}
9772 
9773 	/* Setup CRC operation parameters */
9774 	crc_len = d_td->plaintext.no_crc == false ?
9775 			(d_td->plaintext.len -
9776 				d_td->plaintext.crc_offset -
9777 				RTE_ETHER_CRC_LEN) :
9778 			0;
9779 	crc_len = crc_len > 0 ? crc_len : 0;
9780 	ut_params->op->sym->auth.data.length = crc_len;
9781 	ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
9782 
9783 	/* Setup cipher operation parameters */
9784 	cipher_len = d_td->plaintext.no_cipher == false ?
9785 			(d_td->plaintext.len -
9786 				d_td->plaintext.cipher_offset) :
9787 			0;
9788 	cipher_len = cipher_len > 0 ? cipher_len : 0;
9789 	ut_params->op->sym->cipher.data.length = cipher_len;
9790 	ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
9791 
9792 	/* Setup cipher IV */
9793 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9794 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9795 
9796 	/* Attach session to operation */
9797 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
9798 
9799 	/* Set crypto operation mbufs */
9800 	ut_params->op->sym->m_src = ut_params->ibuf;
9801 	ut_params->op->sym->m_dst = NULL;
9802 
9803 	/* Process crypto operation */
9804 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9805 			NULL) {
9806 		printf("TestCase %s(%d) line %d: %s\n",
9807 			__func__, i, __LINE__,
9808 			"failed to process security crypto op");
9809 		ret = TEST_FAILED;
9810 		goto on_err;
9811 	}
9812 
9813 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9814 		printf("TestCase %s(%d) line %d: %s\n",
9815 			__func__, i, __LINE__, "crypto op processing failed");
9816 		ret = TEST_FAILED;
9817 		goto on_err;
9818 	}
9819 
9820 	/* Validate ciphertext */
9821 	ciphertext = plaintext;
9822 
9823 	if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
9824 		printf("TestCase %s(%d) line %d: %s\n",
9825 			__func__, i, __LINE__, "ciphertext not as expected\n");
9826 		rte_hexdump(stdout, "expected", d_td->ciphertext.data,
9827 				d_td->ciphertext.len);
9828 		rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
9829 		ret = TEST_FAILED;
9830 		goto on_err;
9831 	}
9832 
9833 on_err:
9834 	rte_crypto_op_free(ut_params->op);
9835 	ut_params->op = NULL;
9836 
9837 	if (ut_params->sec_session)
9838 		rte_security_session_destroy(ctx, ut_params->sec_session);
9839 	ut_params->sec_session = NULL;
9840 
9841 	rte_pktmbuf_free(ut_params->ibuf);
9842 	ut_params->ibuf = NULL;
9843 
9844 	return ret;
9845 }
9846 
9847 #define TEST_DOCSIS_COUNT(func) do {			\
9848 	int ret = func;					\
9849 	if (ret == TEST_SUCCESS)  {			\
9850 		printf("\t%2d)", n++);			\
9851 		printf("+++++ PASSED:" #func"\n");	\
9852 		p++;					\
9853 	} else if (ret == TEST_SKIPPED) {		\
9854 		printf("\t%2d)", n++);			\
9855 		printf("~~~~~ SKIPPED:" #func"\n");	\
9856 		s++;					\
9857 	} else {					\
9858 		printf("\t%2d)", n++);			\
9859 		printf("----- FAILED:" #func"\n");	\
9860 		f++;					\
9861 	}						\
9862 } while (0)
9863 
9864 static int
9865 test_DOCSIS_PROTO_uplink_all(void)
9866 {
9867 	int p = 0, s = 0, f = 0, n = 0;
9868 
9869 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1));
9870 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2));
9871 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3));
9872 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4));
9873 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5));
9874 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6));
9875 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7));
9876 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8));
9877 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9));
9878 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10));
9879 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11));
9880 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12));
9881 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13));
9882 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14));
9883 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15));
9884 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16));
9885 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17));
9886 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18));
9887 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19));
9888 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20));
9889 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21));
9890 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22));
9891 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23));
9892 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24));
9893 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25));
9894 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26));
9895 
9896 	if (f)
9897 		printf("## %s: %d passed out of %d (%d skipped)\n",
9898 			__func__, p, n, s);
9899 
9900 	return f;
9901 };
9902 
9903 static int
9904 test_DOCSIS_PROTO_downlink_all(void)
9905 {
9906 	int p = 0, s = 0, f = 0, n = 0;
9907 
9908 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1));
9909 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2));
9910 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3));
9911 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4));
9912 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5));
9913 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6));
9914 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7));
9915 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8));
9916 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9));
9917 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10));
9918 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11));
9919 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12));
9920 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13));
9921 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14));
9922 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15));
9923 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16));
9924 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17));
9925 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18));
9926 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19));
9927 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20));
9928 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21));
9929 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22));
9930 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23));
9931 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24));
9932 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25));
9933 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26));
9934 
9935 	if (f)
9936 		printf("## %s: %d passed out of %d (%d skipped)\n",
9937 			__func__, p, n, s);
9938 
9939 	return f;
9940 };
9941 
9942 static int
9943 test_DOCSIS_PROTO_all(void)
9944 {
9945 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9946 	struct crypto_unittest_params *ut_params = &unittest_params;
9947 	struct rte_cryptodev_info dev_info;
9948 	int status;
9949 
9950 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9951 	uint64_t feat_flags = dev_info.feature_flags;
9952 
9953 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9954 		return TEST_SKIPPED;
9955 
9956 	/* Set action type */
9957 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9958 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9959 		gbl_action_type;
9960 
9961 	if (security_proto_supported(ut_params->type,
9962 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
9963 		return TEST_SKIPPED;
9964 
9965 	status = test_DOCSIS_PROTO_uplink_all();
9966 	status += test_DOCSIS_PROTO_downlink_all();
9967 
9968 	if (status)
9969 		return TEST_FAILED;
9970 	else
9971 		return TEST_SUCCESS;
9972 }
9973 #endif
9974 
9975 static int
9976 test_AES_GCM_authenticated_encryption_test_case_1(void)
9977 {
9978 	return test_authenticated_encryption(&gcm_test_case_1);
9979 }
9980 
9981 static int
9982 test_AES_GCM_authenticated_encryption_test_case_2(void)
9983 {
9984 	return test_authenticated_encryption(&gcm_test_case_2);
9985 }
9986 
9987 static int
9988 test_AES_GCM_authenticated_encryption_test_case_3(void)
9989 {
9990 	return test_authenticated_encryption(&gcm_test_case_3);
9991 }
9992 
9993 static int
9994 test_AES_GCM_authenticated_encryption_test_case_4(void)
9995 {
9996 	return test_authenticated_encryption(&gcm_test_case_4);
9997 }
9998 
9999 static int
10000 test_AES_GCM_authenticated_encryption_test_case_5(void)
10001 {
10002 	return test_authenticated_encryption(&gcm_test_case_5);
10003 }
10004 
10005 static int
10006 test_AES_GCM_authenticated_encryption_test_case_6(void)
10007 {
10008 	return test_authenticated_encryption(&gcm_test_case_6);
10009 }
10010 
10011 static int
10012 test_AES_GCM_authenticated_encryption_test_case_7(void)
10013 {
10014 	return test_authenticated_encryption(&gcm_test_case_7);
10015 }
10016 
10017 static int
10018 test_AES_GCM_authenticated_encryption_test_case_8(void)
10019 {
10020 	return test_authenticated_encryption(&gcm_test_case_8);
10021 }
10022 
10023 static int
10024 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
10025 {
10026 	return test_authenticated_encryption(&gcm_J0_test_case_1);
10027 }
10028 
10029 static int
10030 test_AES_GCM_auth_encryption_test_case_192_1(void)
10031 {
10032 	return test_authenticated_encryption(&gcm_test_case_192_1);
10033 }
10034 
10035 static int
10036 test_AES_GCM_auth_encryption_test_case_192_2(void)
10037 {
10038 	return test_authenticated_encryption(&gcm_test_case_192_2);
10039 }
10040 
10041 static int
10042 test_AES_GCM_auth_encryption_test_case_192_3(void)
10043 {
10044 	return test_authenticated_encryption(&gcm_test_case_192_3);
10045 }
10046 
10047 static int
10048 test_AES_GCM_auth_encryption_test_case_192_4(void)
10049 {
10050 	return test_authenticated_encryption(&gcm_test_case_192_4);
10051 }
10052 
10053 static int
10054 test_AES_GCM_auth_encryption_test_case_192_5(void)
10055 {
10056 	return test_authenticated_encryption(&gcm_test_case_192_5);
10057 }
10058 
10059 static int
10060 test_AES_GCM_auth_encryption_test_case_192_6(void)
10061 {
10062 	return test_authenticated_encryption(&gcm_test_case_192_6);
10063 }
10064 
10065 static int
10066 test_AES_GCM_auth_encryption_test_case_192_7(void)
10067 {
10068 	return test_authenticated_encryption(&gcm_test_case_192_7);
10069 }
10070 
10071 static int
10072 test_AES_GCM_auth_encryption_test_case_256_1(void)
10073 {
10074 	return test_authenticated_encryption(&gcm_test_case_256_1);
10075 }
10076 
10077 static int
10078 test_AES_GCM_auth_encryption_test_case_256_2(void)
10079 {
10080 	return test_authenticated_encryption(&gcm_test_case_256_2);
10081 }
10082 
10083 static int
10084 test_AES_GCM_auth_encryption_test_case_256_3(void)
10085 {
10086 	return test_authenticated_encryption(&gcm_test_case_256_3);
10087 }
10088 
10089 static int
10090 test_AES_GCM_auth_encryption_test_case_256_4(void)
10091 {
10092 	return test_authenticated_encryption(&gcm_test_case_256_4);
10093 }
10094 
10095 static int
10096 test_AES_GCM_auth_encryption_test_case_256_5(void)
10097 {
10098 	return test_authenticated_encryption(&gcm_test_case_256_5);
10099 }
10100 
10101 static int
10102 test_AES_GCM_auth_encryption_test_case_256_6(void)
10103 {
10104 	return test_authenticated_encryption(&gcm_test_case_256_6);
10105 }
10106 
10107 static int
10108 test_AES_GCM_auth_encryption_test_case_256_7(void)
10109 {
10110 	return test_authenticated_encryption(&gcm_test_case_256_7);
10111 }
10112 
10113 static int
10114 test_AES_GCM_auth_encryption_test_case_aad_1(void)
10115 {
10116 	return test_authenticated_encryption(&gcm_test_case_aad_1);
10117 }
10118 
10119 static int
10120 test_AES_GCM_auth_encryption_test_case_aad_2(void)
10121 {
10122 	return test_authenticated_encryption(&gcm_test_case_aad_2);
10123 }
10124 
10125 static int
10126 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
10127 {
10128 	struct aead_test_data tdata;
10129 	int res;
10130 
10131 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10132 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10133 	tdata.iv.data[0] += 1;
10134 	res = test_authenticated_encryption(&tdata);
10135 	if (res == TEST_SKIPPED)
10136 		return res;
10137 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10138 	return TEST_SUCCESS;
10139 }
10140 
10141 static int
10142 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
10143 {
10144 	struct aead_test_data tdata;
10145 	int res;
10146 
10147 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10148 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10149 	tdata.plaintext.data[0] += 1;
10150 	res = test_authenticated_encryption(&tdata);
10151 	if (res == TEST_SKIPPED)
10152 		return res;
10153 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10154 	return TEST_SUCCESS;
10155 }
10156 
10157 static int
10158 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
10159 {
10160 	struct aead_test_data tdata;
10161 	int res;
10162 
10163 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10164 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10165 	tdata.ciphertext.data[0] += 1;
10166 	res = test_authenticated_encryption(&tdata);
10167 	if (res == TEST_SKIPPED)
10168 		return res;
10169 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10170 	return TEST_SUCCESS;
10171 }
10172 
10173 static int
10174 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
10175 {
10176 	struct aead_test_data tdata;
10177 	int res;
10178 
10179 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10180 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10181 	tdata.aad.len += 1;
10182 	res = test_authenticated_encryption(&tdata);
10183 	if (res == TEST_SKIPPED)
10184 		return res;
10185 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10186 	return TEST_SUCCESS;
10187 }
10188 
10189 static int
10190 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
10191 {
10192 	struct aead_test_data tdata;
10193 	uint8_t aad[gcm_test_case_7.aad.len];
10194 	int res;
10195 
10196 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10197 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10198 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10199 	aad[0] += 1;
10200 	tdata.aad.data = aad;
10201 	res = test_authenticated_encryption(&tdata);
10202 	if (res == TEST_SKIPPED)
10203 		return res;
10204 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10205 	return TEST_SUCCESS;
10206 }
10207 
10208 static int
10209 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
10210 {
10211 	struct aead_test_data tdata;
10212 	int res;
10213 
10214 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10215 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10216 	tdata.auth_tag.data[0] += 1;
10217 	res = test_authenticated_encryption(&tdata);
10218 	if (res == TEST_SKIPPED)
10219 		return res;
10220 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10221 	return TEST_SUCCESS;
10222 }
10223 
10224 static int
10225 test_authenticated_decryption(const struct aead_test_data *tdata)
10226 {
10227 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10228 	struct crypto_unittest_params *ut_params = &unittest_params;
10229 
10230 	int retval;
10231 	uint8_t *plaintext;
10232 	uint32_t i;
10233 	struct rte_cryptodev_info dev_info;
10234 
10235 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10236 	uint64_t feat_flags = dev_info.feature_flags;
10237 
10238 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10239 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10240 		printf("Device doesn't support RAW data-path APIs.\n");
10241 		return TEST_SKIPPED;
10242 	}
10243 
10244 	/* Verify the capabilities */
10245 	struct rte_cryptodev_sym_capability_idx cap_idx;
10246 	const struct rte_cryptodev_symmetric_capability *capability;
10247 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10248 	cap_idx.algo.aead = tdata->algo;
10249 	capability = rte_cryptodev_sym_capability_get(
10250 			ts_params->valid_devs[0], &cap_idx);
10251 	if (capability == NULL)
10252 		return TEST_SKIPPED;
10253 	if (rte_cryptodev_sym_capability_check_aead(
10254 			capability, tdata->key.len, tdata->auth_tag.len,
10255 			tdata->aad.len, tdata->iv.len))
10256 		return TEST_SKIPPED;
10257 
10258 	/* Create AEAD session */
10259 	retval = create_aead_session(ts_params->valid_devs[0],
10260 			tdata->algo,
10261 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10262 			tdata->key.data, tdata->key.len,
10263 			tdata->aad.len, tdata->auth_tag.len,
10264 			tdata->iv.len);
10265 	if (retval < 0)
10266 		return retval;
10267 
10268 	/* alloc mbuf and set payload */
10269 	if (tdata->aad.len > MBUF_SIZE) {
10270 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10271 		/* Populate full size of add data */
10272 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
10273 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
10274 	} else
10275 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10276 
10277 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10278 			rte_pktmbuf_tailroom(ut_params->ibuf));
10279 
10280 	/* Create AEAD operation */
10281 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10282 	if (retval < 0)
10283 		return retval;
10284 
10285 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10286 
10287 	ut_params->op->sym->m_src = ut_params->ibuf;
10288 
10289 	/* Process crypto operation */
10290 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10291 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
10292 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10293 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10294 				ut_params->op, 0, 0, 0, 0);
10295 	else
10296 		TEST_ASSERT_NOT_NULL(
10297 			process_crypto_request(ts_params->valid_devs[0],
10298 			ut_params->op), "failed to process sym crypto op");
10299 
10300 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10301 			"crypto op processing failed");
10302 
10303 	if (ut_params->op->sym->m_dst)
10304 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
10305 				uint8_t *);
10306 	else
10307 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
10308 				uint8_t *,
10309 				ut_params->op->sym->cipher.data.offset);
10310 
10311 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10312 
10313 	/* Validate obuf */
10314 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10315 			plaintext,
10316 			tdata->plaintext.data,
10317 			tdata->plaintext.len,
10318 			"Plaintext data not as expected");
10319 
10320 	TEST_ASSERT_EQUAL(ut_params->op->status,
10321 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10322 			"Authentication failed");
10323 
10324 	return 0;
10325 }
10326 
10327 static int
10328 test_AES_GCM_authenticated_decryption_test_case_1(void)
10329 {
10330 	return test_authenticated_decryption(&gcm_test_case_1);
10331 }
10332 
10333 static int
10334 test_AES_GCM_authenticated_decryption_test_case_2(void)
10335 {
10336 	return test_authenticated_decryption(&gcm_test_case_2);
10337 }
10338 
10339 static int
10340 test_AES_GCM_authenticated_decryption_test_case_3(void)
10341 {
10342 	return test_authenticated_decryption(&gcm_test_case_3);
10343 }
10344 
10345 static int
10346 test_AES_GCM_authenticated_decryption_test_case_4(void)
10347 {
10348 	return test_authenticated_decryption(&gcm_test_case_4);
10349 }
10350 
10351 static int
10352 test_AES_GCM_authenticated_decryption_test_case_5(void)
10353 {
10354 	return test_authenticated_decryption(&gcm_test_case_5);
10355 }
10356 
10357 static int
10358 test_AES_GCM_authenticated_decryption_test_case_6(void)
10359 {
10360 	return test_authenticated_decryption(&gcm_test_case_6);
10361 }
10362 
10363 static int
10364 test_AES_GCM_authenticated_decryption_test_case_7(void)
10365 {
10366 	return test_authenticated_decryption(&gcm_test_case_7);
10367 }
10368 
10369 static int
10370 test_AES_GCM_authenticated_decryption_test_case_8(void)
10371 {
10372 	return test_authenticated_decryption(&gcm_test_case_8);
10373 }
10374 
10375 static int
10376 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
10377 {
10378 	return test_authenticated_decryption(&gcm_J0_test_case_1);
10379 }
10380 
10381 static int
10382 test_AES_GCM_auth_decryption_test_case_192_1(void)
10383 {
10384 	return test_authenticated_decryption(&gcm_test_case_192_1);
10385 }
10386 
10387 static int
10388 test_AES_GCM_auth_decryption_test_case_192_2(void)
10389 {
10390 	return test_authenticated_decryption(&gcm_test_case_192_2);
10391 }
10392 
10393 static int
10394 test_AES_GCM_auth_decryption_test_case_192_3(void)
10395 {
10396 	return test_authenticated_decryption(&gcm_test_case_192_3);
10397 }
10398 
10399 static int
10400 test_AES_GCM_auth_decryption_test_case_192_4(void)
10401 {
10402 	return test_authenticated_decryption(&gcm_test_case_192_4);
10403 }
10404 
10405 static int
10406 test_AES_GCM_auth_decryption_test_case_192_5(void)
10407 {
10408 	return test_authenticated_decryption(&gcm_test_case_192_5);
10409 }
10410 
10411 static int
10412 test_AES_GCM_auth_decryption_test_case_192_6(void)
10413 {
10414 	return test_authenticated_decryption(&gcm_test_case_192_6);
10415 }
10416 
10417 static int
10418 test_AES_GCM_auth_decryption_test_case_192_7(void)
10419 {
10420 	return test_authenticated_decryption(&gcm_test_case_192_7);
10421 }
10422 
10423 static int
10424 test_AES_GCM_auth_decryption_test_case_256_1(void)
10425 {
10426 	return test_authenticated_decryption(&gcm_test_case_256_1);
10427 }
10428 
10429 static int
10430 test_AES_GCM_auth_decryption_test_case_256_2(void)
10431 {
10432 	return test_authenticated_decryption(&gcm_test_case_256_2);
10433 }
10434 
10435 static int
10436 test_AES_GCM_auth_decryption_test_case_256_3(void)
10437 {
10438 	return test_authenticated_decryption(&gcm_test_case_256_3);
10439 }
10440 
10441 static int
10442 test_AES_GCM_auth_decryption_test_case_256_4(void)
10443 {
10444 	return test_authenticated_decryption(&gcm_test_case_256_4);
10445 }
10446 
10447 static int
10448 test_AES_GCM_auth_decryption_test_case_256_5(void)
10449 {
10450 	return test_authenticated_decryption(&gcm_test_case_256_5);
10451 }
10452 
10453 static int
10454 test_AES_GCM_auth_decryption_test_case_256_6(void)
10455 {
10456 	return test_authenticated_decryption(&gcm_test_case_256_6);
10457 }
10458 
10459 static int
10460 test_AES_GCM_auth_decryption_test_case_256_7(void)
10461 {
10462 	return test_authenticated_decryption(&gcm_test_case_256_7);
10463 }
10464 
10465 static int
10466 test_AES_GCM_auth_decryption_test_case_aad_1(void)
10467 {
10468 	return test_authenticated_decryption(&gcm_test_case_aad_1);
10469 }
10470 
10471 static int
10472 test_AES_GCM_auth_decryption_test_case_aad_2(void)
10473 {
10474 	return test_authenticated_decryption(&gcm_test_case_aad_2);
10475 }
10476 
10477 static int
10478 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
10479 {
10480 	struct aead_test_data tdata;
10481 	int res;
10482 
10483 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10484 	tdata.iv.data[0] += 1;
10485 	res = test_authenticated_decryption(&tdata);
10486 	if (res == TEST_SKIPPED)
10487 		return res;
10488 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10489 	return TEST_SUCCESS;
10490 }
10491 
10492 static int
10493 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
10494 {
10495 	struct aead_test_data tdata;
10496 	int res;
10497 
10498 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10499 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10500 	tdata.plaintext.data[0] += 1;
10501 	res = test_authenticated_decryption(&tdata);
10502 	if (res == TEST_SKIPPED)
10503 		return res;
10504 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10505 	return TEST_SUCCESS;
10506 }
10507 
10508 static int
10509 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
10510 {
10511 	struct aead_test_data tdata;
10512 	int res;
10513 
10514 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10515 	tdata.ciphertext.data[0] += 1;
10516 	res = test_authenticated_decryption(&tdata);
10517 	if (res == TEST_SKIPPED)
10518 		return res;
10519 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10520 	return TEST_SUCCESS;
10521 }
10522 
10523 static int
10524 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
10525 {
10526 	struct aead_test_data tdata;
10527 	int res;
10528 
10529 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10530 	tdata.aad.len += 1;
10531 	res = test_authenticated_decryption(&tdata);
10532 	if (res == TEST_SKIPPED)
10533 		return res;
10534 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10535 	return TEST_SUCCESS;
10536 }
10537 
10538 static int
10539 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
10540 {
10541 	struct aead_test_data tdata;
10542 	uint8_t aad[gcm_test_case_7.aad.len];
10543 	int res;
10544 
10545 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10546 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10547 	aad[0] += 1;
10548 	tdata.aad.data = aad;
10549 	res = test_authenticated_decryption(&tdata);
10550 	if (res == TEST_SKIPPED)
10551 		return res;
10552 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10553 	return TEST_SUCCESS;
10554 }
10555 
10556 static int
10557 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
10558 {
10559 	struct aead_test_data tdata;
10560 	int res;
10561 
10562 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10563 	tdata.auth_tag.data[0] += 1;
10564 	res = test_authenticated_decryption(&tdata);
10565 	if (res == TEST_SKIPPED)
10566 		return res;
10567 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
10568 	return TEST_SUCCESS;
10569 }
10570 
10571 static int
10572 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
10573 {
10574 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10575 	struct crypto_unittest_params *ut_params = &unittest_params;
10576 
10577 	int retval;
10578 	uint8_t *ciphertext, *auth_tag;
10579 	uint16_t plaintext_pad_len;
10580 	struct rte_cryptodev_info dev_info;
10581 
10582 	/* Verify the capabilities */
10583 	struct rte_cryptodev_sym_capability_idx cap_idx;
10584 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10585 	cap_idx.algo.aead = tdata->algo;
10586 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10587 			&cap_idx) == NULL)
10588 		return TEST_SKIPPED;
10589 
10590 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10591 	uint64_t feat_flags = dev_info.feature_flags;
10592 
10593 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10594 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)))
10595 		return TEST_SKIPPED;
10596 
10597 	/* not supported with CPU crypto */
10598 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10599 		return TEST_SKIPPED;
10600 
10601 	/* Create AEAD session */
10602 	retval = create_aead_session(ts_params->valid_devs[0],
10603 			tdata->algo,
10604 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
10605 			tdata->key.data, tdata->key.len,
10606 			tdata->aad.len, tdata->auth_tag.len,
10607 			tdata->iv.len);
10608 	if (retval < 0)
10609 		return retval;
10610 
10611 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10612 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10613 
10614 	/* clear mbuf payload */
10615 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10616 			rte_pktmbuf_tailroom(ut_params->ibuf));
10617 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10618 			rte_pktmbuf_tailroom(ut_params->obuf));
10619 
10620 	/* Create AEAD operation */
10621 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10622 	if (retval < 0)
10623 		return retval;
10624 
10625 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10626 
10627 	ut_params->op->sym->m_src = ut_params->ibuf;
10628 	ut_params->op->sym->m_dst = ut_params->obuf;
10629 
10630 	/* Process crypto operation */
10631 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10632 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10633 			ut_params->op, 0, 0, 0, 0);
10634 	else
10635 		TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10636 			ut_params->op), "failed to process sym crypto op");
10637 
10638 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10639 			"crypto op processing failed");
10640 
10641 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10642 
10643 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10644 			ut_params->op->sym->cipher.data.offset);
10645 	auth_tag = ciphertext + plaintext_pad_len;
10646 
10647 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10648 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10649 
10650 	/* Validate obuf */
10651 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10652 			ciphertext,
10653 			tdata->ciphertext.data,
10654 			tdata->ciphertext.len,
10655 			"Ciphertext data not as expected");
10656 
10657 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10658 			auth_tag,
10659 			tdata->auth_tag.data,
10660 			tdata->auth_tag.len,
10661 			"Generated auth tag not as expected");
10662 
10663 	return 0;
10664 
10665 }
10666 
10667 static int
10668 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
10669 {
10670 	return test_authenticated_encryption_oop(&gcm_test_case_5);
10671 }
10672 
10673 static int
10674 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
10675 {
10676 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10677 	struct crypto_unittest_params *ut_params = &unittest_params;
10678 
10679 	int retval;
10680 	uint8_t *plaintext;
10681 	struct rte_cryptodev_info dev_info;
10682 
10683 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10684 	uint64_t feat_flags = dev_info.feature_flags;
10685 
10686 	/* Verify the capabilities */
10687 	struct rte_cryptodev_sym_capability_idx cap_idx;
10688 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10689 	cap_idx.algo.aead = tdata->algo;
10690 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10691 			&cap_idx) == NULL)
10692 		return TEST_SKIPPED;
10693 
10694 	/* not supported with CPU crypto and raw data-path APIs*/
10695 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
10696 			global_api_test_type == CRYPTODEV_RAW_API_TEST)
10697 		return TEST_SKIPPED;
10698 
10699 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10700 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10701 		printf("Device does not support RAW data-path APIs.\n");
10702 		return TEST_SKIPPED;
10703 	}
10704 
10705 	/* Create AEAD session */
10706 	retval = create_aead_session(ts_params->valid_devs[0],
10707 			tdata->algo,
10708 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10709 			tdata->key.data, tdata->key.len,
10710 			tdata->aad.len, tdata->auth_tag.len,
10711 			tdata->iv.len);
10712 	if (retval < 0)
10713 		return retval;
10714 
10715 	/* alloc mbuf and set payload */
10716 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10717 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10718 
10719 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10720 			rte_pktmbuf_tailroom(ut_params->ibuf));
10721 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10722 			rte_pktmbuf_tailroom(ut_params->obuf));
10723 
10724 	/* Create AEAD operation */
10725 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10726 	if (retval < 0)
10727 		return retval;
10728 
10729 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10730 
10731 	ut_params->op->sym->m_src = ut_params->ibuf;
10732 	ut_params->op->sym->m_dst = ut_params->obuf;
10733 
10734 	/* Process crypto operation */
10735 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10736 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10737 				ut_params->op, 0, 0, 0, 0);
10738 	else
10739 		TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10740 			ut_params->op), "failed to process sym crypto op");
10741 
10742 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10743 			"crypto op processing failed");
10744 
10745 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10746 			ut_params->op->sym->cipher.data.offset);
10747 
10748 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10749 
10750 	/* Validate obuf */
10751 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10752 			plaintext,
10753 			tdata->plaintext.data,
10754 			tdata->plaintext.len,
10755 			"Plaintext data not as expected");
10756 
10757 	TEST_ASSERT_EQUAL(ut_params->op->status,
10758 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10759 			"Authentication failed");
10760 	return 0;
10761 }
10762 
10763 static int
10764 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
10765 {
10766 	return test_authenticated_decryption_oop(&gcm_test_case_5);
10767 }
10768 
10769 static int
10770 test_authenticated_encryption_sessionless(
10771 		const struct aead_test_data *tdata)
10772 {
10773 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10774 	struct crypto_unittest_params *ut_params = &unittest_params;
10775 
10776 	int retval;
10777 	uint8_t *ciphertext, *auth_tag;
10778 	uint16_t plaintext_pad_len;
10779 	uint8_t key[tdata->key.len + 1];
10780 	struct rte_cryptodev_info dev_info;
10781 
10782 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10783 	uint64_t feat_flags = dev_info.feature_flags;
10784 
10785 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10786 		printf("Device doesn't support Sessionless ops.\n");
10787 		return TEST_SKIPPED;
10788 	}
10789 
10790 	/* not supported with CPU crypto */
10791 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10792 		return TEST_SKIPPED;
10793 
10794 	/* Verify the capabilities */
10795 	struct rte_cryptodev_sym_capability_idx cap_idx;
10796 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10797 	cap_idx.algo.aead = tdata->algo;
10798 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10799 			&cap_idx) == NULL)
10800 		return TEST_SKIPPED;
10801 
10802 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10803 
10804 	/* clear mbuf payload */
10805 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10806 			rte_pktmbuf_tailroom(ut_params->ibuf));
10807 
10808 	/* Create AEAD operation */
10809 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10810 	if (retval < 0)
10811 		return retval;
10812 
10813 	/* Create GCM xform */
10814 	memcpy(key, tdata->key.data, tdata->key.len);
10815 	retval = create_aead_xform(ut_params->op,
10816 			tdata->algo,
10817 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
10818 			key, tdata->key.len,
10819 			tdata->aad.len, tdata->auth_tag.len,
10820 			tdata->iv.len);
10821 	if (retval < 0)
10822 		return retval;
10823 
10824 	ut_params->op->sym->m_src = ut_params->ibuf;
10825 
10826 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10827 			RTE_CRYPTO_OP_SESSIONLESS,
10828 			"crypto op session type not sessionless");
10829 
10830 	/* Process crypto operation */
10831 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10832 			ut_params->op), "failed to process sym crypto op");
10833 
10834 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10835 
10836 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10837 			"crypto op status not success");
10838 
10839 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10840 
10841 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10842 			ut_params->op->sym->cipher.data.offset);
10843 	auth_tag = ciphertext + plaintext_pad_len;
10844 
10845 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10846 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10847 
10848 	/* Validate obuf */
10849 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10850 			ciphertext,
10851 			tdata->ciphertext.data,
10852 			tdata->ciphertext.len,
10853 			"Ciphertext data not as expected");
10854 
10855 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10856 			auth_tag,
10857 			tdata->auth_tag.data,
10858 			tdata->auth_tag.len,
10859 			"Generated auth tag not as expected");
10860 
10861 	return 0;
10862 
10863 }
10864 
10865 static int
10866 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
10867 {
10868 	return test_authenticated_encryption_sessionless(
10869 			&gcm_test_case_5);
10870 }
10871 
10872 static int
10873 test_authenticated_decryption_sessionless(
10874 		const struct aead_test_data *tdata)
10875 {
10876 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10877 	struct crypto_unittest_params *ut_params = &unittest_params;
10878 
10879 	int retval;
10880 	uint8_t *plaintext;
10881 	uint8_t key[tdata->key.len + 1];
10882 	struct rte_cryptodev_info dev_info;
10883 
10884 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10885 	uint64_t feat_flags = dev_info.feature_flags;
10886 
10887 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10888 		printf("Device doesn't support Sessionless ops.\n");
10889 		return TEST_SKIPPED;
10890 	}
10891 
10892 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10893 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10894 		printf("Device doesn't support RAW data-path APIs.\n");
10895 		return TEST_SKIPPED;
10896 	}
10897 
10898 	/* not supported with CPU crypto */
10899 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10900 		return TEST_SKIPPED;
10901 
10902 	/* Verify the capabilities */
10903 	struct rte_cryptodev_sym_capability_idx cap_idx;
10904 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10905 	cap_idx.algo.aead = tdata->algo;
10906 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10907 			&cap_idx) == NULL)
10908 		return TEST_SKIPPED;
10909 
10910 	/* alloc mbuf and set payload */
10911 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10912 
10913 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10914 			rte_pktmbuf_tailroom(ut_params->ibuf));
10915 
10916 	/* Create AEAD operation */
10917 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10918 	if (retval < 0)
10919 		return retval;
10920 
10921 	/* Create AEAD xform */
10922 	memcpy(key, tdata->key.data, tdata->key.len);
10923 	retval = create_aead_xform(ut_params->op,
10924 			tdata->algo,
10925 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10926 			key, tdata->key.len,
10927 			tdata->aad.len, tdata->auth_tag.len,
10928 			tdata->iv.len);
10929 	if (retval < 0)
10930 		return retval;
10931 
10932 	ut_params->op->sym->m_src = ut_params->ibuf;
10933 
10934 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10935 			RTE_CRYPTO_OP_SESSIONLESS,
10936 			"crypto op session type not sessionless");
10937 
10938 	/* Process crypto operation */
10939 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10940 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10941 				ut_params->op, 0, 0, 0, 0);
10942 	else
10943 		TEST_ASSERT_NOT_NULL(process_crypto_request(
10944 			ts_params->valid_devs[0], ut_params->op),
10945 				"failed to process sym crypto op");
10946 
10947 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10948 
10949 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10950 			"crypto op status not success");
10951 
10952 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10953 			ut_params->op->sym->cipher.data.offset);
10954 
10955 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10956 
10957 	/* Validate obuf */
10958 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10959 			plaintext,
10960 			tdata->plaintext.data,
10961 			tdata->plaintext.len,
10962 			"Plaintext data not as expected");
10963 
10964 	TEST_ASSERT_EQUAL(ut_params->op->status,
10965 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10966 			"Authentication failed");
10967 	return 0;
10968 }
10969 
10970 static int
10971 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
10972 {
10973 	return test_authenticated_decryption_sessionless(
10974 			&gcm_test_case_5);
10975 }
10976 
10977 static int
10978 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
10979 {
10980 	return test_authenticated_encryption(&ccm_test_case_128_1);
10981 }
10982 
10983 static int
10984 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
10985 {
10986 	return test_authenticated_encryption(&ccm_test_case_128_2);
10987 }
10988 
10989 static int
10990 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
10991 {
10992 	return test_authenticated_encryption(&ccm_test_case_128_3);
10993 }
10994 
10995 static int
10996 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
10997 {
10998 	return test_authenticated_decryption(&ccm_test_case_128_1);
10999 }
11000 
11001 static int
11002 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
11003 {
11004 	return test_authenticated_decryption(&ccm_test_case_128_2);
11005 }
11006 
11007 static int
11008 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
11009 {
11010 	return test_authenticated_decryption(&ccm_test_case_128_3);
11011 }
11012 
11013 static int
11014 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
11015 {
11016 	return test_authenticated_encryption(&ccm_test_case_192_1);
11017 }
11018 
11019 static int
11020 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
11021 {
11022 	return test_authenticated_encryption(&ccm_test_case_192_2);
11023 }
11024 
11025 static int
11026 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
11027 {
11028 	return test_authenticated_encryption(&ccm_test_case_192_3);
11029 }
11030 
11031 static int
11032 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
11033 {
11034 	return test_authenticated_decryption(&ccm_test_case_192_1);
11035 }
11036 
11037 static int
11038 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
11039 {
11040 	return test_authenticated_decryption(&ccm_test_case_192_2);
11041 }
11042 
11043 static int
11044 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
11045 {
11046 	return test_authenticated_decryption(&ccm_test_case_192_3);
11047 }
11048 
11049 static int
11050 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
11051 {
11052 	return test_authenticated_encryption(&ccm_test_case_256_1);
11053 }
11054 
11055 static int
11056 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
11057 {
11058 	return test_authenticated_encryption(&ccm_test_case_256_2);
11059 }
11060 
11061 static int
11062 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
11063 {
11064 	return test_authenticated_encryption(&ccm_test_case_256_3);
11065 }
11066 
11067 static int
11068 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
11069 {
11070 	return test_authenticated_decryption(&ccm_test_case_256_1);
11071 }
11072 
11073 static int
11074 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
11075 {
11076 	return test_authenticated_decryption(&ccm_test_case_256_2);
11077 }
11078 
11079 static int
11080 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
11081 {
11082 	return test_authenticated_decryption(&ccm_test_case_256_3);
11083 }
11084 
11085 static int
11086 test_stats(void)
11087 {
11088 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11089 	struct rte_cryptodev_stats stats;
11090 
11091 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11092 		return TEST_SKIPPED;
11093 
11094 	/* Verify the capabilities */
11095 	struct rte_cryptodev_sym_capability_idx cap_idx;
11096 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11097 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
11098 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11099 			&cap_idx) == NULL)
11100 		return TEST_SKIPPED;
11101 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11102 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11103 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11104 			&cap_idx) == NULL)
11105 		return TEST_SKIPPED;
11106 
11107 	if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
11108 			== -ENOTSUP)
11109 		return TEST_SKIPPED;
11110 
11111 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11112 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
11113 			&stats) == -ENODEV),
11114 		"rte_cryptodev_stats_get invalid dev failed");
11115 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
11116 		"rte_cryptodev_stats_get invalid Param failed");
11117 
11118 	/* Test expected values */
11119 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
11120 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11121 			&stats),
11122 		"rte_cryptodev_stats_get failed");
11123 	TEST_ASSERT((stats.enqueued_count == 1),
11124 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11125 	TEST_ASSERT((stats.dequeued_count == 1),
11126 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11127 	TEST_ASSERT((stats.enqueue_err_count == 0),
11128 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11129 	TEST_ASSERT((stats.dequeue_err_count == 0),
11130 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11131 
11132 	/* invalid device but should ignore and not reset device stats*/
11133 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
11134 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11135 			&stats),
11136 		"rte_cryptodev_stats_get failed");
11137 	TEST_ASSERT((stats.enqueued_count == 1),
11138 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11139 
11140 	/* check that a valid reset clears stats */
11141 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11142 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11143 			&stats),
11144 					  "rte_cryptodev_stats_get failed");
11145 	TEST_ASSERT((stats.enqueued_count == 0),
11146 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11147 	TEST_ASSERT((stats.dequeued_count == 0),
11148 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11149 
11150 	return TEST_SUCCESS;
11151 }
11152 
11153 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
11154 				   struct crypto_unittest_params *ut_params,
11155 				   enum rte_crypto_auth_operation op,
11156 				   const struct HMAC_MD5_vector *test_case)
11157 {
11158 	uint8_t key[64];
11159 
11160 	memcpy(key, test_case->key.data, test_case->key.len);
11161 
11162 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11163 	ut_params->auth_xform.next = NULL;
11164 	ut_params->auth_xform.auth.op = op;
11165 
11166 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
11167 
11168 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
11169 	ut_params->auth_xform.auth.key.length = test_case->key.len;
11170 	ut_params->auth_xform.auth.key.data = key;
11171 
11172 	ut_params->sess = rte_cryptodev_sym_session_create(
11173 			ts_params->session_mpool);
11174 
11175 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11176 			ut_params->sess, &ut_params->auth_xform,
11177 			ts_params->session_priv_mpool);
11178 
11179 	if (ut_params->sess == NULL)
11180 		return TEST_FAILED;
11181 
11182 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11183 
11184 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11185 			rte_pktmbuf_tailroom(ut_params->ibuf));
11186 
11187 	return 0;
11188 }
11189 
11190 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
11191 			      const struct HMAC_MD5_vector *test_case,
11192 			      uint8_t **plaintext)
11193 {
11194 	uint16_t plaintext_pad_len;
11195 
11196 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11197 
11198 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11199 				16);
11200 
11201 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11202 			plaintext_pad_len);
11203 	memcpy(*plaintext, test_case->plaintext.data,
11204 			test_case->plaintext.len);
11205 
11206 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11207 			ut_params->ibuf, MD5_DIGEST_LEN);
11208 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11209 			"no room to append digest");
11210 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11211 			ut_params->ibuf, plaintext_pad_len);
11212 
11213 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11214 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
11215 			   test_case->auth_tag.len);
11216 	}
11217 
11218 	sym_op->auth.data.offset = 0;
11219 	sym_op->auth.data.length = test_case->plaintext.len;
11220 
11221 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11222 	ut_params->op->sym->m_src = ut_params->ibuf;
11223 
11224 	return 0;
11225 }
11226 
11227 static int
11228 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
11229 {
11230 	uint16_t plaintext_pad_len;
11231 	uint8_t *plaintext, *auth_tag;
11232 
11233 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11234 	struct crypto_unittest_params *ut_params = &unittest_params;
11235 	struct rte_cryptodev_info dev_info;
11236 
11237 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11238 	uint64_t feat_flags = dev_info.feature_flags;
11239 
11240 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11241 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11242 		printf("Device doesn't support RAW data-path APIs.\n");
11243 		return TEST_SKIPPED;
11244 	}
11245 
11246 	/* Verify the capabilities */
11247 	struct rte_cryptodev_sym_capability_idx cap_idx;
11248 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11249 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11250 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11251 			&cap_idx) == NULL)
11252 		return TEST_SKIPPED;
11253 
11254 	if (MD5_HMAC_create_session(ts_params, ut_params,
11255 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
11256 		return TEST_FAILED;
11257 
11258 	/* Generate Crypto op data structure */
11259 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11260 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11261 	TEST_ASSERT_NOT_NULL(ut_params->op,
11262 			"Failed to allocate symmetric crypto operation struct");
11263 
11264 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11265 				16);
11266 
11267 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11268 		return TEST_FAILED;
11269 
11270 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11271 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11272 			ut_params->op);
11273 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11274 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11275 				ut_params->op, 0, 1, 0, 0);
11276 	else
11277 		TEST_ASSERT_NOT_NULL(
11278 			process_crypto_request(ts_params->valid_devs[0],
11279 				ut_params->op),
11280 				"failed to process sym crypto op");
11281 
11282 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11283 			"crypto op processing failed");
11284 
11285 	if (ut_params->op->sym->m_dst) {
11286 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11287 				uint8_t *, plaintext_pad_len);
11288 	} else {
11289 		auth_tag = plaintext + plaintext_pad_len;
11290 	}
11291 
11292 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11293 			auth_tag,
11294 			test_case->auth_tag.data,
11295 			test_case->auth_tag.len,
11296 			"HMAC_MD5 generated tag not as expected");
11297 
11298 	return TEST_SUCCESS;
11299 }
11300 
11301 static int
11302 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
11303 {
11304 	uint8_t *plaintext;
11305 
11306 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11307 	struct crypto_unittest_params *ut_params = &unittest_params;
11308 	struct rte_cryptodev_info dev_info;
11309 
11310 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11311 	uint64_t feat_flags = dev_info.feature_flags;
11312 
11313 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11314 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11315 		printf("Device doesn't support RAW data-path APIs.\n");
11316 		return TEST_SKIPPED;
11317 	}
11318 
11319 	/* Verify the capabilities */
11320 	struct rte_cryptodev_sym_capability_idx cap_idx;
11321 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11322 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11323 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11324 			&cap_idx) == NULL)
11325 		return TEST_SKIPPED;
11326 
11327 	if (MD5_HMAC_create_session(ts_params, ut_params,
11328 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
11329 		return TEST_FAILED;
11330 	}
11331 
11332 	/* Generate Crypto op data structure */
11333 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11334 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11335 	TEST_ASSERT_NOT_NULL(ut_params->op,
11336 			"Failed to allocate symmetric crypto operation struct");
11337 
11338 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11339 		return TEST_FAILED;
11340 
11341 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11342 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11343 			ut_params->op);
11344 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11345 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11346 				ut_params->op, 0, 1, 0, 0);
11347 	else
11348 		TEST_ASSERT_NOT_NULL(
11349 			process_crypto_request(ts_params->valid_devs[0],
11350 				ut_params->op),
11351 				"failed to process sym crypto op");
11352 
11353 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11354 			"HMAC_MD5 crypto op processing failed");
11355 
11356 	return TEST_SUCCESS;
11357 }
11358 
11359 static int
11360 test_MD5_HMAC_generate_case_1(void)
11361 {
11362 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
11363 }
11364 
11365 static int
11366 test_MD5_HMAC_verify_case_1(void)
11367 {
11368 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
11369 }
11370 
11371 static int
11372 test_MD5_HMAC_generate_case_2(void)
11373 {
11374 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
11375 }
11376 
11377 static int
11378 test_MD5_HMAC_verify_case_2(void)
11379 {
11380 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
11381 }
11382 
11383 static int
11384 test_multi_session(void)
11385 {
11386 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11387 	struct crypto_unittest_params *ut_params = &unittest_params;
11388 
11389 	struct rte_cryptodev_info dev_info;
11390 	struct rte_cryptodev_sym_session **sessions;
11391 
11392 	uint16_t i;
11393 
11394 	/* Verify the capabilities */
11395 	struct rte_cryptodev_sym_capability_idx cap_idx;
11396 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11397 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11398 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11399 			&cap_idx) == NULL)
11400 		return TEST_SKIPPED;
11401 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11402 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11403 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11404 			&cap_idx) == NULL)
11405 		return TEST_SKIPPED;
11406 
11407 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
11408 			aes_cbc_key, hmac_sha512_key);
11409 
11410 
11411 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11412 
11413 	sessions = rte_malloc(NULL,
11414 			sizeof(struct rte_cryptodev_sym_session *) *
11415 			(MAX_NB_SESSIONS + 1), 0);
11416 
11417 	/* Create multiple crypto sessions*/
11418 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
11419 
11420 		sessions[i] = rte_cryptodev_sym_session_create(
11421 				ts_params->session_mpool);
11422 
11423 		rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11424 				sessions[i], &ut_params->auth_xform,
11425 				ts_params->session_priv_mpool);
11426 		TEST_ASSERT_NOT_NULL(sessions[i],
11427 				"Session creation failed at session number %u",
11428 				i);
11429 
11430 		/* Attempt to send a request on each session */
11431 		TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
11432 			sessions[i],
11433 			ut_params,
11434 			ts_params,
11435 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
11436 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
11437 			aes_cbc_iv),
11438 			"Failed to perform decrypt on request number %u.", i);
11439 		/* free crypto operation structure */
11440 		if (ut_params->op)
11441 			rte_crypto_op_free(ut_params->op);
11442 
11443 		/*
11444 		 * free mbuf - both obuf and ibuf are usually the same,
11445 		 * so check if they point at the same address is necessary,
11446 		 * to avoid freeing the mbuf twice.
11447 		 */
11448 		if (ut_params->obuf) {
11449 			rte_pktmbuf_free(ut_params->obuf);
11450 			if (ut_params->ibuf == ut_params->obuf)
11451 				ut_params->ibuf = 0;
11452 			ut_params->obuf = 0;
11453 		}
11454 		if (ut_params->ibuf) {
11455 			rte_pktmbuf_free(ut_params->ibuf);
11456 			ut_params->ibuf = 0;
11457 		}
11458 	}
11459 
11460 	sessions[i] = NULL;
11461 	/* Next session create should fail */
11462 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11463 			sessions[i], &ut_params->auth_xform,
11464 			ts_params->session_priv_mpool);
11465 	TEST_ASSERT_NULL(sessions[i],
11466 			"Session creation succeeded unexpectedly!");
11467 
11468 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
11469 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11470 				sessions[i]);
11471 		rte_cryptodev_sym_session_free(sessions[i]);
11472 	}
11473 
11474 	rte_free(sessions);
11475 
11476 	return TEST_SUCCESS;
11477 }
11478 
11479 struct multi_session_params {
11480 	struct crypto_unittest_params ut_params;
11481 	uint8_t *cipher_key;
11482 	uint8_t *hmac_key;
11483 	const uint8_t *cipher;
11484 	const uint8_t *digest;
11485 	uint8_t *iv;
11486 };
11487 
11488 #define MB_SESSION_NUMBER 3
11489 
11490 static int
11491 test_multi_session_random_usage(void)
11492 {
11493 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11494 	struct rte_cryptodev_info dev_info;
11495 	struct rte_cryptodev_sym_session **sessions;
11496 	uint32_t i, j;
11497 	struct multi_session_params ut_paramz[] = {
11498 
11499 		{
11500 			.cipher_key = ms_aes_cbc_key0,
11501 			.hmac_key = ms_hmac_key0,
11502 			.cipher = ms_aes_cbc_cipher0,
11503 			.digest = ms_hmac_digest0,
11504 			.iv = ms_aes_cbc_iv0
11505 		},
11506 		{
11507 			.cipher_key = ms_aes_cbc_key1,
11508 			.hmac_key = ms_hmac_key1,
11509 			.cipher = ms_aes_cbc_cipher1,
11510 			.digest = ms_hmac_digest1,
11511 			.iv = ms_aes_cbc_iv1
11512 		},
11513 		{
11514 			.cipher_key = ms_aes_cbc_key2,
11515 			.hmac_key = ms_hmac_key2,
11516 			.cipher = ms_aes_cbc_cipher2,
11517 			.digest = ms_hmac_digest2,
11518 			.iv = ms_aes_cbc_iv2
11519 		},
11520 
11521 	};
11522 
11523 	/* Verify the capabilities */
11524 	struct rte_cryptodev_sym_capability_idx cap_idx;
11525 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11526 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11527 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11528 			&cap_idx) == NULL)
11529 		return TEST_SKIPPED;
11530 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11531 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11532 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11533 			&cap_idx) == NULL)
11534 		return TEST_SKIPPED;
11535 
11536 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11537 
11538 	sessions = rte_malloc(NULL,
11539 			(sizeof(struct rte_cryptodev_sym_session *)
11540 					* MAX_NB_SESSIONS) + 1, 0);
11541 
11542 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
11543 		sessions[i] = rte_cryptodev_sym_session_create(
11544 				ts_params->session_mpool);
11545 
11546 		rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
11547 				sizeof(struct crypto_unittest_params));
11548 
11549 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
11550 				&ut_paramz[i].ut_params,
11551 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
11552 
11553 		/* Create multiple crypto sessions*/
11554 		rte_cryptodev_sym_session_init(
11555 				ts_params->valid_devs[0],
11556 				sessions[i],
11557 				&ut_paramz[i].ut_params.auth_xform,
11558 				ts_params->session_priv_mpool);
11559 
11560 		TEST_ASSERT_NOT_NULL(sessions[i],
11561 				"Session creation failed at session number %u",
11562 				i);
11563 
11564 	}
11565 
11566 	srand(time(NULL));
11567 	for (i = 0; i < 40000; i++) {
11568 
11569 		j = rand() % MB_SESSION_NUMBER;
11570 
11571 		TEST_ASSERT_SUCCESS(
11572 			test_AES_CBC_HMAC_SHA512_decrypt_perform(
11573 					sessions[j],
11574 					&ut_paramz[j].ut_params,
11575 					ts_params, ut_paramz[j].cipher,
11576 					ut_paramz[j].digest,
11577 					ut_paramz[j].iv),
11578 			"Failed to perform decrypt on request number %u.", i);
11579 
11580 		if (ut_paramz[j].ut_params.op)
11581 			rte_crypto_op_free(ut_paramz[j].ut_params.op);
11582 
11583 		/*
11584 		 * free mbuf - both obuf and ibuf are usually the same,
11585 		 * so check if they point at the same address is necessary,
11586 		 * to avoid freeing the mbuf twice.
11587 		 */
11588 		if (ut_paramz[j].ut_params.obuf) {
11589 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
11590 			if (ut_paramz[j].ut_params.ibuf
11591 					== ut_paramz[j].ut_params.obuf)
11592 				ut_paramz[j].ut_params.ibuf = 0;
11593 			ut_paramz[j].ut_params.obuf = 0;
11594 		}
11595 		if (ut_paramz[j].ut_params.ibuf) {
11596 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
11597 			ut_paramz[j].ut_params.ibuf = 0;
11598 		}
11599 	}
11600 
11601 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
11602 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11603 				sessions[i]);
11604 		rte_cryptodev_sym_session_free(sessions[i]);
11605 	}
11606 
11607 	rte_free(sessions);
11608 
11609 	return TEST_SUCCESS;
11610 }
11611 
11612 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
11613 			0xab, 0xab, 0xab, 0xab,
11614 			0xab, 0xab, 0xab, 0xab,
11615 			0xab, 0xab, 0xab, 0xab};
11616 
11617 static int
11618 test_null_invalid_operation(void)
11619 {
11620 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11621 	struct crypto_unittest_params *ut_params = &unittest_params;
11622 	int ret;
11623 
11624 	/* This test is for NULL PMD only */
11625 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
11626 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11627 		return TEST_SKIPPED;
11628 
11629 	/* Setup Cipher Parameters */
11630 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11631 	ut_params->cipher_xform.next = NULL;
11632 
11633 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
11634 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11635 
11636 	ut_params->sess = rte_cryptodev_sym_session_create(
11637 			ts_params->session_mpool);
11638 
11639 	/* Create Crypto session*/
11640 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11641 			ut_params->sess, &ut_params->cipher_xform,
11642 			ts_params->session_priv_mpool);
11643 	TEST_ASSERT(ret < 0,
11644 			"Session creation succeeded unexpectedly");
11645 
11646 
11647 	/* Setup HMAC Parameters */
11648 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11649 	ut_params->auth_xform.next = NULL;
11650 
11651 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
11652 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11653 
11654 	ut_params->sess = rte_cryptodev_sym_session_create(
11655 			ts_params->session_mpool);
11656 
11657 	/* Create Crypto session*/
11658 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11659 			ut_params->sess, &ut_params->auth_xform,
11660 			ts_params->session_priv_mpool);
11661 	TEST_ASSERT(ret < 0,
11662 			"Session creation succeeded unexpectedly");
11663 
11664 	return TEST_SUCCESS;
11665 }
11666 
11667 
11668 #define NULL_BURST_LENGTH (32)
11669 
11670 static int
11671 test_null_burst_operation(void)
11672 {
11673 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11674 	struct crypto_unittest_params *ut_params = &unittest_params;
11675 
11676 	unsigned i, burst_len = NULL_BURST_LENGTH;
11677 
11678 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
11679 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
11680 
11681 	/* This test is for NULL PMD only */
11682 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
11683 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11684 		return TEST_SKIPPED;
11685 
11686 	/* Setup Cipher Parameters */
11687 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11688 	ut_params->cipher_xform.next = &ut_params->auth_xform;
11689 
11690 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
11691 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11692 
11693 	/* Setup HMAC Parameters */
11694 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11695 	ut_params->auth_xform.next = NULL;
11696 
11697 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
11698 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11699 
11700 	ut_params->sess = rte_cryptodev_sym_session_create(
11701 			ts_params->session_mpool);
11702 
11703 	/* Create Crypto session*/
11704 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11705 			ut_params->sess, &ut_params->cipher_xform,
11706 			ts_params->session_priv_mpool);
11707 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11708 
11709 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
11710 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
11711 			burst_len, "failed to generate burst of crypto ops");
11712 
11713 	/* Generate an operation for each mbuf in burst */
11714 	for (i = 0; i < burst_len; i++) {
11715 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11716 
11717 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
11718 
11719 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
11720 				sizeof(unsigned));
11721 		*data = i;
11722 
11723 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
11724 
11725 		burst[i]->sym->m_src = m;
11726 	}
11727 
11728 	/* Process crypto operation */
11729 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
11730 			0, burst, burst_len),
11731 			burst_len,
11732 			"Error enqueuing burst");
11733 
11734 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
11735 			0, burst_dequeued, burst_len),
11736 			burst_len,
11737 			"Error dequeuing burst");
11738 
11739 
11740 	for (i = 0; i < burst_len; i++) {
11741 		TEST_ASSERT_EQUAL(
11742 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
11743 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
11744 					uint32_t *),
11745 			"data not as expected");
11746 
11747 		rte_pktmbuf_free(burst[i]->sym->m_src);
11748 		rte_crypto_op_free(burst[i]);
11749 	}
11750 
11751 	return TEST_SUCCESS;
11752 }
11753 
11754 static uint16_t
11755 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11756 		  uint16_t nb_ops, void *user_param)
11757 {
11758 	RTE_SET_USED(dev_id);
11759 	RTE_SET_USED(qp_id);
11760 	RTE_SET_USED(ops);
11761 	RTE_SET_USED(user_param);
11762 
11763 	printf("crypto enqueue callback called\n");
11764 	return nb_ops;
11765 }
11766 
11767 static uint16_t
11768 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11769 		  uint16_t nb_ops, void *user_param)
11770 {
11771 	RTE_SET_USED(dev_id);
11772 	RTE_SET_USED(qp_id);
11773 	RTE_SET_USED(ops);
11774 	RTE_SET_USED(user_param);
11775 
11776 	printf("crypto dequeue callback called\n");
11777 	return nb_ops;
11778 }
11779 
11780 /*
11781  * Thread using enqueue/dequeue callback with RCU.
11782  */
11783 static int
11784 test_enqdeq_callback_thread(void *arg)
11785 {
11786 	RTE_SET_USED(arg);
11787 	/* DP thread calls rte_cryptodev_enqueue_burst()/
11788 	 * rte_cryptodev_dequeue_burst() and invokes callback.
11789 	 */
11790 	test_null_burst_operation();
11791 	return 0;
11792 }
11793 
11794 static int
11795 test_enq_callback_setup(void)
11796 {
11797 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11798 	struct rte_cryptodev_info dev_info;
11799 	struct rte_cryptodev_qp_conf qp_conf = {
11800 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
11801 	};
11802 
11803 	struct rte_cryptodev_cb *cb;
11804 	uint16_t qp_id = 0;
11805 
11806 	/* Stop the device in case it's started so it can be configured */
11807 	rte_cryptodev_stop(ts_params->valid_devs[0]);
11808 
11809 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11810 
11811 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11812 			&ts_params->conf),
11813 			"Failed to configure cryptodev %u",
11814 			ts_params->valid_devs[0]);
11815 
11816 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11817 	qp_conf.mp_session = ts_params->session_mpool;
11818 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
11819 
11820 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11821 			ts_params->valid_devs[0], qp_id, &qp_conf,
11822 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11823 			"Failed test for "
11824 			"rte_cryptodev_queue_pair_setup: num_inflights "
11825 			"%u on qp %u on cryptodev %u",
11826 			qp_conf.nb_descriptors, qp_id,
11827 			ts_params->valid_devs[0]);
11828 
11829 	/* Test with invalid crypto device */
11830 	cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
11831 			qp_id, test_enq_callback, NULL);
11832 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11833 			"cryptodev %u did not fail",
11834 			qp_id, RTE_CRYPTO_MAX_DEVS);
11835 
11836 	/* Test with invalid queue pair */
11837 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11838 			dev_info.max_nb_queue_pairs + 1,
11839 			test_enq_callback, NULL);
11840 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11841 			"cryptodev %u did not fail",
11842 			dev_info.max_nb_queue_pairs + 1,
11843 			ts_params->valid_devs[0]);
11844 
11845 	/* Test with NULL callback */
11846 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11847 			qp_id, NULL, NULL);
11848 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11849 			"cryptodev %u did not fail",
11850 			qp_id, ts_params->valid_devs[0]);
11851 
11852 	/* Test with valid configuration */
11853 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11854 			qp_id, test_enq_callback, NULL);
11855 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11856 			"qp %u on cryptodev %u",
11857 			qp_id, ts_params->valid_devs[0]);
11858 
11859 	rte_cryptodev_start(ts_params->valid_devs[0]);
11860 
11861 	/* Launch a thread */
11862 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11863 				rte_get_next_lcore(-1, 1, 0));
11864 
11865 	/* Wait until reader exited. */
11866 	rte_eal_mp_wait_lcore();
11867 
11868 	/* Test with invalid crypto device */
11869 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11870 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11871 			"Expected call to fail as crypto device is invalid");
11872 
11873 	/* Test with invalid queue pair */
11874 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11875 			ts_params->valid_devs[0],
11876 			dev_info.max_nb_queue_pairs + 1, cb),
11877 			"Expected call to fail as queue pair is invalid");
11878 
11879 	/* Test with NULL callback */
11880 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11881 			ts_params->valid_devs[0], qp_id, NULL),
11882 			"Expected call to fail as callback is NULL");
11883 
11884 	/* Test with valid configuration */
11885 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
11886 			ts_params->valid_devs[0], qp_id, cb),
11887 			"Failed test to remove callback on "
11888 			"qp %u on cryptodev %u",
11889 			qp_id, ts_params->valid_devs[0]);
11890 
11891 	return TEST_SUCCESS;
11892 }
11893 
11894 static int
11895 test_deq_callback_setup(void)
11896 {
11897 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11898 	struct rte_cryptodev_info dev_info;
11899 	struct rte_cryptodev_qp_conf qp_conf = {
11900 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
11901 	};
11902 
11903 	struct rte_cryptodev_cb *cb;
11904 	uint16_t qp_id = 0;
11905 
11906 	/* Stop the device in case it's started so it can be configured */
11907 	rte_cryptodev_stop(ts_params->valid_devs[0]);
11908 
11909 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11910 
11911 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11912 			&ts_params->conf),
11913 			"Failed to configure cryptodev %u",
11914 			ts_params->valid_devs[0]);
11915 
11916 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11917 	qp_conf.mp_session = ts_params->session_mpool;
11918 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
11919 
11920 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11921 			ts_params->valid_devs[0], qp_id, &qp_conf,
11922 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11923 			"Failed test for "
11924 			"rte_cryptodev_queue_pair_setup: num_inflights "
11925 			"%u on qp %u on cryptodev %u",
11926 			qp_conf.nb_descriptors, qp_id,
11927 			ts_params->valid_devs[0]);
11928 
11929 	/* Test with invalid crypto device */
11930 	cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
11931 			qp_id, test_deq_callback, NULL);
11932 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11933 			"cryptodev %u did not fail",
11934 			qp_id, RTE_CRYPTO_MAX_DEVS);
11935 
11936 	/* Test with invalid queue pair */
11937 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11938 			dev_info.max_nb_queue_pairs + 1,
11939 			test_deq_callback, NULL);
11940 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11941 			"cryptodev %u did not fail",
11942 			dev_info.max_nb_queue_pairs + 1,
11943 			ts_params->valid_devs[0]);
11944 
11945 	/* Test with NULL callback */
11946 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11947 			qp_id, NULL, NULL);
11948 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11949 			"cryptodev %u did not fail",
11950 			qp_id, ts_params->valid_devs[0]);
11951 
11952 	/* Test with valid configuration */
11953 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11954 			qp_id, test_deq_callback, NULL);
11955 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11956 			"qp %u on cryptodev %u",
11957 			qp_id, ts_params->valid_devs[0]);
11958 
11959 	rte_cryptodev_start(ts_params->valid_devs[0]);
11960 
11961 	/* Launch a thread */
11962 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11963 				rte_get_next_lcore(-1, 1, 0));
11964 
11965 	/* Wait until reader exited. */
11966 	rte_eal_mp_wait_lcore();
11967 
11968 	/* Test with invalid crypto device */
11969 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11970 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11971 			"Expected call to fail as crypto device is invalid");
11972 
11973 	/* Test with invalid queue pair */
11974 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11975 			ts_params->valid_devs[0],
11976 			dev_info.max_nb_queue_pairs + 1, cb),
11977 			"Expected call to fail as queue pair is invalid");
11978 
11979 	/* Test with NULL callback */
11980 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11981 			ts_params->valid_devs[0], qp_id, NULL),
11982 			"Expected call to fail as callback is NULL");
11983 
11984 	/* Test with valid configuration */
11985 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
11986 			ts_params->valid_devs[0], qp_id, cb),
11987 			"Failed test to remove callback on "
11988 			"qp %u on cryptodev %u",
11989 			qp_id, ts_params->valid_devs[0]);
11990 
11991 	return TEST_SUCCESS;
11992 }
11993 
11994 static void
11995 generate_gmac_large_plaintext(uint8_t *data)
11996 {
11997 	uint16_t i;
11998 
11999 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
12000 		memcpy(&data[i], &data[0], 32);
12001 }
12002 
12003 static int
12004 create_gmac_operation(enum rte_crypto_auth_operation op,
12005 		const struct gmac_test_data *tdata)
12006 {
12007 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12008 	struct crypto_unittest_params *ut_params = &unittest_params;
12009 	struct rte_crypto_sym_op *sym_op;
12010 
12011 	uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12012 
12013 	/* Generate Crypto op data structure */
12014 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12015 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12016 	TEST_ASSERT_NOT_NULL(ut_params->op,
12017 			"Failed to allocate symmetric crypto operation struct");
12018 
12019 	sym_op = ut_params->op->sym;
12020 
12021 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12022 			ut_params->ibuf, tdata->gmac_tag.len);
12023 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12024 			"no room to append digest");
12025 
12026 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12027 			ut_params->ibuf, plaintext_pad_len);
12028 
12029 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12030 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12031 				tdata->gmac_tag.len);
12032 		debug_hexdump(stdout, "digest:",
12033 				sym_op->auth.digest.data,
12034 				tdata->gmac_tag.len);
12035 	}
12036 
12037 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12038 			uint8_t *, IV_OFFSET);
12039 
12040 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12041 
12042 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12043 
12044 	sym_op->cipher.data.length = 0;
12045 	sym_op->cipher.data.offset = 0;
12046 
12047 	sym_op->auth.data.offset = 0;
12048 	sym_op->auth.data.length = tdata->plaintext.len;
12049 
12050 	return 0;
12051 }
12052 
12053 static int
12054 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
12055 		const struct gmac_test_data *tdata,
12056 		void *digest_mem, uint64_t digest_phys)
12057 {
12058 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12059 	struct crypto_unittest_params *ut_params = &unittest_params;
12060 	struct rte_crypto_sym_op *sym_op;
12061 
12062 	/* Generate Crypto op data structure */
12063 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12064 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12065 	TEST_ASSERT_NOT_NULL(ut_params->op,
12066 			"Failed to allocate symmetric crypto operation struct");
12067 
12068 	sym_op = ut_params->op->sym;
12069 
12070 	sym_op->auth.digest.data = digest_mem;
12071 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12072 			"no room to append digest");
12073 
12074 	sym_op->auth.digest.phys_addr = digest_phys;
12075 
12076 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12077 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12078 				tdata->gmac_tag.len);
12079 		debug_hexdump(stdout, "digest:",
12080 				sym_op->auth.digest.data,
12081 				tdata->gmac_tag.len);
12082 	}
12083 
12084 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12085 			uint8_t *, IV_OFFSET);
12086 
12087 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12088 
12089 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12090 
12091 	sym_op->cipher.data.length = 0;
12092 	sym_op->cipher.data.offset = 0;
12093 
12094 	sym_op->auth.data.offset = 0;
12095 	sym_op->auth.data.length = tdata->plaintext.len;
12096 
12097 	return 0;
12098 }
12099 
12100 static int create_gmac_session(uint8_t dev_id,
12101 		const struct gmac_test_data *tdata,
12102 		enum rte_crypto_auth_operation auth_op)
12103 {
12104 	uint8_t auth_key[tdata->key.len];
12105 
12106 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12107 	struct crypto_unittest_params *ut_params = &unittest_params;
12108 
12109 	memcpy(auth_key, tdata->key.data, tdata->key.len);
12110 
12111 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12112 	ut_params->auth_xform.next = NULL;
12113 
12114 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
12115 	ut_params->auth_xform.auth.op = auth_op;
12116 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
12117 	ut_params->auth_xform.auth.key.length = tdata->key.len;
12118 	ut_params->auth_xform.auth.key.data = auth_key;
12119 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12120 	ut_params->auth_xform.auth.iv.length = tdata->iv.len;
12121 
12122 
12123 	ut_params->sess = rte_cryptodev_sym_session_create(
12124 			ts_params->session_mpool);
12125 
12126 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12127 			&ut_params->auth_xform,
12128 			ts_params->session_priv_mpool);
12129 
12130 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12131 
12132 	return 0;
12133 }
12134 
12135 static int
12136 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
12137 {
12138 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12139 	struct crypto_unittest_params *ut_params = &unittest_params;
12140 	struct rte_cryptodev_info dev_info;
12141 
12142 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12143 	uint64_t feat_flags = dev_info.feature_flags;
12144 
12145 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12146 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12147 		printf("Device doesn't support RAW data-path APIs.\n");
12148 		return TEST_SKIPPED;
12149 	}
12150 
12151 	int retval;
12152 
12153 	uint8_t *auth_tag, *plaintext;
12154 	uint16_t plaintext_pad_len;
12155 
12156 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12157 			      "No GMAC length in the source data");
12158 
12159 	/* Verify the capabilities */
12160 	struct rte_cryptodev_sym_capability_idx cap_idx;
12161 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12162 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12163 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12164 			&cap_idx) == NULL)
12165 		return TEST_SKIPPED;
12166 
12167 	retval = create_gmac_session(ts_params->valid_devs[0],
12168 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12169 
12170 	if (retval < 0)
12171 		return retval;
12172 
12173 	if (tdata->plaintext.len > MBUF_SIZE)
12174 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12175 	else
12176 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12177 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12178 			"Failed to allocate input buffer in mempool");
12179 
12180 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12181 			rte_pktmbuf_tailroom(ut_params->ibuf));
12182 
12183 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12184 	/*
12185 	 * Runtime generate the large plain text instead of use hard code
12186 	 * plain text vector. It is done to avoid create huge source file
12187 	 * with the test vector.
12188 	 */
12189 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12190 		generate_gmac_large_plaintext(tdata->plaintext.data);
12191 
12192 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12193 				plaintext_pad_len);
12194 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12195 
12196 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12197 	debug_hexdump(stdout, "plaintext:", plaintext,
12198 			tdata->plaintext.len);
12199 
12200 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
12201 			tdata);
12202 
12203 	if (retval < 0)
12204 		return retval;
12205 
12206 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12207 
12208 	ut_params->op->sym->m_src = ut_params->ibuf;
12209 
12210 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12211 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12212 			ut_params->op);
12213 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12214 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12215 				ut_params->op, 0, 1, 0, 0);
12216 	else
12217 		TEST_ASSERT_NOT_NULL(
12218 			process_crypto_request(ts_params->valid_devs[0],
12219 			ut_params->op), "failed to process sym crypto op");
12220 
12221 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12222 			"crypto op processing failed");
12223 
12224 	if (ut_params->op->sym->m_dst) {
12225 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12226 				uint8_t *, plaintext_pad_len);
12227 	} else {
12228 		auth_tag = plaintext + plaintext_pad_len;
12229 	}
12230 
12231 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12232 
12233 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12234 			auth_tag,
12235 			tdata->gmac_tag.data,
12236 			tdata->gmac_tag.len,
12237 			"GMAC Generated auth tag not as expected");
12238 
12239 	return 0;
12240 }
12241 
12242 static int
12243 test_AES_GMAC_authentication_test_case_1(void)
12244 {
12245 	return test_AES_GMAC_authentication(&gmac_test_case_1);
12246 }
12247 
12248 static int
12249 test_AES_GMAC_authentication_test_case_2(void)
12250 {
12251 	return test_AES_GMAC_authentication(&gmac_test_case_2);
12252 }
12253 
12254 static int
12255 test_AES_GMAC_authentication_test_case_3(void)
12256 {
12257 	return test_AES_GMAC_authentication(&gmac_test_case_3);
12258 }
12259 
12260 static int
12261 test_AES_GMAC_authentication_test_case_4(void)
12262 {
12263 	return test_AES_GMAC_authentication(&gmac_test_case_4);
12264 }
12265 
12266 static int
12267 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
12268 {
12269 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12270 	struct crypto_unittest_params *ut_params = &unittest_params;
12271 	int retval;
12272 	uint32_t plaintext_pad_len;
12273 	uint8_t *plaintext;
12274 	struct rte_cryptodev_info dev_info;
12275 
12276 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12277 	uint64_t feat_flags = dev_info.feature_flags;
12278 
12279 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12280 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12281 		printf("Device doesn't support RAW data-path APIs.\n");
12282 		return TEST_SKIPPED;
12283 	}
12284 
12285 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12286 			      "No GMAC length in the source data");
12287 
12288 	/* Verify the capabilities */
12289 	struct rte_cryptodev_sym_capability_idx cap_idx;
12290 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12291 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12292 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12293 			&cap_idx) == NULL)
12294 		return TEST_SKIPPED;
12295 
12296 	retval = create_gmac_session(ts_params->valid_devs[0],
12297 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
12298 
12299 	if (retval < 0)
12300 		return retval;
12301 
12302 	if (tdata->plaintext.len > MBUF_SIZE)
12303 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12304 	else
12305 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12306 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12307 			"Failed to allocate input buffer in mempool");
12308 
12309 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12310 			rte_pktmbuf_tailroom(ut_params->ibuf));
12311 
12312 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12313 
12314 	/*
12315 	 * Runtime generate the large plain text instead of use hard code
12316 	 * plain text vector. It is done to avoid create huge source file
12317 	 * with the test vector.
12318 	 */
12319 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12320 		generate_gmac_large_plaintext(tdata->plaintext.data);
12321 
12322 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12323 				plaintext_pad_len);
12324 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12325 
12326 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12327 	debug_hexdump(stdout, "plaintext:", plaintext,
12328 			tdata->plaintext.len);
12329 
12330 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
12331 			tdata);
12332 
12333 	if (retval < 0)
12334 		return retval;
12335 
12336 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12337 
12338 	ut_params->op->sym->m_src = ut_params->ibuf;
12339 
12340 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12341 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12342 			ut_params->op);
12343 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12344 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12345 				ut_params->op, 0, 1, 0, 0);
12346 	else
12347 		TEST_ASSERT_NOT_NULL(
12348 			process_crypto_request(ts_params->valid_devs[0],
12349 			ut_params->op), "failed to process sym crypto op");
12350 
12351 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12352 			"crypto op processing failed");
12353 
12354 	return 0;
12355 
12356 }
12357 
12358 static int
12359 test_AES_GMAC_authentication_verify_test_case_1(void)
12360 {
12361 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
12362 }
12363 
12364 static int
12365 test_AES_GMAC_authentication_verify_test_case_2(void)
12366 {
12367 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
12368 }
12369 
12370 static int
12371 test_AES_GMAC_authentication_verify_test_case_3(void)
12372 {
12373 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
12374 }
12375 
12376 static int
12377 test_AES_GMAC_authentication_verify_test_case_4(void)
12378 {
12379 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
12380 }
12381 
12382 static int
12383 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
12384 				uint32_t fragsz)
12385 {
12386 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12387 	struct crypto_unittest_params *ut_params = &unittest_params;
12388 	struct rte_cryptodev_info dev_info;
12389 	uint64_t feature_flags;
12390 	unsigned int trn_data = 0;
12391 	void *digest_mem = NULL;
12392 	uint32_t segs = 1;
12393 	unsigned int to_trn = 0;
12394 	struct rte_mbuf *buf = NULL;
12395 	uint8_t *auth_tag, *plaintext;
12396 	int retval;
12397 
12398 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12399 			      "No GMAC length in the source data");
12400 
12401 	/* Verify the capabilities */
12402 	struct rte_cryptodev_sym_capability_idx cap_idx;
12403 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12404 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12405 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12406 			&cap_idx) == NULL)
12407 		return TEST_SKIPPED;
12408 
12409 	/* Check for any input SGL support */
12410 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12411 	feature_flags = dev_info.feature_flags;
12412 
12413 	if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
12414 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
12415 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
12416 		return TEST_SKIPPED;
12417 
12418 	if (fragsz > tdata->plaintext.len)
12419 		fragsz = tdata->plaintext.len;
12420 
12421 	uint16_t plaintext_len = fragsz;
12422 
12423 	retval = create_gmac_session(ts_params->valid_devs[0],
12424 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12425 
12426 	if (retval < 0)
12427 		return retval;
12428 
12429 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12430 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12431 			"Failed to allocate input buffer in mempool");
12432 
12433 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12434 			rte_pktmbuf_tailroom(ut_params->ibuf));
12435 
12436 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12437 				plaintext_len);
12438 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12439 
12440 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12441 
12442 	trn_data += plaintext_len;
12443 
12444 	buf = ut_params->ibuf;
12445 
12446 	/*
12447 	 * Loop until no more fragments
12448 	 */
12449 
12450 	while (trn_data < tdata->plaintext.len) {
12451 		++segs;
12452 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12453 				(tdata->plaintext.len - trn_data) : fragsz;
12454 
12455 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12456 		buf = buf->next;
12457 
12458 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12459 				rte_pktmbuf_tailroom(buf));
12460 
12461 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12462 				to_trn);
12463 
12464 		memcpy(plaintext, tdata->plaintext.data + trn_data,
12465 				to_trn);
12466 		trn_data += to_trn;
12467 		if (trn_data  == tdata->plaintext.len)
12468 			digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12469 					tdata->gmac_tag.len);
12470 	}
12471 	ut_params->ibuf->nb_segs = segs;
12472 
12473 	/*
12474 	 * Place digest at the end of the last buffer
12475 	 */
12476 	uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12477 
12478 	if (!digest_mem) {
12479 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12480 				+ tdata->gmac_tag.len);
12481 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12482 				tdata->plaintext.len);
12483 	}
12484 
12485 	retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
12486 			tdata, digest_mem, digest_phys);
12487 
12488 	if (retval < 0)
12489 		return retval;
12490 
12491 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12492 
12493 	ut_params->op->sym->m_src = ut_params->ibuf;
12494 
12495 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12496 		return TEST_SKIPPED;
12497 
12498 	TEST_ASSERT_NOT_NULL(
12499 		process_crypto_request(ts_params->valid_devs[0],
12500 		ut_params->op), "failed to process sym crypto op");
12501 
12502 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12503 			"crypto op processing failed");
12504 
12505 	auth_tag = digest_mem;
12506 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12507 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12508 			auth_tag,
12509 			tdata->gmac_tag.data,
12510 			tdata->gmac_tag.len,
12511 			"GMAC Generated auth tag not as expected");
12512 
12513 	return 0;
12514 }
12515 
12516 /* Segment size not multiple of block size (16B) */
12517 static int
12518 test_AES_GMAC_authentication_SGL_40B(void)
12519 {
12520 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
12521 }
12522 
12523 static int
12524 test_AES_GMAC_authentication_SGL_80B(void)
12525 {
12526 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
12527 }
12528 
12529 static int
12530 test_AES_GMAC_authentication_SGL_2048B(void)
12531 {
12532 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
12533 }
12534 
12535 /* Segment size not multiple of block size (16B) */
12536 static int
12537 test_AES_GMAC_authentication_SGL_2047B(void)
12538 {
12539 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
12540 }
12541 
12542 struct test_crypto_vector {
12543 	enum rte_crypto_cipher_algorithm crypto_algo;
12544 	unsigned int cipher_offset;
12545 	unsigned int cipher_len;
12546 
12547 	struct {
12548 		uint8_t data[64];
12549 		unsigned int len;
12550 	} cipher_key;
12551 
12552 	struct {
12553 		uint8_t data[64];
12554 		unsigned int len;
12555 	} iv;
12556 
12557 	struct {
12558 		const uint8_t *data;
12559 		unsigned int len;
12560 	} plaintext;
12561 
12562 	struct {
12563 		const uint8_t *data;
12564 		unsigned int len;
12565 	} ciphertext;
12566 
12567 	enum rte_crypto_auth_algorithm auth_algo;
12568 	unsigned int auth_offset;
12569 
12570 	struct {
12571 		uint8_t data[128];
12572 		unsigned int len;
12573 	} auth_key;
12574 
12575 	struct {
12576 		const uint8_t *data;
12577 		unsigned int len;
12578 	} aad;
12579 
12580 	struct {
12581 		uint8_t data[128];
12582 		unsigned int len;
12583 	} digest;
12584 };
12585 
12586 static const struct test_crypto_vector
12587 hmac_sha1_test_crypto_vector = {
12588 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12589 	.plaintext = {
12590 		.data = plaintext_hash,
12591 		.len = 512
12592 	},
12593 	.auth_key = {
12594 		.data = {
12595 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12596 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12597 			0xDE, 0xF4, 0xDE, 0xAD
12598 		},
12599 		.len = 20
12600 	},
12601 	.digest = {
12602 		.data = {
12603 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
12604 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
12605 			0x3F, 0x91, 0x64, 0x59
12606 		},
12607 		.len = 20
12608 	}
12609 };
12610 
12611 static const struct test_crypto_vector
12612 aes128_gmac_test_vector = {
12613 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
12614 	.plaintext = {
12615 		.data = plaintext_hash,
12616 		.len = 512
12617 	},
12618 	.iv = {
12619 		.data = {
12620 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12621 			0x08, 0x09, 0x0A, 0x0B
12622 		},
12623 		.len = 12
12624 	},
12625 	.auth_key = {
12626 		.data = {
12627 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12628 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
12629 		},
12630 		.len = 16
12631 	},
12632 	.digest = {
12633 		.data = {
12634 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
12635 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
12636 		},
12637 		.len = 16
12638 	}
12639 };
12640 
12641 static const struct test_crypto_vector
12642 aes128cbc_hmac_sha1_test_vector = {
12643 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12644 	.cipher_offset = 0,
12645 	.cipher_len = 512,
12646 	.cipher_key = {
12647 		.data = {
12648 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12649 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12650 		},
12651 		.len = 16
12652 	},
12653 	.iv = {
12654 		.data = {
12655 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12656 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12657 		},
12658 		.len = 16
12659 	},
12660 	.plaintext = {
12661 		.data = plaintext_hash,
12662 		.len = 512
12663 	},
12664 	.ciphertext = {
12665 		.data = ciphertext512_aes128cbc,
12666 		.len = 512
12667 	},
12668 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12669 	.auth_offset = 0,
12670 	.auth_key = {
12671 		.data = {
12672 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12673 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12674 			0xDE, 0xF4, 0xDE, 0xAD
12675 		},
12676 		.len = 20
12677 	},
12678 	.digest = {
12679 		.data = {
12680 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
12681 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12682 			0x18, 0x8C, 0x1D, 0x32
12683 		},
12684 		.len = 20
12685 	}
12686 };
12687 
12688 static const struct test_crypto_vector
12689 aes128cbc_hmac_sha1_aad_test_vector = {
12690 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12691 	.cipher_offset = 8,
12692 	.cipher_len = 496,
12693 	.cipher_key = {
12694 		.data = {
12695 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12696 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12697 		},
12698 		.len = 16
12699 	},
12700 	.iv = {
12701 		.data = {
12702 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12703 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12704 		},
12705 		.len = 16
12706 	},
12707 	.plaintext = {
12708 		.data = plaintext_hash,
12709 		.len = 512
12710 	},
12711 	.ciphertext = {
12712 		.data = ciphertext512_aes128cbc_aad,
12713 		.len = 512
12714 	},
12715 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12716 	.auth_offset = 0,
12717 	.auth_key = {
12718 		.data = {
12719 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12720 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12721 			0xDE, 0xF4, 0xDE, 0xAD
12722 		},
12723 		.len = 20
12724 	},
12725 	.digest = {
12726 		.data = {
12727 			0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
12728 			0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
12729 			0x62, 0x0F, 0xFB, 0x10
12730 		},
12731 		.len = 20
12732 	}
12733 };
12734 
12735 static void
12736 data_corruption(uint8_t *data)
12737 {
12738 	data[0] += 1;
12739 }
12740 
12741 static void
12742 tag_corruption(uint8_t *data, unsigned int tag_offset)
12743 {
12744 	data[tag_offset] += 1;
12745 }
12746 
12747 static int
12748 create_auth_session(struct crypto_unittest_params *ut_params,
12749 		uint8_t dev_id,
12750 		const struct test_crypto_vector *reference,
12751 		enum rte_crypto_auth_operation auth_op)
12752 {
12753 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12754 	uint8_t auth_key[reference->auth_key.len + 1];
12755 
12756 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12757 
12758 	/* Setup Authentication Parameters */
12759 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12760 	ut_params->auth_xform.auth.op = auth_op;
12761 	ut_params->auth_xform.next = NULL;
12762 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12763 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12764 	ut_params->auth_xform.auth.key.data = auth_key;
12765 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12766 
12767 	/* Create Crypto session*/
12768 	ut_params->sess = rte_cryptodev_sym_session_create(
12769 			ts_params->session_mpool);
12770 
12771 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12772 				&ut_params->auth_xform,
12773 				ts_params->session_priv_mpool);
12774 
12775 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12776 
12777 	return 0;
12778 }
12779 
12780 static int
12781 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
12782 		uint8_t dev_id,
12783 		const struct test_crypto_vector *reference,
12784 		enum rte_crypto_auth_operation auth_op,
12785 		enum rte_crypto_cipher_operation cipher_op)
12786 {
12787 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12788 	uint8_t cipher_key[reference->cipher_key.len + 1];
12789 	uint8_t auth_key[reference->auth_key.len + 1];
12790 
12791 	memcpy(cipher_key, reference->cipher_key.data,
12792 			reference->cipher_key.len);
12793 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12794 
12795 	/* Setup Authentication Parameters */
12796 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12797 	ut_params->auth_xform.auth.op = auth_op;
12798 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12799 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12800 	ut_params->auth_xform.auth.key.data = auth_key;
12801 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12802 
12803 	if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
12804 		ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12805 		ut_params->auth_xform.auth.iv.length = reference->iv.len;
12806 	} else {
12807 		ut_params->auth_xform.next = &ut_params->cipher_xform;
12808 
12809 		/* Setup Cipher Parameters */
12810 		ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12811 		ut_params->cipher_xform.next = NULL;
12812 		ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12813 		ut_params->cipher_xform.cipher.op = cipher_op;
12814 		ut_params->cipher_xform.cipher.key.data = cipher_key;
12815 		ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12816 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12817 		ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12818 	}
12819 
12820 	/* Create Crypto session*/
12821 	ut_params->sess = rte_cryptodev_sym_session_create(
12822 			ts_params->session_mpool);
12823 
12824 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12825 				&ut_params->auth_xform,
12826 				ts_params->session_priv_mpool);
12827 
12828 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12829 
12830 	return 0;
12831 }
12832 
12833 static int
12834 create_auth_operation(struct crypto_testsuite_params *ts_params,
12835 		struct crypto_unittest_params *ut_params,
12836 		const struct test_crypto_vector *reference,
12837 		unsigned int auth_generate)
12838 {
12839 	/* Generate Crypto op data structure */
12840 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12841 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12842 	TEST_ASSERT_NOT_NULL(ut_params->op,
12843 			"Failed to allocate pktmbuf offload");
12844 
12845 	/* Set crypto operation data parameters */
12846 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12847 
12848 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12849 
12850 	/* set crypto operation source mbuf */
12851 	sym_op->m_src = ut_params->ibuf;
12852 
12853 	/* digest */
12854 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12855 			ut_params->ibuf, reference->digest.len);
12856 
12857 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12858 			"no room to append auth tag");
12859 
12860 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12861 			ut_params->ibuf, reference->plaintext.len);
12862 
12863 	if (auth_generate)
12864 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12865 	else
12866 		memcpy(sym_op->auth.digest.data,
12867 				reference->digest.data,
12868 				reference->digest.len);
12869 
12870 	debug_hexdump(stdout, "digest:",
12871 			sym_op->auth.digest.data,
12872 			reference->digest.len);
12873 
12874 	sym_op->auth.data.length = reference->plaintext.len;
12875 	sym_op->auth.data.offset = 0;
12876 
12877 	return 0;
12878 }
12879 
12880 static int
12881 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
12882 		struct crypto_unittest_params *ut_params,
12883 		const struct test_crypto_vector *reference,
12884 		unsigned int auth_generate)
12885 {
12886 	/* Generate Crypto op data structure */
12887 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12888 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12889 	TEST_ASSERT_NOT_NULL(ut_params->op,
12890 			"Failed to allocate pktmbuf offload");
12891 
12892 	/* Set crypto operation data parameters */
12893 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12894 
12895 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12896 
12897 	/* set crypto operation source mbuf */
12898 	sym_op->m_src = ut_params->ibuf;
12899 
12900 	/* digest */
12901 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12902 			ut_params->ibuf, reference->digest.len);
12903 
12904 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12905 			"no room to append auth tag");
12906 
12907 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12908 			ut_params->ibuf, reference->ciphertext.len);
12909 
12910 	if (auth_generate)
12911 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12912 	else
12913 		memcpy(sym_op->auth.digest.data,
12914 				reference->digest.data,
12915 				reference->digest.len);
12916 
12917 	debug_hexdump(stdout, "digest:",
12918 			sym_op->auth.digest.data,
12919 			reference->digest.len);
12920 
12921 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12922 			reference->iv.data, reference->iv.len);
12923 
12924 	sym_op->cipher.data.length = 0;
12925 	sym_op->cipher.data.offset = 0;
12926 
12927 	sym_op->auth.data.length = reference->plaintext.len;
12928 	sym_op->auth.data.offset = 0;
12929 
12930 	return 0;
12931 }
12932 
12933 static int
12934 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
12935 		struct crypto_unittest_params *ut_params,
12936 		const struct test_crypto_vector *reference,
12937 		unsigned int auth_generate)
12938 {
12939 	/* Generate Crypto op data structure */
12940 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12941 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12942 	TEST_ASSERT_NOT_NULL(ut_params->op,
12943 			"Failed to allocate pktmbuf offload");
12944 
12945 	/* Set crypto operation data parameters */
12946 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12947 
12948 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12949 
12950 	/* set crypto operation source mbuf */
12951 	sym_op->m_src = ut_params->ibuf;
12952 
12953 	/* digest */
12954 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12955 			ut_params->ibuf, reference->digest.len);
12956 
12957 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12958 			"no room to append auth tag");
12959 
12960 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12961 			ut_params->ibuf, reference->ciphertext.len);
12962 
12963 	if (auth_generate)
12964 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12965 	else
12966 		memcpy(sym_op->auth.digest.data,
12967 				reference->digest.data,
12968 				reference->digest.len);
12969 
12970 	debug_hexdump(stdout, "digest:",
12971 			sym_op->auth.digest.data,
12972 			reference->digest.len);
12973 
12974 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12975 			reference->iv.data, reference->iv.len);
12976 
12977 	sym_op->cipher.data.length = reference->cipher_len;
12978 	sym_op->cipher.data.offset = reference->cipher_offset;
12979 
12980 	sym_op->auth.data.length = reference->plaintext.len;
12981 	sym_op->auth.data.offset = reference->auth_offset;
12982 
12983 	return 0;
12984 }
12985 
12986 static int
12987 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12988 		struct crypto_unittest_params *ut_params,
12989 		const struct test_crypto_vector *reference)
12990 {
12991 	return create_auth_operation(ts_params, ut_params, reference, 0);
12992 }
12993 
12994 static int
12995 create_auth_verify_GMAC_operation(
12996 		struct crypto_testsuite_params *ts_params,
12997 		struct crypto_unittest_params *ut_params,
12998 		const struct test_crypto_vector *reference)
12999 {
13000 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
13001 }
13002 
13003 static int
13004 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13005 		struct crypto_unittest_params *ut_params,
13006 		const struct test_crypto_vector *reference)
13007 {
13008 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
13009 }
13010 
13011 static int
13012 test_authentication_verify_fail_when_data_corruption(
13013 		struct crypto_testsuite_params *ts_params,
13014 		struct crypto_unittest_params *ut_params,
13015 		const struct test_crypto_vector *reference,
13016 		unsigned int data_corrupted)
13017 {
13018 	int retval;
13019 
13020 	uint8_t *plaintext;
13021 	struct rte_cryptodev_info dev_info;
13022 
13023 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13024 	uint64_t feat_flags = dev_info.feature_flags;
13025 
13026 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13027 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13028 		printf("Device doesn't support RAW data-path APIs.\n");
13029 		return TEST_SKIPPED;
13030 	}
13031 
13032 	/* Verify the capabilities */
13033 	struct rte_cryptodev_sym_capability_idx cap_idx;
13034 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13035 	cap_idx.algo.auth = reference->auth_algo;
13036 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13037 			&cap_idx) == NULL)
13038 		return TEST_SKIPPED;
13039 
13040 
13041 	/* Create session */
13042 	retval = create_auth_session(ut_params,
13043 			ts_params->valid_devs[0],
13044 			reference,
13045 			RTE_CRYPTO_AUTH_OP_VERIFY);
13046 	if (retval < 0)
13047 		return retval;
13048 
13049 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13050 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13051 			"Failed to allocate input buffer in mempool");
13052 
13053 	/* clear mbuf payload */
13054 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13055 			rte_pktmbuf_tailroom(ut_params->ibuf));
13056 
13057 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13058 			reference->plaintext.len);
13059 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13060 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13061 
13062 	debug_hexdump(stdout, "plaintext:", plaintext,
13063 		reference->plaintext.len);
13064 
13065 	/* Create operation */
13066 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
13067 
13068 	if (retval < 0)
13069 		return retval;
13070 
13071 	if (data_corrupted)
13072 		data_corruption(plaintext);
13073 	else
13074 		tag_corruption(plaintext, reference->plaintext.len);
13075 
13076 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13077 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13078 			ut_params->op);
13079 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13080 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13081 			"authentication not failed");
13082 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13083 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13084 				ut_params->op, 0, 1, 0, 0);
13085 	else {
13086 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13087 			ut_params->op);
13088 	}
13089 	if (ut_params->op == NULL)
13090 		return 0;
13091 	else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
13092 		return 0;
13093 
13094 	return -1;
13095 }
13096 
13097 static int
13098 test_authentication_verify_GMAC_fail_when_corruption(
13099 		struct crypto_testsuite_params *ts_params,
13100 		struct crypto_unittest_params *ut_params,
13101 		const struct test_crypto_vector *reference,
13102 		unsigned int data_corrupted)
13103 {
13104 	int retval;
13105 	uint8_t *plaintext;
13106 	struct rte_cryptodev_info dev_info;
13107 
13108 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13109 	uint64_t feat_flags = dev_info.feature_flags;
13110 
13111 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13112 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13113 		printf("Device doesn't support RAW data-path APIs.\n");
13114 		return TEST_SKIPPED;
13115 	}
13116 
13117 	/* Verify the capabilities */
13118 	struct rte_cryptodev_sym_capability_idx cap_idx;
13119 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13120 	cap_idx.algo.auth = reference->auth_algo;
13121 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13122 			&cap_idx) == NULL)
13123 		return TEST_SKIPPED;
13124 
13125 	/* Create session */
13126 	retval = create_auth_cipher_session(ut_params,
13127 			ts_params->valid_devs[0],
13128 			reference,
13129 			RTE_CRYPTO_AUTH_OP_VERIFY,
13130 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
13131 	if (retval < 0)
13132 		return retval;
13133 
13134 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13135 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13136 			"Failed to allocate input buffer in mempool");
13137 
13138 	/* clear mbuf payload */
13139 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13140 			rte_pktmbuf_tailroom(ut_params->ibuf));
13141 
13142 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13143 			reference->plaintext.len);
13144 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13145 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13146 
13147 	debug_hexdump(stdout, "plaintext:", plaintext,
13148 		reference->plaintext.len);
13149 
13150 	/* Create operation */
13151 	retval = create_auth_verify_GMAC_operation(ts_params,
13152 			ut_params,
13153 			reference);
13154 
13155 	if (retval < 0)
13156 		return retval;
13157 
13158 	if (data_corrupted)
13159 		data_corruption(plaintext);
13160 	else
13161 		tag_corruption(plaintext, reference->aad.len);
13162 
13163 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13164 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13165 			ut_params->op);
13166 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13167 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13168 			"authentication not failed");
13169 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13170 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13171 				ut_params->op, 0, 1, 0, 0);
13172 	else {
13173 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13174 			ut_params->op);
13175 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13176 	}
13177 
13178 	return 0;
13179 }
13180 
13181 static int
13182 test_authenticated_decryption_fail_when_corruption(
13183 		struct crypto_testsuite_params *ts_params,
13184 		struct crypto_unittest_params *ut_params,
13185 		const struct test_crypto_vector *reference,
13186 		unsigned int data_corrupted)
13187 {
13188 	int retval;
13189 
13190 	uint8_t *ciphertext;
13191 	struct rte_cryptodev_info dev_info;
13192 
13193 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13194 	uint64_t feat_flags = dev_info.feature_flags;
13195 
13196 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13197 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13198 		printf("Device doesn't support RAW data-path APIs.\n");
13199 		return TEST_SKIPPED;
13200 	}
13201 
13202 	/* Verify the capabilities */
13203 	struct rte_cryptodev_sym_capability_idx cap_idx;
13204 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13205 	cap_idx.algo.auth = reference->auth_algo;
13206 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13207 			&cap_idx) == NULL)
13208 		return TEST_SKIPPED;
13209 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13210 	cap_idx.algo.cipher = reference->crypto_algo;
13211 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13212 			&cap_idx) == NULL)
13213 		return TEST_SKIPPED;
13214 
13215 	/* Create session */
13216 	retval = create_auth_cipher_session(ut_params,
13217 			ts_params->valid_devs[0],
13218 			reference,
13219 			RTE_CRYPTO_AUTH_OP_VERIFY,
13220 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
13221 	if (retval < 0)
13222 		return retval;
13223 
13224 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13225 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13226 			"Failed to allocate input buffer in mempool");
13227 
13228 	/* clear mbuf payload */
13229 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13230 			rte_pktmbuf_tailroom(ut_params->ibuf));
13231 
13232 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13233 			reference->ciphertext.len);
13234 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13235 	memcpy(ciphertext, reference->ciphertext.data,
13236 			reference->ciphertext.len);
13237 
13238 	/* Create operation */
13239 	retval = create_cipher_auth_verify_operation(ts_params,
13240 			ut_params,
13241 			reference);
13242 
13243 	if (retval < 0)
13244 		return retval;
13245 
13246 	if (data_corrupted)
13247 		data_corruption(ciphertext);
13248 	else
13249 		tag_corruption(ciphertext, reference->ciphertext.len);
13250 
13251 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13252 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13253 			ut_params->op);
13254 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13255 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13256 			"authentication not failed");
13257 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13258 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13259 				ut_params->op, 1, 1, 0, 0);
13260 	else {
13261 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13262 			ut_params->op);
13263 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13264 	}
13265 
13266 	return 0;
13267 }
13268 
13269 static int
13270 test_authenticated_encrypt_with_esn(
13271 		struct crypto_testsuite_params *ts_params,
13272 		struct crypto_unittest_params *ut_params,
13273 		const struct test_crypto_vector *reference)
13274 {
13275 	int retval;
13276 
13277 	uint8_t *authciphertext, *plaintext, *auth_tag;
13278 	uint16_t plaintext_pad_len;
13279 	uint8_t cipher_key[reference->cipher_key.len + 1];
13280 	uint8_t auth_key[reference->auth_key.len + 1];
13281 	struct rte_cryptodev_info dev_info;
13282 
13283 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13284 	uint64_t feat_flags = dev_info.feature_flags;
13285 
13286 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13287 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13288 		printf("Device doesn't support RAW data-path APIs.\n");
13289 		return TEST_SKIPPED;
13290 	}
13291 
13292 	/* Verify the capabilities */
13293 	struct rte_cryptodev_sym_capability_idx cap_idx;
13294 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13295 	cap_idx.algo.auth = reference->auth_algo;
13296 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13297 			&cap_idx) == NULL)
13298 		return TEST_SKIPPED;
13299 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13300 	cap_idx.algo.cipher = reference->crypto_algo;
13301 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13302 			&cap_idx) == NULL)
13303 		return TEST_SKIPPED;
13304 
13305 	/* Create session */
13306 	memcpy(cipher_key, reference->cipher_key.data,
13307 			reference->cipher_key.len);
13308 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13309 
13310 	/* Setup Cipher Parameters */
13311 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13312 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13313 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13314 	ut_params->cipher_xform.cipher.key.data = cipher_key;
13315 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13316 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13317 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13318 
13319 	ut_params->cipher_xform.next = &ut_params->auth_xform;
13320 
13321 	/* Setup Authentication Parameters */
13322 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13323 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13324 	ut_params->auth_xform.auth.algo = reference->auth_algo;
13325 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13326 	ut_params->auth_xform.auth.key.data = auth_key;
13327 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
13328 	ut_params->auth_xform.next = NULL;
13329 
13330 	/* Create Crypto session*/
13331 	ut_params->sess = rte_cryptodev_sym_session_create(
13332 			ts_params->session_mpool);
13333 
13334 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13335 				ut_params->sess,
13336 				&ut_params->cipher_xform,
13337 				ts_params->session_priv_mpool);
13338 
13339 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13340 
13341 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13342 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13343 			"Failed to allocate input buffer in mempool");
13344 
13345 	/* clear mbuf payload */
13346 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13347 			rte_pktmbuf_tailroom(ut_params->ibuf));
13348 
13349 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13350 			reference->plaintext.len);
13351 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13352 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13353 
13354 	/* Create operation */
13355 	retval = create_cipher_auth_operation(ts_params,
13356 			ut_params,
13357 			reference, 0);
13358 
13359 	if (retval < 0)
13360 		return retval;
13361 
13362 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13363 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13364 			ut_params->op);
13365 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13366 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13367 				ut_params->op, 1, 1, 0, 0);
13368 	else
13369 		ut_params->op = process_crypto_request(
13370 			ts_params->valid_devs[0], ut_params->op);
13371 
13372 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
13373 
13374 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13375 			"crypto op processing failed");
13376 
13377 	plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
13378 
13379 	authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
13380 			ut_params->op->sym->auth.data.offset);
13381 	auth_tag = authciphertext + plaintext_pad_len;
13382 	debug_hexdump(stdout, "ciphertext:", authciphertext,
13383 			reference->ciphertext.len);
13384 	debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
13385 
13386 	/* Validate obuf */
13387 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13388 			authciphertext,
13389 			reference->ciphertext.data,
13390 			reference->ciphertext.len,
13391 			"Ciphertext data not as expected");
13392 
13393 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13394 			auth_tag,
13395 			reference->digest.data,
13396 			reference->digest.len,
13397 			"Generated digest not as expected");
13398 
13399 	return TEST_SUCCESS;
13400 
13401 }
13402 
13403 static int
13404 test_authenticated_decrypt_with_esn(
13405 		struct crypto_testsuite_params *ts_params,
13406 		struct crypto_unittest_params *ut_params,
13407 		const struct test_crypto_vector *reference)
13408 {
13409 	int retval;
13410 
13411 	uint8_t *ciphertext;
13412 	uint8_t cipher_key[reference->cipher_key.len + 1];
13413 	uint8_t auth_key[reference->auth_key.len + 1];
13414 	struct rte_cryptodev_info dev_info;
13415 
13416 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13417 	uint64_t feat_flags = dev_info.feature_flags;
13418 
13419 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13420 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13421 		printf("Device doesn't support RAW data-path APIs.\n");
13422 		return TEST_SKIPPED;
13423 	}
13424 
13425 	/* Verify the capabilities */
13426 	struct rte_cryptodev_sym_capability_idx cap_idx;
13427 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13428 	cap_idx.algo.auth = reference->auth_algo;
13429 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13430 			&cap_idx) == NULL)
13431 		return TEST_SKIPPED;
13432 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13433 	cap_idx.algo.cipher = reference->crypto_algo;
13434 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13435 			&cap_idx) == NULL)
13436 		return TEST_SKIPPED;
13437 
13438 	/* Create session */
13439 	memcpy(cipher_key, reference->cipher_key.data,
13440 			reference->cipher_key.len);
13441 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13442 
13443 	/* Setup Authentication Parameters */
13444 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13445 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
13446 	ut_params->auth_xform.auth.algo = reference->auth_algo;
13447 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13448 	ut_params->auth_xform.auth.key.data = auth_key;
13449 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
13450 	ut_params->auth_xform.next = &ut_params->cipher_xform;
13451 
13452 	/* Setup Cipher Parameters */
13453 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13454 	ut_params->cipher_xform.next = NULL;
13455 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13456 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
13457 	ut_params->cipher_xform.cipher.key.data = cipher_key;
13458 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13459 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13460 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13461 
13462 	/* Create Crypto session*/
13463 	ut_params->sess = rte_cryptodev_sym_session_create(
13464 			ts_params->session_mpool);
13465 
13466 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13467 				ut_params->sess,
13468 				&ut_params->auth_xform,
13469 				ts_params->session_priv_mpool);
13470 
13471 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13472 
13473 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13474 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13475 			"Failed to allocate input buffer in mempool");
13476 
13477 	/* clear mbuf payload */
13478 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13479 			rte_pktmbuf_tailroom(ut_params->ibuf));
13480 
13481 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13482 			reference->ciphertext.len);
13483 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13484 	memcpy(ciphertext, reference->ciphertext.data,
13485 			reference->ciphertext.len);
13486 
13487 	/* Create operation */
13488 	retval = create_cipher_auth_verify_operation(ts_params,
13489 			ut_params,
13490 			reference);
13491 
13492 	if (retval < 0)
13493 		return retval;
13494 
13495 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13496 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13497 			ut_params->op);
13498 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13499 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13500 				ut_params->op, 1, 1, 0, 0);
13501 	else
13502 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13503 			ut_params->op);
13504 
13505 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
13506 	TEST_ASSERT_EQUAL(ut_params->op->status,
13507 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13508 			"crypto op processing passed");
13509 
13510 	ut_params->obuf = ut_params->op->sym->m_src;
13511 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
13512 
13513 	return 0;
13514 }
13515 
13516 static int
13517 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
13518 		const struct aead_test_data *tdata,
13519 		void *digest_mem, uint64_t digest_phys)
13520 {
13521 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13522 	struct crypto_unittest_params *ut_params = &unittest_params;
13523 
13524 	const unsigned int auth_tag_len = tdata->auth_tag.len;
13525 	const unsigned int iv_len = tdata->iv.len;
13526 	unsigned int aad_len = tdata->aad.len;
13527 	unsigned int aad_len_pad = 0;
13528 
13529 	/* Generate Crypto op data structure */
13530 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13531 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13532 	TEST_ASSERT_NOT_NULL(ut_params->op,
13533 		"Failed to allocate symmetric crypto operation struct");
13534 
13535 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13536 
13537 	sym_op->aead.digest.data = digest_mem;
13538 
13539 	TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
13540 			"no room to append digest");
13541 
13542 	sym_op->aead.digest.phys_addr = digest_phys;
13543 
13544 	if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
13545 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
13546 				auth_tag_len);
13547 		debug_hexdump(stdout, "digest:",
13548 				sym_op->aead.digest.data,
13549 				auth_tag_len);
13550 	}
13551 
13552 	/* Append aad data */
13553 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
13554 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13555 				uint8_t *, IV_OFFSET);
13556 
13557 		/* Copy IV 1 byte after the IV pointer, according to the API */
13558 		rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
13559 
13560 		aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
13561 
13562 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13563 				ut_params->ibuf, aad_len);
13564 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13565 				"no room to prepend aad");
13566 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13567 				ut_params->ibuf);
13568 
13569 		memset(sym_op->aead.aad.data, 0, aad_len);
13570 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
13571 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13572 
13573 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13574 		debug_hexdump(stdout, "aad:",
13575 				sym_op->aead.aad.data, aad_len);
13576 	} else {
13577 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13578 				uint8_t *, IV_OFFSET);
13579 
13580 		rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
13581 
13582 		aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
13583 
13584 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13585 				ut_params->ibuf, aad_len_pad);
13586 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13587 				"no room to prepend aad");
13588 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13589 				ut_params->ibuf);
13590 
13591 		memset(sym_op->aead.aad.data, 0, aad_len);
13592 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13593 
13594 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13595 		debug_hexdump(stdout, "aad:",
13596 				sym_op->aead.aad.data, aad_len);
13597 	}
13598 
13599 	sym_op->aead.data.length = tdata->plaintext.len;
13600 	sym_op->aead.data.offset = aad_len_pad;
13601 
13602 	return 0;
13603 }
13604 
13605 #define SGL_MAX_NO	16
13606 
13607 static int
13608 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
13609 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
13610 {
13611 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13612 	struct crypto_unittest_params *ut_params = &unittest_params;
13613 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
13614 	int retval;
13615 	int to_trn = 0;
13616 	int to_trn_tbl[SGL_MAX_NO];
13617 	int segs = 1;
13618 	unsigned int trn_data = 0;
13619 	uint8_t *plaintext, *ciphertext, *auth_tag;
13620 	struct rte_cryptodev_info dev_info;
13621 
13622 	/* Verify the capabilities */
13623 	struct rte_cryptodev_sym_capability_idx cap_idx;
13624 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
13625 	cap_idx.algo.aead = tdata->algo;
13626 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13627 			&cap_idx) == NULL)
13628 		return TEST_SKIPPED;
13629 
13630 	/* OOP not supported with CPU crypto */
13631 	if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13632 		return TEST_SKIPPED;
13633 
13634 	/* Detailed check for the particular SGL support flag */
13635 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13636 	if (!oop) {
13637 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
13638 		if (sgl_in && (!(dev_info.feature_flags &
13639 				RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
13640 			return TEST_SKIPPED;
13641 
13642 		uint64_t feat_flags = dev_info.feature_flags;
13643 
13644 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13645 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13646 			printf("Device doesn't support RAW data-path APIs.\n");
13647 			return TEST_SKIPPED;
13648 		}
13649 	} else {
13650 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
13651 		unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
13652 				tdata->plaintext.len;
13653 		/* Raw data path API does not support OOP */
13654 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13655 			return TEST_SKIPPED;
13656 		if (sgl_in && !sgl_out) {
13657 			if (!(dev_info.feature_flags &
13658 					RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
13659 				return TEST_SKIPPED;
13660 		} else if (!sgl_in && sgl_out) {
13661 			if (!(dev_info.feature_flags &
13662 					RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
13663 				return TEST_SKIPPED;
13664 		} else if (sgl_in && sgl_out) {
13665 			if (!(dev_info.feature_flags &
13666 					RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
13667 				return TEST_SKIPPED;
13668 		}
13669 	}
13670 
13671 	if (fragsz > tdata->plaintext.len)
13672 		fragsz = tdata->plaintext.len;
13673 
13674 	uint16_t plaintext_len = fragsz;
13675 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
13676 
13677 	if (fragsz_oop > tdata->plaintext.len)
13678 		frag_size_oop = tdata->plaintext.len;
13679 
13680 	int ecx = 0;
13681 	void *digest_mem = NULL;
13682 
13683 	uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
13684 
13685 	if (tdata->plaintext.len % fragsz != 0) {
13686 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
13687 			return 1;
13688 	}	else {
13689 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
13690 			return 1;
13691 	}
13692 
13693 	/*
13694 	 * For out-op-place we need to alloc another mbuf
13695 	 */
13696 	if (oop) {
13697 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13698 		rte_pktmbuf_append(ut_params->obuf,
13699 				frag_size_oop + prepend_len);
13700 		buf_oop = ut_params->obuf;
13701 	}
13702 
13703 	/* Create AEAD session */
13704 	retval = create_aead_session(ts_params->valid_devs[0],
13705 			tdata->algo,
13706 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
13707 			tdata->key.data, tdata->key.len,
13708 			tdata->aad.len, tdata->auth_tag.len,
13709 			tdata->iv.len);
13710 	if (retval < 0)
13711 		return retval;
13712 
13713 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13714 
13715 	/* clear mbuf payload */
13716 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13717 			rte_pktmbuf_tailroom(ut_params->ibuf));
13718 
13719 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13720 			plaintext_len);
13721 
13722 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13723 
13724 	trn_data += plaintext_len;
13725 
13726 	buf = ut_params->ibuf;
13727 
13728 	/*
13729 	 * Loop until no more fragments
13730 	 */
13731 
13732 	while (trn_data < tdata->plaintext.len) {
13733 		++segs;
13734 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13735 				(tdata->plaintext.len - trn_data) : fragsz;
13736 
13737 		to_trn_tbl[ecx++] = to_trn;
13738 
13739 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13740 		buf = buf->next;
13741 
13742 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13743 				rte_pktmbuf_tailroom(buf));
13744 
13745 		/* OOP */
13746 		if (oop && !fragsz_oop) {
13747 			buf_last_oop = buf_oop->next =
13748 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
13749 			buf_oop = buf_oop->next;
13750 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13751 					0, rte_pktmbuf_tailroom(buf_oop));
13752 			rte_pktmbuf_append(buf_oop, to_trn);
13753 		}
13754 
13755 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
13756 				to_trn);
13757 
13758 		memcpy(plaintext, tdata->plaintext.data + trn_data,
13759 				to_trn);
13760 		trn_data += to_trn;
13761 		if (trn_data  == tdata->plaintext.len) {
13762 			if (oop) {
13763 				if (!fragsz_oop)
13764 					digest_mem = rte_pktmbuf_append(buf_oop,
13765 						tdata->auth_tag.len);
13766 			} else
13767 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
13768 					tdata->auth_tag.len);
13769 		}
13770 	}
13771 
13772 	uint64_t digest_phys = 0;
13773 
13774 	ut_params->ibuf->nb_segs = segs;
13775 
13776 	segs = 1;
13777 	if (fragsz_oop && oop) {
13778 		to_trn = 0;
13779 		ecx = 0;
13780 
13781 		if (frag_size_oop == tdata->plaintext.len) {
13782 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
13783 				tdata->auth_tag.len);
13784 
13785 			digest_phys = rte_pktmbuf_iova_offset(
13786 					ut_params->obuf,
13787 					tdata->plaintext.len + prepend_len);
13788 		}
13789 
13790 		trn_data = frag_size_oop;
13791 		while (trn_data < tdata->plaintext.len) {
13792 			++segs;
13793 			to_trn =
13794 				(tdata->plaintext.len - trn_data <
13795 						frag_size_oop) ?
13796 				(tdata->plaintext.len - trn_data) :
13797 						frag_size_oop;
13798 
13799 			to_trn_tbl[ecx++] = to_trn;
13800 
13801 			buf_last_oop = buf_oop->next =
13802 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
13803 			buf_oop = buf_oop->next;
13804 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13805 					0, rte_pktmbuf_tailroom(buf_oop));
13806 			rte_pktmbuf_append(buf_oop, to_trn);
13807 
13808 			trn_data += to_trn;
13809 
13810 			if (trn_data  == tdata->plaintext.len) {
13811 				digest_mem = rte_pktmbuf_append(buf_oop,
13812 					tdata->auth_tag.len);
13813 			}
13814 		}
13815 
13816 		ut_params->obuf->nb_segs = segs;
13817 	}
13818 
13819 	/*
13820 	 * Place digest at the end of the last buffer
13821 	 */
13822 	if (!digest_phys)
13823 		digest_phys = rte_pktmbuf_iova(buf) + to_trn;
13824 	if (oop && buf_last_oop)
13825 		digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
13826 
13827 	if (!digest_mem && !oop) {
13828 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13829 				+ tdata->auth_tag.len);
13830 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
13831 				tdata->plaintext.len);
13832 	}
13833 
13834 	/* Create AEAD operation */
13835 	retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
13836 			tdata, digest_mem, digest_phys);
13837 
13838 	if (retval < 0)
13839 		return retval;
13840 
13841 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13842 
13843 	ut_params->op->sym->m_src = ut_params->ibuf;
13844 	if (oop)
13845 		ut_params->op->sym->m_dst = ut_params->obuf;
13846 
13847 	/* Process crypto operation */
13848 	if (oop == IN_PLACE &&
13849 			gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13850 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
13851 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13852 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13853 				ut_params->op, 0, 0, 0, 0);
13854 	else
13855 		TEST_ASSERT_NOT_NULL(
13856 			process_crypto_request(ts_params->valid_devs[0],
13857 			ut_params->op), "failed to process sym crypto op");
13858 
13859 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13860 			"crypto op processing failed");
13861 
13862 
13863 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
13864 			uint8_t *, prepend_len);
13865 	if (oop) {
13866 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
13867 				uint8_t *, prepend_len);
13868 	}
13869 
13870 	if (fragsz_oop)
13871 		fragsz = fragsz_oop;
13872 
13873 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13874 			ciphertext,
13875 			tdata->ciphertext.data,
13876 			fragsz,
13877 			"Ciphertext data not as expected");
13878 
13879 	buf = ut_params->op->sym->m_src->next;
13880 	if (oop)
13881 		buf = ut_params->op->sym->m_dst->next;
13882 
13883 	unsigned int off = fragsz;
13884 
13885 	ecx = 0;
13886 	while (buf) {
13887 		ciphertext = rte_pktmbuf_mtod(buf,
13888 				uint8_t *);
13889 
13890 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
13891 				ciphertext,
13892 				tdata->ciphertext.data + off,
13893 				to_trn_tbl[ecx],
13894 				"Ciphertext data not as expected");
13895 
13896 		off += to_trn_tbl[ecx++];
13897 		buf = buf->next;
13898 	}
13899 
13900 	auth_tag = digest_mem;
13901 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13902 			auth_tag,
13903 			tdata->auth_tag.data,
13904 			tdata->auth_tag.len,
13905 			"Generated auth tag not as expected");
13906 
13907 	return 0;
13908 }
13909 
13910 static int
13911 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
13912 {
13913 	return test_authenticated_encryption_SGL(
13914 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
13915 }
13916 
13917 static int
13918 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
13919 {
13920 	return test_authenticated_encryption_SGL(
13921 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
13922 }
13923 
13924 static int
13925 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
13926 {
13927 	return test_authenticated_encryption_SGL(
13928 			&gcm_test_case_8, OUT_OF_PLACE, 400,
13929 			gcm_test_case_8.plaintext.len);
13930 }
13931 
13932 static int
13933 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
13934 {
13935 	/* This test is not for OPENSSL PMD */
13936 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
13937 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
13938 		return TEST_SKIPPED;
13939 
13940 	return test_authenticated_encryption_SGL(
13941 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
13942 }
13943 
13944 static int
13945 test_authentication_verify_fail_when_data_corrupted(
13946 		struct crypto_testsuite_params *ts_params,
13947 		struct crypto_unittest_params *ut_params,
13948 		const struct test_crypto_vector *reference)
13949 {
13950 	return test_authentication_verify_fail_when_data_corruption(
13951 			ts_params, ut_params, reference, 1);
13952 }
13953 
13954 static int
13955 test_authentication_verify_fail_when_tag_corrupted(
13956 		struct crypto_testsuite_params *ts_params,
13957 		struct crypto_unittest_params *ut_params,
13958 		const struct test_crypto_vector *reference)
13959 {
13960 	return test_authentication_verify_fail_when_data_corruption(
13961 			ts_params, ut_params, reference, 0);
13962 }
13963 
13964 static int
13965 test_authentication_verify_GMAC_fail_when_data_corrupted(
13966 		struct crypto_testsuite_params *ts_params,
13967 		struct crypto_unittest_params *ut_params,
13968 		const struct test_crypto_vector *reference)
13969 {
13970 	return test_authentication_verify_GMAC_fail_when_corruption(
13971 			ts_params, ut_params, reference, 1);
13972 }
13973 
13974 static int
13975 test_authentication_verify_GMAC_fail_when_tag_corrupted(
13976 		struct crypto_testsuite_params *ts_params,
13977 		struct crypto_unittest_params *ut_params,
13978 		const struct test_crypto_vector *reference)
13979 {
13980 	return test_authentication_verify_GMAC_fail_when_corruption(
13981 			ts_params, ut_params, reference, 0);
13982 }
13983 
13984 static int
13985 test_authenticated_decryption_fail_when_data_corrupted(
13986 		struct crypto_testsuite_params *ts_params,
13987 		struct crypto_unittest_params *ut_params,
13988 		const struct test_crypto_vector *reference)
13989 {
13990 	return test_authenticated_decryption_fail_when_corruption(
13991 			ts_params, ut_params, reference, 1);
13992 }
13993 
13994 static int
13995 test_authenticated_decryption_fail_when_tag_corrupted(
13996 		struct crypto_testsuite_params *ts_params,
13997 		struct crypto_unittest_params *ut_params,
13998 		const struct test_crypto_vector *reference)
13999 {
14000 	return test_authenticated_decryption_fail_when_corruption(
14001 			ts_params, ut_params, reference, 0);
14002 }
14003 
14004 static int
14005 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
14006 {
14007 	return test_authentication_verify_fail_when_data_corrupted(
14008 			&testsuite_params, &unittest_params,
14009 			&hmac_sha1_test_crypto_vector);
14010 }
14011 
14012 static int
14013 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
14014 {
14015 	return test_authentication_verify_fail_when_tag_corrupted(
14016 			&testsuite_params, &unittest_params,
14017 			&hmac_sha1_test_crypto_vector);
14018 }
14019 
14020 static int
14021 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
14022 {
14023 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
14024 			&testsuite_params, &unittest_params,
14025 			&aes128_gmac_test_vector);
14026 }
14027 
14028 static int
14029 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
14030 {
14031 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
14032 			&testsuite_params, &unittest_params,
14033 			&aes128_gmac_test_vector);
14034 }
14035 
14036 static int
14037 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
14038 {
14039 	return test_authenticated_decryption_fail_when_data_corrupted(
14040 			&testsuite_params,
14041 			&unittest_params,
14042 			&aes128cbc_hmac_sha1_test_vector);
14043 }
14044 
14045 static int
14046 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
14047 {
14048 	return test_authenticated_decryption_fail_when_tag_corrupted(
14049 			&testsuite_params,
14050 			&unittest_params,
14051 			&aes128cbc_hmac_sha1_test_vector);
14052 }
14053 
14054 static int
14055 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14056 {
14057 	return test_authenticated_encrypt_with_esn(
14058 			&testsuite_params,
14059 			&unittest_params,
14060 			&aes128cbc_hmac_sha1_aad_test_vector);
14061 }
14062 
14063 static int
14064 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14065 {
14066 	return test_authenticated_decrypt_with_esn(
14067 			&testsuite_params,
14068 			&unittest_params,
14069 			&aes128cbc_hmac_sha1_aad_test_vector);
14070 }
14071 
14072 static int
14073 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
14074 {
14075 	return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
14076 }
14077 
14078 static int
14079 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
14080 {
14081 	return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
14082 }
14083 
14084 #ifdef RTE_CRYPTO_SCHEDULER
14085 
14086 /* global AESNI worker IDs for the scheduler test */
14087 uint8_t aesni_ids[2];
14088 
14089 static int
14090 scheduler_testsuite_setup(void)
14091 {
14092 	uint32_t i = 0;
14093 	int32_t nb_devs, ret;
14094 	char vdev_args[VDEV_ARGS_SIZE] = {""};
14095 	char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
14096 		"ordering=enable,name=cryptodev_test_scheduler,corelist="};
14097 	uint16_t worker_core_count = 0;
14098 	uint16_t socket_id = 0;
14099 
14100 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
14101 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
14102 
14103 		/* Identify the Worker Cores
14104 		 * Use 2 worker cores for the device args
14105 		 */
14106 		RTE_LCORE_FOREACH_WORKER(i) {
14107 			if (worker_core_count > 1)
14108 				break;
14109 			snprintf(vdev_args, sizeof(vdev_args),
14110 					"%s%d", temp_str, i);
14111 			strcpy(temp_str, vdev_args);
14112 			strlcat(temp_str, ";", sizeof(temp_str));
14113 			worker_core_count++;
14114 			socket_id = rte_lcore_to_socket_id(i);
14115 		}
14116 		if (worker_core_count != 2) {
14117 			RTE_LOG(ERR, USER1,
14118 				"Cryptodev scheduler test require at least "
14119 				"two worker cores to run. "
14120 				"Please use the correct coremask.\n");
14121 			return TEST_FAILED;
14122 		}
14123 		strcpy(temp_str, vdev_args);
14124 		snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
14125 				temp_str, socket_id);
14126 		RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
14127 		nb_devs = rte_cryptodev_device_count_by_driver(
14128 				rte_cryptodev_driver_id_get(
14129 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
14130 		if (nb_devs < 1) {
14131 			ret = rte_vdev_init(
14132 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
14133 					vdev_args);
14134 			TEST_ASSERT(ret == 0,
14135 				"Failed to create instance %u of pmd : %s",
14136 				i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14137 		}
14138 	}
14139 	return testsuite_setup();
14140 }
14141 
14142 static int
14143 test_scheduler_attach_worker_op(void)
14144 {
14145 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14146 	uint8_t sched_id = ts_params->valid_devs[0];
14147 	uint32_t i, nb_devs_attached = 0;
14148 	int ret;
14149 	char vdev_name[32];
14150 	unsigned int count = rte_cryptodev_count();
14151 
14152 	/* create 2 AESNI_MB vdevs on top of existing devices */
14153 	for (i = count; i < count + 2; i++) {
14154 		snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
14155 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
14156 				i);
14157 		ret = rte_vdev_init(vdev_name, NULL);
14158 
14159 		TEST_ASSERT(ret == 0,
14160 			"Failed to create instance %u of"
14161 			" pmd : %s",
14162 			i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14163 
14164 		if (ret < 0) {
14165 			RTE_LOG(ERR, USER1,
14166 				"Failed to create 2 AESNI MB PMDs.\n");
14167 			return TEST_SKIPPED;
14168 		}
14169 	}
14170 
14171 	/* attach 2 AESNI_MB cdevs */
14172 	for (i = count; i < count + 2; i++) {
14173 		struct rte_cryptodev_info info;
14174 		unsigned int session_size;
14175 
14176 		rte_cryptodev_info_get(i, &info);
14177 		if (info.driver_id != rte_cryptodev_driver_id_get(
14178 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
14179 			continue;
14180 
14181 		session_size = rte_cryptodev_sym_get_private_session_size(i);
14182 		/*
14183 		 * Create the session mempool again, since now there are new devices
14184 		 * to use the mempool.
14185 		 */
14186 		if (ts_params->session_mpool) {
14187 			rte_mempool_free(ts_params->session_mpool);
14188 			ts_params->session_mpool = NULL;
14189 		}
14190 		if (ts_params->session_priv_mpool) {
14191 			rte_mempool_free(ts_params->session_priv_mpool);
14192 			ts_params->session_priv_mpool = NULL;
14193 		}
14194 
14195 		if (info.sym.max_nb_sessions != 0 &&
14196 				info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
14197 			RTE_LOG(ERR, USER1,
14198 					"Device does not support "
14199 					"at least %u sessions\n",
14200 					MAX_NB_SESSIONS);
14201 			return TEST_FAILED;
14202 		}
14203 		/*
14204 		 * Create mempool with maximum number of sessions,
14205 		 * to include the session headers
14206 		 */
14207 		if (ts_params->session_mpool == NULL) {
14208 			ts_params->session_mpool =
14209 				rte_cryptodev_sym_session_pool_create(
14210 						"test_sess_mp",
14211 						MAX_NB_SESSIONS, 0, 0, 0,
14212 						SOCKET_ID_ANY);
14213 			TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
14214 					"session mempool allocation failed");
14215 		}
14216 
14217 		/*
14218 		 * Create mempool with maximum number of sessions,
14219 		 * to include device specific session private data
14220 		 */
14221 		if (ts_params->session_priv_mpool == NULL) {
14222 			ts_params->session_priv_mpool = rte_mempool_create(
14223 					"test_sess_mp_priv",
14224 					MAX_NB_SESSIONS,
14225 					session_size,
14226 					0, 0, NULL, NULL, NULL,
14227 					NULL, SOCKET_ID_ANY,
14228 					0);
14229 
14230 			TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
14231 					"session mempool allocation failed");
14232 		}
14233 
14234 		ts_params->qp_conf.mp_session = ts_params->session_mpool;
14235 		ts_params->qp_conf.mp_session_private =
14236 				ts_params->session_priv_mpool;
14237 
14238 		ret = rte_cryptodev_scheduler_worker_attach(sched_id,
14239 				(uint8_t)i);
14240 
14241 		TEST_ASSERT(ret == 0,
14242 			"Failed to attach device %u of pmd : %s", i,
14243 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14244 
14245 		aesni_ids[nb_devs_attached] = (uint8_t)i;
14246 
14247 		nb_devs_attached++;
14248 	}
14249 
14250 	return 0;
14251 }
14252 
14253 static int
14254 test_scheduler_detach_worker_op(void)
14255 {
14256 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14257 	uint8_t sched_id = ts_params->valid_devs[0];
14258 	uint32_t i;
14259 	int ret;
14260 
14261 	for (i = 0; i < 2; i++) {
14262 		ret = rte_cryptodev_scheduler_worker_detach(sched_id,
14263 				aesni_ids[i]);
14264 		TEST_ASSERT(ret == 0,
14265 			"Failed to detach device %u", aesni_ids[i]);
14266 	}
14267 
14268 	return 0;
14269 }
14270 
14271 static int
14272 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
14273 {
14274 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14275 	uint8_t sched_id = ts_params->valid_devs[0];
14276 	/* set mode */
14277 	return rte_cryptodev_scheduler_mode_set(sched_id,
14278 		scheduler_mode);
14279 }
14280 
14281 static int
14282 test_scheduler_mode_roundrobin_op(void)
14283 {
14284 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
14285 			0, "Failed to set roundrobin mode");
14286 	return 0;
14287 
14288 }
14289 
14290 static int
14291 test_scheduler_mode_multicore_op(void)
14292 {
14293 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
14294 			0, "Failed to set multicore mode");
14295 
14296 	return 0;
14297 }
14298 
14299 static int
14300 test_scheduler_mode_failover_op(void)
14301 {
14302 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
14303 			0, "Failed to set failover mode");
14304 
14305 	return 0;
14306 }
14307 
14308 static int
14309 test_scheduler_mode_pkt_size_distr_op(void)
14310 {
14311 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
14312 			0, "Failed to set pktsize mode");
14313 
14314 	return 0;
14315 }
14316 
14317 static int
14318 scheduler_multicore_testsuite_setup(void)
14319 {
14320 	if (test_scheduler_attach_worker_op() < 0)
14321 		return TEST_SKIPPED;
14322 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
14323 		return TEST_SKIPPED;
14324 	return 0;
14325 }
14326 
14327 static int
14328 scheduler_roundrobin_testsuite_setup(void)
14329 {
14330 	if (test_scheduler_attach_worker_op() < 0)
14331 		return TEST_SKIPPED;
14332 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
14333 		return TEST_SKIPPED;
14334 	return 0;
14335 }
14336 
14337 static int
14338 scheduler_failover_testsuite_setup(void)
14339 {
14340 	if (test_scheduler_attach_worker_op() < 0)
14341 		return TEST_SKIPPED;
14342 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
14343 		return TEST_SKIPPED;
14344 	return 0;
14345 }
14346 
14347 static int
14348 scheduler_pkt_size_distr_testsuite_setup(void)
14349 {
14350 	if (test_scheduler_attach_worker_op() < 0)
14351 		return TEST_SKIPPED;
14352 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
14353 		return TEST_SKIPPED;
14354 	return 0;
14355 }
14356 
14357 static void
14358 scheduler_mode_testsuite_teardown(void)
14359 {
14360 	test_scheduler_detach_worker_op();
14361 }
14362 
14363 #endif /* RTE_CRYPTO_SCHEDULER */
14364 
14365 static struct unit_test_suite end_testsuite = {
14366 	.suite_name = NULL,
14367 	.setup = NULL,
14368 	.teardown = NULL,
14369 	.unit_test_suites = NULL
14370 };
14371 
14372 #ifdef RTE_LIB_SECURITY
14373 static struct unit_test_suite ipsec_proto_testsuite  = {
14374 	.suite_name = "IPsec Proto Unit Test Suite",
14375 	.setup = ipsec_proto_testsuite_setup,
14376 	.unit_test_cases = {
14377 		TEST_CASE_NAMED_WITH_DATA(
14378 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14379 			ut_setup_security, ut_teardown,
14380 			test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
14381 		TEST_CASE_NAMED_WITH_DATA(
14382 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14383 			ut_setup_security, ut_teardown,
14384 			test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
14385 		TEST_CASE_NAMED_WITH_DATA(
14386 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14387 			ut_setup_security, ut_teardown,
14388 			test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
14389 		TEST_CASE_NAMED_WITH_DATA(
14390 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14391 			ut_setup_security, ut_teardown,
14392 			test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
14393 		TEST_CASE_NAMED_WITH_DATA(
14394 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14395 			ut_setup_security, ut_teardown,
14396 			test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
14397 		TEST_CASE_NAMED_WITH_DATA(
14398 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14399 			ut_setup_security, ut_teardown,
14400 			test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
14401 		TEST_CASE_NAMED_ST(
14402 			"Combined test alg list",
14403 			ut_setup_security, ut_teardown,
14404 			test_ipsec_proto_display_list),
14405 		TEST_CASE_NAMED_ST(
14406 			"IV generation",
14407 			ut_setup_security, ut_teardown,
14408 			test_ipsec_proto_iv_gen),
14409 		TEST_CASE_NAMED_ST(
14410 			"UDP encapsulation",
14411 			ut_setup_security, ut_teardown,
14412 			test_ipsec_proto_udp_encap),
14413 		TEST_CASE_NAMED_ST(
14414 			"UDP encapsulation ports verification test",
14415 			ut_setup_security, ut_teardown,
14416 			test_ipsec_proto_udp_ports_verify),
14417 		TEST_CASE_NAMED_ST(
14418 			"SA expiry packets soft",
14419 			ut_setup_security, ut_teardown,
14420 			test_ipsec_proto_sa_exp_pkts_soft),
14421 		TEST_CASE_NAMED_ST(
14422 			"SA expiry packets hard",
14423 			ut_setup_security, ut_teardown,
14424 			test_ipsec_proto_sa_exp_pkts_hard),
14425 		TEST_CASE_NAMED_ST(
14426 			"Negative test: ICV corruption",
14427 			ut_setup_security, ut_teardown,
14428 			test_ipsec_proto_err_icv_corrupt),
14429 		TEST_CASE_NAMED_ST(
14430 			"Tunnel dst addr verification",
14431 			ut_setup_security, ut_teardown,
14432 			test_ipsec_proto_tunnel_dst_addr_verify),
14433 		TEST_CASE_NAMED_ST(
14434 			"Tunnel src and dst addr verification",
14435 			ut_setup_security, ut_teardown,
14436 			test_ipsec_proto_tunnel_src_dst_addr_verify),
14437 		TEST_CASE_NAMED_ST(
14438 			"Inner IP checksum",
14439 			ut_setup_security, ut_teardown,
14440 			test_ipsec_proto_inner_ip_csum),
14441 		TEST_CASE_NAMED_ST(
14442 			"Inner L4 checksum",
14443 			ut_setup_security, ut_teardown,
14444 			test_ipsec_proto_inner_l4_csum),
14445 		TEST_CASES_END() /**< NULL terminate unit test array */
14446 	}
14447 };
14448 
14449 static struct unit_test_suite pdcp_proto_testsuite  = {
14450 	.suite_name = "PDCP Proto Unit Test Suite",
14451 	.setup = pdcp_proto_testsuite_setup,
14452 	.unit_test_cases = {
14453 		TEST_CASE_ST(ut_setup_security, ut_teardown,
14454 			test_PDCP_PROTO_all),
14455 		TEST_CASES_END() /**< NULL terminate unit test array */
14456 	}
14457 };
14458 
14459 static struct unit_test_suite docsis_proto_testsuite  = {
14460 	.suite_name = "Docsis Proto Unit Test Suite",
14461 	.setup = docsis_proto_testsuite_setup,
14462 	.unit_test_cases = {
14463 		TEST_CASE_ST(ut_setup_security, ut_teardown,
14464 			test_DOCSIS_PROTO_all),
14465 		TEST_CASES_END() /**< NULL terminate unit test array */
14466 	}
14467 };
14468 #endif
14469 
14470 static struct unit_test_suite cryptodev_gen_testsuite  = {
14471 	.suite_name = "Crypto General Unit Test Suite",
14472 	.setup = crypto_gen_testsuite_setup,
14473 	.unit_test_cases = {
14474 		TEST_CASE_ST(ut_setup, ut_teardown,
14475 				test_device_configure_invalid_dev_id),
14476 		TEST_CASE_ST(ut_setup, ut_teardown,
14477 				test_queue_pair_descriptor_setup),
14478 		TEST_CASE_ST(ut_setup, ut_teardown,
14479 				test_device_configure_invalid_queue_pair_ids),
14480 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
14481 		TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
14482 		TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
14483 		TEST_CASES_END() /**< NULL terminate unit test array */
14484 	}
14485 };
14486 
14487 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
14488 	.suite_name = "Negative HMAC SHA1 Unit Test Suite",
14489 	.setup = negative_hmac_sha1_testsuite_setup,
14490 	.unit_test_cases = {
14491 		/** Negative tests */
14492 		TEST_CASE_ST(ut_setup, ut_teardown,
14493 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
14494 		TEST_CASE_ST(ut_setup, ut_teardown,
14495 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14496 		TEST_CASE_ST(ut_setup, ut_teardown,
14497 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14498 		TEST_CASE_ST(ut_setup, ut_teardown,
14499 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14500 
14501 		TEST_CASES_END() /**< NULL terminate unit test array */
14502 	}
14503 };
14504 
14505 static struct unit_test_suite cryptodev_multi_session_testsuite = {
14506 	.suite_name = "Multi Session Unit Test Suite",
14507 	.setup = multi_session_testsuite_setup,
14508 	.unit_test_cases = {
14509 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
14510 		TEST_CASE_ST(ut_setup, ut_teardown,
14511 				test_multi_session_random_usage),
14512 
14513 		TEST_CASES_END() /**< NULL terminate unit test array */
14514 	}
14515 };
14516 
14517 static struct unit_test_suite cryptodev_null_testsuite  = {
14518 	.suite_name = "NULL Test Suite",
14519 	.setup = null_testsuite_setup,
14520 	.unit_test_cases = {
14521 		TEST_CASE_ST(ut_setup, ut_teardown,
14522 			test_null_invalid_operation),
14523 		TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
14524 		TEST_CASES_END()
14525 	}
14526 };
14527 
14528 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
14529 	.suite_name = "AES CCM Authenticated Test Suite",
14530 	.setup = aes_ccm_auth_testsuite_setup,
14531 	.unit_test_cases = {
14532 		/** AES CCM Authenticated Encryption 128 bits key*/
14533 		TEST_CASE_ST(ut_setup, ut_teardown,
14534 			test_AES_CCM_authenticated_encryption_test_case_128_1),
14535 		TEST_CASE_ST(ut_setup, ut_teardown,
14536 			test_AES_CCM_authenticated_encryption_test_case_128_2),
14537 		TEST_CASE_ST(ut_setup, ut_teardown,
14538 			test_AES_CCM_authenticated_encryption_test_case_128_3),
14539 
14540 		/** AES CCM Authenticated Decryption 128 bits key*/
14541 		TEST_CASE_ST(ut_setup, ut_teardown,
14542 			test_AES_CCM_authenticated_decryption_test_case_128_1),
14543 		TEST_CASE_ST(ut_setup, ut_teardown,
14544 			test_AES_CCM_authenticated_decryption_test_case_128_2),
14545 		TEST_CASE_ST(ut_setup, ut_teardown,
14546 			test_AES_CCM_authenticated_decryption_test_case_128_3),
14547 
14548 		/** AES CCM Authenticated Encryption 192 bits key */
14549 		TEST_CASE_ST(ut_setup, ut_teardown,
14550 			test_AES_CCM_authenticated_encryption_test_case_192_1),
14551 		TEST_CASE_ST(ut_setup, ut_teardown,
14552 			test_AES_CCM_authenticated_encryption_test_case_192_2),
14553 		TEST_CASE_ST(ut_setup, ut_teardown,
14554 			test_AES_CCM_authenticated_encryption_test_case_192_3),
14555 
14556 		/** AES CCM Authenticated Decryption 192 bits key*/
14557 		TEST_CASE_ST(ut_setup, ut_teardown,
14558 			test_AES_CCM_authenticated_decryption_test_case_192_1),
14559 		TEST_CASE_ST(ut_setup, ut_teardown,
14560 			test_AES_CCM_authenticated_decryption_test_case_192_2),
14561 		TEST_CASE_ST(ut_setup, ut_teardown,
14562 			test_AES_CCM_authenticated_decryption_test_case_192_3),
14563 
14564 		/** AES CCM Authenticated Encryption 256 bits key */
14565 		TEST_CASE_ST(ut_setup, ut_teardown,
14566 			test_AES_CCM_authenticated_encryption_test_case_256_1),
14567 		TEST_CASE_ST(ut_setup, ut_teardown,
14568 			test_AES_CCM_authenticated_encryption_test_case_256_2),
14569 		TEST_CASE_ST(ut_setup, ut_teardown,
14570 			test_AES_CCM_authenticated_encryption_test_case_256_3),
14571 
14572 		/** AES CCM Authenticated Decryption 256 bits key*/
14573 		TEST_CASE_ST(ut_setup, ut_teardown,
14574 			test_AES_CCM_authenticated_decryption_test_case_256_1),
14575 		TEST_CASE_ST(ut_setup, ut_teardown,
14576 			test_AES_CCM_authenticated_decryption_test_case_256_2),
14577 		TEST_CASE_ST(ut_setup, ut_teardown,
14578 			test_AES_CCM_authenticated_decryption_test_case_256_3),
14579 		TEST_CASES_END()
14580 	}
14581 };
14582 
14583 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
14584 	.suite_name = "AES GCM Authenticated Test Suite",
14585 	.setup = aes_gcm_auth_testsuite_setup,
14586 	.unit_test_cases = {
14587 		/** AES GCM Authenticated Encryption */
14588 		TEST_CASE_ST(ut_setup, ut_teardown,
14589 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
14590 		TEST_CASE_ST(ut_setup, ut_teardown,
14591 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
14592 		TEST_CASE_ST(ut_setup, ut_teardown,
14593 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
14594 		TEST_CASE_ST(ut_setup, ut_teardown,
14595 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
14596 		TEST_CASE_ST(ut_setup, ut_teardown,
14597 			test_AES_GCM_authenticated_encryption_test_case_1),
14598 		TEST_CASE_ST(ut_setup, ut_teardown,
14599 			test_AES_GCM_authenticated_encryption_test_case_2),
14600 		TEST_CASE_ST(ut_setup, ut_teardown,
14601 			test_AES_GCM_authenticated_encryption_test_case_3),
14602 		TEST_CASE_ST(ut_setup, ut_teardown,
14603 			test_AES_GCM_authenticated_encryption_test_case_4),
14604 		TEST_CASE_ST(ut_setup, ut_teardown,
14605 			test_AES_GCM_authenticated_encryption_test_case_5),
14606 		TEST_CASE_ST(ut_setup, ut_teardown,
14607 			test_AES_GCM_authenticated_encryption_test_case_6),
14608 		TEST_CASE_ST(ut_setup, ut_teardown,
14609 			test_AES_GCM_authenticated_encryption_test_case_7),
14610 		TEST_CASE_ST(ut_setup, ut_teardown,
14611 			test_AES_GCM_authenticated_encryption_test_case_8),
14612 		TEST_CASE_ST(ut_setup, ut_teardown,
14613 			test_AES_GCM_J0_authenticated_encryption_test_case_1),
14614 
14615 		/** AES GCM Authenticated Decryption */
14616 		TEST_CASE_ST(ut_setup, ut_teardown,
14617 			test_AES_GCM_authenticated_decryption_test_case_1),
14618 		TEST_CASE_ST(ut_setup, ut_teardown,
14619 			test_AES_GCM_authenticated_decryption_test_case_2),
14620 		TEST_CASE_ST(ut_setup, ut_teardown,
14621 			test_AES_GCM_authenticated_decryption_test_case_3),
14622 		TEST_CASE_ST(ut_setup, ut_teardown,
14623 			test_AES_GCM_authenticated_decryption_test_case_4),
14624 		TEST_CASE_ST(ut_setup, ut_teardown,
14625 			test_AES_GCM_authenticated_decryption_test_case_5),
14626 		TEST_CASE_ST(ut_setup, ut_teardown,
14627 			test_AES_GCM_authenticated_decryption_test_case_6),
14628 		TEST_CASE_ST(ut_setup, ut_teardown,
14629 			test_AES_GCM_authenticated_decryption_test_case_7),
14630 		TEST_CASE_ST(ut_setup, ut_teardown,
14631 			test_AES_GCM_authenticated_decryption_test_case_8),
14632 		TEST_CASE_ST(ut_setup, ut_teardown,
14633 			test_AES_GCM_J0_authenticated_decryption_test_case_1),
14634 
14635 		/** AES GCM Authenticated Encryption 192 bits key */
14636 		TEST_CASE_ST(ut_setup, ut_teardown,
14637 			test_AES_GCM_auth_encryption_test_case_192_1),
14638 		TEST_CASE_ST(ut_setup, ut_teardown,
14639 			test_AES_GCM_auth_encryption_test_case_192_2),
14640 		TEST_CASE_ST(ut_setup, ut_teardown,
14641 			test_AES_GCM_auth_encryption_test_case_192_3),
14642 		TEST_CASE_ST(ut_setup, ut_teardown,
14643 			test_AES_GCM_auth_encryption_test_case_192_4),
14644 		TEST_CASE_ST(ut_setup, ut_teardown,
14645 			test_AES_GCM_auth_encryption_test_case_192_5),
14646 		TEST_CASE_ST(ut_setup, ut_teardown,
14647 			test_AES_GCM_auth_encryption_test_case_192_6),
14648 		TEST_CASE_ST(ut_setup, ut_teardown,
14649 			test_AES_GCM_auth_encryption_test_case_192_7),
14650 
14651 		/** AES GCM Authenticated Decryption 192 bits key */
14652 		TEST_CASE_ST(ut_setup, ut_teardown,
14653 			test_AES_GCM_auth_decryption_test_case_192_1),
14654 		TEST_CASE_ST(ut_setup, ut_teardown,
14655 			test_AES_GCM_auth_decryption_test_case_192_2),
14656 		TEST_CASE_ST(ut_setup, ut_teardown,
14657 			test_AES_GCM_auth_decryption_test_case_192_3),
14658 		TEST_CASE_ST(ut_setup, ut_teardown,
14659 			test_AES_GCM_auth_decryption_test_case_192_4),
14660 		TEST_CASE_ST(ut_setup, ut_teardown,
14661 			test_AES_GCM_auth_decryption_test_case_192_5),
14662 		TEST_CASE_ST(ut_setup, ut_teardown,
14663 			test_AES_GCM_auth_decryption_test_case_192_6),
14664 		TEST_CASE_ST(ut_setup, ut_teardown,
14665 			test_AES_GCM_auth_decryption_test_case_192_7),
14666 
14667 		/** AES GCM Authenticated Encryption 256 bits key */
14668 		TEST_CASE_ST(ut_setup, ut_teardown,
14669 			test_AES_GCM_auth_encryption_test_case_256_1),
14670 		TEST_CASE_ST(ut_setup, ut_teardown,
14671 			test_AES_GCM_auth_encryption_test_case_256_2),
14672 		TEST_CASE_ST(ut_setup, ut_teardown,
14673 			test_AES_GCM_auth_encryption_test_case_256_3),
14674 		TEST_CASE_ST(ut_setup, ut_teardown,
14675 			test_AES_GCM_auth_encryption_test_case_256_4),
14676 		TEST_CASE_ST(ut_setup, ut_teardown,
14677 			test_AES_GCM_auth_encryption_test_case_256_5),
14678 		TEST_CASE_ST(ut_setup, ut_teardown,
14679 			test_AES_GCM_auth_encryption_test_case_256_6),
14680 		TEST_CASE_ST(ut_setup, ut_teardown,
14681 			test_AES_GCM_auth_encryption_test_case_256_7),
14682 
14683 		/** AES GCM Authenticated Decryption 256 bits key */
14684 		TEST_CASE_ST(ut_setup, ut_teardown,
14685 			test_AES_GCM_auth_decryption_test_case_256_1),
14686 		TEST_CASE_ST(ut_setup, ut_teardown,
14687 			test_AES_GCM_auth_decryption_test_case_256_2),
14688 		TEST_CASE_ST(ut_setup, ut_teardown,
14689 			test_AES_GCM_auth_decryption_test_case_256_3),
14690 		TEST_CASE_ST(ut_setup, ut_teardown,
14691 			test_AES_GCM_auth_decryption_test_case_256_4),
14692 		TEST_CASE_ST(ut_setup, ut_teardown,
14693 			test_AES_GCM_auth_decryption_test_case_256_5),
14694 		TEST_CASE_ST(ut_setup, ut_teardown,
14695 			test_AES_GCM_auth_decryption_test_case_256_6),
14696 		TEST_CASE_ST(ut_setup, ut_teardown,
14697 			test_AES_GCM_auth_decryption_test_case_256_7),
14698 
14699 		/** AES GCM Authenticated Encryption big aad size */
14700 		TEST_CASE_ST(ut_setup, ut_teardown,
14701 			test_AES_GCM_auth_encryption_test_case_aad_1),
14702 		TEST_CASE_ST(ut_setup, ut_teardown,
14703 			test_AES_GCM_auth_encryption_test_case_aad_2),
14704 
14705 		/** AES GCM Authenticated Decryption big aad size */
14706 		TEST_CASE_ST(ut_setup, ut_teardown,
14707 			test_AES_GCM_auth_decryption_test_case_aad_1),
14708 		TEST_CASE_ST(ut_setup, ut_teardown,
14709 			test_AES_GCM_auth_decryption_test_case_aad_2),
14710 
14711 		/** Out of place tests */
14712 		TEST_CASE_ST(ut_setup, ut_teardown,
14713 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
14714 		TEST_CASE_ST(ut_setup, ut_teardown,
14715 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
14716 
14717 		/** Session-less tests */
14718 		TEST_CASE_ST(ut_setup, ut_teardown,
14719 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
14720 		TEST_CASE_ST(ut_setup, ut_teardown,
14721 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
14722 
14723 		TEST_CASES_END()
14724 	}
14725 };
14726 
14727 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
14728 	.suite_name = "AES GMAC Authentication Test Suite",
14729 	.setup = aes_gmac_auth_testsuite_setup,
14730 	.unit_test_cases = {
14731 		TEST_CASE_ST(ut_setup, ut_teardown,
14732 			test_AES_GMAC_authentication_test_case_1),
14733 		TEST_CASE_ST(ut_setup, ut_teardown,
14734 			test_AES_GMAC_authentication_verify_test_case_1),
14735 		TEST_CASE_ST(ut_setup, ut_teardown,
14736 			test_AES_GMAC_authentication_test_case_2),
14737 		TEST_CASE_ST(ut_setup, ut_teardown,
14738 			test_AES_GMAC_authentication_verify_test_case_2),
14739 		TEST_CASE_ST(ut_setup, ut_teardown,
14740 			test_AES_GMAC_authentication_test_case_3),
14741 		TEST_CASE_ST(ut_setup, ut_teardown,
14742 			test_AES_GMAC_authentication_verify_test_case_3),
14743 		TEST_CASE_ST(ut_setup, ut_teardown,
14744 			test_AES_GMAC_authentication_test_case_4),
14745 		TEST_CASE_ST(ut_setup, ut_teardown,
14746 			test_AES_GMAC_authentication_verify_test_case_4),
14747 		TEST_CASE_ST(ut_setup, ut_teardown,
14748 			test_AES_GMAC_authentication_SGL_40B),
14749 		TEST_CASE_ST(ut_setup, ut_teardown,
14750 			test_AES_GMAC_authentication_SGL_80B),
14751 		TEST_CASE_ST(ut_setup, ut_teardown,
14752 			test_AES_GMAC_authentication_SGL_2048B),
14753 		TEST_CASE_ST(ut_setup, ut_teardown,
14754 			test_AES_GMAC_authentication_SGL_2047B),
14755 
14756 		TEST_CASES_END()
14757 	}
14758 };
14759 
14760 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
14761 	.suite_name = "Chacha20-Poly1305 Test Suite",
14762 	.setup = chacha20_poly1305_testsuite_setup,
14763 	.unit_test_cases = {
14764 		TEST_CASE_ST(ut_setup, ut_teardown,
14765 			test_chacha20_poly1305_encrypt_test_case_rfc8439),
14766 		TEST_CASE_ST(ut_setup, ut_teardown,
14767 			test_chacha20_poly1305_decrypt_test_case_rfc8439),
14768 		TEST_CASES_END()
14769 	}
14770 };
14771 
14772 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
14773 	.suite_name = "SNOW 3G Test Suite",
14774 	.setup = snow3g_testsuite_setup,
14775 	.unit_test_cases = {
14776 		/** SNOW 3G encrypt only (UEA2) */
14777 		TEST_CASE_ST(ut_setup, ut_teardown,
14778 			test_snow3g_encryption_test_case_1),
14779 		TEST_CASE_ST(ut_setup, ut_teardown,
14780 			test_snow3g_encryption_test_case_2),
14781 		TEST_CASE_ST(ut_setup, ut_teardown,
14782 			test_snow3g_encryption_test_case_3),
14783 		TEST_CASE_ST(ut_setup, ut_teardown,
14784 			test_snow3g_encryption_test_case_4),
14785 		TEST_CASE_ST(ut_setup, ut_teardown,
14786 			test_snow3g_encryption_test_case_5),
14787 
14788 		TEST_CASE_ST(ut_setup, ut_teardown,
14789 			test_snow3g_encryption_test_case_1_oop),
14790 		TEST_CASE_ST(ut_setup, ut_teardown,
14791 			test_snow3g_encryption_test_case_1_oop_sgl),
14792 		TEST_CASE_ST(ut_setup, ut_teardown,
14793 			test_snow3g_encryption_test_case_1_offset_oop),
14794 		TEST_CASE_ST(ut_setup, ut_teardown,
14795 			test_snow3g_decryption_test_case_1_oop),
14796 
14797 		/** SNOW 3G generate auth, then encrypt (UEA2) */
14798 		TEST_CASE_ST(ut_setup, ut_teardown,
14799 			test_snow3g_auth_cipher_test_case_1),
14800 		TEST_CASE_ST(ut_setup, ut_teardown,
14801 			test_snow3g_auth_cipher_test_case_2),
14802 		TEST_CASE_ST(ut_setup, ut_teardown,
14803 			test_snow3g_auth_cipher_test_case_2_oop),
14804 		TEST_CASE_ST(ut_setup, ut_teardown,
14805 			test_snow3g_auth_cipher_part_digest_enc),
14806 		TEST_CASE_ST(ut_setup, ut_teardown,
14807 			test_snow3g_auth_cipher_part_digest_enc_oop),
14808 		TEST_CASE_ST(ut_setup, ut_teardown,
14809 			test_snow3g_auth_cipher_test_case_3_sgl),
14810 		TEST_CASE_ST(ut_setup, ut_teardown,
14811 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
14812 		TEST_CASE_ST(ut_setup, ut_teardown,
14813 			test_snow3g_auth_cipher_part_digest_enc_sgl),
14814 		TEST_CASE_ST(ut_setup, ut_teardown,
14815 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
14816 
14817 		/** SNOW 3G decrypt (UEA2), then verify auth */
14818 		TEST_CASE_ST(ut_setup, ut_teardown,
14819 			test_snow3g_auth_cipher_verify_test_case_1),
14820 		TEST_CASE_ST(ut_setup, ut_teardown,
14821 			test_snow3g_auth_cipher_verify_test_case_2),
14822 		TEST_CASE_ST(ut_setup, ut_teardown,
14823 			test_snow3g_auth_cipher_verify_test_case_2_oop),
14824 		TEST_CASE_ST(ut_setup, ut_teardown,
14825 			test_snow3g_auth_cipher_verify_part_digest_enc),
14826 		TEST_CASE_ST(ut_setup, ut_teardown,
14827 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
14828 		TEST_CASE_ST(ut_setup, ut_teardown,
14829 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
14830 		TEST_CASE_ST(ut_setup, ut_teardown,
14831 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
14832 		TEST_CASE_ST(ut_setup, ut_teardown,
14833 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
14834 		TEST_CASE_ST(ut_setup, ut_teardown,
14835 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
14836 
14837 		/** SNOW 3G decrypt only (UEA2) */
14838 		TEST_CASE_ST(ut_setup, ut_teardown,
14839 			test_snow3g_decryption_test_case_1),
14840 		TEST_CASE_ST(ut_setup, ut_teardown,
14841 			test_snow3g_decryption_test_case_2),
14842 		TEST_CASE_ST(ut_setup, ut_teardown,
14843 			test_snow3g_decryption_test_case_3),
14844 		TEST_CASE_ST(ut_setup, ut_teardown,
14845 			test_snow3g_decryption_test_case_4),
14846 		TEST_CASE_ST(ut_setup, ut_teardown,
14847 			test_snow3g_decryption_test_case_5),
14848 		TEST_CASE_ST(ut_setup, ut_teardown,
14849 			test_snow3g_decryption_with_digest_test_case_1),
14850 		TEST_CASE_ST(ut_setup, ut_teardown,
14851 			test_snow3g_hash_generate_test_case_1),
14852 		TEST_CASE_ST(ut_setup, ut_teardown,
14853 			test_snow3g_hash_generate_test_case_2),
14854 		TEST_CASE_ST(ut_setup, ut_teardown,
14855 			test_snow3g_hash_generate_test_case_3),
14856 
14857 		/* Tests with buffers which length is not byte-aligned */
14858 		TEST_CASE_ST(ut_setup, ut_teardown,
14859 			test_snow3g_hash_generate_test_case_4),
14860 		TEST_CASE_ST(ut_setup, ut_teardown,
14861 			test_snow3g_hash_generate_test_case_5),
14862 		TEST_CASE_ST(ut_setup, ut_teardown,
14863 			test_snow3g_hash_generate_test_case_6),
14864 		TEST_CASE_ST(ut_setup, ut_teardown,
14865 			test_snow3g_hash_verify_test_case_1),
14866 		TEST_CASE_ST(ut_setup, ut_teardown,
14867 			test_snow3g_hash_verify_test_case_2),
14868 		TEST_CASE_ST(ut_setup, ut_teardown,
14869 			test_snow3g_hash_verify_test_case_3),
14870 
14871 		/* Tests with buffers which length is not byte-aligned */
14872 		TEST_CASE_ST(ut_setup, ut_teardown,
14873 			test_snow3g_hash_verify_test_case_4),
14874 		TEST_CASE_ST(ut_setup, ut_teardown,
14875 			test_snow3g_hash_verify_test_case_5),
14876 		TEST_CASE_ST(ut_setup, ut_teardown,
14877 			test_snow3g_hash_verify_test_case_6),
14878 		TEST_CASE_ST(ut_setup, ut_teardown,
14879 			test_snow3g_cipher_auth_test_case_1),
14880 		TEST_CASE_ST(ut_setup, ut_teardown,
14881 			test_snow3g_auth_cipher_with_digest_test_case_1),
14882 		TEST_CASES_END()
14883 	}
14884 };
14885 
14886 static struct unit_test_suite cryptodev_zuc_testsuite  = {
14887 	.suite_name = "ZUC Test Suite",
14888 	.setup = zuc_testsuite_setup,
14889 	.unit_test_cases = {
14890 		/** ZUC encrypt only (EEA3) */
14891 		TEST_CASE_ST(ut_setup, ut_teardown,
14892 			test_zuc_encryption_test_case_1),
14893 		TEST_CASE_ST(ut_setup, ut_teardown,
14894 			test_zuc_encryption_test_case_2),
14895 		TEST_CASE_ST(ut_setup, ut_teardown,
14896 			test_zuc_encryption_test_case_3),
14897 		TEST_CASE_ST(ut_setup, ut_teardown,
14898 			test_zuc_encryption_test_case_4),
14899 		TEST_CASE_ST(ut_setup, ut_teardown,
14900 			test_zuc_encryption_test_case_5),
14901 		TEST_CASE_ST(ut_setup, ut_teardown,
14902 			test_zuc_encryption_test_case_6_sgl),
14903 		TEST_CASE_ST(ut_setup, ut_teardown,
14904 			test_zuc_encryption_test_case_7),
14905 
14906 		/** ZUC authenticate (EIA3) */
14907 		TEST_CASE_ST(ut_setup, ut_teardown,
14908 			test_zuc_hash_generate_test_case_1),
14909 		TEST_CASE_ST(ut_setup, ut_teardown,
14910 			test_zuc_hash_generate_test_case_2),
14911 		TEST_CASE_ST(ut_setup, ut_teardown,
14912 			test_zuc_hash_generate_test_case_3),
14913 		TEST_CASE_ST(ut_setup, ut_teardown,
14914 			test_zuc_hash_generate_test_case_4),
14915 		TEST_CASE_ST(ut_setup, ut_teardown,
14916 			test_zuc_hash_generate_test_case_5),
14917 		TEST_CASE_ST(ut_setup, ut_teardown,
14918 			test_zuc_hash_generate_test_case_6),
14919 		TEST_CASE_ST(ut_setup, ut_teardown,
14920 			test_zuc_hash_generate_test_case_7),
14921 		TEST_CASE_ST(ut_setup, ut_teardown,
14922 			test_zuc_hash_generate_test_case_8),
14923 		TEST_CASE_ST(ut_setup, ut_teardown,
14924 			test_zuc_hash_generate_test_case_9),
14925 		TEST_CASE_ST(ut_setup, ut_teardown,
14926 			test_zuc_hash_generate_test_case_10),
14927 
14928 
14929 		/** ZUC alg-chain (EEA3/EIA3) */
14930 		TEST_CASE_ST(ut_setup, ut_teardown,
14931 			test_zuc_cipher_auth_test_case_1),
14932 		TEST_CASE_ST(ut_setup, ut_teardown,
14933 			test_zuc_cipher_auth_test_case_2),
14934 
14935 		/** ZUC generate auth, then encrypt (EEA3) */
14936 		TEST_CASE_ST(ut_setup, ut_teardown,
14937 			test_zuc_auth_cipher_test_case_1),
14938 		TEST_CASE_ST(ut_setup, ut_teardown,
14939 			test_zuc_auth_cipher_test_case_1_oop),
14940 		TEST_CASE_ST(ut_setup, ut_teardown,
14941 			test_zuc_auth_cipher_test_case_1_sgl),
14942 		TEST_CASE_ST(ut_setup, ut_teardown,
14943 			test_zuc_auth_cipher_test_case_1_oop_sgl),
14944 
14945 		/** ZUC decrypt (EEA3), then verify auth */
14946 		TEST_CASE_ST(ut_setup, ut_teardown,
14947 			test_zuc_auth_cipher_verify_test_case_1),
14948 		TEST_CASE_ST(ut_setup, ut_teardown,
14949 			test_zuc_auth_cipher_verify_test_case_1_oop),
14950 		TEST_CASE_ST(ut_setup, ut_teardown,
14951 			test_zuc_auth_cipher_verify_test_case_1_sgl),
14952 		TEST_CASE_ST(ut_setup, ut_teardown,
14953 			test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
14954 		TEST_CASES_END()
14955 	}
14956 };
14957 
14958 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
14959 	.suite_name = "HMAC_MD5 Authentication Test Suite",
14960 	.setup = hmac_md5_auth_testsuite_setup,
14961 	.unit_test_cases = {
14962 		TEST_CASE_ST(ut_setup, ut_teardown,
14963 			test_MD5_HMAC_generate_case_1),
14964 		TEST_CASE_ST(ut_setup, ut_teardown,
14965 			test_MD5_HMAC_verify_case_1),
14966 		TEST_CASE_ST(ut_setup, ut_teardown,
14967 			test_MD5_HMAC_generate_case_2),
14968 		TEST_CASE_ST(ut_setup, ut_teardown,
14969 			test_MD5_HMAC_verify_case_2),
14970 		TEST_CASES_END()
14971 	}
14972 };
14973 
14974 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
14975 	.suite_name = "Kasumi Test Suite",
14976 	.setup = kasumi_testsuite_setup,
14977 	.unit_test_cases = {
14978 		/** KASUMI hash only (UIA1) */
14979 		TEST_CASE_ST(ut_setup, ut_teardown,
14980 			test_kasumi_hash_generate_test_case_1),
14981 		TEST_CASE_ST(ut_setup, ut_teardown,
14982 			test_kasumi_hash_generate_test_case_2),
14983 		TEST_CASE_ST(ut_setup, ut_teardown,
14984 			test_kasumi_hash_generate_test_case_3),
14985 		TEST_CASE_ST(ut_setup, ut_teardown,
14986 			test_kasumi_hash_generate_test_case_4),
14987 		TEST_CASE_ST(ut_setup, ut_teardown,
14988 			test_kasumi_hash_generate_test_case_5),
14989 		TEST_CASE_ST(ut_setup, ut_teardown,
14990 			test_kasumi_hash_generate_test_case_6),
14991 
14992 		TEST_CASE_ST(ut_setup, ut_teardown,
14993 			test_kasumi_hash_verify_test_case_1),
14994 		TEST_CASE_ST(ut_setup, ut_teardown,
14995 			test_kasumi_hash_verify_test_case_2),
14996 		TEST_CASE_ST(ut_setup, ut_teardown,
14997 			test_kasumi_hash_verify_test_case_3),
14998 		TEST_CASE_ST(ut_setup, ut_teardown,
14999 			test_kasumi_hash_verify_test_case_4),
15000 		TEST_CASE_ST(ut_setup, ut_teardown,
15001 			test_kasumi_hash_verify_test_case_5),
15002 
15003 		/** KASUMI encrypt only (UEA1) */
15004 		TEST_CASE_ST(ut_setup, ut_teardown,
15005 			test_kasumi_encryption_test_case_1),
15006 		TEST_CASE_ST(ut_setup, ut_teardown,
15007 			test_kasumi_encryption_test_case_1_sgl),
15008 		TEST_CASE_ST(ut_setup, ut_teardown,
15009 			test_kasumi_encryption_test_case_1_oop),
15010 		TEST_CASE_ST(ut_setup, ut_teardown,
15011 			test_kasumi_encryption_test_case_1_oop_sgl),
15012 		TEST_CASE_ST(ut_setup, ut_teardown,
15013 			test_kasumi_encryption_test_case_2),
15014 		TEST_CASE_ST(ut_setup, ut_teardown,
15015 			test_kasumi_encryption_test_case_3),
15016 		TEST_CASE_ST(ut_setup, ut_teardown,
15017 			test_kasumi_encryption_test_case_4),
15018 		TEST_CASE_ST(ut_setup, ut_teardown,
15019 			test_kasumi_encryption_test_case_5),
15020 
15021 		/** KASUMI decrypt only (UEA1) */
15022 		TEST_CASE_ST(ut_setup, ut_teardown,
15023 			test_kasumi_decryption_test_case_1),
15024 		TEST_CASE_ST(ut_setup, ut_teardown,
15025 			test_kasumi_decryption_test_case_2),
15026 		TEST_CASE_ST(ut_setup, ut_teardown,
15027 			test_kasumi_decryption_test_case_3),
15028 		TEST_CASE_ST(ut_setup, ut_teardown,
15029 			test_kasumi_decryption_test_case_4),
15030 		TEST_CASE_ST(ut_setup, ut_teardown,
15031 			test_kasumi_decryption_test_case_5),
15032 		TEST_CASE_ST(ut_setup, ut_teardown,
15033 			test_kasumi_decryption_test_case_1_oop),
15034 		TEST_CASE_ST(ut_setup, ut_teardown,
15035 			test_kasumi_cipher_auth_test_case_1),
15036 
15037 		/** KASUMI generate auth, then encrypt (F8) */
15038 		TEST_CASE_ST(ut_setup, ut_teardown,
15039 			test_kasumi_auth_cipher_test_case_1),
15040 		TEST_CASE_ST(ut_setup, ut_teardown,
15041 			test_kasumi_auth_cipher_test_case_2),
15042 		TEST_CASE_ST(ut_setup, ut_teardown,
15043 			test_kasumi_auth_cipher_test_case_2_oop),
15044 		TEST_CASE_ST(ut_setup, ut_teardown,
15045 			test_kasumi_auth_cipher_test_case_2_sgl),
15046 		TEST_CASE_ST(ut_setup, ut_teardown,
15047 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
15048 
15049 		/** KASUMI decrypt (F8), then verify auth */
15050 		TEST_CASE_ST(ut_setup, ut_teardown,
15051 			test_kasumi_auth_cipher_verify_test_case_1),
15052 		TEST_CASE_ST(ut_setup, ut_teardown,
15053 			test_kasumi_auth_cipher_verify_test_case_2),
15054 		TEST_CASE_ST(ut_setup, ut_teardown,
15055 			test_kasumi_auth_cipher_verify_test_case_2_oop),
15056 		TEST_CASE_ST(ut_setup, ut_teardown,
15057 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
15058 		TEST_CASE_ST(ut_setup, ut_teardown,
15059 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
15060 
15061 		TEST_CASES_END()
15062 	}
15063 };
15064 
15065 static struct unit_test_suite cryptodev_esn_testsuite  = {
15066 	.suite_name = "ESN Test Suite",
15067 	.setup = esn_testsuite_setup,
15068 	.unit_test_cases = {
15069 		TEST_CASE_ST(ut_setup, ut_teardown,
15070 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
15071 		TEST_CASE_ST(ut_setup, ut_teardown,
15072 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
15073 		TEST_CASES_END()
15074 	}
15075 };
15076 
15077 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
15078 	.suite_name = "Negative AES GCM Test Suite",
15079 	.setup = negative_aes_gcm_testsuite_setup,
15080 	.unit_test_cases = {
15081 		TEST_CASE_ST(ut_setup, ut_teardown,
15082 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
15083 		TEST_CASE_ST(ut_setup, ut_teardown,
15084 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
15085 		TEST_CASE_ST(ut_setup, ut_teardown,
15086 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
15087 		TEST_CASE_ST(ut_setup, ut_teardown,
15088 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
15089 		TEST_CASE_ST(ut_setup, ut_teardown,
15090 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
15091 		TEST_CASE_ST(ut_setup, ut_teardown,
15092 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
15093 		TEST_CASE_ST(ut_setup, ut_teardown,
15094 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
15095 		TEST_CASE_ST(ut_setup, ut_teardown,
15096 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
15097 		TEST_CASE_ST(ut_setup, ut_teardown,
15098 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
15099 		TEST_CASE_ST(ut_setup, ut_teardown,
15100 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
15101 		TEST_CASE_ST(ut_setup, ut_teardown,
15102 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
15103 		TEST_CASE_ST(ut_setup, ut_teardown,
15104 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
15105 
15106 		TEST_CASES_END()
15107 	}
15108 };
15109 
15110 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
15111 	.suite_name = "Negative AES GMAC Test Suite",
15112 	.setup = negative_aes_gmac_testsuite_setup,
15113 	.unit_test_cases = {
15114 		TEST_CASE_ST(ut_setup, ut_teardown,
15115 			authentication_verify_AES128_GMAC_fail_data_corrupt),
15116 		TEST_CASE_ST(ut_setup, ut_teardown,
15117 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
15118 
15119 		TEST_CASES_END()
15120 	}
15121 };
15122 
15123 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
15124 	.suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
15125 	.setup = mixed_cipher_hash_testsuite_setup,
15126 	.unit_test_cases = {
15127 		/** AUTH AES CMAC + CIPHER AES CTR */
15128 		TEST_CASE_ST(ut_setup, ut_teardown,
15129 			test_aes_cmac_aes_ctr_digest_enc_test_case_1),
15130 		TEST_CASE_ST(ut_setup, ut_teardown,
15131 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15132 		TEST_CASE_ST(ut_setup, ut_teardown,
15133 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15134 		TEST_CASE_ST(ut_setup, ut_teardown,
15135 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15136 		TEST_CASE_ST(ut_setup, ut_teardown,
15137 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
15138 		TEST_CASE_ST(ut_setup, ut_teardown,
15139 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15140 		TEST_CASE_ST(ut_setup, ut_teardown,
15141 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15142 		TEST_CASE_ST(ut_setup, ut_teardown,
15143 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15144 
15145 		/** AUTH ZUC + CIPHER SNOW3G */
15146 		TEST_CASE_ST(ut_setup, ut_teardown,
15147 			test_auth_zuc_cipher_snow_test_case_1),
15148 		TEST_CASE_ST(ut_setup, ut_teardown,
15149 			test_verify_auth_zuc_cipher_snow_test_case_1),
15150 		/** AUTH AES CMAC + CIPHER SNOW3G */
15151 		TEST_CASE_ST(ut_setup, ut_teardown,
15152 			test_auth_aes_cmac_cipher_snow_test_case_1),
15153 		TEST_CASE_ST(ut_setup, ut_teardown,
15154 			test_verify_auth_aes_cmac_cipher_snow_test_case_1),
15155 		/** AUTH ZUC + CIPHER AES CTR */
15156 		TEST_CASE_ST(ut_setup, ut_teardown,
15157 			test_auth_zuc_cipher_aes_ctr_test_case_1),
15158 		TEST_CASE_ST(ut_setup, ut_teardown,
15159 			test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
15160 		/** AUTH SNOW3G + CIPHER AES CTR */
15161 		TEST_CASE_ST(ut_setup, ut_teardown,
15162 			test_auth_snow_cipher_aes_ctr_test_case_1),
15163 		TEST_CASE_ST(ut_setup, ut_teardown,
15164 			test_verify_auth_snow_cipher_aes_ctr_test_case_1),
15165 		/** AUTH SNOW3G + CIPHER ZUC */
15166 		TEST_CASE_ST(ut_setup, ut_teardown,
15167 			test_auth_snow_cipher_zuc_test_case_1),
15168 		TEST_CASE_ST(ut_setup, ut_teardown,
15169 			test_verify_auth_snow_cipher_zuc_test_case_1),
15170 		/** AUTH AES CMAC + CIPHER ZUC */
15171 		TEST_CASE_ST(ut_setup, ut_teardown,
15172 			test_auth_aes_cmac_cipher_zuc_test_case_1),
15173 		TEST_CASE_ST(ut_setup, ut_teardown,
15174 			test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
15175 
15176 		/** AUTH NULL + CIPHER SNOW3G */
15177 		TEST_CASE_ST(ut_setup, ut_teardown,
15178 			test_auth_null_cipher_snow_test_case_1),
15179 		TEST_CASE_ST(ut_setup, ut_teardown,
15180 			test_verify_auth_null_cipher_snow_test_case_1),
15181 		/** AUTH NULL + CIPHER ZUC */
15182 		TEST_CASE_ST(ut_setup, ut_teardown,
15183 			test_auth_null_cipher_zuc_test_case_1),
15184 		TEST_CASE_ST(ut_setup, ut_teardown,
15185 			test_verify_auth_null_cipher_zuc_test_case_1),
15186 		/** AUTH SNOW3G + CIPHER NULL */
15187 		TEST_CASE_ST(ut_setup, ut_teardown,
15188 			test_auth_snow_cipher_null_test_case_1),
15189 		TEST_CASE_ST(ut_setup, ut_teardown,
15190 			test_verify_auth_snow_cipher_null_test_case_1),
15191 		/** AUTH ZUC + CIPHER NULL */
15192 		TEST_CASE_ST(ut_setup, ut_teardown,
15193 			test_auth_zuc_cipher_null_test_case_1),
15194 		TEST_CASE_ST(ut_setup, ut_teardown,
15195 			test_verify_auth_zuc_cipher_null_test_case_1),
15196 		/** AUTH NULL + CIPHER AES CTR */
15197 		TEST_CASE_ST(ut_setup, ut_teardown,
15198 			test_auth_null_cipher_aes_ctr_test_case_1),
15199 		TEST_CASE_ST(ut_setup, ut_teardown,
15200 			test_verify_auth_null_cipher_aes_ctr_test_case_1),
15201 		/** AUTH AES CMAC + CIPHER NULL */
15202 		TEST_CASE_ST(ut_setup, ut_teardown,
15203 			test_auth_aes_cmac_cipher_null_test_case_1),
15204 		TEST_CASE_ST(ut_setup, ut_teardown,
15205 			test_verify_auth_aes_cmac_cipher_null_test_case_1),
15206 		TEST_CASES_END()
15207 	}
15208 };
15209 
15210 static int
15211 run_cryptodev_testsuite(const char *pmd_name)
15212 {
15213 	uint8_t ret, j, i = 0, blk_start_idx = 0;
15214 	const enum blockcipher_test_type blk_suites[] = {
15215 		BLKCIPHER_AES_CHAIN_TYPE,
15216 		BLKCIPHER_AES_CIPHERONLY_TYPE,
15217 		BLKCIPHER_AES_DOCSIS_TYPE,
15218 		BLKCIPHER_3DES_CHAIN_TYPE,
15219 		BLKCIPHER_3DES_CIPHERONLY_TYPE,
15220 		BLKCIPHER_DES_CIPHERONLY_TYPE,
15221 		BLKCIPHER_DES_DOCSIS_TYPE,
15222 		BLKCIPHER_AUTHONLY_TYPE};
15223 	struct unit_test_suite *static_suites[] = {
15224 		&cryptodev_multi_session_testsuite,
15225 		&cryptodev_null_testsuite,
15226 		&cryptodev_aes_ccm_auth_testsuite,
15227 		&cryptodev_aes_gcm_auth_testsuite,
15228 		&cryptodev_aes_gmac_auth_testsuite,
15229 		&cryptodev_snow3g_testsuite,
15230 		&cryptodev_chacha20_poly1305_testsuite,
15231 		&cryptodev_zuc_testsuite,
15232 		&cryptodev_hmac_md5_auth_testsuite,
15233 		&cryptodev_kasumi_testsuite,
15234 		&cryptodev_esn_testsuite,
15235 		&cryptodev_negative_aes_gcm_testsuite,
15236 		&cryptodev_negative_aes_gmac_testsuite,
15237 		&cryptodev_mixed_cipher_hash_testsuite,
15238 		&cryptodev_negative_hmac_sha1_testsuite,
15239 		&cryptodev_gen_testsuite,
15240 #ifdef RTE_LIB_SECURITY
15241 		&ipsec_proto_testsuite,
15242 		&pdcp_proto_testsuite,
15243 		&docsis_proto_testsuite,
15244 #endif
15245 		&end_testsuite
15246 	};
15247 	static struct unit_test_suite ts = {
15248 		.suite_name = "Cryptodev Unit Test Suite",
15249 		.setup = testsuite_setup,
15250 		.teardown = testsuite_teardown,
15251 		.unit_test_cases = {TEST_CASES_END()}
15252 	};
15253 
15254 	gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
15255 
15256 	if (gbl_driver_id == -1) {
15257 		RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
15258 		return TEST_SKIPPED;
15259 	}
15260 
15261 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15262 			(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
15263 
15264 	ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
15265 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15266 	ret = unit_test_suite_runner(&ts);
15267 
15268 	FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
15269 	free(ts.unit_test_suites);
15270 	return ret;
15271 }
15272 
15273 static int
15274 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
15275 {
15276 	struct rte_cryptodev_info dev_info;
15277 	uint8_t i, nb_devs;
15278 	int driver_id;
15279 
15280 	driver_id = rte_cryptodev_driver_id_get(pmd_name);
15281 	if (driver_id == -1) {
15282 		RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
15283 		return TEST_SKIPPED;
15284 	}
15285 
15286 	nb_devs = rte_cryptodev_count();
15287 	if (nb_devs < 1) {
15288 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
15289 		return TEST_SKIPPED;
15290 	}
15291 
15292 	for (i = 0; i < nb_devs; i++) {
15293 		rte_cryptodev_info_get(i, &dev_info);
15294 		if (dev_info.driver_id == driver_id) {
15295 			if (!(dev_info.feature_flags & flag)) {
15296 				RTE_LOG(INFO, USER1, "%s not supported\n",
15297 						flag_name);
15298 				return TEST_SKIPPED;
15299 			}
15300 			return 0; /* found */
15301 		}
15302 	}
15303 
15304 	RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
15305 	return TEST_SKIPPED;
15306 }
15307 
15308 static int
15309 test_cryptodev_qat(void)
15310 {
15311 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
15312 }
15313 
15314 static int
15315 test_cryptodev_virtio(void)
15316 {
15317 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
15318 }
15319 
15320 static int
15321 test_cryptodev_aesni_mb(void)
15322 {
15323 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15324 }
15325 
15326 static int
15327 test_cryptodev_cpu_aesni_mb(void)
15328 {
15329 	int32_t rc;
15330 	enum rte_security_session_action_type at = gbl_action_type;
15331 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15332 	rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15333 	gbl_action_type = at;
15334 	return rc;
15335 }
15336 
15337 static int
15338 test_cryptodev_openssl(void)
15339 {
15340 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
15341 }
15342 
15343 static int
15344 test_cryptodev_aesni_gcm(void)
15345 {
15346 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15347 }
15348 
15349 static int
15350 test_cryptodev_cpu_aesni_gcm(void)
15351 {
15352 	int32_t rc;
15353 	enum rte_security_session_action_type at = gbl_action_type;
15354 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15355 	rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15356 	gbl_action_type = at;
15357 	return rc;
15358 }
15359 
15360 static int
15361 test_cryptodev_mlx5(void)
15362 {
15363 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
15364 }
15365 
15366 static int
15367 test_cryptodev_null(void)
15368 {
15369 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
15370 }
15371 
15372 static int
15373 test_cryptodev_sw_snow3g(void)
15374 {
15375 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
15376 }
15377 
15378 static int
15379 test_cryptodev_sw_kasumi(void)
15380 {
15381 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
15382 }
15383 
15384 static int
15385 test_cryptodev_sw_zuc(void)
15386 {
15387 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
15388 }
15389 
15390 static int
15391 test_cryptodev_armv8(void)
15392 {
15393 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
15394 }
15395 
15396 static int
15397 test_cryptodev_mrvl(void)
15398 {
15399 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
15400 }
15401 
15402 #ifdef RTE_CRYPTO_SCHEDULER
15403 
15404 static int
15405 test_cryptodev_scheduler(void)
15406 {
15407 	uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
15408 	const enum blockcipher_test_type blk_suites[] = {
15409 		BLKCIPHER_AES_CHAIN_TYPE,
15410 		BLKCIPHER_AES_CIPHERONLY_TYPE,
15411 		BLKCIPHER_AUTHONLY_TYPE
15412 	};
15413 	static struct unit_test_suite scheduler_multicore = {
15414 		.suite_name = "Scheduler Multicore Unit Test Suite",
15415 		.setup = scheduler_multicore_testsuite_setup,
15416 		.teardown = scheduler_mode_testsuite_teardown,
15417 		.unit_test_cases = {TEST_CASES_END()}
15418 	};
15419 	static struct unit_test_suite scheduler_round_robin = {
15420 		.suite_name = "Scheduler Round Robin Unit Test Suite",
15421 		.setup = scheduler_roundrobin_testsuite_setup,
15422 		.teardown = scheduler_mode_testsuite_teardown,
15423 		.unit_test_cases = {TEST_CASES_END()}
15424 	};
15425 	static struct unit_test_suite scheduler_failover = {
15426 		.suite_name = "Scheduler Failover Unit Test Suite",
15427 		.setup = scheduler_failover_testsuite_setup,
15428 		.teardown = scheduler_mode_testsuite_teardown,
15429 		.unit_test_cases = {TEST_CASES_END()}
15430 	};
15431 	static struct unit_test_suite scheduler_pkt_size_distr = {
15432 		.suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
15433 		.setup = scheduler_pkt_size_distr_testsuite_setup,
15434 		.teardown = scheduler_mode_testsuite_teardown,
15435 		.unit_test_cases = {TEST_CASES_END()}
15436 	};
15437 	struct unit_test_suite *sched_mode_suites[] = {
15438 		&scheduler_multicore,
15439 		&scheduler_round_robin,
15440 		&scheduler_failover,
15441 		&scheduler_pkt_size_distr
15442 	};
15443 	static struct unit_test_suite scheduler_config = {
15444 		.suite_name = "Crypto Device Scheduler Config Unit Test Suite",
15445 		.unit_test_cases = {
15446 			TEST_CASE(test_scheduler_attach_worker_op),
15447 			TEST_CASE(test_scheduler_mode_multicore_op),
15448 			TEST_CASE(test_scheduler_mode_roundrobin_op),
15449 			TEST_CASE(test_scheduler_mode_failover_op),
15450 			TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
15451 			TEST_CASE(test_scheduler_detach_worker_op),
15452 
15453 			TEST_CASES_END() /**< NULL terminate array */
15454 		}
15455 	};
15456 	struct unit_test_suite *static_suites[] = {
15457 		&scheduler_config,
15458 		&end_testsuite
15459 	};
15460 	static struct unit_test_suite ts = {
15461 		.suite_name = "Scheduler Unit Test Suite",
15462 		.setup = scheduler_testsuite_setup,
15463 		.teardown = testsuite_teardown,
15464 		.unit_test_cases = {TEST_CASES_END()}
15465 	};
15466 
15467 	gbl_driver_id =	rte_cryptodev_driver_id_get(
15468 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
15469 
15470 	if (gbl_driver_id == -1) {
15471 		RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
15472 		return TEST_SKIPPED;
15473 	}
15474 
15475 	if (rte_cryptodev_driver_id_get(
15476 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
15477 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
15478 		return TEST_SKIPPED;
15479 	}
15480 
15481 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15482 		uint8_t blk_i = 0;
15483 		sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
15484 				(struct unit_test_suite *) *
15485 				(RTE_DIM(blk_suites) + 1));
15486 		ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
15487 				blk_suites, RTE_DIM(blk_suites));
15488 		sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
15489 	}
15490 
15491 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15492 			(RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
15493 	ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
15494 			RTE_DIM(sched_mode_suites));
15495 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15496 	ret = unit_test_suite_runner(&ts);
15497 
15498 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15499 		FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
15500 				(*sched_mode_suites[sched_i]),
15501 				RTE_DIM(blk_suites));
15502 		free(sched_mode_suites[sched_i]->unit_test_suites);
15503 	}
15504 	free(ts.unit_test_suites);
15505 	return ret;
15506 }
15507 
15508 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
15509 
15510 #endif
15511 
15512 static int
15513 test_cryptodev_dpaa2_sec(void)
15514 {
15515 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
15516 }
15517 
15518 static int
15519 test_cryptodev_dpaa_sec(void)
15520 {
15521 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
15522 }
15523 
15524 static int
15525 test_cryptodev_ccp(void)
15526 {
15527 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
15528 }
15529 
15530 static int
15531 test_cryptodev_octeontx(void)
15532 {
15533 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
15534 }
15535 
15536 static int
15537 test_cryptodev_octeontx2(void)
15538 {
15539 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
15540 }
15541 
15542 static int
15543 test_cryptodev_caam_jr(void)
15544 {
15545 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
15546 }
15547 
15548 static int
15549 test_cryptodev_nitrox(void)
15550 {
15551 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
15552 }
15553 
15554 static int
15555 test_cryptodev_bcmfs(void)
15556 {
15557 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
15558 }
15559 
15560 static int
15561 test_cryptodev_qat_raw_api(void)
15562 {
15563 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
15564 	int ret;
15565 
15566 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15567 			"RAW API");
15568 	if (ret)
15569 		return ret;
15570 
15571 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
15572 	ret = run_cryptodev_testsuite(pmd_name);
15573 	global_api_test_type = CRYPTODEV_API_TEST;
15574 
15575 	return ret;
15576 }
15577 
15578 static int
15579 test_cryptodev_cn9k(void)
15580 {
15581 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
15582 }
15583 
15584 static int
15585 test_cryptodev_cn10k(void)
15586 {
15587 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
15588 }
15589 
15590 static int
15591 test_cryptodev_dpaa2_sec_raw_api(void)
15592 {
15593 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
15594 	int ret;
15595 
15596 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15597 			"RAW API");
15598 	if (ret)
15599 		return ret;
15600 
15601 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
15602 	ret = run_cryptodev_testsuite(pmd_name);
15603 	global_api_test_type = CRYPTODEV_API_TEST;
15604 
15605 	return ret;
15606 }
15607 
15608 static int
15609 test_cryptodev_dpaa_sec_raw_api(void)
15610 {
15611 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
15612 	int ret;
15613 
15614 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15615 			"RAW API");
15616 	if (ret)
15617 		return ret;
15618 
15619 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
15620 	ret = run_cryptodev_testsuite(pmd_name);
15621 	global_api_test_type = CRYPTODEV_API_TEST;
15622 
15623 	return ret;
15624 }
15625 
15626 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest,
15627 		test_cryptodev_dpaa2_sec_raw_api);
15628 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest,
15629 		test_cryptodev_dpaa_sec_raw_api);
15630 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
15631 		test_cryptodev_qat_raw_api);
15632 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
15633 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
15634 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
15635 	test_cryptodev_cpu_aesni_mb);
15636 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
15637 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
15638 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
15639 	test_cryptodev_cpu_aesni_gcm);
15640 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
15641 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
15642 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
15643 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
15644 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
15645 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
15646 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
15647 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
15648 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
15649 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
15650 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
15651 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
15652 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
15653 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
15654 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
15655 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
15656 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
15657 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);
15658