xref: /dpdk/app/test/test_cryptodev_blockcipher.c (revision 4acc862b18a2f1691d1561f7b75542f6a056d41f)
1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2a9de470cSBruce Richardson  * Copyright(c) 2015-2017 Intel Corporation
3a9de470cSBruce Richardson  */
4a9de470cSBruce Richardson 
5a9de470cSBruce Richardson #include <rte_common.h>
6a9de470cSBruce Richardson #include <rte_hexdump.h>
7a9de470cSBruce Richardson #include <rte_mbuf.h>
8a9de470cSBruce Richardson #include <rte_malloc.h>
9a9de470cSBruce Richardson #include <rte_memcpy.h>
10a9de470cSBruce Richardson #include <rte_pause.h>
11a9de470cSBruce Richardson 
12a9de470cSBruce Richardson #include <rte_crypto.h>
13a9de470cSBruce Richardson #include <rte_cryptodev.h>
14a9de470cSBruce Richardson 
15a9de470cSBruce Richardson #include "test.h"
16a9de470cSBruce Richardson #include "test_cryptodev.h"
17a9de470cSBruce Richardson #include "test_cryptodev_blockcipher.h"
18a9de470cSBruce Richardson #include "test_cryptodev_aes_test_vectors.h"
19a9de470cSBruce Richardson #include "test_cryptodev_des_test_vectors.h"
20a9de470cSBruce Richardson #include "test_cryptodev_hash_test_vectors.h"
211daecf63SSunyang Wu #include "test_cryptodev_sm4_test_vectors.h"
22a9de470cSBruce Richardson 
23a9de470cSBruce Richardson static int
2493982b21SPablo de Lara verify_algo_support(const struct blockcipher_test_case *t,
2593982b21SPablo de Lara 		const uint8_t dev_id, const uint32_t digest_len)
2693982b21SPablo de Lara {
2793982b21SPablo de Lara 	int ret = 0;
2893982b21SPablo de Lara 	const struct blockcipher_test_data *tdata = t->test_data;
2993982b21SPablo de Lara 	struct rte_cryptodev_sym_capability_idx cap_idx;
3093982b21SPablo de Lara 	const struct rte_cryptodev_symmetric_capability *capability;
3193982b21SPablo de Lara 
3293982b21SPablo de Lara 	if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) {
3393982b21SPablo de Lara 		cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3493982b21SPablo de Lara 		cap_idx.algo.cipher = tdata->crypto_algo;
3593982b21SPablo de Lara 		capability = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);
3693982b21SPablo de Lara 		if (capability == NULL)
3793982b21SPablo de Lara 			return -1;
3893982b21SPablo de Lara 
39d5728a5aSShiri Kuzin 		if (cap_idx.algo.cipher != RTE_CRYPTO_CIPHER_NULL &&
40d5728a5aSShiri Kuzin 				!(t->test_data->wrapped_key))
4193982b21SPablo de Lara 			ret = rte_cryptodev_sym_capability_check_cipher(capability,
4293982b21SPablo de Lara 							tdata->cipher_key.len,
4393982b21SPablo de Lara 							tdata->iv.len);
4493982b21SPablo de Lara 		if (ret != 0)
4593982b21SPablo de Lara 			return -1;
4693982b21SPablo de Lara 	}
4793982b21SPablo de Lara 
4893982b21SPablo de Lara 	if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH) {
4993982b21SPablo de Lara 		cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5093982b21SPablo de Lara 		cap_idx.algo.auth = tdata->auth_algo;
5193982b21SPablo de Lara 		capability = rte_cryptodev_sym_capability_get(dev_id, &cap_idx);
5293982b21SPablo de Lara 		if (capability == NULL)
5393982b21SPablo de Lara 			return -1;
5493982b21SPablo de Lara 
5593982b21SPablo de Lara 		if (cap_idx.algo.auth != RTE_CRYPTO_AUTH_NULL)
5693982b21SPablo de Lara 			ret = rte_cryptodev_sym_capability_check_auth(capability,
5793982b21SPablo de Lara 							tdata->auth_key.len,
5893982b21SPablo de Lara 							digest_len,
5993982b21SPablo de Lara 							0);
6093982b21SPablo de Lara 		if (ret != 0)
6193982b21SPablo de Lara 			return -1;
6293982b21SPablo de Lara 	}
6393982b21SPablo de Lara 
6493982b21SPablo de Lara 	return 0;
6593982b21SPablo de Lara }
6693982b21SPablo de Lara 
6793982b21SPablo de Lara static int
68a9de470cSBruce Richardson test_blockcipher_one_case(const struct blockcipher_test_case *t,
69a9de470cSBruce Richardson 	struct rte_mempool *mbuf_pool,
70a9de470cSBruce Richardson 	struct rte_mempool *op_mpool,
71a9de470cSBruce Richardson 	struct rte_mempool *sess_mpool,
72a9de470cSBruce Richardson 	uint8_t dev_id,
73a9de470cSBruce Richardson 	char *test_msg)
74a9de470cSBruce Richardson {
75a9de470cSBruce Richardson 	struct rte_mbuf *ibuf = NULL;
76a9de470cSBruce Richardson 	struct rte_mbuf *obuf = NULL;
77a9de470cSBruce Richardson 	struct rte_mbuf *iobuf;
78a9de470cSBruce Richardson 	struct rte_crypto_sym_xform *cipher_xform = NULL;
79a9de470cSBruce Richardson 	struct rte_crypto_sym_xform *auth_xform = NULL;
80a9de470cSBruce Richardson 	struct rte_crypto_sym_xform *init_xform = NULL;
81a9de470cSBruce Richardson 	struct rte_crypto_sym_op *sym_op = NULL;
82a9de470cSBruce Richardson 	struct rte_crypto_op *op = NULL;
83a9de470cSBruce Richardson 	struct rte_cryptodev_info dev_info;
842a440d6aSAkhil Goyal 	void *sess = NULL;
85a9de470cSBruce Richardson 
86a9de470cSBruce Richardson 	int status = TEST_SUCCESS;
87a9de470cSBruce Richardson 	const struct blockcipher_test_data *tdata = t->test_data;
88a9de470cSBruce Richardson 	uint8_t cipher_key[tdata->cipher_key.len];
89a9de470cSBruce Richardson 	uint8_t auth_key[tdata->auth_key.len];
90a9de470cSBruce Richardson 	uint32_t buf_len = tdata->ciphertext.len;
91b4c469ecSPablo de Lara 	uint32_t digest_len = tdata->digest.len;
92a9de470cSBruce Richardson 	char *buf_p = NULL;
93a9de470cSBruce Richardson 	uint8_t src_pattern = 0xa5;
94a9de470cSBruce Richardson 	uint8_t dst_pattern = 0xb6;
95a9de470cSBruce Richardson 	uint8_t tmp_src_buf[MBUF_SIZE];
96a9de470cSBruce Richardson 	uint8_t tmp_dst_buf[MBUF_SIZE];
976356c286STejasree Kondoj 	uint32_t pad_len;
98a9de470cSBruce Richardson 
9963e1fbc3SCiara Power 	int nb_segs_in = 1;
10063e1fbc3SCiara Power 	int nb_segs_out = 1;
10163e1fbc3SCiara Power 	uint64_t sgl_type = t->sgl_flag;
1025e73a1f8SFan Zhang 	uint32_t nb_iterates = 0;
103a9de470cSBruce Richardson 
104a9de470cSBruce Richardson 	rte_cryptodev_info_get(dev_id, &dev_info);
105a9de470cSBruce Richardson 	uint64_t feat_flags = dev_info.feature_flags;
106afcfa2fdSPablo de Lara 
107afcfa2fdSPablo de Lara 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) {
108afcfa2fdSPablo de Lara 		if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
109bf5c7112SCiara Power 			printf("Device doesn't support sessionless operations "
110afcfa2fdSPablo de Lara 				"Test Skipped.\n");
111afcfa2fdSPablo de Lara 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
112afcfa2fdSPablo de Lara 				"SKIPPED");
113cf43d9d0SAkhil Goyal 			return TEST_SKIPPED;
114afcfa2fdSPablo de Lara 		}
115afcfa2fdSPablo de Lara 	}
1166356c286STejasree Kondoj 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_DIGEST_ENCRYPTED) {
1176356c286STejasree Kondoj 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
1186356c286STejasree Kondoj 			printf("Device doesn't support encrypted digest "
1196356c286STejasree Kondoj 				"Test Skipped.\n");
1206356c286STejasree Kondoj 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
1216356c286STejasree Kondoj 				"SKIPPED");
1226356c286STejasree Kondoj 			return TEST_SKIPPED;
1236356c286STejasree Kondoj 		}
1246356c286STejasree Kondoj 	}
125afcfa2fdSPablo de Lara 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SG) {
12663e1fbc3SCiara Power 		if (sgl_type == 0) {
12763e1fbc3SCiara Power 			if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP)
12863e1fbc3SCiara Power 				sgl_type = RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT;
12963e1fbc3SCiara Power 			else
13063e1fbc3SCiara Power 				sgl_type = RTE_CRYPTODEV_FF_IN_PLACE_SGL;
13163e1fbc3SCiara Power 		}
132a9de470cSBruce Richardson 
13363e1fbc3SCiara Power 		if (!(feat_flags & sgl_type)) {
13463e1fbc3SCiara Power 			printf("Device doesn't support scatter-gather type."
135a9de470cSBruce Richardson 				" Test Skipped.\n");
13693982b21SPablo de Lara 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
13793982b21SPablo de Lara 				"SKIPPED");
138cf43d9d0SAkhil Goyal 			return TEST_SKIPPED;
139a9de470cSBruce Richardson 		}
14063e1fbc3SCiara Power 
14163e1fbc3SCiara Power 		if (sgl_type == RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT ||
14263e1fbc3SCiara Power 				sgl_type == RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT ||
14363e1fbc3SCiara Power 				sgl_type == RTE_CRYPTODEV_FF_IN_PLACE_SGL)
14463e1fbc3SCiara Power 			nb_segs_in = t->sgl_segs == 0 ? 3 : t->sgl_segs;
14563e1fbc3SCiara Power 
14663e1fbc3SCiara Power 		if (sgl_type == RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT ||
14763e1fbc3SCiara Power 				sgl_type == RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)
14863e1fbc3SCiara Power 			nb_segs_out = t->sgl_segs == 0 ? 3 : t->sgl_segs;
149a9de470cSBruce Richardson 	}
150a9de470cSBruce Richardson 
151d5728a5aSShiri Kuzin 	if (!!(feat_flags & RTE_CRYPTODEV_FF_CIPHER_WRAPPED_KEY) ^
152d5728a5aSShiri Kuzin 		tdata->wrapped_key) {
153d5728a5aSShiri Kuzin 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
154d5728a5aSShiri Kuzin 			"SKIPPED");
155d5728a5aSShiri Kuzin 		return TEST_SKIPPED;
156d5728a5aSShiri Kuzin 	}
157a9de470cSBruce Richardson 
1584868f659SFan Zhang 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST &&
1594868f659SFan Zhang 		!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)) {
1604868f659SFan Zhang 		printf("Device doesn't support raw data-path APIs. "
1614868f659SFan Zhang 			"Test Skipped.\n");
1624868f659SFan Zhang 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "SKIPPED");
1634868f659SFan Zhang 		return TEST_SKIPPED;
1644868f659SFan Zhang 	}
1654868f659SFan Zhang 
16655be2162SPablo de Lara 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
16755be2162SPablo de Lara 		uint64_t oop_flags = RTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT |
16855be2162SPablo de Lara 			RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT |
16955be2162SPablo de Lara 			RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT |
17055be2162SPablo de Lara 			RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT;
17155be2162SPablo de Lara 		if (!(feat_flags & oop_flags)) {
17255be2162SPablo de Lara 			printf("Device doesn't support out-of-place operations."
17355be2162SPablo de Lara 				"Test Skipped.\n");
17455be2162SPablo de Lara 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
17555be2162SPablo de Lara 				"SKIPPED");
176cf43d9d0SAkhil Goyal 			return TEST_SKIPPED;
17755be2162SPablo de Lara 		}
1784868f659SFan Zhang 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
1794868f659SFan Zhang 			printf("Raw Data Path APIs do not support OOP, "
1804868f659SFan Zhang 				"Test Skipped.\n");
1814868f659SFan Zhang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "SKIPPED");
182085f128aSCiara Power 			status = TEST_SKIPPED;
1834868f659SFan Zhang 			goto error_exit;
1844868f659SFan Zhang 		}
18555be2162SPablo de Lara 	}
18655be2162SPablo de Lara 
187a9de470cSBruce Richardson 	if (tdata->cipher_key.len)
188a9de470cSBruce Richardson 		memcpy(cipher_key, tdata->cipher_key.data,
189a9de470cSBruce Richardson 			tdata->cipher_key.len);
190a9de470cSBruce Richardson 	if (tdata->auth_key.len)
191a9de470cSBruce Richardson 		memcpy(auth_key, tdata->auth_key.data,
192a9de470cSBruce Richardson 			tdata->auth_key.len);
193a9de470cSBruce Richardson 
19493982b21SPablo de Lara 	/* Check if PMD is capable of performing that test */
19593982b21SPablo de Lara 	if (verify_algo_support(t, dev_id, digest_len) < 0) {
19693982b21SPablo de Lara 		RTE_LOG(DEBUG, USER1,
19793982b21SPablo de Lara 			"Device does not support this algorithm."
19893982b21SPablo de Lara 			"Test Skipped.\n");
19993982b21SPablo de Lara 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "SKIPPED");
200cf43d9d0SAkhil Goyal 		return TEST_SKIPPED;
20193982b21SPablo de Lara 	}
20293982b21SPablo de Lara 
203a9de470cSBruce Richardson 	/* preparing data */
204a9de470cSBruce Richardson 	if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH)
205a9de470cSBruce Richardson 		buf_len += digest_len;
206a9de470cSBruce Richardson 
2076356c286STejasree Kondoj 	pad_len = RTE_ALIGN(buf_len, 16) - buf_len;
2086356c286STejasree Kondoj 	if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED)
2096356c286STejasree Kondoj 		buf_len += pad_len;
2106356c286STejasree Kondoj 
211a9de470cSBruce Richardson 	/* for contiguous mbuf, nb_segs is 1 */
212a9de470cSBruce Richardson 	ibuf = create_segmented_mbuf(mbuf_pool,
21363e1fbc3SCiara Power 			tdata->ciphertext.len, nb_segs_in, src_pattern);
214a9de470cSBruce Richardson 	if (ibuf == NULL) {
215a9de470cSBruce Richardson 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
216a9de470cSBruce Richardson 			"line %u FAILED: %s",
217a9de470cSBruce Richardson 			__LINE__, "Cannot create source mbuf");
218a9de470cSBruce Richardson 		status = TEST_FAILED;
219a9de470cSBruce Richardson 		goto error_exit;
220a9de470cSBruce Richardson 	}
221a9de470cSBruce Richardson 
222a9de470cSBruce Richardson 	/* only encryption requires plaintext.data input,
223a9de470cSBruce Richardson 	 * decryption/(digest gen)/(digest verify) use ciphertext.data
224a9de470cSBruce Richardson 	 * to be computed
225a9de470cSBruce Richardson 	 */
226a9de470cSBruce Richardson 	if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT)
227a9de470cSBruce Richardson 		pktmbuf_write(ibuf, 0, tdata->plaintext.len,
228a9de470cSBruce Richardson 				tdata->plaintext.data);
229a9de470cSBruce Richardson 	else
230a9de470cSBruce Richardson 		pktmbuf_write(ibuf, 0, tdata->ciphertext.len,
231a9de470cSBruce Richardson 				tdata->ciphertext.data);
232a9de470cSBruce Richardson 
233a9de470cSBruce Richardson 	buf_p = rte_pktmbuf_append(ibuf, digest_len);
234a9de470cSBruce Richardson 	if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY)
2356356c286STejasree Kondoj 		if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED)
2366356c286STejasree Kondoj 			rte_memcpy(buf_p,
2376356c286STejasree Kondoj 				tdata->ciphertext.data + tdata->ciphertext.len,
2386356c286STejasree Kondoj 				 digest_len);
2396356c286STejasree Kondoj 		else
240a9de470cSBruce Richardson 			rte_memcpy(buf_p, tdata->digest.data, digest_len);
241a9de470cSBruce Richardson 	else
242a9de470cSBruce Richardson 		memset(buf_p, 0, digest_len);
2436356c286STejasree Kondoj 	if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED) {
2446356c286STejasree Kondoj 		buf_p = rte_pktmbuf_append(ibuf, pad_len);
2456356c286STejasree Kondoj 		if (!buf_p) {
2466356c286STejasree Kondoj 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
2476356c286STejasree Kondoj 				"FAILED: %s", __LINE__,
2486356c286STejasree Kondoj 				"No room to append mbuf");
2496356c286STejasree Kondoj 			status = TEST_FAILED;
2506356c286STejasree Kondoj 			goto error_exit;
2516356c286STejasree Kondoj 		}
2526356c286STejasree Kondoj 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY) {
2536356c286STejasree Kondoj 			const uint8_t *temp_p = tdata->ciphertext.data +
2546356c286STejasree Kondoj 					tdata->ciphertext.len +
2556356c286STejasree Kondoj 					digest_len;
2566356c286STejasree Kondoj 			rte_memcpy(buf_p, temp_p, pad_len);
2576356c286STejasree Kondoj 		} else
2586356c286STejasree Kondoj 			memset(buf_p, 0xa5, pad_len);
2596356c286STejasree Kondoj 	}
260a9de470cSBruce Richardson 
261a9de470cSBruce Richardson 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
26263e1fbc3SCiara Power 		obuf = create_segmented_mbuf(mbuf_pool,
26363e1fbc3SCiara Power 			tdata->ciphertext.len, nb_segs_out, dst_pattern);
264a9de470cSBruce Richardson 		if (!obuf) {
265a9de470cSBruce Richardson 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
266a9de470cSBruce Richardson 				"FAILED: %s", __LINE__,
267a9de470cSBruce Richardson 				"Allocation of rte_mbuf failed");
268a9de470cSBruce Richardson 			status = TEST_FAILED;
269a9de470cSBruce Richardson 			goto error_exit;
270a9de470cSBruce Richardson 		}
271a9de470cSBruce Richardson 		memset(obuf->buf_addr, dst_pattern, obuf->buf_len);
272a9de470cSBruce Richardson 
2730e51e342SGagandeep Singh 		if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED)
2746356c286STejasree Kondoj 			buf_p = rte_pktmbuf_append(obuf, buf_len + pad_len);
2750e51e342SGagandeep Singh 		else
2760e51e342SGagandeep Singh 			buf_p = rte_pktmbuf_append(obuf, buf_len);
277a9de470cSBruce Richardson 		if (!buf_p) {
278a9de470cSBruce Richardson 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
279a9de470cSBruce Richardson 				"FAILED: %s", __LINE__,
280a9de470cSBruce Richardson 				"No room to append mbuf");
281a9de470cSBruce Richardson 			status = TEST_FAILED;
282a9de470cSBruce Richardson 			goto error_exit;
283a9de470cSBruce Richardson 		}
284a9de470cSBruce Richardson 		memset(buf_p, 0, buf_len);
285a9de470cSBruce Richardson 	}
286a9de470cSBruce Richardson 
287a9de470cSBruce Richardson 	/* Generate Crypto op data structure */
288a9de470cSBruce Richardson 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
289a9de470cSBruce Richardson 	if (!op) {
290a9de470cSBruce Richardson 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
291a9de470cSBruce Richardson 			"line %u FAILED: %s",
292a9de470cSBruce Richardson 			__LINE__, "Failed to allocate symmetric crypto "
293a9de470cSBruce Richardson 			"operation struct");
294a9de470cSBruce Richardson 		status = TEST_FAILED;
295a9de470cSBruce Richardson 		goto error_exit;
296a9de470cSBruce Richardson 	}
297a9de470cSBruce Richardson 
298a9de470cSBruce Richardson 	sym_op = op->sym;
299a9de470cSBruce Richardson 
3005e73a1f8SFan Zhang iterate:
3015e73a1f8SFan Zhang 	if (nb_iterates) {
3025e73a1f8SFan Zhang 		struct rte_mbuf *tmp_buf = ibuf;
3035e73a1f8SFan Zhang 
3045e73a1f8SFan Zhang 		ibuf = obuf;
3055e73a1f8SFan Zhang 		obuf = tmp_buf;
3065e73a1f8SFan Zhang 
3075e73a1f8SFan Zhang 		rte_pktmbuf_reset(ibuf);
3085e73a1f8SFan Zhang 		rte_pktmbuf_reset(obuf);
3095e73a1f8SFan Zhang 
3105e73a1f8SFan Zhang 		rte_pktmbuf_append(ibuf, tdata->ciphertext.len);
3115e73a1f8SFan Zhang 
3125e73a1f8SFan Zhang 		/* only encryption requires plaintext.data input,
3135e73a1f8SFan Zhang 		 * decryption/(digest gen)/(digest verify) use ciphertext.data
3145e73a1f8SFan Zhang 		 * to be computed
3155e73a1f8SFan Zhang 		 */
3165e73a1f8SFan Zhang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT)
3175e73a1f8SFan Zhang 			pktmbuf_write(ibuf, 0, tdata->plaintext.len,
3185e73a1f8SFan Zhang 					tdata->plaintext.data);
3195e73a1f8SFan Zhang 		else
3205e73a1f8SFan Zhang 			pktmbuf_write(ibuf, 0, tdata->ciphertext.len,
3215e73a1f8SFan Zhang 					tdata->ciphertext.data);
3225e73a1f8SFan Zhang 
3235e73a1f8SFan Zhang 		buf_p = rte_pktmbuf_append(ibuf, digest_len);
3245e73a1f8SFan Zhang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY)
3255e73a1f8SFan Zhang 			rte_memcpy(buf_p, tdata->digest.data, digest_len);
3265e73a1f8SFan Zhang 		else
3275e73a1f8SFan Zhang 			memset(buf_p, 0, digest_len);
3285e73a1f8SFan Zhang 
3295e73a1f8SFan Zhang 		memset(obuf->buf_addr, dst_pattern, obuf->buf_len);
3305e73a1f8SFan Zhang 
3315e73a1f8SFan Zhang 		buf_p = rte_pktmbuf_append(obuf, buf_len);
3325e73a1f8SFan Zhang 		if (!buf_p) {
3335e73a1f8SFan Zhang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
3345e73a1f8SFan Zhang 				"FAILED: %s", __LINE__,
3355e73a1f8SFan Zhang 				"No room to append mbuf");
3365e73a1f8SFan Zhang 			status = TEST_FAILED;
3375e73a1f8SFan Zhang 			goto error_exit;
3385e73a1f8SFan Zhang 		}
3395e73a1f8SFan Zhang 		memset(buf_p, 0, buf_len);
3405e73a1f8SFan Zhang 	}
3415e73a1f8SFan Zhang 
342a9de470cSBruce Richardson 	sym_op->m_src = ibuf;
343a9de470cSBruce Richardson 
344a9de470cSBruce Richardson 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
345a9de470cSBruce Richardson 		sym_op->m_dst = obuf;
346a9de470cSBruce Richardson 		iobuf = obuf;
347a9de470cSBruce Richardson 	} else {
348a9de470cSBruce Richardson 		sym_op->m_dst = NULL;
349a9de470cSBruce Richardson 		iobuf = ibuf;
350a9de470cSBruce Richardson 	}
351a9de470cSBruce Richardson 
352a9de470cSBruce Richardson 	/* sessionless op requires allocate xform using
353a9de470cSBruce Richardson 	 * rte_crypto_op_sym_xforms_alloc(), otherwise rte_zmalloc()
354a9de470cSBruce Richardson 	 * is used
355a9de470cSBruce Richardson 	 */
356a9de470cSBruce Richardson 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) {
357a9de470cSBruce Richardson 		uint32_t n_xforms = 0;
358a9de470cSBruce Richardson 
359a9de470cSBruce Richardson 		if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER)
360a9de470cSBruce Richardson 			n_xforms++;
361a9de470cSBruce Richardson 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH)
362a9de470cSBruce Richardson 			n_xforms++;
363a9de470cSBruce Richardson 
364a9de470cSBruce Richardson 		if (rte_crypto_op_sym_xforms_alloc(op, n_xforms)
365a9de470cSBruce Richardson 			== NULL) {
366a9de470cSBruce Richardson 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
367a9de470cSBruce Richardson 				"FAILED: %s", __LINE__, "Failed to "
368a9de470cSBruce Richardson 				"allocate space for crypto transforms");
369a9de470cSBruce Richardson 			status = TEST_FAILED;
370a9de470cSBruce Richardson 			goto error_exit;
371a9de470cSBruce Richardson 		}
372a9de470cSBruce Richardson 	} else {
373a9de470cSBruce Richardson 		cipher_xform = rte_zmalloc(NULL,
374a9de470cSBruce Richardson 			sizeof(struct rte_crypto_sym_xform), 0);
375a9de470cSBruce Richardson 
376a9de470cSBruce Richardson 		auth_xform = rte_zmalloc(NULL,
377a9de470cSBruce Richardson 			sizeof(struct rte_crypto_sym_xform), 0);
378a9de470cSBruce Richardson 
379a9de470cSBruce Richardson 		if (!cipher_xform || !auth_xform) {
380a9de470cSBruce Richardson 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
381a9de470cSBruce Richardson 				"FAILED: %s", __LINE__, "Failed to "
382a9de470cSBruce Richardson 				"allocate memory for crypto transforms");
383a9de470cSBruce Richardson 			status = TEST_FAILED;
384a9de470cSBruce Richardson 			goto error_exit;
385a9de470cSBruce Richardson 		}
386a9de470cSBruce Richardson 	}
387a9de470cSBruce Richardson 
388a9de470cSBruce Richardson 	/* preparing xform, for sessioned op, init_xform is initialized
389a9de470cSBruce Richardson 	 * here and later as param in rte_cryptodev_sym_session_create() call
390a9de470cSBruce Richardson 	 */
391a9de470cSBruce Richardson 	if (t->op_mask == BLOCKCIPHER_TEST_OP_ENC_AUTH_GEN) {
392a9de470cSBruce Richardson 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) {
393a9de470cSBruce Richardson 			cipher_xform = op->sym->xform;
394a9de470cSBruce Richardson 			auth_xform = cipher_xform->next;
395a9de470cSBruce Richardson 			auth_xform->next = NULL;
396a9de470cSBruce Richardson 		} else {
397a9de470cSBruce Richardson 			cipher_xform->next = auth_xform;
398a9de470cSBruce Richardson 			auth_xform->next = NULL;
399a9de470cSBruce Richardson 			init_xform = cipher_xform;
400a9de470cSBruce Richardson 		}
401a9de470cSBruce Richardson 	} else if (t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_VERIFY_DEC) {
402a9de470cSBruce Richardson 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) {
403a9de470cSBruce Richardson 			auth_xform = op->sym->xform;
404a9de470cSBruce Richardson 			cipher_xform = auth_xform->next;
405a9de470cSBruce Richardson 			cipher_xform->next = NULL;
406a9de470cSBruce Richardson 		} else {
407a9de470cSBruce Richardson 			auth_xform->next = cipher_xform;
408a9de470cSBruce Richardson 			cipher_xform->next = NULL;
409a9de470cSBruce Richardson 			init_xform = auth_xform;
410a9de470cSBruce Richardson 		}
4116356c286STejasree Kondoj 	} else if (t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_GEN_ENC) {
4126356c286STejasree Kondoj 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) {
4136356c286STejasree Kondoj 			auth_xform = op->sym->xform;
4146356c286STejasree Kondoj 			cipher_xform = auth_xform->next;
4156356c286STejasree Kondoj 			cipher_xform->next = NULL;
4166356c286STejasree Kondoj 		} else {
4176356c286STejasree Kondoj 			auth_xform->next = cipher_xform;
4186356c286STejasree Kondoj 			cipher_xform->next = NULL;
4196356c286STejasree Kondoj 			init_xform = auth_xform;
4206356c286STejasree Kondoj 		}
4216356c286STejasree Kondoj 	} else if (t->op_mask == BLOCKCIPHER_TEST_OP_DEC_AUTH_VERIFY) {
4226356c286STejasree Kondoj 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) {
4236356c286STejasree Kondoj 			cipher_xform = op->sym->xform;
4246356c286STejasree Kondoj 			auth_xform = cipher_xform->next;
4256356c286STejasree Kondoj 			auth_xform->next = NULL;
4266356c286STejasree Kondoj 		} else {
4276356c286STejasree Kondoj 			cipher_xform->next = auth_xform;
4286356c286STejasree Kondoj 			auth_xform->next = NULL;
4296356c286STejasree Kondoj 			init_xform = cipher_xform;
4306356c286STejasree Kondoj 		}
431a9de470cSBruce Richardson 	} else if ((t->op_mask == BLOCKCIPHER_TEST_OP_ENCRYPT) ||
432a9de470cSBruce Richardson 			(t->op_mask == BLOCKCIPHER_TEST_OP_DECRYPT)) {
433a9de470cSBruce Richardson 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS)
434a9de470cSBruce Richardson 			cipher_xform = op->sym->xform;
435a9de470cSBruce Richardson 		else
436a9de470cSBruce Richardson 			init_xform = cipher_xform;
437a9de470cSBruce Richardson 		cipher_xform->next = NULL;
438a9de470cSBruce Richardson 	} else if ((t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_GEN) ||
439a9de470cSBruce Richardson 			(t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_VERIFY)) {
440a9de470cSBruce Richardson 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS)
441a9de470cSBruce Richardson 			auth_xform = op->sym->xform;
442a9de470cSBruce Richardson 		else
443a9de470cSBruce Richardson 			init_xform = auth_xform;
444a9de470cSBruce Richardson 		auth_xform->next = NULL;
445a9de470cSBruce Richardson 	} else {
446a9de470cSBruce Richardson 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
447a9de470cSBruce Richardson 			"line %u FAILED: %s",
448a9de470cSBruce Richardson 			__LINE__, "Unrecognized operation");
449a9de470cSBruce Richardson 		status = TEST_FAILED;
450a9de470cSBruce Richardson 		goto error_exit;
451a9de470cSBruce Richardson 	}
452a9de470cSBruce Richardson 
453a9de470cSBruce Richardson 	/*configure xforms & sym_op cipher and auth data*/
454a9de470cSBruce Richardson 	if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) {
455a9de470cSBruce Richardson 		cipher_xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
456a9de470cSBruce Richardson 		cipher_xform->cipher.algo = tdata->crypto_algo;
457a9de470cSBruce Richardson 		if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT)
458a9de470cSBruce Richardson 			cipher_xform->cipher.op =
459a9de470cSBruce Richardson 				RTE_CRYPTO_CIPHER_OP_ENCRYPT;
460a9de470cSBruce Richardson 		else
461a9de470cSBruce Richardson 			cipher_xform->cipher.op =
462a9de470cSBruce Richardson 				RTE_CRYPTO_CIPHER_OP_DECRYPT;
463a9de470cSBruce Richardson 		cipher_xform->cipher.key.data = cipher_key;
464a9de470cSBruce Richardson 		cipher_xform->cipher.key.length = tdata->cipher_key.len;
465a9de470cSBruce Richardson 		cipher_xform->cipher.iv.offset = IV_OFFSET;
466d5728a5aSShiri Kuzin 		cipher_xform->cipher.dataunit_len = tdata->xts_dataunit_len;
467d954825aSAnkur Dwivedi 
468d954825aSAnkur Dwivedi 		if (tdata->crypto_algo == RTE_CRYPTO_CIPHER_NULL)
469d954825aSAnkur Dwivedi 			cipher_xform->cipher.iv.length = 0;
470d954825aSAnkur Dwivedi 		else
471a9de470cSBruce Richardson 			cipher_xform->cipher.iv.length = tdata->iv.len;
472a9de470cSBruce Richardson 
4735e73a1f8SFan Zhang 		sym_op->cipher.data.offset = tdata->cipher_offset;
4745e73a1f8SFan Zhang 		sym_op->cipher.data.length = tdata->ciphertext.len -
4755e73a1f8SFan Zhang 				tdata->cipher_offset;
4766356c286STejasree Kondoj 		if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED) {
4776356c286STejasree Kondoj 			sym_op->cipher.data.length += tdata->digest.len;
4786356c286STejasree Kondoj 			sym_op->cipher.data.length += pad_len;
4796356c286STejasree Kondoj 		}
480a9de470cSBruce Richardson 		rte_memcpy(rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFFSET),
481a9de470cSBruce Richardson 				tdata->iv.data,
482a9de470cSBruce Richardson 				tdata->iv.len);
483a9de470cSBruce Richardson 	}
484a9de470cSBruce Richardson 
485a9de470cSBruce Richardson 	if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH) {
486a9de470cSBruce Richardson 		uint32_t digest_offset = tdata->ciphertext.len;
487a9de470cSBruce Richardson 
488a9de470cSBruce Richardson 		auth_xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
489a9de470cSBruce Richardson 		auth_xform->auth.algo = tdata->auth_algo;
490a9de470cSBruce Richardson 		auth_xform->auth.key.length = tdata->auth_key.len;
491a9de470cSBruce Richardson 		auth_xform->auth.key.data = auth_key;
492a9de470cSBruce Richardson 		auth_xform->auth.digest_length = digest_len;
493a9de470cSBruce Richardson 
494a9de470cSBruce Richardson 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN) {
495a9de470cSBruce Richardson 			auth_xform->auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
496a9de470cSBruce Richardson 			sym_op->auth.digest.data = pktmbuf_mtod_offset
497a9de470cSBruce Richardson 				(iobuf, digest_offset);
498a9de470cSBruce Richardson 			sym_op->auth.digest.phys_addr =
499a9de470cSBruce Richardson 				pktmbuf_iova_offset(iobuf,
500a9de470cSBruce Richardson 					digest_offset);
501a9de470cSBruce Richardson 		} else {
502a9de470cSBruce Richardson 			auth_xform->auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
503a9de470cSBruce Richardson 			sym_op->auth.digest.data = pktmbuf_mtod_offset
504a9de470cSBruce Richardson 				(sym_op->m_src, digest_offset);
505a9de470cSBruce Richardson 			sym_op->auth.digest.phys_addr =
506a9de470cSBruce Richardson 				pktmbuf_iova_offset(sym_op->m_src,
507a9de470cSBruce Richardson 					digest_offset);
508a9de470cSBruce Richardson 		}
509a9de470cSBruce Richardson 
5105e73a1f8SFan Zhang 		sym_op->auth.data.offset = tdata->auth_offset;
5115e73a1f8SFan Zhang 		sym_op->auth.data.length = tdata->ciphertext.len -
5125e73a1f8SFan Zhang 				tdata->auth_offset;
513a9de470cSBruce Richardson 	}
514a9de470cSBruce Richardson 
5155e73a1f8SFan Zhang 	/**
5165e73a1f8SFan Zhang 	 * Create session for sessioned op. For mbuf iteration test,
5175e73a1f8SFan Zhang 	 * skip the session creation for the second iteration.
5185e73a1f8SFan Zhang 	 */
5195e73a1f8SFan Zhang 	if (!(t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) &&
5205e73a1f8SFan Zhang 			nb_iterates == 0) {
521bdce2564SAkhil Goyal 		sess = rte_cryptodev_sym_session_create(dev_id, init_xform,
522bdce2564SAkhil Goyal 				sess_mpool);
523bdce2564SAkhil Goyal 		if (sess == NULL) {
524439d222bSAnkur Dwivedi 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "UNSUPPORTED");
525cf43d9d0SAkhil Goyal 			status = TEST_SKIPPED;
526439d222bSAnkur Dwivedi 			goto error_exit;
527439d222bSAnkur Dwivedi 		}
528439d222bSAnkur Dwivedi 		if (!sess || status < 0) {
529a9de470cSBruce Richardson 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
530a9de470cSBruce Richardson 				"FAILED: %s", __LINE__,
531a9de470cSBruce Richardson 				"Session creation failed");
532a9de470cSBruce Richardson 			status = TEST_FAILED;
533a9de470cSBruce Richardson 			goto error_exit;
534a9de470cSBruce Richardson 		}
535a9de470cSBruce Richardson 
536a9de470cSBruce Richardson 		/* attach symmetric crypto session to crypto operations */
537a9de470cSBruce Richardson 		rte_crypto_op_attach_sym_session(op, sess);
538a9de470cSBruce Richardson 	}
539a9de470cSBruce Richardson 
540a9de470cSBruce Richardson 	debug_hexdump(stdout, "m_src(before):",
541a9de470cSBruce Richardson 			sym_op->m_src->buf_addr, sym_op->m_src->buf_len);
542a9de470cSBruce Richardson 	rte_memcpy(tmp_src_buf, sym_op->m_src->buf_addr,
543a9de470cSBruce Richardson 						sym_op->m_src->buf_len);
544a9de470cSBruce Richardson 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
545a9de470cSBruce Richardson 		debug_hexdump(stdout, "m_dst(before):",
546a9de470cSBruce Richardson 			sym_op->m_dst->buf_addr, sym_op->m_dst->buf_len);
547a9de470cSBruce Richardson 		rte_memcpy(tmp_dst_buf, sym_op->m_dst->buf_addr,
548a9de470cSBruce Richardson 						sym_op->m_dst->buf_len);
549a9de470cSBruce Richardson 	}
550a9de470cSBruce Richardson 
551a9de470cSBruce Richardson 	/* Process crypto operation */
5524868f659SFan Zhang 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
5534868f659SFan Zhang 		uint8_t is_cipher = 0, is_auth = 0;
5544868f659SFan Zhang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER)
5554868f659SFan Zhang 			is_cipher = 1;
5564868f659SFan Zhang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH)
5574868f659SFan Zhang 			is_auth = 1;
5584868f659SFan Zhang 
5595080c984SAnoob Joseph 		status = process_sym_raw_dp_op(dev_id, 0, op, is_cipher, is_auth,
5605080c984SAnoob Joseph 					       0, tdata->iv.len);
5615080c984SAnoob Joseph 		if (status != TEST_SUCCESS) {
5625080c984SAnoob Joseph 			if (status == TEST_SKIPPED)
5635080c984SAnoob Joseph 				snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "SKIPPED");
5645080c984SAnoob Joseph 			else
5655080c984SAnoob Joseph 				snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "FAILED");
5665080c984SAnoob Joseph 
5675080c984SAnoob Joseph 			goto error_exit;
5685080c984SAnoob Joseph 		}
5694868f659SFan Zhang 	} else {
570a9de470cSBruce Richardson 		if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
571a9de470cSBruce Richardson 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
572a9de470cSBruce Richardson 				"line %u FAILED: %s",
573a9de470cSBruce Richardson 				__LINE__, "Error sending packet for encryption");
574a9de470cSBruce Richardson 			status = TEST_FAILED;
575a9de470cSBruce Richardson 			goto error_exit;
576a9de470cSBruce Richardson 		}
577a9de470cSBruce Richardson 
578a9de470cSBruce Richardson 		op = NULL;
579a9de470cSBruce Richardson 
580a9de470cSBruce Richardson 		while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
581a9de470cSBruce Richardson 			rte_pause();
582a9de470cSBruce Richardson 
583a9de470cSBruce Richardson 		if (!op) {
584a9de470cSBruce Richardson 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
585a9de470cSBruce Richardson 				"line %u FAILED: %s",
586a9de470cSBruce Richardson 				__LINE__, "Failed to process sym crypto op");
587a9de470cSBruce Richardson 			status = TEST_FAILED;
588a9de470cSBruce Richardson 			goto error_exit;
589a9de470cSBruce Richardson 		}
5904868f659SFan Zhang 	}
591a9de470cSBruce Richardson 
592a9de470cSBruce Richardson 	debug_hexdump(stdout, "m_src(after):",
593a9de470cSBruce Richardson 			sym_op->m_src->buf_addr, sym_op->m_src->buf_len);
594a9de470cSBruce Richardson 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP)
595a9de470cSBruce Richardson 		debug_hexdump(stdout, "m_dst(after):",
596a9de470cSBruce Richardson 			sym_op->m_dst->buf_addr, sym_op->m_dst->buf_len);
597a9de470cSBruce Richardson 
598a9de470cSBruce Richardson 	/* Verify results */
599a9de470cSBruce Richardson 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
600a9de470cSBruce Richardson 		if ((t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY) &&
601a9de470cSBruce Richardson 			(op->status == RTE_CRYPTO_OP_STATUS_AUTH_FAILED))
602a9de470cSBruce Richardson 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
603a9de470cSBruce Richardson 				"FAILED: Digest verification failed "
604a9de470cSBruce Richardson 				"(0x%X)", __LINE__, op->status);
605a9de470cSBruce Richardson 		else
606a9de470cSBruce Richardson 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
607a9de470cSBruce Richardson 				"FAILED: Operation failed "
608a9de470cSBruce Richardson 				"(0x%X)", __LINE__, op->status);
609a9de470cSBruce Richardson 		status = TEST_FAILED;
610a9de470cSBruce Richardson 		goto error_exit;
611a9de470cSBruce Richardson 	}
612a9de470cSBruce Richardson 
613a9de470cSBruce Richardson 	if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) {
614a9de470cSBruce Richardson 		uint8_t buffer[2048];
615a9de470cSBruce Richardson 		const uint8_t *compare_ref;
616a9de470cSBruce Richardson 		uint32_t compare_len;
617a9de470cSBruce Richardson 
618a9de470cSBruce Richardson 		if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT) {
6195e73a1f8SFan Zhang 			compare_ref = tdata->ciphertext.data +
6205e73a1f8SFan Zhang 					tdata->cipher_offset;
6215e73a1f8SFan Zhang 			compare_len = tdata->ciphertext.len -
6225e73a1f8SFan Zhang 					tdata->cipher_offset;
6236356c286STejasree Kondoj 			if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED)
6246356c286STejasree Kondoj 				compare_len += tdata->digest.len;
625a9de470cSBruce Richardson 		} else {
6265e73a1f8SFan Zhang 			compare_ref = tdata->plaintext.data +
6275e73a1f8SFan Zhang 					tdata->cipher_offset;
6285e73a1f8SFan Zhang 			compare_len = tdata->plaintext.len -
6295e73a1f8SFan Zhang 					tdata->cipher_offset;
630a9de470cSBruce Richardson 		}
631a9de470cSBruce Richardson 
6325e73a1f8SFan Zhang 		if (memcmp(rte_pktmbuf_read(iobuf, tdata->cipher_offset,
6335e73a1f8SFan Zhang 				compare_len, buffer), compare_ref,
6345e73a1f8SFan Zhang 				compare_len)) {
635a9de470cSBruce Richardson 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
636a9de470cSBruce Richardson 				"FAILED: %s", __LINE__,
637a9de470cSBruce Richardson 				"Crypto data not as expected");
638a9de470cSBruce Richardson 			status = TEST_FAILED;
639a9de470cSBruce Richardson 			goto error_exit;
640a9de470cSBruce Richardson 		}
641a9de470cSBruce Richardson 	}
642a9de470cSBruce Richardson 
6436356c286STejasree Kondoj 	/* Check digest data only in enc-then-auth_gen case.
6446356c286STejasree Kondoj 	 * In auth_gen-then-enc case, cipher text contains both encrypted
6456356c286STejasree Kondoj 	 * plain text and encrypted digest value. If cipher text is correct,
6466356c286STejasree Kondoj 	 * it implies digest is also generated properly.
6476356c286STejasree Kondoj 	 */
6486356c286STejasree Kondoj 	if (!(t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED))
649a9de470cSBruce Richardson 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN) {
650a9de470cSBruce Richardson 			uint8_t *auth_res = pktmbuf_mtod_offset(iobuf,
651a9de470cSBruce Richardson 						tdata->ciphertext.len);
652a9de470cSBruce Richardson 
653a9de470cSBruce Richardson 			if (memcmp(auth_res, tdata->digest.data, digest_len)) {
654a9de470cSBruce Richardson 				snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
655a9de470cSBruce Richardson 					"FAILED: %s", __LINE__, "Generated "
656a9de470cSBruce Richardson 					"digest data not as expected");
657a9de470cSBruce Richardson 				status = TEST_FAILED;
658a9de470cSBruce Richardson 				goto error_exit;
659a9de470cSBruce Richardson 			}
660a9de470cSBruce Richardson 		}
661a9de470cSBruce Richardson 
662a9de470cSBruce Richardson 	/* The only parts that should have changed in the buffer are
663a9de470cSBruce Richardson 	 * plaintext/ciphertext and digest.
664a9de470cSBruce Richardson 	 * In OOP only the dest buffer should change.
665a9de470cSBruce Richardson 	 */
666a9de470cSBruce Richardson 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
667a9de470cSBruce Richardson 		struct rte_mbuf *mbuf;
668a9de470cSBruce Richardson 		uint8_t value;
669a9de470cSBruce Richardson 		uint32_t head_unchanged_len, changed_len = 0;
670a9de470cSBruce Richardson 		uint32_t i;
671a9de470cSBruce Richardson 		uint32_t hdroom_used = 0, tlroom_used = 0;
672a9de470cSBruce Richardson 		uint32_t hdroom = 0;
673a9de470cSBruce Richardson 
674a9de470cSBruce Richardson 		mbuf = sym_op->m_src;
675a9de470cSBruce Richardson 		/*
676a9de470cSBruce Richardson 		 * Crypto PMDs specify the headroom & tailroom it would use
677a9de470cSBruce Richardson 		 * when processing the crypto operation. PMD is free to modify
678a9de470cSBruce Richardson 		 * this space, and so the verification check should skip that
679a9de470cSBruce Richardson 		 * block.
680a9de470cSBruce Richardson 		 */
681a9de470cSBruce Richardson 		hdroom_used = dev_info.min_mbuf_headroom_req;
682a9de470cSBruce Richardson 		tlroom_used = dev_info.min_mbuf_tailroom_req;
683a9de470cSBruce Richardson 
684a9de470cSBruce Richardson 		/* Get headroom */
685a9de470cSBruce Richardson 		hdroom = rte_pktmbuf_headroom(mbuf);
686a9de470cSBruce Richardson 
687a9de470cSBruce Richardson 		head_unchanged_len = mbuf->buf_len;
688a9de470cSBruce Richardson 
689a9de470cSBruce Richardson 		for (i = 0; i < mbuf->buf_len; i++) {
690a9de470cSBruce Richardson 
691a9de470cSBruce Richardson 			/* Skip headroom used by PMD */
692a9de470cSBruce Richardson 			if (i == hdroom - hdroom_used)
693a9de470cSBruce Richardson 				i += hdroom_used;
694a9de470cSBruce Richardson 
695a9de470cSBruce Richardson 			/* Skip tailroom used by PMD */
696a9de470cSBruce Richardson 			if (i == (hdroom + mbuf->data_len))
697a9de470cSBruce Richardson 				i += tlroom_used;
698a9de470cSBruce Richardson 
699a9de470cSBruce Richardson 			value = *((uint8_t *)(mbuf->buf_addr)+i);
700a9de470cSBruce Richardson 			if (value != tmp_src_buf[i]) {
701a9de470cSBruce Richardson 				snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
702a9de470cSBruce Richardson 	"line %u FAILED: OOP src outer mbuf data (0x%x) not as expected (0x%x)",
703a9de470cSBruce Richardson 					__LINE__, value, tmp_src_buf[i]);
704a9de470cSBruce Richardson 				status = TEST_FAILED;
705a9de470cSBruce Richardson 				goto error_exit;
706a9de470cSBruce Richardson 			}
707a9de470cSBruce Richardson 		}
708a9de470cSBruce Richardson 
709a9de470cSBruce Richardson 		mbuf = sym_op->m_dst;
710a9de470cSBruce Richardson 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH) {
711a9de470cSBruce Richardson 			head_unchanged_len = hdroom + sym_op->auth.data.offset;
712a9de470cSBruce Richardson 			changed_len = sym_op->auth.data.length;
713a9de470cSBruce Richardson 			if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN)
714a9de470cSBruce Richardson 				changed_len += digest_len;
715a9de470cSBruce Richardson 		} else {
716a9de470cSBruce Richardson 			/* cipher-only */
717a9de470cSBruce Richardson 			head_unchanged_len = hdroom +
718a9de470cSBruce Richardson 					sym_op->cipher.data.offset;
719a9de470cSBruce Richardson 			changed_len = sym_op->cipher.data.length;
720a9de470cSBruce Richardson 		}
721a9de470cSBruce Richardson 
7226356c286STejasree Kondoj 		if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED)
7236356c286STejasree Kondoj 			changed_len = sym_op->cipher.data.length +
7246356c286STejasree Kondoj 				digest_len + pad_len;
7256356c286STejasree Kondoj 
726a9de470cSBruce Richardson 		for (i = 0; i < mbuf->buf_len; i++) {
727a9de470cSBruce Richardson 			if (i == head_unchanged_len)
728a9de470cSBruce Richardson 				i += changed_len;
729a9de470cSBruce Richardson 			value = *((uint8_t *)(mbuf->buf_addr)+i);
730a9de470cSBruce Richardson 			if (value != tmp_dst_buf[i]) {
731a9de470cSBruce Richardson 				snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
732a9de470cSBruce Richardson 				"line %u FAILED: OOP dst outer mbuf data "
733a9de470cSBruce Richardson 				"(0x%x) not as expected (0x%x)",
734a9de470cSBruce Richardson 				__LINE__, value, tmp_dst_buf[i]);
735a9de470cSBruce Richardson 				status = TEST_FAILED;
736a9de470cSBruce Richardson 				goto error_exit;
737a9de470cSBruce Richardson 			}
738a9de470cSBruce Richardson 		}
7395e73a1f8SFan Zhang 
7405e73a1f8SFan Zhang 		if (!nb_iterates) {
7415e73a1f8SFan Zhang 			nb_iterates++;
7425e73a1f8SFan Zhang 			goto iterate;
7435e73a1f8SFan Zhang 		}
744a9de470cSBruce Richardson 	} else {
745a9de470cSBruce Richardson 		/* In-place operation */
746a9de470cSBruce Richardson 		struct rte_mbuf *mbuf;
747a9de470cSBruce Richardson 		uint8_t value;
748a9de470cSBruce Richardson 		uint32_t head_unchanged_len = 0, changed_len = 0;
749a9de470cSBruce Richardson 		uint32_t i;
750a9de470cSBruce Richardson 		uint32_t hdroom_used = 0, tlroom_used = 0;
751a9de470cSBruce Richardson 		uint32_t hdroom = 0;
752a9de470cSBruce Richardson 
753a9de470cSBruce Richardson 		/*
754a9de470cSBruce Richardson 		 * Crypto PMDs specify the headroom & tailroom it would use
755a9de470cSBruce Richardson 		 * when processing the crypto operation. PMD is free to modify
756a9de470cSBruce Richardson 		 * this space, and so the verification check should skip that
757a9de470cSBruce Richardson 		 * block.
758a9de470cSBruce Richardson 		 */
759a9de470cSBruce Richardson 		hdroom_used = dev_info.min_mbuf_headroom_req;
760a9de470cSBruce Richardson 		tlroom_used = dev_info.min_mbuf_tailroom_req;
761a9de470cSBruce Richardson 
762a9de470cSBruce Richardson 		mbuf = sym_op->m_src;
763a9de470cSBruce Richardson 
764a9de470cSBruce Richardson 		/* Get headroom */
765a9de470cSBruce Richardson 		hdroom = rte_pktmbuf_headroom(mbuf);
766a9de470cSBruce Richardson 
767a9de470cSBruce Richardson 		if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) {
768a9de470cSBruce Richardson 			head_unchanged_len = hdroom +
769a9de470cSBruce Richardson 					sym_op->cipher.data.offset;
770a9de470cSBruce Richardson 			changed_len = sym_op->cipher.data.length;
771a9de470cSBruce Richardson 		} else {
772a9de470cSBruce Richardson 			/* auth-only */
773a9de470cSBruce Richardson 			head_unchanged_len = hdroom +
774a9de470cSBruce Richardson 					sym_op->auth.data.offset +
775a9de470cSBruce Richardson 					sym_op->auth.data.length;
776a9de470cSBruce Richardson 			changed_len = 0;
777a9de470cSBruce Richardson 		}
778a9de470cSBruce Richardson 
779a9de470cSBruce Richardson 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN)
780a9de470cSBruce Richardson 			changed_len += digest_len;
781a9de470cSBruce Richardson 
7826356c286STejasree Kondoj 		if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED)
7836356c286STejasree Kondoj 			changed_len = sym_op->cipher.data.length;
7846356c286STejasree Kondoj 
785a9de470cSBruce Richardson 		for (i = 0; i < mbuf->buf_len; i++) {
786a9de470cSBruce Richardson 
787a9de470cSBruce Richardson 			/* Skip headroom used by PMD */
788a9de470cSBruce Richardson 			if (i == hdroom - hdroom_used)
789a9de470cSBruce Richardson 				i += hdroom_used;
790a9de470cSBruce Richardson 
791a9de470cSBruce Richardson 			if (i == head_unchanged_len)
792a9de470cSBruce Richardson 				i += changed_len;
793a9de470cSBruce Richardson 
794a9de470cSBruce Richardson 			/* Skip tailroom used by PMD */
795a9de470cSBruce Richardson 			if (i == (hdroom + mbuf->data_len))
796a9de470cSBruce Richardson 				i += tlroom_used;
797a9de470cSBruce Richardson 
798a9de470cSBruce Richardson 			value = *((uint8_t *)(mbuf->buf_addr)+i);
799a9de470cSBruce Richardson 			if (value != tmp_src_buf[i]) {
800a9de470cSBruce Richardson 				snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
801a9de470cSBruce Richardson 				"line %u FAILED: outer mbuf data (0x%x) "
802a9de470cSBruce Richardson 				"not as expected (0x%x)",
803a9de470cSBruce Richardson 				__LINE__, value, tmp_src_buf[i]);
804a9de470cSBruce Richardson 				status = TEST_FAILED;
805a9de470cSBruce Richardson 				goto error_exit;
806a9de470cSBruce Richardson 			}
807a9de470cSBruce Richardson 		}
808a9de470cSBruce Richardson 	}
809a9de470cSBruce Richardson 
810a9de470cSBruce Richardson 	snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "PASS");
811a9de470cSBruce Richardson 
812a9de470cSBruce Richardson error_exit:
813a9de470cSBruce Richardson 	if (!(t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS)) {
814bdce2564SAkhil Goyal 		if (sess)
815bdce2564SAkhil Goyal 			rte_cryptodev_sym_session_free(dev_id, sess);
816a9de470cSBruce Richardson 		rte_free(cipher_xform);
817a9de470cSBruce Richardson 		rte_free(auth_xform);
818a9de470cSBruce Richardson 	}
819a9de470cSBruce Richardson 
820a9de470cSBruce Richardson 	rte_crypto_op_free(op);
821a9de470cSBruce Richardson 
822a9de470cSBruce Richardson 	rte_pktmbuf_free(obuf);
823a9de470cSBruce Richardson 
824a9de470cSBruce Richardson 	rte_pktmbuf_free(ibuf);
825a9de470cSBruce Richardson 
826a9de470cSBruce Richardson 	return status;
827a9de470cSBruce Richardson }
828a9de470cSBruce Richardson 
829e65da89cSCiara Power static int
830e65da89cSCiara Power blockcipher_test_case_run(const void *data)
831a9de470cSBruce Richardson {
832e65da89cSCiara Power 	const struct blockcipher_test_case *tc_data = data;
833e65da89cSCiara Power 	int status;
834a9de470cSBruce Richardson 	char test_msg[BLOCKCIPHER_TEST_MSG_LEN + 1];
835e65da89cSCiara Power 
836e65da89cSCiara Power 	status = test_blockcipher_one_case(tc_data,
837e65da89cSCiara Power 			p_testsuite_params->mbuf_pool,
838e65da89cSCiara Power 			p_testsuite_params->op_mpool,
839e65da89cSCiara Power 			p_testsuite_params->session_mpool,
840e65da89cSCiara Power 			p_testsuite_params->valid_devs[0],
841e65da89cSCiara Power 			test_msg);
842e65da89cSCiara Power 	return status;
843e65da89cSCiara Power }
844e65da89cSCiara Power 
845e65da89cSCiara Power static int
846e65da89cSCiara Power aes_chain_setup(void)
847e65da89cSCiara Power {
848e65da89cSCiara Power 	uint8_t dev_id = p_testsuite_params->valid_devs[0];
849e65da89cSCiara Power 	struct rte_cryptodev_info dev_info;
850e65da89cSCiara Power 	uint64_t feat_flags;
851e65da89cSCiara Power 	const enum rte_crypto_cipher_algorithm ciphers[] = {
852e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_NULL,
853e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_AES_CTR,
854e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_AES_CBC
855e65da89cSCiara Power 	};
856e65da89cSCiara Power 	const enum rte_crypto_auth_algorithm auths[] = {
857e65da89cSCiara Power 		RTE_CRYPTO_AUTH_NULL,
858e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA1_HMAC,
859e65da89cSCiara Power 		RTE_CRYPTO_AUTH_AES_XCBC_MAC,
860e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA256_HMAC,
861e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA512_HMAC,
862e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA224_HMAC,
863e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA384_HMAC
864e65da89cSCiara Power 	};
865e65da89cSCiara Power 
866e65da89cSCiara Power 	rte_cryptodev_info_get(dev_id, &dev_info);
867e65da89cSCiara Power 	feat_flags = dev_info.feature_flags;
868e65da89cSCiara Power 
869e65da89cSCiara Power 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
870e65da89cSCiara Power 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
871e65da89cSCiara Power 			!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
872e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES Chain "
873e65da89cSCiara Power 				"testsuite not met\n");
874e65da89cSCiara Power 		return TEST_SKIPPED;
875e65da89cSCiara Power 	}
876e65da89cSCiara Power 
877e65da89cSCiara Power 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
878e65da89cSCiara Power 			&& check_auth_capabilities_supported(auths,
879e65da89cSCiara Power 			RTE_DIM(auths)) != 0) {
880e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Capability requirements for AES Chain "
881e65da89cSCiara Power 				"testsuite not met\n");
882e65da89cSCiara Power 		return TEST_SKIPPED;
883e65da89cSCiara Power 	}
884e65da89cSCiara Power 
885e65da89cSCiara Power 	return 0;
886e65da89cSCiara Power }
887e65da89cSCiara Power 
888e65da89cSCiara Power static int
889e65da89cSCiara Power aes_cipheronly_setup(void)
890e65da89cSCiara Power {
891e65da89cSCiara Power 	uint8_t dev_id = p_testsuite_params->valid_devs[0];
892e65da89cSCiara Power 	struct rte_cryptodev_info dev_info;
893e65da89cSCiara Power 	uint64_t feat_flags;
894e65da89cSCiara Power 	const enum rte_crypto_cipher_algorithm ciphers[] = {
895e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_NULL,
896e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_AES_CTR,
897e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_AES_CBC,
898e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_AES_ECB,
899e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_AES_XTS
900e65da89cSCiara Power 	};
901e65da89cSCiara Power 	const enum rte_crypto_auth_algorithm auths[] = {
902e65da89cSCiara Power 		RTE_CRYPTO_AUTH_NULL,
903e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA1_HMAC,
904e65da89cSCiara Power 		RTE_CRYPTO_AUTH_AES_XCBC_MAC
905e65da89cSCiara Power 	};
906e65da89cSCiara Power 
907e65da89cSCiara Power 	rte_cryptodev_info_get(dev_id, &dev_info);
908e65da89cSCiara Power 	feat_flags = dev_info.feature_flags;
909e65da89cSCiara Power 
910e65da89cSCiara Power 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
911e65da89cSCiara Power 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
912e65da89cSCiara Power 			!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
913e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES Cipheronly "
914e65da89cSCiara Power 				"testsuite not met\n");
915e65da89cSCiara Power 		return TEST_SKIPPED;
916e65da89cSCiara Power 	}
917e65da89cSCiara Power 
918e65da89cSCiara Power 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
919e65da89cSCiara Power 			&& check_auth_capabilities_supported(auths,
920e65da89cSCiara Power 			RTE_DIM(auths)) != 0) {
921e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Capability requirements for AES Cipheronly "
922e65da89cSCiara Power 				"testsuite not met\n");
923e65da89cSCiara Power 		return TEST_SKIPPED;
924e65da89cSCiara Power 	}
925e65da89cSCiara Power 
926e65da89cSCiara Power 	return 0;
927e65da89cSCiara Power }
928e65da89cSCiara Power 
929e65da89cSCiara Power static int
930e65da89cSCiara Power aes_docsis_setup(void)
931e65da89cSCiara Power {
932e65da89cSCiara Power 	uint8_t dev_id = p_testsuite_params->valid_devs[0];
933e65da89cSCiara Power 	struct rte_cryptodev_info dev_info;
934e65da89cSCiara Power 	uint64_t feat_flags;
935e65da89cSCiara Power 	const enum rte_crypto_cipher_algorithm ciphers[] = {
936e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_AES_DOCSISBPI
937e65da89cSCiara Power 	};
938e65da89cSCiara Power 
939e65da89cSCiara Power 	rte_cryptodev_info_get(dev_id, &dev_info);
940e65da89cSCiara Power 	feat_flags = dev_info.feature_flags;
941e65da89cSCiara Power 
942e65da89cSCiara Power 	/* Data-path service does not support DOCSIS yet */
943e65da89cSCiara Power 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
944e65da89cSCiara Power 			(global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
945e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES Docsis "
946e65da89cSCiara Power 				"testsuite not met\n");
947e65da89cSCiara Power 		return TEST_SKIPPED;
948e65da89cSCiara Power 	}
949e65da89cSCiara Power 
950e65da89cSCiara Power 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
951e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Capability requirements for AES Docsis "
952e65da89cSCiara Power 				"testsuite not met\n");
953e65da89cSCiara Power 		return TEST_SKIPPED;
954e65da89cSCiara Power 	}
955e65da89cSCiara Power 
956e65da89cSCiara Power 	return 0;
957e65da89cSCiara Power }
958e65da89cSCiara Power 
959e65da89cSCiara Power static int
960e65da89cSCiara Power triple_des_chain_setup(void)
961e65da89cSCiara Power {
962e65da89cSCiara Power 	uint8_t dev_id = p_testsuite_params->valid_devs[0];
963e65da89cSCiara Power 	struct rte_cryptodev_info dev_info;
964e65da89cSCiara Power 	uint64_t feat_flags;
965e65da89cSCiara Power 	const enum rte_crypto_cipher_algorithm ciphers[] = {
966e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_3DES_CTR,
967e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_3DES_CBC
968e65da89cSCiara Power 	};
969e65da89cSCiara Power 	const enum rte_crypto_auth_algorithm auths[] = {
970e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA1_HMAC,
971e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA1
972e65da89cSCiara Power 	};
973e65da89cSCiara Power 
974e65da89cSCiara Power 	rte_cryptodev_info_get(dev_id, &dev_info);
975e65da89cSCiara Power 	feat_flags = dev_info.feature_flags;
976e65da89cSCiara Power 
977e65da89cSCiara Power 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
978e65da89cSCiara Power 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
979e65da89cSCiara Power 			!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
980e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Feature flag requirements for 3DES Chain "
981e65da89cSCiara Power 				"testsuite not met\n");
982e65da89cSCiara Power 		return TEST_SKIPPED;
983e65da89cSCiara Power 	}
984e65da89cSCiara Power 
985e65da89cSCiara Power 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
986e65da89cSCiara Power 			&& check_auth_capabilities_supported(auths,
987e65da89cSCiara Power 			RTE_DIM(auths)) != 0) {
988e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Capability requirements for 3DES Chain "
989e65da89cSCiara Power 				"testsuite not met\n");
990e65da89cSCiara Power 		return TEST_SKIPPED;
991e65da89cSCiara Power 	}
992e65da89cSCiara Power 
993e65da89cSCiara Power 	return 0;
994e65da89cSCiara Power }
995e65da89cSCiara Power 
996e65da89cSCiara Power static int
997e65da89cSCiara Power triple_des_cipheronly_setup(void)
998e65da89cSCiara Power {
999e65da89cSCiara Power 	uint8_t dev_id = p_testsuite_params->valid_devs[0];
1000e65da89cSCiara Power 	struct rte_cryptodev_info dev_info;
1001e65da89cSCiara Power 	uint64_t feat_flags;
1002e65da89cSCiara Power 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1003e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_3DES_CTR,
1004e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_3DES_CBC
1005e65da89cSCiara Power 	};
1006e65da89cSCiara Power 
1007e65da89cSCiara Power 	rte_cryptodev_info_get(dev_id, &dev_info);
1008e65da89cSCiara Power 	feat_flags = dev_info.feature_flags;
1009e65da89cSCiara Power 
1010e65da89cSCiara Power 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1011e65da89cSCiara Power 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1012e65da89cSCiara Power 			!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1013e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Feature flag requirements for 3DES "
1014e65da89cSCiara Power 				"Cipheronly testsuite not met\n");
1015e65da89cSCiara Power 		return TEST_SKIPPED;
1016e65da89cSCiara Power 	}
1017e65da89cSCiara Power 
1018e65da89cSCiara Power 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
1019e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Capability requirements for 3DES "
1020e65da89cSCiara Power 				"Cipheronly testsuite not met\n");
1021e65da89cSCiara Power 		return TEST_SKIPPED;
1022e65da89cSCiara Power 	}
1023e65da89cSCiara Power 
1024e65da89cSCiara Power 	return 0;
1025e65da89cSCiara Power }
1026e65da89cSCiara Power 
1027e65da89cSCiara Power static int
1028e65da89cSCiara Power des_cipheronly_setup(void)
1029e65da89cSCiara Power {
1030e65da89cSCiara Power 	uint8_t dev_id = p_testsuite_params->valid_devs[0];
1031e65da89cSCiara Power 	struct rte_cryptodev_info dev_info;
1032e65da89cSCiara Power 	uint64_t feat_flags;
1033e65da89cSCiara Power 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1034e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_DES_CBC
1035e65da89cSCiara Power 	};
1036e65da89cSCiara Power 
1037e65da89cSCiara Power 	rte_cryptodev_info_get(dev_id, &dev_info);
1038e65da89cSCiara Power 	feat_flags = dev_info.feature_flags;
1039e65da89cSCiara Power 
1040e65da89cSCiara Power 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1041e65da89cSCiara Power 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1042e65da89cSCiara Power 			!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1043e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Feature flag requirements for DES "
1044e65da89cSCiara Power 				"Cipheronly testsuite not met\n");
1045e65da89cSCiara Power 		return TEST_SKIPPED;
1046e65da89cSCiara Power 	}
1047e65da89cSCiara Power 
1048e65da89cSCiara Power 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
1049e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Capability requirements for DES "
1050e65da89cSCiara Power 				"Cipheronly testsuite not met\n");
1051e65da89cSCiara Power 		return TEST_SKIPPED;
1052e65da89cSCiara Power 	}
1053e65da89cSCiara Power 
1054e65da89cSCiara Power 	return 0;
1055e65da89cSCiara Power }
1056e65da89cSCiara Power 
1057e65da89cSCiara Power static int
1058e65da89cSCiara Power des_docsis_setup(void)
1059e65da89cSCiara Power {
1060e65da89cSCiara Power 	uint8_t dev_id = p_testsuite_params->valid_devs[0];
1061e65da89cSCiara Power 	struct rte_cryptodev_info dev_info;
1062e65da89cSCiara Power 	uint64_t feat_flags;
1063e65da89cSCiara Power 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1064e65da89cSCiara Power 		RTE_CRYPTO_CIPHER_DES_DOCSISBPI
1065e65da89cSCiara Power 	};
1066e65da89cSCiara Power 
1067e65da89cSCiara Power 	rte_cryptodev_info_get(dev_id, &dev_info);
1068e65da89cSCiara Power 	feat_flags = dev_info.feature_flags;
1069e65da89cSCiara Power 
1070e65da89cSCiara Power 	/* Data-path service does not support DOCSIS yet */
1071e65da89cSCiara Power 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1072e65da89cSCiara Power 			(global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1073e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Feature flag requirements for DES Docsis "
1074e65da89cSCiara Power 				"testsuite not met\n");
1075e65da89cSCiara Power 		return TEST_SKIPPED;
1076e65da89cSCiara Power 	}
1077e65da89cSCiara Power 
1078e65da89cSCiara Power 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
1079e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Capability requirements for DES Docsis "
1080e65da89cSCiara Power 				"testsuite not met\n");
1081e65da89cSCiara Power 		return TEST_SKIPPED;
1082e65da89cSCiara Power 	}
1083e65da89cSCiara Power 
1084e65da89cSCiara Power 	return 0;
1085e65da89cSCiara Power }
1086e65da89cSCiara Power 
1087e65da89cSCiara Power static int
1088e65da89cSCiara Power authonly_setup(void)
1089e65da89cSCiara Power {
1090e65da89cSCiara Power 	uint8_t dev_id = p_testsuite_params->valid_devs[0];
1091e65da89cSCiara Power 	struct rte_cryptodev_info dev_info;
1092e65da89cSCiara Power 	uint64_t feat_flags;
1093e65da89cSCiara Power 	const enum rte_crypto_auth_algorithm auths[] = {
1094e65da89cSCiara Power 		RTE_CRYPTO_AUTH_MD5,
1095e65da89cSCiara Power 		RTE_CRYPTO_AUTH_MD5_HMAC,
1096e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA1,
1097e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA1_HMAC,
1098e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA224,
1099e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA224_HMAC,
1100e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA256,
1101e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA256_HMAC,
1102e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA384,
1103e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA384_HMAC,
1104e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA512,
1105e65da89cSCiara Power 		RTE_CRYPTO_AUTH_SHA512_HMAC,
1106e65da89cSCiara Power 		RTE_CRYPTO_AUTH_AES_CMAC,
1107e65da89cSCiara Power 		RTE_CRYPTO_AUTH_NULL,
1108e65da89cSCiara Power 		RTE_CRYPTO_AUTH_AES_XCBC_MAC
1109e65da89cSCiara Power 	};
1110e65da89cSCiara Power 
1111e65da89cSCiara Power 	rte_cryptodev_info_get(dev_id, &dev_info);
1112e65da89cSCiara Power 	feat_flags = dev_info.feature_flags;
1113e65da89cSCiara Power 
1114e65da89cSCiara Power 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1115e65da89cSCiara Power 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1116e65da89cSCiara Power 			!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1117e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Feature flag requirements for Auth Only "
1118e65da89cSCiara Power 				"testsuite not met\n");
1119e65da89cSCiara Power 		return TEST_SKIPPED;
1120e65da89cSCiara Power 	}
1121e65da89cSCiara Power 
1122e65da89cSCiara Power 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1123e65da89cSCiara Power 		RTE_LOG(INFO, USER1, "Capability requirements for Auth Only "
1124e65da89cSCiara Power 				"testsuite not met\n");
1125e65da89cSCiara Power 		return TEST_SKIPPED;
1126e65da89cSCiara Power 	}
1127e65da89cSCiara Power 
1128e65da89cSCiara Power 	return 0;
1129e65da89cSCiara Power }
1130e65da89cSCiara Power 
11311daecf63SSunyang Wu static int
11321daecf63SSunyang Wu sm4_chain_setup(void)
11331daecf63SSunyang Wu {
11341daecf63SSunyang Wu 	uint8_t dev_id = p_testsuite_params->valid_devs[0];
11351daecf63SSunyang Wu 	struct rte_cryptodev_info dev_info;
11361daecf63SSunyang Wu 	uint64_t feat_flags;
11371daecf63SSunyang Wu 	const enum rte_crypto_cipher_algorithm ciphers[] = {
11381daecf63SSunyang Wu 		RTE_CRYPTO_CIPHER_SM4_CTR,
11391daecf63SSunyang Wu 		RTE_CRYPTO_CIPHER_SM4_CBC,
11401daecf63SSunyang Wu 		RTE_CRYPTO_CIPHER_SM4_OFB,
11411daecf63SSunyang Wu 		RTE_CRYPTO_CIPHER_SM4_CFB
11421daecf63SSunyang Wu 	};
11431daecf63SSunyang Wu 	const enum rte_crypto_auth_algorithm auths[] = {
11441daecf63SSunyang Wu 		RTE_CRYPTO_AUTH_SM3,
11451daecf63SSunyang Wu 		RTE_CRYPTO_AUTH_SM3_HMAC,
11461daecf63SSunyang Wu 	};
11471daecf63SSunyang Wu 
11481daecf63SSunyang Wu 	rte_cryptodev_info_get(dev_id, &dev_info);
11491daecf63SSunyang Wu 	feat_flags = dev_info.feature_flags;
11501daecf63SSunyang Wu 
11511daecf63SSunyang Wu 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
11521daecf63SSunyang Wu 	    (global_api_test_type == CRYPTODEV_RAW_API_TEST &&
11531daecf63SSunyang Wu 	    !(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11541daecf63SSunyang Wu 		RTE_LOG(INFO, USER1, "Feature flag for SM4 Chain testsuite not met\n");
11551daecf63SSunyang Wu 		return TEST_SKIPPED;
11561daecf63SSunyang Wu 	}
11571daecf63SSunyang Wu 
11581daecf63SSunyang Wu 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 &&
11591daecf63SSunyang Wu 	    check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
11601daecf63SSunyang Wu 		RTE_LOG(INFO, USER1, "Capability for SM4 Chain testsuite not met\n");
11611daecf63SSunyang Wu 		return TEST_SKIPPED;
11621daecf63SSunyang Wu 	}
11631daecf63SSunyang Wu 
11641daecf63SSunyang Wu 	return 0;
11651daecf63SSunyang Wu }
11661daecf63SSunyang Wu 
11671daecf63SSunyang Wu static int
11681daecf63SSunyang Wu sm4_cipheronly_setup(void)
11691daecf63SSunyang Wu {
11701daecf63SSunyang Wu 	uint8_t dev_id = p_testsuite_params->valid_devs[0];
11711daecf63SSunyang Wu 	struct rte_cryptodev_info dev_info;
11721daecf63SSunyang Wu 	uint64_t feat_flags;
11731daecf63SSunyang Wu 	const enum rte_crypto_cipher_algorithm ciphers[] = {
11741daecf63SSunyang Wu 		RTE_CRYPTO_CIPHER_SM4_CBC,
11751daecf63SSunyang Wu 		RTE_CRYPTO_CIPHER_SM4_ECB,
11761daecf63SSunyang Wu 		RTE_CRYPTO_CIPHER_SM4_CTR,
11771daecf63SSunyang Wu 		RTE_CRYPTO_CIPHER_SM4_OFB,
1178*4acc862bSHanxiao Li 		RTE_CRYPTO_CIPHER_SM4_CFB,
1179*4acc862bSHanxiao Li 		RTE_CRYPTO_CIPHER_SM4_XTS
11801daecf63SSunyang Wu 	};
11811daecf63SSunyang Wu 
11821daecf63SSunyang Wu 	rte_cryptodev_info_get(dev_id, &dev_info);
11831daecf63SSunyang Wu 	feat_flags = dev_info.feature_flags;
11841daecf63SSunyang Wu 
11851daecf63SSunyang Wu 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
11861daecf63SSunyang Wu 	    (global_api_test_type == CRYPTODEV_RAW_API_TEST &&
11871daecf63SSunyang Wu 	    !(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11881daecf63SSunyang Wu 		RTE_LOG(INFO, USER1, "Feature flag for SM4 Cipheronly not met\n");
11891daecf63SSunyang Wu 		return TEST_SKIPPED;
11901daecf63SSunyang Wu 	}
11911daecf63SSunyang Wu 
11921daecf63SSunyang Wu 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
11931daecf63SSunyang Wu 		RTE_LOG(INFO, USER1, "Capability for SM4 Cipheronly not met\n");
11941daecf63SSunyang Wu 		return TEST_SKIPPED;
11951daecf63SSunyang Wu 	}
11961daecf63SSunyang Wu 
11971daecf63SSunyang Wu 	return 0;
11981daecf63SSunyang Wu }
11991daecf63SSunyang Wu 
1200e65da89cSCiara Power struct unit_test_suite *
1201e65da89cSCiara Power build_blockcipher_test_suite(enum blockcipher_test_type test_type)
1202e65da89cSCiara Power {
1203e65da89cSCiara Power 	int i, n_test_cases = 0;
1204e65da89cSCiara Power 	struct unit_test_suite *ts;
1205e65da89cSCiara Power 	const char *ts_name = NULL;
1206e65da89cSCiara Power 	const struct blockcipher_test_case *blk_tcs;
1207e65da89cSCiara Power 	struct unit_test_case *tc;
1208e65da89cSCiara Power 	int (*ts_setup)(void) = NULL;
1209a9de470cSBruce Richardson 
1210a9de470cSBruce Richardson 	switch (test_type) {
1211a9de470cSBruce Richardson 	case BLKCIPHER_AES_CHAIN_TYPE:
1212e65da89cSCiara Power 		n_test_cases = RTE_DIM(aes_chain_test_cases);
1213e65da89cSCiara Power 		blk_tcs = aes_chain_test_cases;
1214e65da89cSCiara Power 		ts_name = "AES Chain";
1215e65da89cSCiara Power 		ts_setup = aes_chain_setup;
1216a9de470cSBruce Richardson 		break;
1217a9de470cSBruce Richardson 	case BLKCIPHER_AES_CIPHERONLY_TYPE:
1218e65da89cSCiara Power 		n_test_cases = RTE_DIM(aes_cipheronly_test_cases);
1219e65da89cSCiara Power 		blk_tcs = aes_cipheronly_test_cases;
1220e65da89cSCiara Power 		ts_name = "AES Cipher Only";
1221e65da89cSCiara Power 		ts_setup = aes_cipheronly_setup;
1222a9de470cSBruce Richardson 		break;
1223a9de470cSBruce Richardson 	case BLKCIPHER_AES_DOCSIS_TYPE:
1224e65da89cSCiara Power 		n_test_cases = RTE_DIM(aes_docsis_test_cases);
1225e65da89cSCiara Power 		blk_tcs = aes_docsis_test_cases;
1226e65da89cSCiara Power 		ts_name = "AES Docsis";
1227e65da89cSCiara Power 		ts_setup = aes_docsis_setup;
1228a9de470cSBruce Richardson 		break;
1229a9de470cSBruce Richardson 	case BLKCIPHER_3DES_CHAIN_TYPE:
1230e65da89cSCiara Power 		n_test_cases = RTE_DIM(triple_des_chain_test_cases);
1231e65da89cSCiara Power 		blk_tcs = triple_des_chain_test_cases;
1232e65da89cSCiara Power 		ts_name = "3DES Chain";
1233e65da89cSCiara Power 		ts_setup = triple_des_chain_setup;
1234a9de470cSBruce Richardson 		break;
1235a9de470cSBruce Richardson 	case BLKCIPHER_3DES_CIPHERONLY_TYPE:
1236e65da89cSCiara Power 		n_test_cases = RTE_DIM(triple_des_cipheronly_test_cases);
1237e65da89cSCiara Power 		blk_tcs = triple_des_cipheronly_test_cases;
1238e65da89cSCiara Power 		ts_name = "3DES Cipher Only";
1239e65da89cSCiara Power 		ts_setup = triple_des_cipheronly_setup;
1240a9de470cSBruce Richardson 		break;
1241a9de470cSBruce Richardson 	case BLKCIPHER_DES_CIPHERONLY_TYPE:
1242e65da89cSCiara Power 		n_test_cases = RTE_DIM(des_cipheronly_test_cases);
1243e65da89cSCiara Power 		blk_tcs = des_cipheronly_test_cases;
1244e65da89cSCiara Power 		ts_name = "DES Cipher Only";
1245e65da89cSCiara Power 		ts_setup = des_cipheronly_setup;
1246a9de470cSBruce Richardson 		break;
1247a9de470cSBruce Richardson 	case BLKCIPHER_DES_DOCSIS_TYPE:
1248e65da89cSCiara Power 		n_test_cases = RTE_DIM(des_docsis_test_cases);
1249e65da89cSCiara Power 		blk_tcs = des_docsis_test_cases;
1250e65da89cSCiara Power 		ts_name = "DES Docsis";
1251e65da89cSCiara Power 		ts_setup = des_docsis_setup;
1252a9de470cSBruce Richardson 		break;
12531daecf63SSunyang Wu 	case BLKCIPHER_SM4_CHAIN_TYPE:
12541daecf63SSunyang Wu 		n_test_cases = RTE_DIM(sm4_chain_test_cases);
12551daecf63SSunyang Wu 		blk_tcs = sm4_chain_test_cases;
12561daecf63SSunyang Wu 		ts_name = "SM4 Chain";
12571daecf63SSunyang Wu 		ts_setup = sm4_chain_setup;
12581daecf63SSunyang Wu 		break;
12591daecf63SSunyang Wu 	case BLKCIPHER_SM4_CIPHERONLY_TYPE:
12601daecf63SSunyang Wu 		n_test_cases = RTE_DIM(sm4_cipheronly_test_cases);
12611daecf63SSunyang Wu 		blk_tcs = sm4_cipheronly_test_cases;
12621daecf63SSunyang Wu 		ts_name = "SM4 Cipher Only";
12631daecf63SSunyang Wu 		ts_setup = sm4_cipheronly_setup;
12641daecf63SSunyang Wu 		break;
1265a9de470cSBruce Richardson 	case BLKCIPHER_AUTHONLY_TYPE:
1266e65da89cSCiara Power 		n_test_cases = RTE_DIM(hash_test_cases);
1267e65da89cSCiara Power 		blk_tcs = hash_test_cases;
1268e65da89cSCiara Power 		ts_name = "Auth Only";
1269e65da89cSCiara Power 		ts_setup = authonly_setup;
1270a9de470cSBruce Richardson 		break;
1271a9de470cSBruce Richardson 	default:
12729c8c8064SThomas Monjalon 		return NULL;
1273a9de470cSBruce Richardson 	}
1274a9de470cSBruce Richardson 
1275e65da89cSCiara Power 	ts = calloc(1, sizeof(struct unit_test_suite) +
1276e65da89cSCiara Power 			(sizeof(struct unit_test_case) * (n_test_cases + 1)));
1277e65da89cSCiara Power 	ts->suite_name = ts_name;
1278e65da89cSCiara Power 	ts->setup = ts_setup;
1279e65da89cSCiara Power 
1280a9de470cSBruce Richardson 	for (i = 0; i < n_test_cases; i++) {
1281e65da89cSCiara Power 		tc = &ts->unit_test_cases[i];
1282e65da89cSCiara Power 		tc->name = blk_tcs[i].test_descr;
1283e65da89cSCiara Power 		tc->enabled = 1;
1284e65da89cSCiara Power 		tc->setup = ut_setup;
1285e65da89cSCiara Power 		tc->teardown = ut_teardown;
1286e65da89cSCiara Power 		tc->testcase = NULL;
1287e65da89cSCiara Power 		tc->testcase_with_data = blockcipher_test_case_run;
1288e65da89cSCiara Power 		tc->data = &blk_tcs[i];
1289a9de470cSBruce Richardson 	}
1290e65da89cSCiara Power 	tc = &ts->unit_test_cases[i];
1291e65da89cSCiara Power 	tc->name = NULL;
1292e65da89cSCiara Power 	tc->enabled = 0;
1293e65da89cSCiara Power 	tc->setup = NULL;
1294e65da89cSCiara Power 	tc->teardown = NULL;
1295e65da89cSCiara Power 	tc->testcase = NULL;
1296e65da89cSCiara Power 	tc->testcase_with_data = NULL;
1297e65da89cSCiara Power 	tc->data = NULL;
1298e65da89cSCiara Power 
1299e65da89cSCiara Power 	return ts;
1300a9de470cSBruce Richardson }
1301a9de470cSBruce Richardson 
1302e65da89cSCiara Power void
1303e65da89cSCiara Power free_blockcipher_test_suite(struct unit_test_suite *ts)
1304e65da89cSCiara Power {
1305e65da89cSCiara Power 	free(ts);
1306a9de470cSBruce Richardson }
1307