xref: /dpdk/examples/fips_validation/main.c (revision 733c7861492d67eb5fba8ee50fb08d7db82a176d)
13d0fad56SMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause
23d0fad56SMarko Kovacevic  * Copyright(c) 2018 Intel Corporation
33d0fad56SMarko Kovacevic  */
43d0fad56SMarko Kovacevic 
53d0fad56SMarko Kovacevic #include <sys/stat.h>
63d0fad56SMarko Kovacevic #include <getopt.h>
73d0fad56SMarko Kovacevic #include <dirent.h>
872b452c5SDmitry Kozlyuk #include <stdlib.h>
93d0fad56SMarko Kovacevic 
103d0fad56SMarko Kovacevic #include <rte_cryptodev.h>
1174645f64SAkhil Goyal #include <rte_malloc.h>
123d0fad56SMarko Kovacevic #include <rte_mempool.h>
133d0fad56SMarko Kovacevic #include <rte_mbuf.h>
143d0fad56SMarko Kovacevic #include <rte_string_fns.h>
15b7ceea22SBrian Dooley #include <rte_random.h>
163d0fad56SMarko Kovacevic 
173d0fad56SMarko Kovacevic #include "fips_validation.h"
1841d561cbSFan Zhang #include "fips_dev_self_test.h"
193d0fad56SMarko Kovacevic 
20fc6e6515SIbtisam Tariq enum {
21fc6e6515SIbtisam Tariq #define OPT_REQ_FILE_PATH           "req-file"
22fc6e6515SIbtisam Tariq 	OPT_REQ_FILE_PATH_NUM = 256,
23fc6e6515SIbtisam Tariq #define OPT_RSP_FILE_PATH           "rsp-file"
24fc6e6515SIbtisam Tariq 	OPT_RSP_FILE_PATH_NUM,
25fc6e6515SIbtisam Tariq #define OPT_MBUF_DATAROOM           "mbuf-dataroom"
26fc6e6515SIbtisam Tariq 	OPT_MBUF_DATAROOM_NUM,
27fc6e6515SIbtisam Tariq #define OPT_FOLDER                  "path-is-folder"
28fc6e6515SIbtisam Tariq 	OPT_FOLDER_NUM,
29fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV               "cryptodev"
30fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_NUM,
31fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_ID            "cryptodev-id"
32fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_ID_NUM,
33fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_ST            "self-test"
34fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_ST_NUM,
35fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_BK_ID         "broken-test-id"
36fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_BK_ID_NUM,
37fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_BK_DIR_KEY    "broken-test-dir"
38fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_BK_DIR_KEY_NUM,
3989be27e3SBrandon Lo #define OPT_USE_JSON                "use-json"
4089be27e3SBrandon Lo 	OPT_USE_JSON_NUM,
4136128a67SGowrishankar Muthukrishnan #define OPT_CRYPTODEV_ASYM          "asymmetric"
4236128a67SGowrishankar Muthukrishnan 	OPT_CRYPTODEV_ASYM_NUM,
43fc6e6515SIbtisam Tariq };
443d0fad56SMarko Kovacevic 
453d0fad56SMarko Kovacevic struct fips_test_vector vec;
463d0fad56SMarko Kovacevic struct fips_test_interim_info info;
473d0fad56SMarko Kovacevic 
488d70a194SDavid Marchand #ifdef USE_JANSSON
4958cc9880SBrandon Lo struct fips_test_json_info json_info;
508d70a194SDavid Marchand #endif /* USE_JANSSON */
5158cc9880SBrandon Lo 
523d0fad56SMarko Kovacevic struct cryptodev_fips_validate_env {
533d0fad56SMarko Kovacevic 	const char *req_path;
543d0fad56SMarko Kovacevic 	const char *rsp_path;
553d0fad56SMarko Kovacevic 	uint32_t is_path_folder;
56952e10cdSFan Zhang 	uint8_t dev_id;
573d0fad56SMarko Kovacevic 	struct rte_mempool *mpool;
5836128a67SGowrishankar Muthukrishnan 	struct fips_sym_env {
59261bbff7SFan Zhang 		struct rte_mempool *sess_mpool;
603d0fad56SMarko Kovacevic 		struct rte_mempool *op_pool;
6136128a67SGowrishankar Muthukrishnan 		struct rte_cryptodev_sym_session *sess;
6236128a67SGowrishankar Muthukrishnan 		struct rte_crypto_op *op;
6336128a67SGowrishankar Muthukrishnan 	} sym;
6436128a67SGowrishankar Muthukrishnan 	struct fips_asym_env {
6536128a67SGowrishankar Muthukrishnan 		struct rte_mempool *sess_mpool;
6636128a67SGowrishankar Muthukrishnan 		struct rte_mempool *op_pool;
6736128a67SGowrishankar Muthukrishnan 		struct rte_cryptodev_asym_session *sess;
6836128a67SGowrishankar Muthukrishnan 		struct rte_crypto_op *op;
6936128a67SGowrishankar Muthukrishnan 	} asym;
7036128a67SGowrishankar Muthukrishnan 	struct rte_crypto_op *op;
7136128a67SGowrishankar Muthukrishnan 	uint8_t dev_support_sgl;
7236128a67SGowrishankar Muthukrishnan 	uint16_t mbuf_data_room;
733d0fad56SMarko Kovacevic 	struct rte_mbuf *mbuf;
74952e10cdSFan Zhang 	uint8_t *digest;
75952e10cdSFan Zhang 	uint16_t digest_len;
7636128a67SGowrishankar Muthukrishnan 	bool is_asym_test;
77952e10cdSFan Zhang 	uint16_t self_test;
7841d561cbSFan Zhang 	struct fips_dev_broken_test_config *broken_test_config;
793d0fad56SMarko Kovacevic } env;
803d0fad56SMarko Kovacevic 
813d0fad56SMarko Kovacevic static int
8236128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_sym_init(void)
8336128a67SGowrishankar Muthukrishnan {
8436128a67SGowrishankar Muthukrishnan 	uint32_t sess_sz = rte_cryptodev_sym_get_private_session_size(
8536128a67SGowrishankar Muthukrishnan 							env.dev_id);
8636128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_info dev_info;
8736128a67SGowrishankar Muthukrishnan 	struct fips_sym_env *sym = &env.sym;
8836128a67SGowrishankar Muthukrishnan 	int ret;
8936128a67SGowrishankar Muthukrishnan 
9036128a67SGowrishankar Muthukrishnan 	rte_cryptodev_info_get(env.dev_id, &dev_info);
9136128a67SGowrishankar Muthukrishnan 	if (dev_info.feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)
9236128a67SGowrishankar Muthukrishnan 		env.dev_support_sgl = 1;
9336128a67SGowrishankar Muthukrishnan 	else
9436128a67SGowrishankar Muthukrishnan 		env.dev_support_sgl = 0;
9536128a67SGowrishankar Muthukrishnan 
9636128a67SGowrishankar Muthukrishnan 	ret = -ENOMEM;
9736128a67SGowrishankar Muthukrishnan 	sym->sess_mpool = rte_cryptodev_sym_session_pool_create(
9836128a67SGowrishankar Muthukrishnan 			"FIPS_SYM_SESS_MEMPOOL", 16, sess_sz, 0, 0, rte_socket_id());
9936128a67SGowrishankar Muthukrishnan 	if (!sym->sess_mpool)
10036128a67SGowrishankar Muthukrishnan 		goto error_exit;
10136128a67SGowrishankar Muthukrishnan 
10236128a67SGowrishankar Muthukrishnan 	sym->op_pool = rte_crypto_op_pool_create(
10336128a67SGowrishankar Muthukrishnan 			"FIPS_OP_SYM_POOL",
10436128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
10536128a67SGowrishankar Muthukrishnan 			1, 0,
10636128a67SGowrishankar Muthukrishnan 			16,
10736128a67SGowrishankar Muthukrishnan 			rte_socket_id());
10836128a67SGowrishankar Muthukrishnan 	if (!sym->op_pool)
10936128a67SGowrishankar Muthukrishnan 		goto error_exit;
11036128a67SGowrishankar Muthukrishnan 
11136128a67SGowrishankar Muthukrishnan 	sym->op = rte_crypto_op_alloc(sym->op_pool, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11236128a67SGowrishankar Muthukrishnan 	if (!sym->op)
11336128a67SGowrishankar Muthukrishnan 		goto error_exit;
11436128a67SGowrishankar Muthukrishnan 
11536128a67SGowrishankar Muthukrishnan 	return 0;
11636128a67SGowrishankar Muthukrishnan 
11736128a67SGowrishankar Muthukrishnan error_exit:
11836128a67SGowrishankar Muthukrishnan 	rte_mempool_free(sym->sess_mpool);
11936128a67SGowrishankar Muthukrishnan 	rte_mempool_free(sym->op_pool);
12036128a67SGowrishankar Muthukrishnan 	return ret;
12136128a67SGowrishankar Muthukrishnan }
12236128a67SGowrishankar Muthukrishnan 
12336128a67SGowrishankar Muthukrishnan static void
12436128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_sym_uninit(void)
12536128a67SGowrishankar Muthukrishnan {
12636128a67SGowrishankar Muthukrishnan 	struct fips_sym_env *sym = &env.sym;
12736128a67SGowrishankar Muthukrishnan 
12836128a67SGowrishankar Muthukrishnan 	rte_pktmbuf_free(env.mbuf);
12936128a67SGowrishankar Muthukrishnan 	rte_crypto_op_free(sym->op);
13036128a67SGowrishankar Muthukrishnan 	rte_cryptodev_sym_session_free(env.dev_id, sym->sess);
13136128a67SGowrishankar Muthukrishnan 	rte_mempool_free(sym->sess_mpool);
13236128a67SGowrishankar Muthukrishnan 	rte_mempool_free(sym->op_pool);
13336128a67SGowrishankar Muthukrishnan }
13436128a67SGowrishankar Muthukrishnan 
13536128a67SGowrishankar Muthukrishnan static int
13636128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_asym_init(void)
13736128a67SGowrishankar Muthukrishnan {
13836128a67SGowrishankar Muthukrishnan 	struct fips_asym_env *asym = &env.asym;
13936128a67SGowrishankar Muthukrishnan 	int ret;
14036128a67SGowrishankar Muthukrishnan 
14136128a67SGowrishankar Muthukrishnan 	ret = -ENOMEM;
14236128a67SGowrishankar Muthukrishnan 	asym->sess_mpool = rte_cryptodev_asym_session_pool_create(
14336128a67SGowrishankar Muthukrishnan 			"FIPS_ASYM_SESS_MEMPOOL", 16, 0, 0, rte_socket_id());
14436128a67SGowrishankar Muthukrishnan 	if (!asym->sess_mpool)
14536128a67SGowrishankar Muthukrishnan 		goto error_exit;
14636128a67SGowrishankar Muthukrishnan 
14736128a67SGowrishankar Muthukrishnan 	asym->op_pool = rte_crypto_op_pool_create(
14836128a67SGowrishankar Muthukrishnan 			"FIPS_OP_ASYM_POOL",
14936128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
15036128a67SGowrishankar Muthukrishnan 			1, 0,
15136128a67SGowrishankar Muthukrishnan 			16,
15236128a67SGowrishankar Muthukrishnan 			rte_socket_id());
15336128a67SGowrishankar Muthukrishnan 	if (!asym->op_pool)
15436128a67SGowrishankar Muthukrishnan 		goto error_exit;
15536128a67SGowrishankar Muthukrishnan 
15636128a67SGowrishankar Muthukrishnan 	asym->op = rte_crypto_op_alloc(asym->op_pool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
15736128a67SGowrishankar Muthukrishnan 	if (!asym->op)
15836128a67SGowrishankar Muthukrishnan 		goto error_exit;
15936128a67SGowrishankar Muthukrishnan 
16036128a67SGowrishankar Muthukrishnan 	return 0;
16136128a67SGowrishankar Muthukrishnan 
16236128a67SGowrishankar Muthukrishnan error_exit:
16336128a67SGowrishankar Muthukrishnan 	rte_mempool_free(asym->sess_mpool);
16436128a67SGowrishankar Muthukrishnan 	rte_mempool_free(asym->op_pool);
16536128a67SGowrishankar Muthukrishnan 	return ret;
16636128a67SGowrishankar Muthukrishnan }
16736128a67SGowrishankar Muthukrishnan 
16836128a67SGowrishankar Muthukrishnan static void
16936128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_asym_uninit(void)
17036128a67SGowrishankar Muthukrishnan {
17136128a67SGowrishankar Muthukrishnan 	struct fips_asym_env *asym = &env.asym;
17236128a67SGowrishankar Muthukrishnan 
17336128a67SGowrishankar Muthukrishnan 	rte_crypto_op_free(asym->op);
17436128a67SGowrishankar Muthukrishnan 	rte_cryptodev_asym_session_free(env.dev_id, asym->sess);
17536128a67SGowrishankar Muthukrishnan 	rte_mempool_free(asym->sess_mpool);
17636128a67SGowrishankar Muthukrishnan 	rte_mempool_free(asym->op_pool);
17736128a67SGowrishankar Muthukrishnan }
17836128a67SGowrishankar Muthukrishnan 
17936128a67SGowrishankar Muthukrishnan static int
18036128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_init(void)
1813d0fad56SMarko Kovacevic {
182c9030ae3SAnoob Joseph 	struct rte_cryptodev_config conf = {rte_socket_id(), 1, 0};
183bdce2564SAkhil Goyal 	struct rte_cryptodev_qp_conf qp_conf = {128, NULL};
184952e10cdSFan Zhang 	uint32_t nb_mbufs = UINT16_MAX / env.mbuf_data_room + 1;
1853d0fad56SMarko Kovacevic 	int ret;
1863d0fad56SMarko Kovacevic 
18741d561cbSFan Zhang 	if (env.self_test) {
18841d561cbSFan Zhang 		ret = fips_dev_self_test(env.dev_id, env.broken_test_config);
18941d561cbSFan Zhang 		if (ret < 0) {
19036128a67SGowrishankar Muthukrishnan 			rte_cryptodev_stop(env.dev_id);
19174645f64SAkhil Goyal 			rte_cryptodev_close(env.dev_id);
19241d561cbSFan Zhang 
19341d561cbSFan Zhang 			return ret;
19441d561cbSFan Zhang 		}
19541d561cbSFan Zhang 	}
19641d561cbSFan Zhang 
1973d0fad56SMarko Kovacevic 	ret = rte_cryptodev_configure(env.dev_id, &conf);
1983d0fad56SMarko Kovacevic 	if (ret < 0)
1993d0fad56SMarko Kovacevic 		return ret;
2003d0fad56SMarko Kovacevic 
20136128a67SGowrishankar Muthukrishnan 	ret = -ENOMEM;
202952e10cdSFan Zhang 	env.mpool = rte_pktmbuf_pool_create("FIPS_MEMPOOL", nb_mbufs,
203952e10cdSFan Zhang 			0, 0, sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM +
204952e10cdSFan Zhang 			env.mbuf_data_room, rte_socket_id());
2053d0fad56SMarko Kovacevic 	if (!env.mpool)
2063d0fad56SMarko Kovacevic 		return ret;
2073d0fad56SMarko Kovacevic 
20836128a67SGowrishankar Muthukrishnan 	ret = cryptodev_fips_validate_app_sym_init();
2093d0fad56SMarko Kovacevic 	if (ret < 0)
210261bbff7SFan Zhang 		goto error_exit;
211261bbff7SFan Zhang 
21236128a67SGowrishankar Muthukrishnan 	if (env.is_asym_test) {
21336128a67SGowrishankar Muthukrishnan 		ret = cryptodev_fips_validate_app_asym_init();
21436128a67SGowrishankar Muthukrishnan 		if (ret < 0)
2153d0fad56SMarko Kovacevic 			goto error_exit;
21636128a67SGowrishankar Muthukrishnan 	}
2173d0fad56SMarko Kovacevic 
21836128a67SGowrishankar Muthukrishnan 	qp_conf.mp_session = env.sym.sess_mpool;
219261bbff7SFan Zhang 
220261bbff7SFan Zhang 	ret = rte_cryptodev_queue_pair_setup(env.dev_id, 0, &qp_conf,
221261bbff7SFan Zhang 			rte_socket_id());
222261bbff7SFan Zhang 	if (ret < 0)
223261bbff7SFan Zhang 		goto error_exit;
224261bbff7SFan Zhang 
2253b2311ccSFan Zhang 	ret = rte_cryptodev_start(env.dev_id);
2263b2311ccSFan Zhang 	if (ret < 0)
2273b2311ccSFan Zhang 		goto error_exit;
2283b2311ccSFan Zhang 
2293d0fad56SMarko Kovacevic 	return 0;
2303d0fad56SMarko Kovacevic 
2313d0fad56SMarko Kovacevic error_exit:
2323d0fad56SMarko Kovacevic 	rte_mempool_free(env.mpool);
2333d0fad56SMarko Kovacevic 	return ret;
2343d0fad56SMarko Kovacevic }
2353d0fad56SMarko Kovacevic 
2363d0fad56SMarko Kovacevic static void
2373d0fad56SMarko Kovacevic cryptodev_fips_validate_app_uninit(void)
2383d0fad56SMarko Kovacevic {
23936128a67SGowrishankar Muthukrishnan 	cryptodev_fips_validate_app_sym_uninit();
24036128a67SGowrishankar Muthukrishnan 
24136128a67SGowrishankar Muthukrishnan 	if (env.is_asym_test)
24236128a67SGowrishankar Muthukrishnan 		cryptodev_fips_validate_app_asym_uninit();
24336128a67SGowrishankar Muthukrishnan 
2443d0fad56SMarko Kovacevic 	rte_mempool_free(env.mpool);
24536128a67SGowrishankar Muthukrishnan 	rte_cryptodev_stop(env.dev_id);
24636128a67SGowrishankar Muthukrishnan 	rte_cryptodev_close(env.dev_id);
2473d0fad56SMarko Kovacevic }
2483d0fad56SMarko Kovacevic 
2493d0fad56SMarko Kovacevic static int
2503d0fad56SMarko Kovacevic fips_test_one_file(void);
2513d0fad56SMarko Kovacevic 
2528d70a194SDavid Marchand #ifdef USE_JANSSON
25389be27e3SBrandon Lo static int
25489be27e3SBrandon Lo fips_test_one_json_file(void);
2558d70a194SDavid Marchand #endif /* USE_JANSSON */
25689be27e3SBrandon Lo 
2573d0fad56SMarko Kovacevic static int
2583d0fad56SMarko Kovacevic parse_cryptodev_arg(char *arg)
2593d0fad56SMarko Kovacevic {
2603d0fad56SMarko Kovacevic 	int id = rte_cryptodev_get_dev_id(arg);
2613d0fad56SMarko Kovacevic 
2623d0fad56SMarko Kovacevic 	if (id < 0) {
2633d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev name %s\n",
2643d0fad56SMarko Kovacevic 				id, arg);
2653d0fad56SMarko Kovacevic 		return id;
2663d0fad56SMarko Kovacevic 	}
2673d0fad56SMarko Kovacevic 
268952e10cdSFan Zhang 	env.dev_id = (uint8_t)id;
2693d0fad56SMarko Kovacevic 
2703d0fad56SMarko Kovacevic 	return 0;
2713d0fad56SMarko Kovacevic }
2723d0fad56SMarko Kovacevic 
2733d0fad56SMarko Kovacevic static int
2743d0fad56SMarko Kovacevic parse_cryptodev_id_arg(char *arg)
2753d0fad56SMarko Kovacevic {
2763d0fad56SMarko Kovacevic 	uint32_t cryptodev_id;
2773d0fad56SMarko Kovacevic 
2783d0fad56SMarko Kovacevic 	if (parser_read_uint32(&cryptodev_id, arg) < 0) {
2793d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
2803d0fad56SMarko Kovacevic 				-EINVAL, arg);
2813d0fad56SMarko Kovacevic 		return -1;
2823d0fad56SMarko Kovacevic 	}
2833d0fad56SMarko Kovacevic 
2843d0fad56SMarko Kovacevic 
285e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(cryptodev_id)) {
2863d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
2873d0fad56SMarko Kovacevic 				cryptodev_id, arg);
2883d0fad56SMarko Kovacevic 		return -1;
2893d0fad56SMarko Kovacevic 	}
2903d0fad56SMarko Kovacevic 
291952e10cdSFan Zhang 	env.dev_id = (uint8_t)cryptodev_id;
2923d0fad56SMarko Kovacevic 
2933d0fad56SMarko Kovacevic 	return 0;
2943d0fad56SMarko Kovacevic }
2953d0fad56SMarko Kovacevic 
2963d0fad56SMarko Kovacevic static void
2973d0fad56SMarko Kovacevic cryptodev_fips_validate_usage(const char *prgname)
2983d0fad56SMarko Kovacevic {
299952e10cdSFan Zhang 	uint32_t def_mbuf_seg_size = DEF_MBUF_SEG_SIZE;
3003d0fad56SMarko Kovacevic 	printf("%s [EAL options] --\n"
3013d0fad56SMarko Kovacevic 		"  --%s: REQUEST-FILE-PATH\n"
3023d0fad56SMarko Kovacevic 		"  --%s: RESPONSE-FILE-PATH\n"
3033d0fad56SMarko Kovacevic 		"  --%s: indicating both paths are folders\n"
304952e10cdSFan Zhang 		"  --%s: mbuf dataroom size (default %u bytes)\n"
3053d0fad56SMarko Kovacevic 		"  --%s: CRYPTODEV-NAME\n"
30641d561cbSFan Zhang 		"  --%s: CRYPTODEV-ID-NAME\n"
30741d561cbSFan Zhang 		"  --%s: self test indicator\n"
30841d561cbSFan Zhang 		"  --%s: self broken test ID\n"
30941d561cbSFan Zhang 		"  --%s: self broken test direction\n",
310fc6e6515SIbtisam Tariq 		prgname, OPT_REQ_FILE_PATH, OPT_RSP_FILE_PATH,
311fc6e6515SIbtisam Tariq 		OPT_FOLDER, OPT_MBUF_DATAROOM, def_mbuf_seg_size,
312fc6e6515SIbtisam Tariq 		OPT_CRYPTODEV, OPT_CRYPTODEV_ID, OPT_CRYPTODEV_ST,
313fc6e6515SIbtisam Tariq 		OPT_CRYPTODEV_BK_ID, OPT_CRYPTODEV_BK_DIR_KEY);
3143d0fad56SMarko Kovacevic }
3153d0fad56SMarko Kovacevic 
3163d0fad56SMarko Kovacevic static int
3173d0fad56SMarko Kovacevic cryptodev_fips_validate_parse_args(int argc, char **argv)
3183d0fad56SMarko Kovacevic {
3193d0fad56SMarko Kovacevic 	int opt, ret;
3203d0fad56SMarko Kovacevic 	char *prgname = argv[0];
3213d0fad56SMarko Kovacevic 	char **argvopt;
3223d0fad56SMarko Kovacevic 	int option_index;
3233d0fad56SMarko Kovacevic 	struct option lgopts[] = {
324fc6e6515SIbtisam Tariq 		{OPT_REQ_FILE_PATH, required_argument,
325fc6e6515SIbtisam Tariq 				NULL, OPT_REQ_FILE_PATH_NUM},
326fc6e6515SIbtisam Tariq 		{OPT_RSP_FILE_PATH, required_argument,
327fc6e6515SIbtisam Tariq 				NULL, OPT_RSP_FILE_PATH_NUM},
328fc6e6515SIbtisam Tariq 		{OPT_FOLDER, no_argument,
329fc6e6515SIbtisam Tariq 				NULL, OPT_FOLDER_NUM},
330fc6e6515SIbtisam Tariq 		{OPT_MBUF_DATAROOM, required_argument,
331fc6e6515SIbtisam Tariq 				NULL, OPT_MBUF_DATAROOM_NUM},
332fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV, required_argument,
333fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_NUM},
334fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV_ID, required_argument,
335fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_ID_NUM},
336fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV_ST, no_argument,
337fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_ST_NUM},
338fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV_BK_ID, required_argument,
339fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_BK_ID_NUM},
340fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV_BK_DIR_KEY, required_argument,
341fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_BK_DIR_KEY_NUM},
34236128a67SGowrishankar Muthukrishnan 		{OPT_CRYPTODEV_ASYM, no_argument,
34336128a67SGowrishankar Muthukrishnan 				NULL, OPT_CRYPTODEV_ASYM_NUM},
3443d0fad56SMarko Kovacevic 		{NULL, 0, 0, 0}
3453d0fad56SMarko Kovacevic 	};
3463d0fad56SMarko Kovacevic 
3473d0fad56SMarko Kovacevic 	argvopt = argv;
3483d0fad56SMarko Kovacevic 
349952e10cdSFan Zhang 	env.mbuf_data_room = DEF_MBUF_SEG_SIZE;
350952e10cdSFan Zhang 	if (rte_cryptodev_count())
351952e10cdSFan Zhang 		env.dev_id = 0;
352952e10cdSFan Zhang 	else {
353952e10cdSFan Zhang 		cryptodev_fips_validate_usage(prgname);
354952e10cdSFan Zhang 		return -EINVAL;
355952e10cdSFan Zhang 	}
356952e10cdSFan Zhang 
3573d0fad56SMarko Kovacevic 	while ((opt = getopt_long(argc, argvopt, "s:",
3583d0fad56SMarko Kovacevic 				  lgopts, &option_index)) != EOF) {
3593d0fad56SMarko Kovacevic 
3603d0fad56SMarko Kovacevic 		switch (opt) {
361fc6e6515SIbtisam Tariq 		case OPT_REQ_FILE_PATH_NUM:
3623d0fad56SMarko Kovacevic 			env.req_path = optarg;
363fc6e6515SIbtisam Tariq 			break;
364fc6e6515SIbtisam Tariq 
365fc6e6515SIbtisam Tariq 		case OPT_RSP_FILE_PATH_NUM:
3663d0fad56SMarko Kovacevic 			env.rsp_path = optarg;
367fc6e6515SIbtisam Tariq 			break;
368fc6e6515SIbtisam Tariq 
369fc6e6515SIbtisam Tariq 		case OPT_FOLDER_NUM:
3703d0fad56SMarko Kovacevic 			env.is_path_folder = 1;
371fc6e6515SIbtisam Tariq 			break;
372fc6e6515SIbtisam Tariq 
373fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_NUM:
3743d0fad56SMarko Kovacevic 			ret = parse_cryptodev_arg(optarg);
3753d0fad56SMarko Kovacevic 			if (ret < 0) {
3763d0fad56SMarko Kovacevic 				cryptodev_fips_validate_usage(prgname);
3773d0fad56SMarko Kovacevic 				return -EINVAL;
3783d0fad56SMarko Kovacevic 			}
379fc6e6515SIbtisam Tariq 			break;
380fc6e6515SIbtisam Tariq 
381fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_ID_NUM:
3823d0fad56SMarko Kovacevic 			ret = parse_cryptodev_id_arg(optarg);
3833d0fad56SMarko Kovacevic 			if (ret < 0) {
3843d0fad56SMarko Kovacevic 				cryptodev_fips_validate_usage(prgname);
3853d0fad56SMarko Kovacevic 				return -EINVAL;
3863d0fad56SMarko Kovacevic 			}
387fc6e6515SIbtisam Tariq 			break;
388fc6e6515SIbtisam Tariq 
389fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_ST_NUM:
39041d561cbSFan Zhang 			env.self_test = 1;
391fc6e6515SIbtisam Tariq 			break;
392fc6e6515SIbtisam Tariq 
393fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_BK_ID_NUM:
39441d561cbSFan Zhang 			if (!env.broken_test_config) {
39541d561cbSFan Zhang 				env.broken_test_config = rte_malloc(
39641d561cbSFan Zhang 					NULL,
39741d561cbSFan Zhang 					sizeof(*env.broken_test_config),
39841d561cbSFan Zhang 					0);
39941d561cbSFan Zhang 				if (!env.broken_test_config)
40041d561cbSFan Zhang 					return -ENOMEM;
40141d561cbSFan Zhang 
40241d561cbSFan Zhang 				env.broken_test_config->expect_fail_dir =
40341d561cbSFan Zhang 					self_test_dir_enc_auth_gen;
40441d561cbSFan Zhang 			}
40541d561cbSFan Zhang 
40641d561cbSFan Zhang 			if (parser_read_uint32(
40741d561cbSFan Zhang 				&env.broken_test_config->expect_fail_test_idx,
40841d561cbSFan Zhang 					optarg) < 0) {
40941d561cbSFan Zhang 				rte_free(env.broken_test_config);
41041d561cbSFan Zhang 				cryptodev_fips_validate_usage(prgname);
41141d561cbSFan Zhang 				return -EINVAL;
41241d561cbSFan Zhang 			}
413fc6e6515SIbtisam Tariq 			break;
414fc6e6515SIbtisam Tariq 
415fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_BK_DIR_KEY_NUM:
41641d561cbSFan Zhang 			if (!env.broken_test_config) {
41741d561cbSFan Zhang 				env.broken_test_config = rte_malloc(
41841d561cbSFan Zhang 					NULL,
41941d561cbSFan Zhang 					sizeof(*env.broken_test_config),
42041d561cbSFan Zhang 					0);
42141d561cbSFan Zhang 				if (!env.broken_test_config)
42241d561cbSFan Zhang 					return -ENOMEM;
42341d561cbSFan Zhang 
424fc6e6515SIbtisam Tariq 				env.broken_test_config->expect_fail_test_idx =
425fc6e6515SIbtisam Tariq 					0;
42641d561cbSFan Zhang 			}
42741d561cbSFan Zhang 
428fc6e6515SIbtisam Tariq 			if (strcmp(optarg, "enc") == 0)
42941d561cbSFan Zhang 				env.broken_test_config->expect_fail_dir =
43041d561cbSFan Zhang 					self_test_dir_enc_auth_gen;
431fc6e6515SIbtisam Tariq 			else if (strcmp(optarg, "dec")
43241d561cbSFan Zhang 					== 0)
43341d561cbSFan Zhang 				env.broken_test_config->expect_fail_dir =
43441d561cbSFan Zhang 					self_test_dir_dec_auth_verify;
43541d561cbSFan Zhang 			else {
43641d561cbSFan Zhang 				rte_free(env.broken_test_config);
43741d561cbSFan Zhang 				cryptodev_fips_validate_usage(prgname);
43841d561cbSFan Zhang 				return -EINVAL;
43941d561cbSFan Zhang 			}
440fc6e6515SIbtisam Tariq 			break;
441952e10cdSFan Zhang 
442fc6e6515SIbtisam Tariq 
443fc6e6515SIbtisam Tariq 		case OPT_MBUF_DATAROOM_NUM:
444fc6e6515SIbtisam Tariq 			if (parser_read_uint16(&env.mbuf_data_room,
445952e10cdSFan Zhang 					optarg) < 0) {
446952e10cdSFan Zhang 				cryptodev_fips_validate_usage(prgname);
447952e10cdSFan Zhang 				return -EINVAL;
448952e10cdSFan Zhang 			}
449952e10cdSFan Zhang 
450fc6e6515SIbtisam Tariq 			if (env.mbuf_data_room == 0) {
4513d0fad56SMarko Kovacevic 				cryptodev_fips_validate_usage(prgname);
4523d0fad56SMarko Kovacevic 				return -EINVAL;
4533d0fad56SMarko Kovacevic 			}
4543d0fad56SMarko Kovacevic 			break;
455fc6e6515SIbtisam Tariq 
45636128a67SGowrishankar Muthukrishnan 		case OPT_CRYPTODEV_ASYM_NUM:
45736128a67SGowrishankar Muthukrishnan 			env.is_asym_test = true;
45836128a67SGowrishankar Muthukrishnan 			break;
45936128a67SGowrishankar Muthukrishnan 
4603d0fad56SMarko Kovacevic 		default:
461fc6e6515SIbtisam Tariq 			cryptodev_fips_validate_usage(prgname);
462fc6e6515SIbtisam Tariq 			return -EINVAL;
4633d0fad56SMarko Kovacevic 		}
4643d0fad56SMarko Kovacevic 	}
4653d0fad56SMarko Kovacevic 
4661442ab1aSOlivier Matz 	if ((env.req_path == NULL && env.rsp_path != NULL) ||
4671442ab1aSOlivier Matz 			(env.req_path != NULL && env.rsp_path == NULL)) {
4681442ab1aSOlivier Matz 		RTE_LOG(ERR, USER1, "Missing req path or rsp path\n");
4691442ab1aSOlivier Matz 		cryptodev_fips_validate_usage(prgname);
4701442ab1aSOlivier Matz 		return -EINVAL;
4711442ab1aSOlivier Matz 	}
4721442ab1aSOlivier Matz 
4731442ab1aSOlivier Matz 	if (env.req_path == NULL && env.self_test == 0) {
4741442ab1aSOlivier Matz 		RTE_LOG(ERR, USER1, "--self-test must be set if req path is missing\n");
4753d0fad56SMarko Kovacevic 		cryptodev_fips_validate_usage(prgname);
4763d0fad56SMarko Kovacevic 		return -EINVAL;
4773d0fad56SMarko Kovacevic 	}
4783d0fad56SMarko Kovacevic 
4793d0fad56SMarko Kovacevic 	return 0;
4803d0fad56SMarko Kovacevic }
4813d0fad56SMarko Kovacevic 
4823d0fad56SMarko Kovacevic int
4833d0fad56SMarko Kovacevic main(int argc, char *argv[])
4843d0fad56SMarko Kovacevic {
4853d0fad56SMarko Kovacevic 	int ret;
4863d0fad56SMarko Kovacevic 
4873d0fad56SMarko Kovacevic 	ret = rte_eal_init(argc, argv);
4883d0fad56SMarko Kovacevic 	if (ret < 0) {
4893d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
4903d0fad56SMarko Kovacevic 		return -1;
4913d0fad56SMarko Kovacevic 	}
4923d0fad56SMarko Kovacevic 
4933d0fad56SMarko Kovacevic 	argc -= ret;
4943d0fad56SMarko Kovacevic 	argv += ret;
4953d0fad56SMarko Kovacevic 
4963d0fad56SMarko Kovacevic 	ret = cryptodev_fips_validate_parse_args(argc, argv);
4973d0fad56SMarko Kovacevic 	if (ret < 0)
4983d0fad56SMarko Kovacevic 		rte_exit(EXIT_FAILURE, "Failed to parse arguments!\n");
4993d0fad56SMarko Kovacevic 
50036128a67SGowrishankar Muthukrishnan 	ret = cryptodev_fips_validate_app_init();
5013d0fad56SMarko Kovacevic 	if (ret < 0) {
5023d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
5033d0fad56SMarko Kovacevic 		return -1;
5043d0fad56SMarko Kovacevic 	}
5053d0fad56SMarko Kovacevic 
5061442ab1aSOlivier Matz 	if (env.req_path == NULL || env.rsp_path == NULL) {
5071442ab1aSOlivier Matz 		printf("No request, exit.\n");
5081442ab1aSOlivier Matz 		goto exit;
5091442ab1aSOlivier Matz 	}
5101442ab1aSOlivier Matz 
5113d0fad56SMarko Kovacevic 	if (!env.is_path_folder) {
5123d0fad56SMarko Kovacevic 		printf("Processing file %s... ", env.req_path);
5133d0fad56SMarko Kovacevic 
5143d0fad56SMarko Kovacevic 		ret = fips_test_init(env.req_path, env.rsp_path,
5153d0fad56SMarko Kovacevic 			rte_cryptodev_name_get(env.dev_id));
5163d0fad56SMarko Kovacevic 		if (ret < 0) {
5173d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
5183d0fad56SMarko Kovacevic 					ret, env.req_path);
5193d0fad56SMarko Kovacevic 			goto exit;
5203d0fad56SMarko Kovacevic 		}
5213d0fad56SMarko Kovacevic 
5228d70a194SDavid Marchand #ifdef USE_JANSSON
52389be27e3SBrandon Lo 		if (info.file_type == FIPS_TYPE_JSON) {
52489be27e3SBrandon Lo 			ret = fips_test_one_json_file();
52589be27e3SBrandon Lo 			json_decref(json_info.json_root);
52689be27e3SBrandon Lo 		}  else {
5273d0fad56SMarko Kovacevic 			ret = fips_test_one_file();
52889be27e3SBrandon Lo 		}
5298d70a194SDavid Marchand #else /* USE_JANSSON */
53089be27e3SBrandon Lo 		ret = fips_test_one_file();
5318d70a194SDavid Marchand #endif /* USE_JANSSON */
53289be27e3SBrandon Lo 
5333d0fad56SMarko Kovacevic 		if (ret < 0) {
5343d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
5353d0fad56SMarko Kovacevic 					ret, env.req_path);
5363d0fad56SMarko Kovacevic 			goto exit;
5373d0fad56SMarko Kovacevic 		}
5383d0fad56SMarko Kovacevic 
5393d0fad56SMarko Kovacevic 		printf("Done\n");
5403d0fad56SMarko Kovacevic 
5413d0fad56SMarko Kovacevic 	} else {
5423d0fad56SMarko Kovacevic 		struct dirent *dir;
5433d0fad56SMarko Kovacevic 		DIR *d_req, *d_rsp;
5443d0fad56SMarko Kovacevic 		char req_path[1024];
5453d0fad56SMarko Kovacevic 		char rsp_path[1024];
5463d0fad56SMarko Kovacevic 
5473d0fad56SMarko Kovacevic 		d_req = opendir(env.req_path);
5483d0fad56SMarko Kovacevic 		if (!d_req) {
5493d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Path %s not exist\n",
5503d0fad56SMarko Kovacevic 					-EINVAL, env.req_path);
5513d0fad56SMarko Kovacevic 			goto exit;
5523d0fad56SMarko Kovacevic 		}
5533d0fad56SMarko Kovacevic 
5543d0fad56SMarko Kovacevic 		d_rsp = opendir(env.rsp_path);
5553d0fad56SMarko Kovacevic 		if (!d_rsp) {
5563d0fad56SMarko Kovacevic 			ret = mkdir(env.rsp_path, 0700);
5573d0fad56SMarko Kovacevic 			if (ret == 0)
5583d0fad56SMarko Kovacevic 				d_rsp = opendir(env.rsp_path);
5593d0fad56SMarko Kovacevic 			else {
5603d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Invalid %s\n",
5613d0fad56SMarko Kovacevic 						-EINVAL, env.rsp_path);
5623d0fad56SMarko Kovacevic 				goto exit;
5633d0fad56SMarko Kovacevic 			}
5643d0fad56SMarko Kovacevic 		}
5653d0fad56SMarko Kovacevic 		closedir(d_rsp);
5663d0fad56SMarko Kovacevic 
5673d0fad56SMarko Kovacevic 		while ((dir = readdir(d_req)) != NULL) {
5683d0fad56SMarko Kovacevic 			if (strstr(dir->d_name, "req") == NULL)
5693d0fad56SMarko Kovacevic 				continue;
5703d0fad56SMarko Kovacevic 
5713d0fad56SMarko Kovacevic 			snprintf(req_path, 1023, "%s/%s", env.req_path,
5723d0fad56SMarko Kovacevic 					dir->d_name);
5733d0fad56SMarko Kovacevic 			snprintf(rsp_path, 1023, "%s/%s", env.rsp_path,
5743d0fad56SMarko Kovacevic 					dir->d_name);
5753d0fad56SMarko Kovacevic 			strlcpy(strstr(rsp_path, "req"), "rsp", 4);
5763d0fad56SMarko Kovacevic 
5773d0fad56SMarko Kovacevic 			printf("Processing file %s... ", req_path);
5783d0fad56SMarko Kovacevic 
5793d0fad56SMarko Kovacevic 			ret = fips_test_init(req_path, rsp_path,
5803d0fad56SMarko Kovacevic 			rte_cryptodev_name_get(env.dev_id));
5813d0fad56SMarko Kovacevic 			if (ret < 0) {
5823d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
5833d0fad56SMarko Kovacevic 						ret, req_path);
5843d0fad56SMarko Kovacevic 				break;
5853d0fad56SMarko Kovacevic 			}
5863d0fad56SMarko Kovacevic 
5878d70a194SDavid Marchand #ifdef USE_JANSSON
58889be27e3SBrandon Lo 			if (info.file_type == FIPS_TYPE_JSON) {
58989be27e3SBrandon Lo 				ret = fips_test_one_json_file();
59089be27e3SBrandon Lo 				json_decref(json_info.json_root);
59189be27e3SBrandon Lo 			} else {
5923d0fad56SMarko Kovacevic 				ret = fips_test_one_file();
59389be27e3SBrandon Lo 			}
5948d70a194SDavid Marchand #else /* USE_JANSSON */
59589be27e3SBrandon Lo 			ret = fips_test_one_file();
5968d70a194SDavid Marchand #endif /* USE_JANSSON */
59789be27e3SBrandon Lo 
5983d0fad56SMarko Kovacevic 			if (ret < 0) {
5993d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
6003d0fad56SMarko Kovacevic 						ret, req_path);
6013d0fad56SMarko Kovacevic 				break;
6023d0fad56SMarko Kovacevic 			}
6033d0fad56SMarko Kovacevic 
6043d0fad56SMarko Kovacevic 			printf("Done\n");
6053d0fad56SMarko Kovacevic 		}
6063d0fad56SMarko Kovacevic 
6073d0fad56SMarko Kovacevic 		closedir(d_req);
6083d0fad56SMarko Kovacevic 	}
6093d0fad56SMarko Kovacevic 
6103d0fad56SMarko Kovacevic 
6113d0fad56SMarko Kovacevic exit:
6123d0fad56SMarko Kovacevic 	fips_test_clear();
6133d0fad56SMarko Kovacevic 	cryptodev_fips_validate_app_uninit();
6143d0fad56SMarko Kovacevic 
61510aa3757SChengchang Tang 	/* clean up the EAL */
61610aa3757SChengchang Tang 	rte_eal_cleanup();
61710aa3757SChengchang Tang 
6183d0fad56SMarko Kovacevic 	return ret;
6193d0fad56SMarko Kovacevic 
6203d0fad56SMarko Kovacevic }
6213d0fad56SMarko Kovacevic 
622cd255ccfSMarko Kovacevic #define IV_OFF (sizeof(struct rte_crypto_op) + sizeof(struct rte_crypto_sym_op))
623cd255ccfSMarko Kovacevic #define CRYPTODEV_FIPS_MAX_RETRIES	16
624cd255ccfSMarko Kovacevic 
625d09abf2dSFan Zhang struct fips_test_ops test_ops;
626cd255ccfSMarko Kovacevic 
627cd255ccfSMarko Kovacevic static int
628952e10cdSFan Zhang prepare_data_mbufs(struct fips_val *val)
629952e10cdSFan Zhang {
630952e10cdSFan Zhang 	struct rte_mbuf *m, *head = 0;
631952e10cdSFan Zhang 	uint8_t *src = val->val;
632952e10cdSFan Zhang 	uint32_t total_len = val->len;
633952e10cdSFan Zhang 	uint16_t nb_seg;
634952e10cdSFan Zhang 	int ret = 0;
635952e10cdSFan Zhang 
636952e10cdSFan Zhang 	rte_pktmbuf_free(env.mbuf);
637952e10cdSFan Zhang 
638952e10cdSFan Zhang 	if (total_len > RTE_MBUF_MAX_NB_SEGS) {
639952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Data len %u too big\n", total_len);
640952e10cdSFan Zhang 		return -EPERM;
641952e10cdSFan Zhang 	}
642952e10cdSFan Zhang 
643952e10cdSFan Zhang 	nb_seg = total_len / env.mbuf_data_room;
644952e10cdSFan Zhang 	if (total_len % env.mbuf_data_room)
645952e10cdSFan Zhang 		nb_seg++;
646952e10cdSFan Zhang 
647952e10cdSFan Zhang 	m = rte_pktmbuf_alloc(env.mpool);
648952e10cdSFan Zhang 	if (!m) {
649952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error %i: Not enough mbuf\n",
650952e10cdSFan Zhang 				-ENOMEM);
651952e10cdSFan Zhang 		return -ENOMEM;
652952e10cdSFan Zhang 	}
653952e10cdSFan Zhang 	head = m;
654952e10cdSFan Zhang 
655952e10cdSFan Zhang 	while (nb_seg) {
656952e10cdSFan Zhang 		uint16_t len = RTE_MIN(total_len, env.mbuf_data_room);
657952e10cdSFan Zhang 		uint8_t *dst = (uint8_t *)rte_pktmbuf_append(m, len);
658952e10cdSFan Zhang 
659952e10cdSFan Zhang 		if (!dst) {
660952e10cdSFan Zhang 			RTE_LOG(ERR, USER1, "Error %i: MBUF too small\n",
661952e10cdSFan Zhang 					-ENOMEM);
662952e10cdSFan Zhang 			ret = -ENOMEM;
663952e10cdSFan Zhang 			goto error_exit;
664952e10cdSFan Zhang 		}
665952e10cdSFan Zhang 
666952e10cdSFan Zhang 		memcpy(dst, src, len);
667952e10cdSFan Zhang 
668952e10cdSFan Zhang 		if (head != m) {
669952e10cdSFan Zhang 			ret = rte_pktmbuf_chain(head, m);
670952e10cdSFan Zhang 			if (ret) {
671952e10cdSFan Zhang 				rte_pktmbuf_free(m);
672952e10cdSFan Zhang 				RTE_LOG(ERR, USER1, "Error %i: SGL build\n",
673952e10cdSFan Zhang 						ret);
674952e10cdSFan Zhang 				goto error_exit;
675952e10cdSFan Zhang 			}
676952e10cdSFan Zhang 		}
677952e10cdSFan Zhang 		total_len -= len;
678952e10cdSFan Zhang 
679952e10cdSFan Zhang 		if (total_len) {
680952e10cdSFan Zhang 			if (!env.dev_support_sgl) {
681952e10cdSFan Zhang 				RTE_LOG(ERR, USER1, "SGL not supported\n");
682952e10cdSFan Zhang 				ret = -EPERM;
683952e10cdSFan Zhang 				goto error_exit;
684952e10cdSFan Zhang 			}
685952e10cdSFan Zhang 
686952e10cdSFan Zhang 			m = rte_pktmbuf_alloc(env.mpool);
687952e10cdSFan Zhang 			if (!m) {
688952e10cdSFan Zhang 				RTE_LOG(ERR, USER1, "Error %i: No memory\n",
689952e10cdSFan Zhang 						-ENOMEM);
690952e10cdSFan Zhang 				goto error_exit;
691952e10cdSFan Zhang 			}
692952e10cdSFan Zhang 		} else
693952e10cdSFan Zhang 			break;
694952e10cdSFan Zhang 
695952e10cdSFan Zhang 		src += len;
696952e10cdSFan Zhang 		nb_seg--;
697952e10cdSFan Zhang 	}
698952e10cdSFan Zhang 
699952e10cdSFan Zhang 	if (total_len) {
700952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error %i: Failed to store all data\n",
701952e10cdSFan Zhang 				-ENOMEM);
702952e10cdSFan Zhang 		goto error_exit;
703952e10cdSFan Zhang 	}
704952e10cdSFan Zhang 
705952e10cdSFan Zhang 	env.mbuf = head;
706952e10cdSFan Zhang 
707952e10cdSFan Zhang 	return 0;
708952e10cdSFan Zhang 
709952e10cdSFan Zhang error_exit:
710952e10cdSFan Zhang 	rte_pktmbuf_free(head);
711952e10cdSFan Zhang 	return ret;
712952e10cdSFan Zhang }
713952e10cdSFan Zhang 
714952e10cdSFan Zhang static int
715cd255ccfSMarko Kovacevic prepare_cipher_op(void)
716cd255ccfSMarko Kovacevic {
717cd255ccfSMarko Kovacevic 	struct rte_crypto_sym_op *sym = env.op->sym;
718cd255ccfSMarko Kovacevic 	uint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *, IV_OFF);
719952e10cdSFan Zhang 	int ret;
720cd255ccfSMarko Kovacevic 
721cd255ccfSMarko Kovacevic 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
722cd255ccfSMarko Kovacevic 
723cd255ccfSMarko Kovacevic 	memcpy(iv, vec.iv.val, vec.iv.len);
724cd255ccfSMarko Kovacevic 
725cd255ccfSMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
726952e10cdSFan Zhang 		ret = prepare_data_mbufs(&vec.pt);
727952e10cdSFan Zhang 		if (ret < 0)
728952e10cdSFan Zhang 			return ret;
729cd255ccfSMarko Kovacevic 
730cd255ccfSMarko Kovacevic 		sym->cipher.data.length = vec.pt.len;
731cd255ccfSMarko Kovacevic 	} else {
732952e10cdSFan Zhang 		ret = prepare_data_mbufs(&vec.ct);
733952e10cdSFan Zhang 		if (ret < 0)
734952e10cdSFan Zhang 			return ret;
735cd255ccfSMarko Kovacevic 
736cd255ccfSMarko Kovacevic 		sym->cipher.data.length = vec.ct.len;
737cd255ccfSMarko Kovacevic 	}
738cd255ccfSMarko Kovacevic 
73936128a67SGowrishankar Muthukrishnan 	rte_crypto_op_attach_sym_session(env.op, env.sym.sess);
740cd255ccfSMarko Kovacevic 
741952e10cdSFan Zhang 	sym->m_src = env.mbuf;
742952e10cdSFan Zhang 	sym->cipher.data.offset = 0;
743952e10cdSFan Zhang 
744cd255ccfSMarko Kovacevic 	return 0;
745cd255ccfSMarko Kovacevic }
746cd255ccfSMarko Kovacevic 
747d09abf2dSFan Zhang int
748f64adb67SMarko Kovacevic prepare_auth_op(void)
749f64adb67SMarko Kovacevic {
750f64adb67SMarko Kovacevic 	struct rte_crypto_sym_op *sym = env.op->sym;
751952e10cdSFan Zhang 	int ret;
752f64adb67SMarko Kovacevic 
753f64adb67SMarko Kovacevic 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
754952e10cdSFan Zhang 
755e27268bdSBrian Dooley 	if (info.interim_info.gcm_data.gen_iv == 1) {
756e27268bdSBrian Dooley 		uint32_t i;
757e27268bdSBrian Dooley 
758e27268bdSBrian Dooley 		if (!vec.iv.val) {
759e27268bdSBrian Dooley 			vec.iv.val = rte_malloc(0, vec.iv.len, 0);
760e27268bdSBrian Dooley 			if (!vec.iv.val)
761e27268bdSBrian Dooley 				return -ENOMEM;
762e27268bdSBrian Dooley 		}
763e27268bdSBrian Dooley 
764e27268bdSBrian Dooley 		for (i = 0; i < vec.iv.len; i++) {
765b7ceea22SBrian Dooley 			int random = rte_rand();
766e27268bdSBrian Dooley 			vec.iv.val[i] = (uint8_t)random;
767e27268bdSBrian Dooley 		}
768e27268bdSBrian Dooley 	}
769e27268bdSBrian Dooley 
770d09abf2dSFan Zhang 	if (vec.iv.len) {
771d09abf2dSFan Zhang 		uint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *,
772d09abf2dSFan Zhang 				IV_OFF);
773d09abf2dSFan Zhang 		memset(iv, 0, vec.iv.len);
774d09abf2dSFan Zhang 		if (vec.iv.val)
775d09abf2dSFan Zhang 			memcpy(iv, vec.iv.val, vec.iv.len);
776d09abf2dSFan Zhang 	}
777d09abf2dSFan Zhang 
778952e10cdSFan Zhang 	ret = prepare_data_mbufs(&vec.pt);
779952e10cdSFan Zhang 	if (ret < 0)
780952e10cdSFan Zhang 		return ret;
781952e10cdSFan Zhang 
782952e10cdSFan Zhang 	rte_free(env.digest);
783952e10cdSFan Zhang 
784952e10cdSFan Zhang 	env.digest = rte_zmalloc(NULL, vec.cipher_auth.digest.len,
785952e10cdSFan Zhang 			RTE_CACHE_LINE_SIZE);
786952e10cdSFan Zhang 	if (!env.digest) {
787952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Not enough memory\n");
788952e10cdSFan Zhang 		return -ENOMEM;
789952e10cdSFan Zhang 	}
790952e10cdSFan Zhang 	env.digest_len = vec.cipher_auth.digest.len;
791f64adb67SMarko Kovacevic 
792f64adb67SMarko Kovacevic 	sym->m_src = env.mbuf;
793f64adb67SMarko Kovacevic 	sym->auth.data.offset = 0;
794f64adb67SMarko Kovacevic 	sym->auth.data.length = vec.pt.len;
795952e10cdSFan Zhang 	sym->auth.digest.data = env.digest;
796952e10cdSFan Zhang 	sym->auth.digest.phys_addr = rte_malloc_virt2iova(env.digest);
797f64adb67SMarko Kovacevic 
79882cfb9c2SFan Zhang 	if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
799952e10cdSFan Zhang 		memcpy(env.digest, vec.cipher_auth.digest.val,
80082cfb9c2SFan Zhang 				vec.cipher_auth.digest.len);
801f64adb67SMarko Kovacevic 
80236128a67SGowrishankar Muthukrishnan 	rte_crypto_op_attach_sym_session(env.op, env.sym.sess);
803c05e4ab7SThomas Monjalon 
804c05e4ab7SThomas Monjalon 	return 0;
805f64adb67SMarko Kovacevic }
806f64adb67SMarko Kovacevic 
807d09abf2dSFan Zhang int
8084aaad299SMarko Kovacevic prepare_aead_op(void)
8094aaad299SMarko Kovacevic {
8104aaad299SMarko Kovacevic 	struct rte_crypto_sym_op *sym = env.op->sym;
8114aaad299SMarko Kovacevic 	uint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *, IV_OFF);
812952e10cdSFan Zhang 	int ret;
8134aaad299SMarko Kovacevic 
8144aaad299SMarko Kovacevic 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8154aaad299SMarko Kovacevic 
816305921f4SMarko Kovacevic 	if (info.algo == FIPS_TEST_ALGO_AES_CCM)
817952e10cdSFan Zhang 		iv++;
8184aaad299SMarko Kovacevic 
819952e10cdSFan Zhang 	if (vec.iv.val)
820952e10cdSFan Zhang 		memcpy(iv, vec.iv.val, vec.iv.len);
821952e10cdSFan Zhang 	else
822952e10cdSFan Zhang 		/* if REQ file has iv length but not data, default as all 0 */
823952e10cdSFan Zhang 		memset(iv, 0, vec.iv.len);
8244aaad299SMarko Kovacevic 
8254aaad299SMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
826952e10cdSFan Zhang 		ret = prepare_data_mbufs(&vec.pt);
827952e10cdSFan Zhang 		if (ret < 0)
828952e10cdSFan Zhang 			return ret;
8294aaad299SMarko Kovacevic 
830952e10cdSFan Zhang 		rte_free(env.digest);
831952e10cdSFan Zhang 		env.digest = rte_zmalloc(NULL, vec.aead.digest.len,
832952e10cdSFan Zhang 				RTE_CACHE_LINE_SIZE);
833952e10cdSFan Zhang 		if (!env.digest) {
834952e10cdSFan Zhang 			RTE_LOG(ERR, USER1, "Not enough memory\n");
8354aaad299SMarko Kovacevic 			return -ENOMEM;
8364aaad299SMarko Kovacevic 		}
83794dfc563SSamina Arshad 		env.digest_len = vec.aead.digest.len;
8384aaad299SMarko Kovacevic 
8394aaad299SMarko Kovacevic 		sym->aead.data.length = vec.pt.len;
840952e10cdSFan Zhang 		sym->aead.digest.data = env.digest;
841952e10cdSFan Zhang 		sym->aead.digest.phys_addr = rte_malloc_virt2iova(env.digest);
8424aaad299SMarko Kovacevic 	} else {
843952e10cdSFan Zhang 		ret = prepare_data_mbufs(&vec.ct);
844952e10cdSFan Zhang 		if (ret < 0)
845952e10cdSFan Zhang 			return ret;
84694dfc563SSamina Arshad 		env.digest_len = vec.aead.digest.len;
8474aaad299SMarko Kovacevic 		sym->aead.data.length = vec.ct.len;
8484aaad299SMarko Kovacevic 		sym->aead.digest.data = vec.aead.digest.val;
8494aaad299SMarko Kovacevic 		sym->aead.digest.phys_addr = rte_malloc_virt2iova(
8504aaad299SMarko Kovacevic 				sym->aead.digest.data);
8514aaad299SMarko Kovacevic 	}
8524aaad299SMarko Kovacevic 
853952e10cdSFan Zhang 	sym->m_src = env.mbuf;
854952e10cdSFan Zhang 	sym->aead.data.offset = 0;
855952e10cdSFan Zhang 	sym->aead.aad.data = vec.aead.aad.val;
856952e10cdSFan Zhang 	sym->aead.aad.phys_addr = rte_malloc_virt2iova(sym->aead.aad.data);
857952e10cdSFan Zhang 
85836128a67SGowrishankar Muthukrishnan 	rte_crypto_op_attach_sym_session(env.op, env.sym.sess);
85936128a67SGowrishankar Muthukrishnan 
86036128a67SGowrishankar Muthukrishnan 	return 0;
86136128a67SGowrishankar Muthukrishnan }
86236128a67SGowrishankar Muthukrishnan 
86336128a67SGowrishankar Muthukrishnan static int
864ae5ae3bfSGowrishankar Muthukrishnan get_hash_oid(enum rte_crypto_auth_algorithm hash, uint8_t *buf)
865ae5ae3bfSGowrishankar Muthukrishnan {
866ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha512[] = {0x30, 0x51, 0x30, 0x0d, 0x06, 0x09,
867ae5ae3bfSGowrishankar Muthukrishnan 				  0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
868ae5ae3bfSGowrishankar Muthukrishnan 				  0x04, 0x02, 0x03, 0x05, 0x00, 0x04,
869ae5ae3bfSGowrishankar Muthukrishnan 				  0x40};
870ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha384[] = {0x30, 0x41, 0x30, 0x0d, 0x06, 0x09,
871ae5ae3bfSGowrishankar Muthukrishnan 				  0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
872ae5ae3bfSGowrishankar Muthukrishnan 				  0x04, 0x02, 0x02, 0x05, 0x00, 0x04,
873ae5ae3bfSGowrishankar Muthukrishnan 				  0x30};
874ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha256[] = {0x30, 0x31, 0x30, 0x0d, 0x06, 0x09,
875ae5ae3bfSGowrishankar Muthukrishnan 				  0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
876ae5ae3bfSGowrishankar Muthukrishnan 				  0x04, 0x02, 0x01, 0x05, 0x00, 0x04,
877ae5ae3bfSGowrishankar Muthukrishnan 				  0x20};
878ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha224[] = {0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09,
879ae5ae3bfSGowrishankar Muthukrishnan 				  0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
880ae5ae3bfSGowrishankar Muthukrishnan 				  0x04, 0x02, 0x04, 0x05, 0x00, 0x04,
881ae5ae3bfSGowrishankar Muthukrishnan 				  0x1c};
882ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha1[] = {0x30, 0x21, 0x30, 0x09, 0x06, 0x05,
883ae5ae3bfSGowrishankar Muthukrishnan 				0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05,
884ae5ae3bfSGowrishankar Muthukrishnan 				0x00, 0x04, 0x14};
885ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t *id = NULL;
886ae5ae3bfSGowrishankar Muthukrishnan 	int id_len = 0;
887ae5ae3bfSGowrishankar Muthukrishnan 
888ae5ae3bfSGowrishankar Muthukrishnan 	switch (hash) {
889ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA1:
890ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha1;
891ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha1);
892ae5ae3bfSGowrishankar Muthukrishnan 		break;
893ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA224:
894ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha224;
895ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha224);
896ae5ae3bfSGowrishankar Muthukrishnan 		break;
897ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA256:
898ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha256;
899ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha256);
900ae5ae3bfSGowrishankar Muthukrishnan 		break;
901ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA384:
902ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha384;
903ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha384);
904ae5ae3bfSGowrishankar Muthukrishnan 		break;
905ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA512:
906ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha512;
907ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha512);
908ae5ae3bfSGowrishankar Muthukrishnan 		break;
909ae5ae3bfSGowrishankar Muthukrishnan 	default:
910ae5ae3bfSGowrishankar Muthukrishnan 		id_len = -1;
911ae5ae3bfSGowrishankar Muthukrishnan 		break;
912ae5ae3bfSGowrishankar Muthukrishnan 	}
913ae5ae3bfSGowrishankar Muthukrishnan 
914ae5ae3bfSGowrishankar Muthukrishnan 	if (id != NULL)
915ae5ae3bfSGowrishankar Muthukrishnan 		rte_memcpy(buf, id, id_len);
916ae5ae3bfSGowrishankar Muthukrishnan 
917ae5ae3bfSGowrishankar Muthukrishnan 	return id_len;
918ae5ae3bfSGowrishankar Muthukrishnan }
919ae5ae3bfSGowrishankar Muthukrishnan 
920ae5ae3bfSGowrishankar Muthukrishnan static int
92136128a67SGowrishankar Muthukrishnan prepare_rsa_op(void)
92236128a67SGowrishankar Muthukrishnan {
92336128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
92436128a67SGowrishankar Muthukrishnan 	struct fips_val msg;
92536128a67SGowrishankar Muthukrishnan 
92636128a67SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
92736128a67SGowrishankar Muthukrishnan 
92836128a67SGowrishankar Muthukrishnan 	asym = env.op->asym;
92936128a67SGowrishankar Muthukrishnan 	if (env.digest) {
93036128a67SGowrishankar Muthukrishnan 		msg.val = env.digest;
93136128a67SGowrishankar Muthukrishnan 		msg.len = env.digest_len;
93236128a67SGowrishankar Muthukrishnan 	} else {
93336128a67SGowrishankar Muthukrishnan 		msg.val = vec.pt.val;
93436128a67SGowrishankar Muthukrishnan 		msg.len = vec.pt.len;
93536128a67SGowrishankar Muthukrishnan 	}
93636128a67SGowrishankar Muthukrishnan 
93736128a67SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
93836128a67SGowrishankar Muthukrishnan 		asym->rsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
93936128a67SGowrishankar Muthukrishnan 		asym->rsa.message.data = msg.val;
94036128a67SGowrishankar Muthukrishnan 		asym->rsa.message.length = msg.len;
94136128a67SGowrishankar Muthukrishnan 
94236128a67SGowrishankar Muthukrishnan 		rte_free(vec.rsa.signature.val);
94336128a67SGowrishankar Muthukrishnan 
94436128a67SGowrishankar Muthukrishnan 		vec.rsa.signature.val = rte_zmalloc(NULL, vec.rsa.n.len, 0);
94536128a67SGowrishankar Muthukrishnan 		vec.rsa.signature.len = vec.rsa.n.len;
94636128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.data = vec.rsa.signature.val;
94736128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.length = 0;
94836128a67SGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGVER) {
94936128a67SGowrishankar Muthukrishnan 		asym->rsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
95036128a67SGowrishankar Muthukrishnan 		asym->rsa.message.data = msg.val;
95136128a67SGowrishankar Muthukrishnan 		asym->rsa.message.length = msg.len;
95236128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.data = vec.rsa.signature.val;
95336128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.length = vec.rsa.signature.len;
95436128a67SGowrishankar Muthukrishnan 	} else {
95536128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op);
95636128a67SGowrishankar Muthukrishnan 		return -EINVAL;
95736128a67SGowrishankar Muthukrishnan 	}
95836128a67SGowrishankar Muthukrishnan 
95936128a67SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
960c05e4ab7SThomas Monjalon 
961c05e4ab7SThomas Monjalon 	return 0;
9624aaad299SMarko Kovacevic }
9634aaad299SMarko Kovacevic 
9644aaad299SMarko Kovacevic static int
965b455d261SGowrishankar Muthukrishnan prepare_ecdsa_op(void)
966b455d261SGowrishankar Muthukrishnan {
967b455d261SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
968b455d261SGowrishankar Muthukrishnan 	struct fips_val msg;
969b455d261SGowrishankar Muthukrishnan 
970b455d261SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
971b455d261SGowrishankar Muthukrishnan 
972b455d261SGowrishankar Muthukrishnan 	asym = env.op->asym;
973b455d261SGowrishankar Muthukrishnan 	if (env.digest) {
974b455d261SGowrishankar Muthukrishnan 		msg.val = env.digest;
975b455d261SGowrishankar Muthukrishnan 		msg.len = env.digest_len;
976b455d261SGowrishankar Muthukrishnan 	} else {
977b455d261SGowrishankar Muthukrishnan 		msg.val = vec.pt.val;
978b455d261SGowrishankar Muthukrishnan 		msg.len = vec.pt.len;
979b455d261SGowrishankar Muthukrishnan 	}
980b455d261SGowrishankar Muthukrishnan 
981b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
982b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
983b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.data = msg.val;
984b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.length = msg.len;
985b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.k.data = vec.ecdsa.k.val;
986b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.k.length = vec.ecdsa.k.len;
987b455d261SGowrishankar Muthukrishnan 
988b455d261SGowrishankar Muthukrishnan 		rte_free(vec.ecdsa.r.val);
989b455d261SGowrishankar Muthukrishnan 
990b455d261SGowrishankar Muthukrishnan 		rte_free(vec.ecdsa.s.val);
991b455d261SGowrishankar Muthukrishnan 
992b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.r.len = info.interim_info.ecdsa_data.curve_len;
993b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.r.val = rte_zmalloc(NULL, vec.ecdsa.r.len, 0);
994b455d261SGowrishankar Muthukrishnan 
995b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.s.len = vec.ecdsa.r.len;
996b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.s.val = rte_zmalloc(NULL, vec.ecdsa.s.len, 0);
997b455d261SGowrishankar Muthukrishnan 
998b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.data = vec.ecdsa.r.val;
999b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.length = 0;
1000b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.data = vec.ecdsa.s.val;
1001b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.length = 0;
1002b455d261SGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGVER) {
1003b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
1004b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.data = msg.val;
1005b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.length = msg.len;
1006b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.data = vec.ecdsa.r.val;
1007b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.length = vec.ecdsa.r.len;
1008b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.data = vec.ecdsa.s.val;
1009b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.length = vec.ecdsa.s.len;
1010b455d261SGowrishankar Muthukrishnan 	} else {
1011b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op);
1012b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1013b455d261SGowrishankar Muthukrishnan 	}
1014b455d261SGowrishankar Muthukrishnan 
1015b455d261SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
1016b455d261SGowrishankar Muthukrishnan 
1017b455d261SGowrishankar Muthukrishnan 	return 0;
1018b455d261SGowrishankar Muthukrishnan }
1019b455d261SGowrishankar Muthukrishnan 
1020b455d261SGowrishankar Muthukrishnan static int
102112ede9acSGowrishankar Muthukrishnan prepare_eddsa_op(void)
102212ede9acSGowrishankar Muthukrishnan {
102312ede9acSGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
102412ede9acSGowrishankar Muthukrishnan 	struct fips_val msg;
102512ede9acSGowrishankar Muthukrishnan 
102612ede9acSGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
102712ede9acSGowrishankar Muthukrishnan 
102812ede9acSGowrishankar Muthukrishnan 	asym = env.op->asym;
102912ede9acSGowrishankar Muthukrishnan 	if (env.digest) {
103012ede9acSGowrishankar Muthukrishnan 		msg.val = env.digest;
103112ede9acSGowrishankar Muthukrishnan 		msg.len = env.digest_len;
103212ede9acSGowrishankar Muthukrishnan 	} else {
103312ede9acSGowrishankar Muthukrishnan 		msg.val = vec.pt.val;
103412ede9acSGowrishankar Muthukrishnan 		msg.len = vec.pt.len;
103512ede9acSGowrishankar Muthukrishnan 	}
103612ede9acSGowrishankar Muthukrishnan 
103712ede9acSGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
103812ede9acSGowrishankar Muthukrishnan 		asym->eddsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
103912ede9acSGowrishankar Muthukrishnan 		asym->eddsa.message.data = msg.val;
104012ede9acSGowrishankar Muthukrishnan 		asym->eddsa.message.length = msg.len;
104112ede9acSGowrishankar Muthukrishnan 		asym->eddsa.context.data = vec.eddsa.ctx.val;
104212ede9acSGowrishankar Muthukrishnan 		asym->eddsa.context.length = vec.eddsa.ctx.len;
104312ede9acSGowrishankar Muthukrishnan 
104412ede9acSGowrishankar Muthukrishnan 		rte_free(vec.eddsa.sign.val);
104512ede9acSGowrishankar Muthukrishnan 
104612ede9acSGowrishankar Muthukrishnan 		vec.eddsa.sign.len = info.interim_info.eddsa_data.curve_len;
104712ede9acSGowrishankar Muthukrishnan 		vec.eddsa.sign.val = rte_zmalloc(NULL, vec.eddsa.sign.len, 0);
104812ede9acSGowrishankar Muthukrishnan 
104912ede9acSGowrishankar Muthukrishnan 		asym->eddsa.sign.data = vec.eddsa.sign.val;
105012ede9acSGowrishankar Muthukrishnan 		asym->eddsa.sign.length = 0;
105112ede9acSGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGVER) {
105212ede9acSGowrishankar Muthukrishnan 		asym->eddsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
105312ede9acSGowrishankar Muthukrishnan 		asym->eddsa.message.data = msg.val;
105412ede9acSGowrishankar Muthukrishnan 		asym->eddsa.message.length = msg.len;
105512ede9acSGowrishankar Muthukrishnan 		asym->eddsa.sign.data = vec.eddsa.sign.val;
105612ede9acSGowrishankar Muthukrishnan 		asym->eddsa.sign.length = vec.eddsa.sign.len;
105712ede9acSGowrishankar Muthukrishnan 	} else {
105812ede9acSGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op);
105912ede9acSGowrishankar Muthukrishnan 		return -EINVAL;
106012ede9acSGowrishankar Muthukrishnan 	}
106112ede9acSGowrishankar Muthukrishnan 
106212ede9acSGowrishankar Muthukrishnan 	if (info.interim_info.eddsa_data.curve_id == RTE_CRYPTO_EC_GROUP_ED25519) {
106312ede9acSGowrishankar Muthukrishnan 		asym->eddsa.instance = RTE_CRYPTO_EDCURVE_25519;
106412ede9acSGowrishankar Muthukrishnan 		if (info.interim_info.eddsa_data.prehash)
106512ede9acSGowrishankar Muthukrishnan 			asym->eddsa.instance = RTE_CRYPTO_EDCURVE_25519PH;
106612ede9acSGowrishankar Muthukrishnan 		if (vec.eddsa.ctx.len > 0)
106712ede9acSGowrishankar Muthukrishnan 			asym->eddsa.instance = RTE_CRYPTO_EDCURVE_25519CTX;
106812ede9acSGowrishankar Muthukrishnan 	} else {
106912ede9acSGowrishankar Muthukrishnan 		asym->eddsa.instance = RTE_CRYPTO_EDCURVE_448;
107012ede9acSGowrishankar Muthukrishnan 		if (info.interim_info.eddsa_data.prehash)
107112ede9acSGowrishankar Muthukrishnan 			asym->eddsa.instance = RTE_CRYPTO_EDCURVE_448PH;
107212ede9acSGowrishankar Muthukrishnan 	}
107312ede9acSGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
107412ede9acSGowrishankar Muthukrishnan 
107512ede9acSGowrishankar Muthukrishnan 	return 0;
107612ede9acSGowrishankar Muthukrishnan }
107712ede9acSGowrishankar Muthukrishnan 
107812ede9acSGowrishankar Muthukrishnan static int
1079b455d261SGowrishankar Muthukrishnan prepare_ecfpm_op(void)
1080b455d261SGowrishankar Muthukrishnan {
1081b455d261SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
1082b455d261SGowrishankar Muthukrishnan 
1083b455d261SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1084b455d261SGowrishankar Muthukrishnan 
1085b455d261SGowrishankar Muthukrishnan 	asym = env.op->asym;
1086b455d261SGowrishankar Muthukrishnan 	asym->ecpm.scalar.data = vec.ecdsa.pkey.val;
1087b455d261SGowrishankar Muthukrishnan 	asym->ecpm.scalar.length = vec.ecdsa.pkey.len;
1088b455d261SGowrishankar Muthukrishnan 
1089b455d261SGowrishankar Muthukrishnan 	rte_free(vec.ecdsa.qx.val);
1090b455d261SGowrishankar Muthukrishnan 
1091b455d261SGowrishankar Muthukrishnan 	rte_free(vec.ecdsa.qy.val);
1092b455d261SGowrishankar Muthukrishnan 
1093b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qx.len = info.interim_info.ecdsa_data.curve_len;
1094b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qx.val = rte_zmalloc(NULL, vec.ecdsa.qx.len, 0);
1095b455d261SGowrishankar Muthukrishnan 
1096b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qy.len = vec.ecdsa.qx.len;
1097b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qy.val = rte_zmalloc(NULL, vec.ecdsa.qy.len, 0);
1098b455d261SGowrishankar Muthukrishnan 
1099b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.x.data = vec.ecdsa.qx.val;
1100b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.x.length = 0;
1101b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.y.data = vec.ecdsa.qy.val;
1102b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.y.length = 0;
1103b455d261SGowrishankar Muthukrishnan 
1104b455d261SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
1105b455d261SGowrishankar Muthukrishnan 
1106b455d261SGowrishankar Muthukrishnan 	return 0;
1107b455d261SGowrishankar Muthukrishnan }
1108b455d261SGowrishankar Muthukrishnan 
1109b455d261SGowrishankar Muthukrishnan static int
111012ede9acSGowrishankar Muthukrishnan prepare_edfpm_op(void)
111112ede9acSGowrishankar Muthukrishnan {
111212ede9acSGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
111312ede9acSGowrishankar Muthukrishnan 
111412ede9acSGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
111512ede9acSGowrishankar Muthukrishnan 
111612ede9acSGowrishankar Muthukrishnan 	asym = env.op->asym;
111712ede9acSGowrishankar Muthukrishnan 	asym->ecpm.scalar.data = vec.eddsa.pkey.val;
111812ede9acSGowrishankar Muthukrishnan 	asym->ecpm.scalar.length = vec.eddsa.pkey.len;
111912ede9acSGowrishankar Muthukrishnan 
112012ede9acSGowrishankar Muthukrishnan 	rte_free(vec.eddsa.q.val);
112112ede9acSGowrishankar Muthukrishnan 
112212ede9acSGowrishankar Muthukrishnan 	vec.eddsa.q.len = info.interim_info.eddsa_data.curve_len;
112312ede9acSGowrishankar Muthukrishnan 	vec.eddsa.q.val = rte_zmalloc(NULL, vec.eddsa.q.len, 0);
112412ede9acSGowrishankar Muthukrishnan 
112512ede9acSGowrishankar Muthukrishnan 	asym->ecpm.r.x.data = vec.eddsa.q.val;
112612ede9acSGowrishankar Muthukrishnan 	asym->ecpm.r.x.length = 0;
112712ede9acSGowrishankar Muthukrishnan 	asym->flags |= RTE_CRYPTO_ASYM_FLAG_PUB_KEY_COMPRESSED;
112812ede9acSGowrishankar Muthukrishnan 
112912ede9acSGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
113012ede9acSGowrishankar Muthukrishnan 
113112ede9acSGowrishankar Muthukrishnan 	return 0;
113212ede9acSGowrishankar Muthukrishnan }
113312ede9acSGowrishankar Muthukrishnan 
113412ede9acSGowrishankar Muthukrishnan static int
1135cd255ccfSMarko Kovacevic prepare_aes_xform(struct rte_crypto_sym_xform *xform)
1136cd255ccfSMarko Kovacevic {
1137cd255ccfSMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1138cd255ccfSMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1139cd255ccfSMarko Kovacevic 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1140cd255ccfSMarko Kovacevic 
1141cd255ccfSMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1142d3190431SMichael Shamis 	if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_CBC)
1143cd255ccfSMarko Kovacevic 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CBC;
1144c8956fd2SBrian Dooley 	else if (info.interim_info.aes_data.cipher_algo ==
1145c8956fd2SBrian Dooley 			RTE_CRYPTO_CIPHER_AES_CTR)
1146c8956fd2SBrian Dooley 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CTR;
1147d3190431SMichael Shamis 	else
1148d3190431SMichael Shamis 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_ECB;
1149d3190431SMichael Shamis 
1150cd255ccfSMarko Kovacevic 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1151cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1152cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1153cd255ccfSMarko Kovacevic 	cipher_xform->key.data = vec.cipher_auth.key.val;
1154cd255ccfSMarko Kovacevic 	cipher_xform->key.length = vec.cipher_auth.key.len;
1155c8956fd2SBrian Dooley 	if (cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CBC ||
1156c8956fd2SBrian Dooley 			cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CTR) {
1157cd255ccfSMarko Kovacevic 		cipher_xform->iv.length = vec.iv.len;
1158cd255ccfSMarko Kovacevic 		cipher_xform->iv.offset = IV_OFF;
1159d3190431SMichael Shamis 	} else {
1160d3190431SMichael Shamis 		cipher_xform->iv.length = 0;
1161d3190431SMichael Shamis 		cipher_xform->iv.offset = 0;
1162d3190431SMichael Shamis 	}
1163d3190431SMichael Shamis 	cap_idx.algo.cipher = cipher_xform->algo;
1164cd255ccfSMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1165cd255ccfSMarko Kovacevic 
1166cd255ccfSMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1167cd255ccfSMarko Kovacevic 	if (!cap) {
1168cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1169cd255ccfSMarko Kovacevic 				env.dev_id);
1170cd255ccfSMarko Kovacevic 		return -EINVAL;
1171cd255ccfSMarko Kovacevic 	}
1172cd255ccfSMarko Kovacevic 
1173cd255ccfSMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1174cd255ccfSMarko Kovacevic 			cipher_xform->key.length,
1175cd255ccfSMarko Kovacevic 			cipher_xform->iv.length) != 0) {
1176cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1177cd255ccfSMarko Kovacevic 				info.device_name, cipher_xform->key.length,
1178cd255ccfSMarko Kovacevic 				cipher_xform->iv.length);
1179cd255ccfSMarko Kovacevic 		return -EPERM;
1180cd255ccfSMarko Kovacevic 	}
1181cd255ccfSMarko Kovacevic 
1182cd255ccfSMarko Kovacevic 	return 0;
1183cd255ccfSMarko Kovacevic }
1184cd255ccfSMarko Kovacevic 
1185f64adb67SMarko Kovacevic static int
1186527cbf3dSMarko Kovacevic prepare_tdes_xform(struct rte_crypto_sym_xform *xform)
1187527cbf3dSMarko Kovacevic {
1188527cbf3dSMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1189527cbf3dSMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1190527cbf3dSMarko Kovacevic 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1191527cbf3dSMarko Kovacevic 
1192527cbf3dSMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1193527cbf3dSMarko Kovacevic 
1194efe3a8dbSMichael Shamis 	if (info.interim_info.tdes_data.test_mode == TDES_MODE_CBC)
1195527cbf3dSMarko Kovacevic 		cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_CBC;
1196efe3a8dbSMichael Shamis 	else
1197efe3a8dbSMichael Shamis 		cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_ECB;
1198527cbf3dSMarko Kovacevic 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1199527cbf3dSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1200527cbf3dSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1201527cbf3dSMarko Kovacevic 	cipher_xform->key.data = vec.cipher_auth.key.val;
1202527cbf3dSMarko Kovacevic 	cipher_xform->key.length = vec.cipher_auth.key.len;
1203efe3a8dbSMichael Shamis 
1204efe3a8dbSMichael Shamis 	if (cipher_xform->algo == RTE_CRYPTO_CIPHER_3DES_CBC) {
1205527cbf3dSMarko Kovacevic 		cipher_xform->iv.length = vec.iv.len;
1206527cbf3dSMarko Kovacevic 		cipher_xform->iv.offset = IV_OFF;
1207efe3a8dbSMichael Shamis 	} else {
1208efe3a8dbSMichael Shamis 		cipher_xform->iv.length = 0;
1209efe3a8dbSMichael Shamis 		cipher_xform->iv.offset = 0;
1210efe3a8dbSMichael Shamis 	}
1211efe3a8dbSMichael Shamis 	cap_idx.algo.cipher = cipher_xform->algo;
1212527cbf3dSMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1213527cbf3dSMarko Kovacevic 
1214527cbf3dSMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1215527cbf3dSMarko Kovacevic 	if (!cap) {
1216527cbf3dSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1217527cbf3dSMarko Kovacevic 				env.dev_id);
1218527cbf3dSMarko Kovacevic 		return -EINVAL;
1219527cbf3dSMarko Kovacevic 	}
1220527cbf3dSMarko Kovacevic 
1221527cbf3dSMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1222527cbf3dSMarko Kovacevic 			cipher_xform->key.length,
1223527cbf3dSMarko Kovacevic 			cipher_xform->iv.length) != 0) {
1224527cbf3dSMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1225527cbf3dSMarko Kovacevic 				info.device_name, cipher_xform->key.length,
1226527cbf3dSMarko Kovacevic 				cipher_xform->iv.length);
1227527cbf3dSMarko Kovacevic 		return -EPERM;
1228527cbf3dSMarko Kovacevic 	}
1229527cbf3dSMarko Kovacevic 
1230527cbf3dSMarko Kovacevic 	return 0;
1231527cbf3dSMarko Kovacevic }
1232527cbf3dSMarko Kovacevic 
1233527cbf3dSMarko Kovacevic static int
1234f64adb67SMarko Kovacevic prepare_hmac_xform(struct rte_crypto_sym_xform *xform)
1235f64adb67SMarko Kovacevic {
1236f64adb67SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1237f64adb67SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1238f64adb67SMarko Kovacevic 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1239f64adb67SMarko Kovacevic 
1240f64adb67SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1241f64adb67SMarko Kovacevic 
1242f64adb67SMarko Kovacevic 	auth_xform->algo = info.interim_info.hmac_data.algo;
1243f64adb67SMarko Kovacevic 	auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE;
1244f64adb67SMarko Kovacevic 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1245f64adb67SMarko Kovacevic 	auth_xform->key.data = vec.cipher_auth.key.val;
1246f64adb67SMarko Kovacevic 	auth_xform->key.length = vec.cipher_auth.key.len;
1247f64adb67SMarko Kovacevic 
1248f64adb67SMarko Kovacevic 	cap_idx.algo.auth = auth_xform->algo;
1249f64adb67SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1250f64adb67SMarko Kovacevic 
1251f64adb67SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1252f64adb67SMarko Kovacevic 	if (!cap) {
1253f64adb67SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1254f64adb67SMarko Kovacevic 				env.dev_id);
1255f64adb67SMarko Kovacevic 		return -EINVAL;
1256f64adb67SMarko Kovacevic 	}
1257f64adb67SMarko Kovacevic 
1258f64adb67SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_auth(cap,
1259f64adb67SMarko Kovacevic 			auth_xform->key.length,
1260f64adb67SMarko Kovacevic 			auth_xform->digest_length, 0) != 0) {
12618782b3b6SPablo de Lara 		RTE_LOG(ERR, USER1, "PMD %s key length %u Digest length %u\n",
1262f64adb67SMarko Kovacevic 				info.device_name, auth_xform->key.length,
1263f64adb67SMarko Kovacevic 				auth_xform->digest_length);
1264f64adb67SMarko Kovacevic 		return -EPERM;
1265f64adb67SMarko Kovacevic 	}
1266f64adb67SMarko Kovacevic 
1267f64adb67SMarko Kovacevic 	return 0;
1268f64adb67SMarko Kovacevic }
1269f64adb67SMarko Kovacevic 
1270d09abf2dSFan Zhang int
12714aaad299SMarko Kovacevic prepare_gcm_xform(struct rte_crypto_sym_xform *xform)
12724aaad299SMarko Kovacevic {
12734aaad299SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
12744aaad299SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
12754aaad299SMarko Kovacevic 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
12764aaad299SMarko Kovacevic 
12774aaad299SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
12784aaad299SMarko Kovacevic 
12794aaad299SMarko Kovacevic 	aead_xform->algo = RTE_CRYPTO_AEAD_AES_GCM;
12804aaad299SMarko Kovacevic 	aead_xform->aad_length = vec.aead.aad.len;
12814aaad299SMarko Kovacevic 	aead_xform->digest_length = vec.aead.digest.len;
12824aaad299SMarko Kovacevic 	aead_xform->iv.offset = IV_OFF;
12834aaad299SMarko Kovacevic 	aead_xform->iv.length = vec.iv.len;
12844aaad299SMarko Kovacevic 	aead_xform->key.data = vec.aead.key.val;
12854aaad299SMarko Kovacevic 	aead_xform->key.length = vec.aead.key.len;
12864aaad299SMarko Kovacevic 	aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
12874aaad299SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
12884aaad299SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_DECRYPT;
12894aaad299SMarko Kovacevic 
12904aaad299SMarko Kovacevic 	cap_idx.algo.aead = aead_xform->algo;
12914aaad299SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12924aaad299SMarko Kovacevic 
12934aaad299SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
12944aaad299SMarko Kovacevic 	if (!cap) {
12954aaad299SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
12964aaad299SMarko Kovacevic 				env.dev_id);
12974aaad299SMarko Kovacevic 		return -EINVAL;
12984aaad299SMarko Kovacevic 	}
12994aaad299SMarko Kovacevic 
13004aaad299SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_aead(cap,
13014aaad299SMarko Kovacevic 			aead_xform->key.length,
13024aaad299SMarko Kovacevic 			aead_xform->digest_length, aead_xform->aad_length,
13034aaad299SMarko Kovacevic 			aead_xform->iv.length) != 0) {
13044aaad299SMarko Kovacevic 		RTE_LOG(ERR, USER1,
13054aaad299SMarko Kovacevic 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
13064aaad299SMarko Kovacevic 				info.device_name, aead_xform->key.length,
13074aaad299SMarko Kovacevic 				aead_xform->digest_length,
13084aaad299SMarko Kovacevic 				aead_xform->aad_length,
13094aaad299SMarko Kovacevic 				aead_xform->iv.length);
13104aaad299SMarko Kovacevic 		return -EPERM;
13114aaad299SMarko Kovacevic 	}
13124aaad299SMarko Kovacevic 
13134aaad299SMarko Kovacevic 	return 0;
13144aaad299SMarko Kovacevic }
13154aaad299SMarko Kovacevic 
1316d09abf2dSFan Zhang int
1317d09abf2dSFan Zhang prepare_gmac_xform(struct rte_crypto_sym_xform *xform)
1318d09abf2dSFan Zhang {
1319d09abf2dSFan Zhang 	const struct rte_cryptodev_symmetric_capability *cap;
1320d09abf2dSFan Zhang 	struct rte_cryptodev_sym_capability_idx cap_idx;
1321d09abf2dSFan Zhang 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1322d09abf2dSFan Zhang 
1323d09abf2dSFan Zhang 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1324d09abf2dSFan Zhang 
1325d09abf2dSFan Zhang 	auth_xform->algo = RTE_CRYPTO_AUTH_AES_GMAC;
1326d09abf2dSFan Zhang 	auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1327d09abf2dSFan Zhang 			RTE_CRYPTO_AUTH_OP_GENERATE :
1328d09abf2dSFan Zhang 			RTE_CRYPTO_AUTH_OP_VERIFY;
1329d09abf2dSFan Zhang 	auth_xform->iv.offset = IV_OFF;
1330d09abf2dSFan Zhang 	auth_xform->iv.length = vec.iv.len;
1331d09abf2dSFan Zhang 	auth_xform->digest_length = vec.aead.digest.len;
1332d09abf2dSFan Zhang 	auth_xform->key.data = vec.aead.key.val;
1333d09abf2dSFan Zhang 	auth_xform->key.length = vec.aead.key.len;
1334d09abf2dSFan Zhang 
1335d09abf2dSFan Zhang 	cap_idx.algo.auth = auth_xform->algo;
1336d09abf2dSFan Zhang 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1337d09abf2dSFan Zhang 
1338d09abf2dSFan Zhang 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1339d09abf2dSFan Zhang 	if (!cap) {
1340d09abf2dSFan Zhang 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1341d09abf2dSFan Zhang 				env.dev_id);
1342d09abf2dSFan Zhang 		return -EINVAL;
1343d09abf2dSFan Zhang 	}
1344d09abf2dSFan Zhang 
1345d09abf2dSFan Zhang 	if (rte_cryptodev_sym_capability_check_auth(cap,
1346d09abf2dSFan Zhang 			auth_xform->key.length,
1347601b8a54SFan Zhang 			auth_xform->digest_length,
1348601b8a54SFan Zhang 			auth_xform->iv.length) != 0) {
1349601b8a54SFan Zhang 
1350601b8a54SFan Zhang 		RTE_LOG(ERR, USER1,
1351601b8a54SFan Zhang 			"PMD %s key length %u Digest length %u IV length %u\n",
1352d09abf2dSFan Zhang 				info.device_name, auth_xform->key.length,
1353601b8a54SFan Zhang 				auth_xform->digest_length,
1354601b8a54SFan Zhang 				auth_xform->iv.length);
1355d09abf2dSFan Zhang 		return -EPERM;
1356d09abf2dSFan Zhang 	}
1357d09abf2dSFan Zhang 
1358d09abf2dSFan Zhang 	return 0;
1359d09abf2dSFan Zhang }
1360d09abf2dSFan Zhang 
1361ac026f46SMarko Kovacevic static int
1362ac026f46SMarko Kovacevic prepare_cmac_xform(struct rte_crypto_sym_xform *xform)
1363ac026f46SMarko Kovacevic {
1364ac026f46SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1365ac026f46SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1366ac026f46SMarko Kovacevic 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1367ac026f46SMarko Kovacevic 
1368ac026f46SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1369ac026f46SMarko Kovacevic 
1370ac026f46SMarko Kovacevic 	auth_xform->algo = RTE_CRYPTO_AUTH_AES_CMAC;
1371ac026f46SMarko Kovacevic 	auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1372ac026f46SMarko Kovacevic 			RTE_CRYPTO_AUTH_OP_GENERATE : RTE_CRYPTO_AUTH_OP_VERIFY;
1373ac026f46SMarko Kovacevic 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1374ac026f46SMarko Kovacevic 	auth_xform->key.data = vec.cipher_auth.key.val;
1375ac026f46SMarko Kovacevic 	auth_xform->key.length = vec.cipher_auth.key.len;
1376ac026f46SMarko Kovacevic 
1377ac026f46SMarko Kovacevic 	cap_idx.algo.auth = auth_xform->algo;
1378ac026f46SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1379ac026f46SMarko Kovacevic 
1380ac026f46SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1381ac026f46SMarko Kovacevic 	if (!cap) {
1382ac026f46SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1383ac026f46SMarko Kovacevic 				env.dev_id);
1384ac026f46SMarko Kovacevic 		return -EINVAL;
1385ac026f46SMarko Kovacevic 	}
1386ac026f46SMarko Kovacevic 
1387ac026f46SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_auth(cap,
1388ac026f46SMarko Kovacevic 			auth_xform->key.length,
1389ac026f46SMarko Kovacevic 			auth_xform->digest_length, 0) != 0) {
13908782b3b6SPablo de Lara 		RTE_LOG(ERR, USER1, "PMD %s key length %u Digest length %u\n",
1391ac026f46SMarko Kovacevic 				info.device_name, auth_xform->key.length,
1392ac026f46SMarko Kovacevic 				auth_xform->digest_length);
1393ac026f46SMarko Kovacevic 		return -EPERM;
1394ac026f46SMarko Kovacevic 	}
1395ac026f46SMarko Kovacevic 
1396ac026f46SMarko Kovacevic 	return 0;
1397ac026f46SMarko Kovacevic }
1398ac026f46SMarko Kovacevic 
1399305921f4SMarko Kovacevic static int
1400305921f4SMarko Kovacevic prepare_ccm_xform(struct rte_crypto_sym_xform *xform)
1401305921f4SMarko Kovacevic {
1402305921f4SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1403305921f4SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1404305921f4SMarko Kovacevic 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
1405305921f4SMarko Kovacevic 
1406305921f4SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
1407305921f4SMarko Kovacevic 
1408305921f4SMarko Kovacevic 	aead_xform->algo = RTE_CRYPTO_AEAD_AES_CCM;
1409305921f4SMarko Kovacevic 	aead_xform->aad_length = vec.aead.aad.len;
1410305921f4SMarko Kovacevic 	aead_xform->digest_length = vec.aead.digest.len;
1411305921f4SMarko Kovacevic 	aead_xform->iv.offset = IV_OFF;
1412305921f4SMarko Kovacevic 	aead_xform->iv.length = vec.iv.len;
1413305921f4SMarko Kovacevic 	aead_xform->key.data = vec.aead.key.val;
1414305921f4SMarko Kovacevic 	aead_xform->key.length = vec.aead.key.len;
1415305921f4SMarko Kovacevic 	aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1416305921f4SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
1417305921f4SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_DECRYPT;
1418305921f4SMarko Kovacevic 
1419305921f4SMarko Kovacevic 	cap_idx.algo.aead = aead_xform->algo;
1420305921f4SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
1421305921f4SMarko Kovacevic 
1422305921f4SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1423305921f4SMarko Kovacevic 	if (!cap) {
1424305921f4SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1425305921f4SMarko Kovacevic 				env.dev_id);
1426305921f4SMarko Kovacevic 		return -EINVAL;
1427305921f4SMarko Kovacevic 	}
1428305921f4SMarko Kovacevic 
1429305921f4SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_aead(cap,
1430305921f4SMarko Kovacevic 			aead_xform->key.length,
1431305921f4SMarko Kovacevic 			aead_xform->digest_length, aead_xform->aad_length,
1432305921f4SMarko Kovacevic 			aead_xform->iv.length) != 0) {
1433305921f4SMarko Kovacevic 		RTE_LOG(ERR, USER1,
1434305921f4SMarko Kovacevic 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
1435305921f4SMarko Kovacevic 				info.device_name, aead_xform->key.length,
1436305921f4SMarko Kovacevic 				aead_xform->digest_length,
1437305921f4SMarko Kovacevic 				aead_xform->aad_length,
1438305921f4SMarko Kovacevic 				aead_xform->iv.length);
1439305921f4SMarko Kovacevic 		return -EPERM;
1440305921f4SMarko Kovacevic 	}
1441305921f4SMarko Kovacevic 
1442305921f4SMarko Kovacevic 	return 0;
1443305921f4SMarko Kovacevic }
1444305921f4SMarko Kovacevic 
1445f4797baeSDamian Nowak static int
1446f4797baeSDamian Nowak prepare_sha_xform(struct rte_crypto_sym_xform *xform)
1447f4797baeSDamian Nowak {
1448f4797baeSDamian Nowak 	const struct rte_cryptodev_symmetric_capability *cap;
1449f4797baeSDamian Nowak 	struct rte_cryptodev_sym_capability_idx cap_idx;
1450f4797baeSDamian Nowak 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1451f4797baeSDamian Nowak 
1452f4797baeSDamian Nowak 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1453f4797baeSDamian Nowak 
1454f4797baeSDamian Nowak 	auth_xform->algo = info.interim_info.sha_data.algo;
1455f4797baeSDamian Nowak 	auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE;
1456f4797baeSDamian Nowak 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1457f4797baeSDamian Nowak 
1458f4797baeSDamian Nowak 	cap_idx.algo.auth = auth_xform->algo;
1459f4797baeSDamian Nowak 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1460f4797baeSDamian Nowak 
1461f4797baeSDamian Nowak 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1462f4797baeSDamian Nowak 	if (!cap) {
1463f4797baeSDamian Nowak 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1464f4797baeSDamian Nowak 				env.dev_id);
1465f4797baeSDamian Nowak 		return -EINVAL;
1466f4797baeSDamian Nowak 	}
1467f4797baeSDamian Nowak 
1468f4797baeSDamian Nowak 	if (rte_cryptodev_sym_capability_check_auth(cap,
1469f4797baeSDamian Nowak 			auth_xform->key.length,
1470f4797baeSDamian Nowak 			auth_xform->digest_length, 0) != 0) {
1471f4797baeSDamian Nowak 		RTE_LOG(ERR, USER1, "PMD %s key length %u digest length %u\n",
1472f4797baeSDamian Nowak 				info.device_name, auth_xform->key.length,
1473f4797baeSDamian Nowak 				auth_xform->digest_length);
1474f4797baeSDamian Nowak 		return -EPERM;
1475f4797baeSDamian Nowak 	}
1476f4797baeSDamian Nowak 
1477f4797baeSDamian Nowak 	return 0;
1478f4797baeSDamian Nowak }
1479f4797baeSDamian Nowak 
1480d5a9ea55SSucharitha Sarananaga static int
1481d5a9ea55SSucharitha Sarananaga prepare_xts_xform(struct rte_crypto_sym_xform *xform)
1482d5a9ea55SSucharitha Sarananaga {
1483d5a9ea55SSucharitha Sarananaga 	const struct rte_cryptodev_symmetric_capability *cap;
1484d5a9ea55SSucharitha Sarananaga 	struct rte_cryptodev_sym_capability_idx cap_idx;
1485d5a9ea55SSucharitha Sarananaga 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1486d5a9ea55SSucharitha Sarananaga 
1487d5a9ea55SSucharitha Sarananaga 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1488d5a9ea55SSucharitha Sarananaga 
1489d5a9ea55SSucharitha Sarananaga 	cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_XTS;
1490d5a9ea55SSucharitha Sarananaga 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1491d5a9ea55SSucharitha Sarananaga 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1492d5a9ea55SSucharitha Sarananaga 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1493d5a9ea55SSucharitha Sarananaga 	cipher_xform->key.data = vec.cipher_auth.key.val;
1494d5a9ea55SSucharitha Sarananaga 	cipher_xform->key.length = vec.cipher_auth.key.len;
1495d5a9ea55SSucharitha Sarananaga 	cipher_xform->iv.length = vec.iv.len;
1496d5a9ea55SSucharitha Sarananaga 	cipher_xform->iv.offset = IV_OFF;
1497d5a9ea55SSucharitha Sarananaga 
1498d5a9ea55SSucharitha Sarananaga 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_XTS;
1499d5a9ea55SSucharitha Sarananaga 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1500d5a9ea55SSucharitha Sarananaga 
1501d5a9ea55SSucharitha Sarananaga 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1502d5a9ea55SSucharitha Sarananaga 	if (!cap) {
1503d5a9ea55SSucharitha Sarananaga 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1504d5a9ea55SSucharitha Sarananaga 				env.dev_id);
1505d5a9ea55SSucharitha Sarananaga 		return -EINVAL;
1506d5a9ea55SSucharitha Sarananaga 	}
1507d5a9ea55SSucharitha Sarananaga 
1508d5a9ea55SSucharitha Sarananaga 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1509d5a9ea55SSucharitha Sarananaga 			cipher_xform->key.length,
1510d5a9ea55SSucharitha Sarananaga 			cipher_xform->iv.length) != 0) {
1511d5a9ea55SSucharitha Sarananaga 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1512d5a9ea55SSucharitha Sarananaga 				info.device_name, cipher_xform->key.length,
1513d5a9ea55SSucharitha Sarananaga 				cipher_xform->iv.length);
1514d5a9ea55SSucharitha Sarananaga 		return -EPERM;
1515d5a9ea55SSucharitha Sarananaga 	}
1516d5a9ea55SSucharitha Sarananaga 
1517d5a9ea55SSucharitha Sarananaga 	return 0;
1518d5a9ea55SSucharitha Sarananaga }
1519d5a9ea55SSucharitha Sarananaga 
1520952e10cdSFan Zhang static int
152136128a67SGowrishankar Muthukrishnan prepare_rsa_xform(struct rte_crypto_asym_xform *xform)
152236128a67SGowrishankar Muthukrishnan {
152336128a67SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
152436128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
152536128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_info dev_info;
152636128a67SGowrishankar Muthukrishnan 
152736128a67SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_RSA;
152836128a67SGowrishankar Muthukrishnan 	xform->next = NULL;
152936128a67SGowrishankar Muthukrishnan 
153036128a67SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
153136128a67SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
153236128a67SGowrishankar Muthukrishnan 	if (!cap) {
153336128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
153436128a67SGowrishankar Muthukrishnan 				env.dev_id);
153536128a67SGowrishankar Muthukrishnan 		return -EINVAL;
153636128a67SGowrishankar Muthukrishnan 	}
153736128a67SGowrishankar Muthukrishnan 
153836128a67SGowrishankar Muthukrishnan 	switch (info.op) {
153936128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
154036128a67SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
154136128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
154236128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
154336128a67SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
154436128a67SGowrishankar Muthukrishnan 			return -EPERM;
154536128a67SGowrishankar Muthukrishnan 		}
154636128a67SGowrishankar Muthukrishnan 		break;
154736128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
154836128a67SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
154936128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
155036128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
155136128a67SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
155236128a67SGowrishankar Muthukrishnan 			return -EPERM;
155336128a67SGowrishankar Muthukrishnan 		}
155436128a67SGowrishankar Muthukrishnan 		break;
155536128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_KEYGEN:
155636128a67SGowrishankar Muthukrishnan 		break;
155736128a67SGowrishankar Muthukrishnan 	default:
155836128a67SGowrishankar Muthukrishnan 		break;
155936128a67SGowrishankar Muthukrishnan 	}
156036128a67SGowrishankar Muthukrishnan 
156136128a67SGowrishankar Muthukrishnan 	rte_cryptodev_info_get(env.dev_id, &dev_info);
156236128a67SGowrishankar Muthukrishnan 	xform->rsa.key_type = info.interim_info.rsa_data.privkey;
156336128a67SGowrishankar Muthukrishnan 	switch (xform->rsa.key_type) {
156436128a67SGowrishankar Muthukrishnan 	case RTE_RSA_KEY_TYPE_QT:
156536128a67SGowrishankar Muthukrishnan 		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT)) {
156636128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s does not support QT key type\n",
156736128a67SGowrishankar Muthukrishnan 				info.device_name);
156836128a67SGowrishankar Muthukrishnan 			return -EPERM;
156936128a67SGowrishankar Muthukrishnan 		}
157036128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.p.data = vec.rsa.p.val;
157136128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.p.length = vec.rsa.p.len;
157236128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.q.data = vec.rsa.q.val;
157336128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.q.length = vec.rsa.q.len;
157436128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dP.data = vec.rsa.dp.val;
157536128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dP.length = vec.rsa.dp.len;
157636128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dQ.data = vec.rsa.dq.val;
157736128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dQ.length = vec.rsa.dq.len;
157836128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.qInv.data = vec.rsa.qinv.val;
157936128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.qInv.length = vec.rsa.qinv.len;
158036128a67SGowrishankar Muthukrishnan 		break;
158136128a67SGowrishankar Muthukrishnan 	case RTE_RSA_KEY_TYPE_EXP:
158236128a67SGowrishankar Muthukrishnan 		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_EXP)) {
158336128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s does not support EXP key type\n",
158436128a67SGowrishankar Muthukrishnan 				info.device_name);
158536128a67SGowrishankar Muthukrishnan 			return -EPERM;
158636128a67SGowrishankar Muthukrishnan 		}
158736128a67SGowrishankar Muthukrishnan 		xform->rsa.d.data = vec.rsa.d.val;
158836128a67SGowrishankar Muthukrishnan 		xform->rsa.d.length = vec.rsa.d.len;
158936128a67SGowrishankar Muthukrishnan 		break;
159036128a67SGowrishankar Muthukrishnan 	default:
159136128a67SGowrishankar Muthukrishnan 		break;
159236128a67SGowrishankar Muthukrishnan 	}
159336128a67SGowrishankar Muthukrishnan 
159436128a67SGowrishankar Muthukrishnan 	xform->rsa.e.data = vec.rsa.e.val;
159536128a67SGowrishankar Muthukrishnan 	xform->rsa.e.length = vec.rsa.e.len;
159636128a67SGowrishankar Muthukrishnan 	xform->rsa.n.data = vec.rsa.n.val;
159736128a67SGowrishankar Muthukrishnan 	xform->rsa.n.length = vec.rsa.n.len;
15988a97564bSGowrishankar Muthukrishnan 
15998a97564bSGowrishankar Muthukrishnan 	xform->rsa.padding.type = info.interim_info.rsa_data.padding;
16008a97564bSGowrishankar Muthukrishnan 	xform->rsa.padding.hash = info.interim_info.rsa_data.auth;
16018a97564bSGowrishankar Muthukrishnan 	if (env.digest) {
16028a97564bSGowrishankar Muthukrishnan 		if (xform->rsa.padding.type == RTE_CRYPTO_RSA_PADDING_PKCS1_5) {
16038a97564bSGowrishankar Muthukrishnan 			struct fips_val msg;
16048a97564bSGowrishankar Muthukrishnan 			int b_len = 0;
16058a97564bSGowrishankar Muthukrishnan 			uint8_t b[32];
16068a97564bSGowrishankar Muthukrishnan 
16078a97564bSGowrishankar Muthukrishnan 			b_len = get_hash_oid(xform->rsa.padding.hash, b);
16088a97564bSGowrishankar Muthukrishnan 			if (b_len < 0) {
16098a97564bSGowrishankar Muthukrishnan 				RTE_LOG(ERR, USER1, "Failed to get digest info for hash %d\n",
16108a97564bSGowrishankar Muthukrishnan 					xform->rsa.padding.hash);
16118a97564bSGowrishankar Muthukrishnan 				return -EINVAL;
16128a97564bSGowrishankar Muthukrishnan 			}
16138a97564bSGowrishankar Muthukrishnan 
16148a97564bSGowrishankar Muthukrishnan 			if (b_len) {
16158a97564bSGowrishankar Muthukrishnan 				msg.len = env.digest_len + b_len;
16168a97564bSGowrishankar Muthukrishnan 				msg.val = rte_zmalloc(NULL, msg.len, 0);
16178a97564bSGowrishankar Muthukrishnan 				rte_memcpy(msg.val, b, b_len);
16188a97564bSGowrishankar Muthukrishnan 				rte_memcpy(msg.val + b_len, env.digest, env.digest_len);
16198a97564bSGowrishankar Muthukrishnan 				rte_free(env.digest);
16208a97564bSGowrishankar Muthukrishnan 				env.digest = msg.val;
16218a97564bSGowrishankar Muthukrishnan 				env.digest_len = msg.len;
16228a97564bSGowrishankar Muthukrishnan 			}
16238a97564bSGowrishankar Muthukrishnan 		}
16248a97564bSGowrishankar Muthukrishnan 	}
16258a97564bSGowrishankar Muthukrishnan 
162636128a67SGowrishankar Muthukrishnan 	return 0;
162736128a67SGowrishankar Muthukrishnan }
162836128a67SGowrishankar Muthukrishnan 
162936128a67SGowrishankar Muthukrishnan static int
1630b455d261SGowrishankar Muthukrishnan prepare_ecdsa_xform(struct rte_crypto_asym_xform *xform)
1631b455d261SGowrishankar Muthukrishnan {
1632b455d261SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1633b455d261SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1634b455d261SGowrishankar Muthukrishnan 
1635b455d261SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECDSA;
1636b455d261SGowrishankar Muthukrishnan 	xform->next = NULL;
1637b455d261SGowrishankar Muthukrishnan 
1638b455d261SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1639b455d261SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1640b455d261SGowrishankar Muthukrishnan 	if (!cap) {
1641b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1642b455d261SGowrishankar Muthukrishnan 				env.dev_id);
1643b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1644b455d261SGowrishankar Muthukrishnan 	}
1645b455d261SGowrishankar Muthukrishnan 
1646b455d261SGowrishankar Muthukrishnan 	switch (info.op) {
1647b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
1648b455d261SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1649b455d261SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
1650b455d261SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1651b455d261SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
1652b455d261SGowrishankar Muthukrishnan 			return -EPERM;
1653b455d261SGowrishankar Muthukrishnan 		}
1654badc0c6fSGowrishankar Muthukrishnan 
1655badc0c6fSGowrishankar Muthukrishnan 		xform->ec.pkey.data = vec.ecdsa.pkey.val;
1656badc0c6fSGowrishankar Muthukrishnan 		xform->ec.pkey.length = vec.ecdsa.pkey.len;
1657b455d261SGowrishankar Muthukrishnan 		break;
1658b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
1659b455d261SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1660b455d261SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
1661b455d261SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1662b455d261SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
1663b455d261SGowrishankar Muthukrishnan 			return -EPERM;
1664b455d261SGowrishankar Muthukrishnan 		}
1665badc0c6fSGowrishankar Muthukrishnan 
1666badc0c6fSGowrishankar Muthukrishnan 		xform->ec.q.x.data = vec.ecdsa.qx.val;
1667badc0c6fSGowrishankar Muthukrishnan 		xform->ec.q.x.length = vec.ecdsa.qx.len;
1668badc0c6fSGowrishankar Muthukrishnan 		xform->ec.q.y.data = vec.ecdsa.qy.val;
1669badc0c6fSGowrishankar Muthukrishnan 		xform->ec.q.y.length = vec.ecdsa.qy.len;
1670b455d261SGowrishankar Muthukrishnan 		break;
1671b455d261SGowrishankar Muthukrishnan 	default:
1672b455d261SGowrishankar Muthukrishnan 		break;
1673b455d261SGowrishankar Muthukrishnan 	}
1674b455d261SGowrishankar Muthukrishnan 
1675b455d261SGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id;
1676b455d261SGowrishankar Muthukrishnan 	return 0;
1677b455d261SGowrishankar Muthukrishnan }
1678b455d261SGowrishankar Muthukrishnan 
1679b455d261SGowrishankar Muthukrishnan static int
168012ede9acSGowrishankar Muthukrishnan prepare_eddsa_xform(struct rte_crypto_asym_xform *xform)
168112ede9acSGowrishankar Muthukrishnan {
168212ede9acSGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
168312ede9acSGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
168412ede9acSGowrishankar Muthukrishnan 
168512ede9acSGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_EDDSA;
168612ede9acSGowrishankar Muthukrishnan 	xform->next = NULL;
168712ede9acSGowrishankar Muthukrishnan 
168812ede9acSGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
168912ede9acSGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
169012ede9acSGowrishankar Muthukrishnan 	if (!cap) {
169112ede9acSGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
169212ede9acSGowrishankar Muthukrishnan 				env.dev_id);
169312ede9acSGowrishankar Muthukrishnan 		return -EINVAL;
169412ede9acSGowrishankar Muthukrishnan 	}
169512ede9acSGowrishankar Muthukrishnan 
169612ede9acSGowrishankar Muthukrishnan 	switch (info.op) {
169712ede9acSGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
169812ede9acSGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
169912ede9acSGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
170012ede9acSGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
170112ede9acSGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
170212ede9acSGowrishankar Muthukrishnan 			return -EPERM;
170312ede9acSGowrishankar Muthukrishnan 		}
170412ede9acSGowrishankar Muthukrishnan 
170512ede9acSGowrishankar Muthukrishnan 		xform->ec.pkey.data = vec.eddsa.pkey.val;
170612ede9acSGowrishankar Muthukrishnan 		xform->ec.pkey.length = vec.eddsa.pkey.len;
170712ede9acSGowrishankar Muthukrishnan 		xform->ec.q.x.data = vec.eddsa.q.val;
170812ede9acSGowrishankar Muthukrishnan 		xform->ec.q.x.length = vec.eddsa.q.len;
170912ede9acSGowrishankar Muthukrishnan 		break;
171012ede9acSGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
171112ede9acSGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
171212ede9acSGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
171312ede9acSGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
171412ede9acSGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
171512ede9acSGowrishankar Muthukrishnan 			return -EPERM;
171612ede9acSGowrishankar Muthukrishnan 		}
171712ede9acSGowrishankar Muthukrishnan 
171812ede9acSGowrishankar Muthukrishnan 		xform->ec.q.x.data = vec.eddsa.q.val;
171912ede9acSGowrishankar Muthukrishnan 		xform->ec.q.x.length = vec.eddsa.q.len;
172012ede9acSGowrishankar Muthukrishnan 		break;
172112ede9acSGowrishankar Muthukrishnan 	default:
172212ede9acSGowrishankar Muthukrishnan 		break;
172312ede9acSGowrishankar Muthukrishnan 	}
172412ede9acSGowrishankar Muthukrishnan 
172512ede9acSGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.eddsa_data.curve_id;
172612ede9acSGowrishankar Muthukrishnan 	return 0;
172712ede9acSGowrishankar Muthukrishnan }
172812ede9acSGowrishankar Muthukrishnan 
172912ede9acSGowrishankar Muthukrishnan static int
1730b455d261SGowrishankar Muthukrishnan prepare_ecfpm_xform(struct rte_crypto_asym_xform *xform)
1731b455d261SGowrishankar Muthukrishnan {
1732b455d261SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1733b455d261SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1734b455d261SGowrishankar Muthukrishnan 
1735b455d261SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECFPM;
1736b455d261SGowrishankar Muthukrishnan 	xform->next = NULL;
1737b455d261SGowrishankar Muthukrishnan 
1738b455d261SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1739b455d261SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1740b455d261SGowrishankar Muthukrishnan 	if (!cap) {
1741b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1742b455d261SGowrishankar Muthukrishnan 				env.dev_id);
1743b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1744b455d261SGowrishankar Muthukrishnan 	}
1745b455d261SGowrishankar Muthukrishnan 
1746b455d261SGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id;
1747b455d261SGowrishankar Muthukrishnan 	return 0;
1748b455d261SGowrishankar Muthukrishnan }
1749b455d261SGowrishankar Muthukrishnan 
1750b455d261SGowrishankar Muthukrishnan static int
175112ede9acSGowrishankar Muthukrishnan prepare_edfpm_xform(struct rte_crypto_asym_xform *xform)
175212ede9acSGowrishankar Muthukrishnan {
175312ede9acSGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
175412ede9acSGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
175512ede9acSGowrishankar Muthukrishnan 
175612ede9acSGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECFPM;
175712ede9acSGowrishankar Muthukrishnan 	xform->next = NULL;
175812ede9acSGowrishankar Muthukrishnan 
175912ede9acSGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
176012ede9acSGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
176112ede9acSGowrishankar Muthukrishnan 	if (!cap) {
176212ede9acSGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
176312ede9acSGowrishankar Muthukrishnan 				env.dev_id);
176412ede9acSGowrishankar Muthukrishnan 		return -EINVAL;
176512ede9acSGowrishankar Muthukrishnan 	}
176612ede9acSGowrishankar Muthukrishnan 
176712ede9acSGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.eddsa_data.curve_id;
176812ede9acSGowrishankar Muthukrishnan 	return 0;
176912ede9acSGowrishankar Muthukrishnan }
177012ede9acSGowrishankar Muthukrishnan 
177112ede9acSGowrishankar Muthukrishnan static int
1772cd255ccfSMarko Kovacevic get_writeback_data(struct fips_val *val)
1773cd255ccfSMarko Kovacevic {
1774952e10cdSFan Zhang 	struct rte_mbuf *m = env.mbuf;
1775952e10cdSFan Zhang 	uint16_t data_len = rte_pktmbuf_pkt_len(m);
1776952e10cdSFan Zhang 	uint16_t total_len = data_len + env.digest_len;
1777952e10cdSFan Zhang 	uint8_t *src, *dst, *wb_data;
1778952e10cdSFan Zhang 
1779952e10cdSFan Zhang 	/* in case val is reused for MCT test, try to free the buffer first */
1780952e10cdSFan Zhang 	if (val->val) {
17813d3408ddSGowrishankar Muthukrishnan 		rte_free(val->val);
1782952e10cdSFan Zhang 		val->val = NULL;
1783952e10cdSFan Zhang 	}
1784952e10cdSFan Zhang 
17853d3408ddSGowrishankar Muthukrishnan 	wb_data = dst = rte_malloc(NULL, total_len, 0);
1786952e10cdSFan Zhang 	if (!dst) {
1787952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error %i: Not enough memory\n", -ENOMEM);
1788952e10cdSFan Zhang 		return -ENOMEM;
1789952e10cdSFan Zhang 	}
1790952e10cdSFan Zhang 
1791952e10cdSFan Zhang 	while (m && data_len) {
1792952e10cdSFan Zhang 		uint16_t seg_len = RTE_MIN(rte_pktmbuf_data_len(m), data_len);
1793952e10cdSFan Zhang 
1794952e10cdSFan Zhang 		src = rte_pktmbuf_mtod(m, uint8_t *);
1795952e10cdSFan Zhang 		memcpy(dst, src, seg_len);
1796952e10cdSFan Zhang 		m = m->next;
1797952e10cdSFan Zhang 		data_len -= seg_len;
1798952e10cdSFan Zhang 		dst += seg_len;
1799952e10cdSFan Zhang 	}
1800952e10cdSFan Zhang 
1801952e10cdSFan Zhang 	if (data_len) {
1802952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error -1: write back data\n");
18033d3408ddSGowrishankar Muthukrishnan 		rte_free(wb_data);
1804952e10cdSFan Zhang 		return -1;
1805952e10cdSFan Zhang 	}
1806952e10cdSFan Zhang 
1807952e10cdSFan Zhang 	if (env.digest)
1808952e10cdSFan Zhang 		memcpy(dst, env.digest, env.digest_len);
1809952e10cdSFan Zhang 
1810952e10cdSFan Zhang 	val->val = wb_data;
1811952e10cdSFan Zhang 	val->len = total_len;
1812952e10cdSFan Zhang 
1813952e10cdSFan Zhang 	return 0;
1814cd255ccfSMarko Kovacevic }
1815cd255ccfSMarko Kovacevic 
1816cd255ccfSMarko Kovacevic static int
181736128a67SGowrishankar Muthukrishnan fips_run_sym_test(void)
1818cd255ccfSMarko Kovacevic {
1819cd255ccfSMarko Kovacevic 	struct rte_crypto_sym_xform xform = {0};
1820cd255ccfSMarko Kovacevic 	uint16_t n_deqd;
1821cd255ccfSMarko Kovacevic 	int ret;
1822cd255ccfSMarko Kovacevic 
182336128a67SGowrishankar Muthukrishnan 	if (!test_ops.prepare_sym_xform || !test_ops.prepare_sym_op)
182436128a67SGowrishankar Muthukrishnan 		return -EINVAL;
182536128a67SGowrishankar Muthukrishnan 
182636128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_sym_xform(&xform);
1827cd255ccfSMarko Kovacevic 	if (ret < 0)
1828cd255ccfSMarko Kovacevic 		return ret;
1829cd255ccfSMarko Kovacevic 
183036128a67SGowrishankar Muthukrishnan 	env.sym.sess = rte_cryptodev_sym_session_create(env.dev_id, &xform,
183136128a67SGowrishankar Muthukrishnan 						env.sym.sess_mpool);
183236128a67SGowrishankar Muthukrishnan 	if (!env.sym.sess)
183336128a67SGowrishankar Muthukrishnan 		return -ENOMEM;
1834cd255ccfSMarko Kovacevic 
183536128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_sym_op();
1836cd255ccfSMarko Kovacevic 	if (ret < 0) {
1837cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Prepare op\n",
1838cd255ccfSMarko Kovacevic 				ret);
1839083a2777SMarko Kovacevic 		goto exit;
1840cd255ccfSMarko Kovacevic 	}
1841cd255ccfSMarko Kovacevic 
1842cd255ccfSMarko Kovacevic 	if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) {
1843cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error: Failed enqueue\n");
1844083a2777SMarko Kovacevic 		ret = -1;
1845083a2777SMarko Kovacevic 		goto exit;
1846cd255ccfSMarko Kovacevic 	}
1847cd255ccfSMarko Kovacevic 
1848cd255ccfSMarko Kovacevic 	do {
1849cd255ccfSMarko Kovacevic 		struct rte_crypto_op *deqd_op;
1850cd255ccfSMarko Kovacevic 
185136128a67SGowrishankar Muthukrishnan 		n_deqd = rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1);
1852cd255ccfSMarko Kovacevic 	} while (n_deqd == 0);
1853cd255ccfSMarko Kovacevic 
1854cd255ccfSMarko Kovacevic 	vec.status = env.op->status;
1855cd255ccfSMarko Kovacevic 
1856083a2777SMarko Kovacevic exit:
185736128a67SGowrishankar Muthukrishnan 	rte_cryptodev_sym_session_free(env.dev_id, env.sym.sess);
185836128a67SGowrishankar Muthukrishnan 	env.sym.sess = NULL;
185936128a67SGowrishankar Muthukrishnan 	return ret;
1860bdce2564SAkhil Goyal }
1861cd255ccfSMarko Kovacevic 
186236128a67SGowrishankar Muthukrishnan static int
186336128a67SGowrishankar Muthukrishnan fips_run_asym_test(void)
186436128a67SGowrishankar Muthukrishnan {
186536128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_xform xform = {0};
186636128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
186736128a67SGowrishankar Muthukrishnan 	struct rte_crypto_op *deqd_op;
186836128a67SGowrishankar Muthukrishnan 	int ret;
186936128a67SGowrishankar Muthukrishnan 
187012ede9acSGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_KEYGEN &&
187112ede9acSGowrishankar Muthukrishnan 		(info.algo != FIPS_TEST_ALGO_ECDSA &&
187212ede9acSGowrishankar Muthukrishnan 		 info.algo != FIPS_TEST_ALGO_EDDSA)) {
187336128a67SGowrishankar Muthukrishnan 		RTE_SET_USED(asym);
187436128a67SGowrishankar Muthukrishnan 		ret = 0;
187536128a67SGowrishankar Muthukrishnan 		goto exit;
187636128a67SGowrishankar Muthukrishnan 	}
187736128a67SGowrishankar Muthukrishnan 
187836128a67SGowrishankar Muthukrishnan 	if (!test_ops.prepare_asym_xform || !test_ops.prepare_asym_op)
187936128a67SGowrishankar Muthukrishnan 		return -EINVAL;
188036128a67SGowrishankar Muthukrishnan 
188136128a67SGowrishankar Muthukrishnan 	asym = env.op->asym;
188236128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_asym_xform(&xform);
188336128a67SGowrishankar Muthukrishnan 	if (ret < 0)
1884cd255ccfSMarko Kovacevic 		return ret;
188536128a67SGowrishankar Muthukrishnan 
188636128a67SGowrishankar Muthukrishnan 	ret = rte_cryptodev_asym_session_create(env.dev_id, &xform, env.asym.sess_mpool,
188736128a67SGowrishankar Muthukrishnan 			(void *)&env.asym.sess);
188836128a67SGowrishankar Muthukrishnan 	if (ret < 0)
188936128a67SGowrishankar Muthukrishnan 		return ret;
189036128a67SGowrishankar Muthukrishnan 
189136128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_asym_op();
189236128a67SGowrishankar Muthukrishnan 	if (ret < 0) {
189336128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Error %i: Prepare op\n", ret);
189436128a67SGowrishankar Muthukrishnan 		goto exit;
189536128a67SGowrishankar Muthukrishnan 	}
189636128a67SGowrishankar Muthukrishnan 
189736128a67SGowrishankar Muthukrishnan 	if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) {
189836128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Error: Failed enqueue\n");
189936128a67SGowrishankar Muthukrishnan 		ret = -1;
190036128a67SGowrishankar Muthukrishnan 		goto exit;
190136128a67SGowrishankar Muthukrishnan 	}
190236128a67SGowrishankar Muthukrishnan 
190336128a67SGowrishankar Muthukrishnan 	while (rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1) == 0)
190436128a67SGowrishankar Muthukrishnan 		rte_pause();
190536128a67SGowrishankar Muthukrishnan 
190636128a67SGowrishankar Muthukrishnan 	vec.status = env.op->status;
190736128a67SGowrishankar Muthukrishnan 
190836128a67SGowrishankar Muthukrishnan  exit:
190936128a67SGowrishankar Muthukrishnan 	if (env.asym.sess)
191036128a67SGowrishankar Muthukrishnan 		rte_cryptodev_asym_session_free(env.dev_id, env.asym.sess);
191136128a67SGowrishankar Muthukrishnan 
191236128a67SGowrishankar Muthukrishnan 	env.asym.sess = NULL;
191336128a67SGowrishankar Muthukrishnan 	return ret;
191436128a67SGowrishankar Muthukrishnan }
191536128a67SGowrishankar Muthukrishnan 
191636128a67SGowrishankar Muthukrishnan static int
191736128a67SGowrishankar Muthukrishnan fips_run_test(void)
191836128a67SGowrishankar Muthukrishnan {
191936128a67SGowrishankar Muthukrishnan 	int ret;
192036128a67SGowrishankar Muthukrishnan 
192112ede9acSGowrishankar Muthukrishnan 	env.op = NULL;
192212ede9acSGowrishankar Muthukrishnan 	if (!env.is_asym_test) {
192336128a67SGowrishankar Muthukrishnan 		env.op = env.sym.op;
192436128a67SGowrishankar Muthukrishnan 		return fips_run_sym_test();
192536128a67SGowrishankar Muthukrishnan 	}
192636128a67SGowrishankar Muthukrishnan 
192712ede9acSGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_KEYGEN) {
192812ede9acSGowrishankar Muthukrishnan 		if (info.algo == FIPS_TEST_ALGO_ECDSA) {
192912ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecfpm_xform;
193012ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecfpm_op;
193112ede9acSGowrishankar Muthukrishnan 			info.interim_info.ecdsa_data.pubkey_gen = 0;
1932b455d261SGowrishankar Muthukrishnan 
193312ede9acSGowrishankar Muthukrishnan 		} else if (info.algo == FIPS_TEST_ALGO_EDDSA) {
193412ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_edfpm_xform;
193512ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_edfpm_op;
193612ede9acSGowrishankar Muthukrishnan 			info.interim_info.eddsa_data.pubkey_gen = 0;
193712ede9acSGowrishankar Muthukrishnan 		}
193812ede9acSGowrishankar Muthukrishnan 
193912ede9acSGowrishankar Muthukrishnan 		env.op = env.asym.op;
194012ede9acSGowrishankar Muthukrishnan 		return fips_run_asym_test();
194112ede9acSGowrishankar Muthukrishnan 	}
194212ede9acSGowrishankar Muthukrishnan 
1943*733c7861SGowrishankar Muthukrishnan 	if (info.algo == FIPS_TEST_ALGO_ECDSA ||
1944*733c7861SGowrishankar Muthukrishnan 	    info.algo == FIPS_TEST_ALGO_RSA) {
194512ede9acSGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len =
194612ede9acSGowrishankar Muthukrishnan 			parse_test_sha_hash_size(info.interim_info.ecdsa_data.auth);
194712ede9acSGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_sha_xform;
194812ede9acSGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
194912ede9acSGowrishankar Muthukrishnan 
195012ede9acSGowrishankar Muthukrishnan 		env.op = env.sym.op;
195112ede9acSGowrishankar Muthukrishnan 		ret = fips_run_sym_test();
195212ede9acSGowrishankar Muthukrishnan 		if (ret < 0)
195312ede9acSGowrishankar Muthukrishnan 			return ret;
195412ede9acSGowrishankar Muthukrishnan 	}
195512ede9acSGowrishankar Muthukrishnan 
195612ede9acSGowrishankar Muthukrishnan 	env.op = env.asym.op;
195712ede9acSGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
195812ede9acSGowrishankar Muthukrishnan 		fips_prepare_asym_xform_t old_xform;
195912ede9acSGowrishankar Muthukrishnan 		fips_prepare_op_t old_op;
196012ede9acSGowrishankar Muthukrishnan 
196112ede9acSGowrishankar Muthukrishnan 		old_xform = test_ops.prepare_asym_xform;
196212ede9acSGowrishankar Muthukrishnan 		old_op = test_ops.prepare_asym_op;
196312ede9acSGowrishankar Muthukrishnan 
196412ede9acSGowrishankar Muthukrishnan 		if (info.algo == FIPS_TEST_ALGO_ECDSA &&
196512ede9acSGowrishankar Muthukrishnan 		    info.interim_info.ecdsa_data.pubkey_gen == 1) {
1966b455d261SGowrishankar Muthukrishnan 			info.op = FIPS_TEST_ASYM_KEYGEN;
1967b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecfpm_xform;
1968b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecfpm_op;
196912ede9acSGowrishankar Muthukrishnan 
1970b455d261SGowrishankar Muthukrishnan 			ret = fips_run_asym_test();
1971b455d261SGowrishankar Muthukrishnan 			if (ret < 0)
1972b455d261SGowrishankar Muthukrishnan 				return ret;
1973b455d261SGowrishankar Muthukrishnan 
1974b455d261SGowrishankar Muthukrishnan 			info.post_interim_writeback(NULL);
1975b455d261SGowrishankar Muthukrishnan 			info.interim_info.ecdsa_data.pubkey_gen = 0;
1976b455d261SGowrishankar Muthukrishnan 
197712ede9acSGowrishankar Muthukrishnan 		} else if (info.algo == FIPS_TEST_ALGO_EDDSA &&
197812ede9acSGowrishankar Muthukrishnan 				   info.interim_info.eddsa_data.pubkey_gen == 1) {
197912ede9acSGowrishankar Muthukrishnan 			info.op = FIPS_TEST_ASYM_KEYGEN;
198012ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_edfpm_xform;
198112ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_edfpm_op;
198212ede9acSGowrishankar Muthukrishnan 
198312ede9acSGowrishankar Muthukrishnan 			const struct rte_cryptodev_asymmetric_xform_capability *cap;
198412ede9acSGowrishankar Muthukrishnan 			struct rte_cryptodev_asym_capability_idx cap_idx;
198512ede9acSGowrishankar Muthukrishnan 
198612ede9acSGowrishankar Muthukrishnan 			cap_idx.type = RTE_CRYPTO_ASYM_XFORM_EDDSA;
198712ede9acSGowrishankar Muthukrishnan 			cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
198812ede9acSGowrishankar Muthukrishnan 			if (!cap) {
198912ede9acSGowrishankar Muthukrishnan 				RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
199012ede9acSGowrishankar Muthukrishnan 						env.dev_id);
199112ede9acSGowrishankar Muthukrishnan 				return -EINVAL;
199212ede9acSGowrishankar Muthukrishnan 			}
199312ede9acSGowrishankar Muthukrishnan 
199412ede9acSGowrishankar Muthukrishnan 			if (cap->op_types & (1 << RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE)) {
199512ede9acSGowrishankar Muthukrishnan 				ret = fips_run_asym_test();
199612ede9acSGowrishankar Muthukrishnan 				if (ret < 0)
199712ede9acSGowrishankar Muthukrishnan 					return ret;
199812ede9acSGowrishankar Muthukrishnan 			} else {
199912ede9acSGowrishankar Muthukrishnan 				/* Below is only a workaround by using known keys. */
200012ede9acSGowrishankar Muthukrishnan 				struct rte_crypto_asym_xform xform = {0};
200112ede9acSGowrishankar Muthukrishnan 
200212ede9acSGowrishankar Muthukrishnan 				prepare_edfpm_xform(&xform);
200312ede9acSGowrishankar Muthukrishnan 				prepare_edfpm_op();
200412ede9acSGowrishankar Muthukrishnan 				uint8_t pkey25519[] = {
200512ede9acSGowrishankar Muthukrishnan 					0x83, 0x3f, 0xe6, 0x24, 0x09, 0x23, 0x7b, 0x9d,
200612ede9acSGowrishankar Muthukrishnan 					0x62, 0xec, 0x77, 0x58, 0x75, 0x20, 0x91, 0x1e,
200712ede9acSGowrishankar Muthukrishnan 					0x9a, 0x75, 0x9c, 0xec, 0x1d, 0x19, 0x75, 0x5b,
200812ede9acSGowrishankar Muthukrishnan 					0x7d, 0xa9, 0x01, 0xb9, 0x6d, 0xca, 0x3d, 0x42
200912ede9acSGowrishankar Muthukrishnan 				};
201012ede9acSGowrishankar Muthukrishnan 				uint8_t q25519[] = {
201112ede9acSGowrishankar Muthukrishnan 					0xec, 0x17, 0x2b, 0x93, 0xad, 0x5e, 0x56, 0x3b,
201212ede9acSGowrishankar Muthukrishnan 					0xf4, 0x93, 0x2c, 0x70, 0xe1, 0x24, 0x50, 0x34,
201312ede9acSGowrishankar Muthukrishnan 					0xc3, 0x54, 0x67, 0xef, 0x2e, 0xfd, 0x4d, 0x64,
201412ede9acSGowrishankar Muthukrishnan 					0xeb, 0xf8, 0x19, 0x68, 0x34, 0x67, 0xe2, 0xbf
201512ede9acSGowrishankar Muthukrishnan 				};
201612ede9acSGowrishankar Muthukrishnan 				uint8_t pkey448[] = {
201712ede9acSGowrishankar Muthukrishnan 					0xd6, 0x5d, 0xf3, 0x41, 0xad, 0x13, 0xe0, 0x08,
201812ede9acSGowrishankar Muthukrishnan 					0x56, 0x76, 0x88, 0xba, 0xed, 0xda, 0x8e, 0x9d,
201912ede9acSGowrishankar Muthukrishnan 					0xcd, 0xc1, 0x7d, 0xc0, 0x24, 0x97, 0x4e, 0xa5,
202012ede9acSGowrishankar Muthukrishnan 					0xb4, 0x22, 0x7b, 0x65, 0x30, 0xe3, 0x39, 0xbf,
202112ede9acSGowrishankar Muthukrishnan 					0xf2, 0x1f, 0x99, 0xe6, 0x8c, 0xa6, 0x96, 0x8f,
202212ede9acSGowrishankar Muthukrishnan 					0x3c, 0xca, 0x6d, 0xfe, 0x0f, 0xb9, 0xf4, 0xfa,
202312ede9acSGowrishankar Muthukrishnan 					0xb4, 0xfa, 0x13, 0x5d, 0x55, 0x42, 0xea, 0x3f,
202412ede9acSGowrishankar Muthukrishnan 					0x01
202512ede9acSGowrishankar Muthukrishnan 				};
202612ede9acSGowrishankar Muthukrishnan 				uint8_t q448[] = {
202712ede9acSGowrishankar Muthukrishnan 					0xdf, 0x97, 0x05, 0xf5, 0x8e, 0xdb, 0xab, 0x80,
202812ede9acSGowrishankar Muthukrishnan 					0x2c, 0x7f, 0x83, 0x63, 0xcf, 0xe5, 0x56, 0x0a,
202912ede9acSGowrishankar Muthukrishnan 					0xb1, 0xc6, 0x13, 0x2c, 0x20, 0xa9, 0xf1, 0xdd,
203012ede9acSGowrishankar Muthukrishnan 					0x16, 0x34, 0x83, 0xa2, 0x6f, 0x8a, 0xc5, 0x3a,
203112ede9acSGowrishankar Muthukrishnan 					0x39, 0xd6, 0x80, 0x8b, 0xf4, 0xa1, 0xdf, 0xbd,
203212ede9acSGowrishankar Muthukrishnan 					0x26, 0x1b, 0x09, 0x9b, 0xb0, 0x3b, 0x3f, 0xb5,
203312ede9acSGowrishankar Muthukrishnan 					0x09, 0x06, 0xcb, 0x28, 0xbd, 0x8a, 0x08, 0x1f,
203412ede9acSGowrishankar Muthukrishnan 					0x00
203512ede9acSGowrishankar Muthukrishnan 				};
203612ede9acSGowrishankar Muthukrishnan 				if (info.interim_info.eddsa_data.curve_id ==
203712ede9acSGowrishankar Muthukrishnan 					RTE_CRYPTO_EC_GROUP_ED25519) {
203812ede9acSGowrishankar Muthukrishnan 					memcpy(vec.eddsa.pkey.val, pkey25519, RTE_DIM(pkey25519));
203912ede9acSGowrishankar Muthukrishnan 					vec.eddsa.pkey.len = 32;
204012ede9acSGowrishankar Muthukrishnan 					memcpy(vec.eddsa.q.val, q25519, RTE_DIM(q25519));
204112ede9acSGowrishankar Muthukrishnan 					vec.eddsa.q.len = 32;
204212ede9acSGowrishankar Muthukrishnan 				} else {
204312ede9acSGowrishankar Muthukrishnan 					memcpy(vec.eddsa.pkey.val, pkey448, RTE_DIM(pkey448));
204412ede9acSGowrishankar Muthukrishnan 					vec.eddsa.pkey.len = 32;
204512ede9acSGowrishankar Muthukrishnan 					memcpy(vec.eddsa.q.val, q448, RTE_DIM(q448));
204612ede9acSGowrishankar Muthukrishnan 					vec.eddsa.q.len = 32;
204712ede9acSGowrishankar Muthukrishnan 				}
204812ede9acSGowrishankar Muthukrishnan 			}
204912ede9acSGowrishankar Muthukrishnan 			info.post_interim_writeback(NULL);
205012ede9acSGowrishankar Muthukrishnan 			info.interim_info.eddsa_data.pubkey_gen = 0;
205112ede9acSGowrishankar Muthukrishnan 
205212ede9acSGowrishankar Muthukrishnan 		}
205312ede9acSGowrishankar Muthukrishnan 
205412ede9acSGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = old_xform;
205512ede9acSGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = old_op;
2056b455d261SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_SIGGEN;
2057b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
2058b455d261SGowrishankar Muthukrishnan 	} else {
2059b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
2060b455d261SGowrishankar Muthukrishnan 	}
2061b455d261SGowrishankar Muthukrishnan 
2062b455d261SGowrishankar Muthukrishnan 	return ret;
2063cd255ccfSMarko Kovacevic }
2064cd255ccfSMarko Kovacevic 
2065cd255ccfSMarko Kovacevic static int
2066cd255ccfSMarko Kovacevic fips_generic_test(void)
2067cd255ccfSMarko Kovacevic {
2068952e10cdSFan Zhang 	struct fips_val val = {NULL, 0};
2069cd255ccfSMarko Kovacevic 	int ret;
2070cd255ccfSMarko Kovacevic 
207189be27e3SBrandon Lo 	if (info.file_type != FIPS_TYPE_JSON)
2072cd255ccfSMarko Kovacevic 		fips_test_write_one_case();
2073cd255ccfSMarko Kovacevic 
2074cd255ccfSMarko Kovacevic 	ret = fips_run_test();
2075cd255ccfSMarko Kovacevic 	if (ret < 0) {
20768a40ff39SArchana Muniganti 		if (ret == -EPERM || ret == -ENOTSUP) {
207789be27e3SBrandon Lo 			if (info.file_type == FIPS_TYPE_JSON)
207889be27e3SBrandon Lo 				return ret;
207989be27e3SBrandon Lo 
2080cd255ccfSMarko Kovacevic 			fprintf(info.fp_wr, "Bypass\n\n");
2081cd255ccfSMarko Kovacevic 			return 0;
2082cd255ccfSMarko Kovacevic 		}
2083cd255ccfSMarko Kovacevic 
2084cd255ccfSMarko Kovacevic 		return ret;
2085cd255ccfSMarko Kovacevic 	}
2086cd255ccfSMarko Kovacevic 
208736128a67SGowrishankar Muthukrishnan 	if (!env.is_asym_test) {
2088952e10cdSFan Zhang 		ret = get_writeback_data(&val);
2089952e10cdSFan Zhang 		if (ret < 0)
2090952e10cdSFan Zhang 			return ret;
209136128a67SGowrishankar Muthukrishnan 	}
2092cd255ccfSMarko Kovacevic 
2093cd255ccfSMarko Kovacevic 	switch (info.file_type) {
2094cd255ccfSMarko Kovacevic 	case FIPS_TYPE_REQ:
2095cd255ccfSMarko Kovacevic 	case FIPS_TYPE_RSP:
209689be27e3SBrandon Lo 	case FIPS_TYPE_JSON:
2097cd255ccfSMarko Kovacevic 		if (info.parse_writeback == NULL)
2098cd255ccfSMarko Kovacevic 			return -EPERM;
2099cd255ccfSMarko Kovacevic 		ret = info.parse_writeback(&val);
2100cd255ccfSMarko Kovacevic 		if (ret < 0)
2101cd255ccfSMarko Kovacevic 			return ret;
2102cd255ccfSMarko Kovacevic 		break;
2103cd255ccfSMarko Kovacevic 	case FIPS_TYPE_FAX:
2104cd255ccfSMarko Kovacevic 		if (info.kat_check == NULL)
2105cd255ccfSMarko Kovacevic 			return -EPERM;
2106cd255ccfSMarko Kovacevic 		ret = info.kat_check(&val);
2107cd255ccfSMarko Kovacevic 		if (ret < 0)
2108cd255ccfSMarko Kovacevic 			return ret;
2109cd255ccfSMarko Kovacevic 		break;
2110f556293fSBrandon Lo 	default:
2111f556293fSBrandon Lo 		break;
2112cd255ccfSMarko Kovacevic 	}
2113cd255ccfSMarko Kovacevic 
211489be27e3SBrandon Lo 	if (info.file_type != FIPS_TYPE_JSON)
2115cd255ccfSMarko Kovacevic 		fprintf(info.fp_wr, "\n");
21163d3408ddSGowrishankar Muthukrishnan 	rte_free(val.val);
2117cd255ccfSMarko Kovacevic 
2118cd255ccfSMarko Kovacevic 	return 0;
2119cd255ccfSMarko Kovacevic }
2120cd255ccfSMarko Kovacevic 
2121cd255ccfSMarko Kovacevic static int
2122527cbf3dSMarko Kovacevic fips_mct_tdes_test(void)
2123527cbf3dSMarko Kovacevic {
2124527cbf3dSMarko Kovacevic #define TDES_BLOCK_SIZE		8
2125527cbf3dSMarko Kovacevic #define TDES_EXTERN_ITER	400
2126527cbf3dSMarko Kovacevic #define TDES_INTERN_ITER	10000
212764569ffaSGowrishankar Muthukrishnan 	struct fips_val val[3] = {{NULL, 0},}, val_key, pt, ct, iv;
21289252e81aSMarko Kovacevic 	uint8_t prev_out[TDES_BLOCK_SIZE] = {0};
21299252e81aSMarko Kovacevic 	uint8_t prev_prev_out[TDES_BLOCK_SIZE] = {0};
21309252e81aSMarko Kovacevic 	uint8_t prev_in[TDES_BLOCK_SIZE] = {0};
2131527cbf3dSMarko Kovacevic 	uint32_t i, j, k;
2132527cbf3dSMarko Kovacevic 	int ret;
2133ae65004fSMichael Shamis 	int test_mode = info.interim_info.tdes_data.test_mode;
2134527cbf3dSMarko Kovacevic 
213564569ffaSGowrishankar Muthukrishnan 	pt.len = vec.pt.len;
21363d3408ddSGowrishankar Muthukrishnan 	pt.val = rte_malloc(NULL, pt.len, 0);
213764569ffaSGowrishankar Muthukrishnan 	ct.len = vec.ct.len;
21383d3408ddSGowrishankar Muthukrishnan 	ct.val = rte_malloc(NULL, ct.len, 0);
213964569ffaSGowrishankar Muthukrishnan 	iv.len = vec.iv.len;
21403d3408ddSGowrishankar Muthukrishnan 	iv.val = rte_malloc(NULL, iv.len, 0);
214164569ffaSGowrishankar Muthukrishnan 
2142527cbf3dSMarko Kovacevic 	for (i = 0; i < TDES_EXTERN_ITER; i++) {
214364569ffaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON) {
214479365018SArchana Muniganti 			if ((i == 0) && (info.version == 21.4f)) {
21452b84d2bdSArchana Muniganti 				if (!(strstr(info.vec[0], "COUNT")))
21462b84d2bdSArchana Muniganti 					fprintf(info.fp_wr, "%s%u\n", "COUNT = ", 0);
214779365018SArchana Muniganti 			}
214879365018SArchana Muniganti 
214979365018SArchana Muniganti 			if (i != 0)
2150527cbf3dSMarko Kovacevic 				update_info_vec(i);
2151527cbf3dSMarko Kovacevic 
2152527cbf3dSMarko Kovacevic 			fips_test_write_one_case();
215364569ffaSGowrishankar Muthukrishnan 		}
2154527cbf3dSMarko Kovacevic 
2155527cbf3dSMarko Kovacevic 		for (j = 0; j < TDES_INTERN_ITER; j++) {
2156527cbf3dSMarko Kovacevic 			ret = fips_run_test();
2157527cbf3dSMarko Kovacevic 			if (ret < 0) {
2158527cbf3dSMarko Kovacevic 				if (ret == -EPERM) {
215989be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
216089be27e3SBrandon Lo 						return ret;
216189be27e3SBrandon Lo 
2162527cbf3dSMarko Kovacevic 					fprintf(info.fp_wr, "Bypass\n");
2163527cbf3dSMarko Kovacevic 					return 0;
2164527cbf3dSMarko Kovacevic 				}
2165527cbf3dSMarko Kovacevic 				return ret;
2166527cbf3dSMarko Kovacevic 			}
2167527cbf3dSMarko Kovacevic 
216864569ffaSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
2169952e10cdSFan Zhang 			if (ret < 0)
2170952e10cdSFan Zhang 				return ret;
2171527cbf3dSMarko Kovacevic 
2172527cbf3dSMarko Kovacevic 			if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
2173527cbf3dSMarko Kovacevic 				memcpy(prev_in, vec.ct.val, TDES_BLOCK_SIZE);
2174527cbf3dSMarko Kovacevic 
2175527cbf3dSMarko Kovacevic 			if (j == 0) {
217664569ffaSGowrishankar Muthukrishnan 				memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE);
217764569ffaSGowrishankar Muthukrishnan 				memcpy(pt.val, vec.pt.val, pt.len);
217864569ffaSGowrishankar Muthukrishnan 				memcpy(ct.val, vec.ct.val, ct.len);
217964569ffaSGowrishankar Muthukrishnan 				memcpy(iv.val, vec.iv.val, iv.len);
2180527cbf3dSMarko Kovacevic 
2181527cbf3dSMarko Kovacevic 				if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
2182ae65004fSMichael Shamis 					if (test_mode == TDES_MODE_ECB) {
218364569ffaSGowrishankar Muthukrishnan 						memcpy(vec.pt.val, val[0].val,
2184ae65004fSMichael Shamis 							   TDES_BLOCK_SIZE);
2185ae65004fSMichael Shamis 					} else {
2186527cbf3dSMarko Kovacevic 						memcpy(vec.pt.val, vec.iv.val,
2187527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
218864569ffaSGowrishankar Muthukrishnan 						memcpy(vec.iv.val, val[0].val,
2189527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
2190ae65004fSMichael Shamis 					}
219164569ffaSGowrishankar Muthukrishnan 					val[1].val = pt.val;
219264569ffaSGowrishankar Muthukrishnan 					val[1].len = pt.len;
219364569ffaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
219464569ffaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2195ae65004fSMichael Shamis 				} else {
2196ae65004fSMichael Shamis 					if (test_mode == TDES_MODE_ECB) {
219764569ffaSGowrishankar Muthukrishnan 						memcpy(vec.ct.val, val[0].val,
2198ae65004fSMichael Shamis 							   TDES_BLOCK_SIZE);
2199527cbf3dSMarko Kovacevic 					} else {
2200527cbf3dSMarko Kovacevic 						memcpy(vec.iv.val, vec.ct.val,
2201527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
220264569ffaSGowrishankar Muthukrishnan 						memcpy(vec.ct.val, val[0].val,
2203527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
2204527cbf3dSMarko Kovacevic 					}
220564569ffaSGowrishankar Muthukrishnan 					val[1].val = ct.val;
220664569ffaSGowrishankar Muthukrishnan 					val[1].len = ct.len;
220764569ffaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
220864569ffaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2209ae65004fSMichael Shamis 				}
2210527cbf3dSMarko Kovacevic 				continue;
2211527cbf3dSMarko Kovacevic 			}
2212527cbf3dSMarko Kovacevic 
2213527cbf3dSMarko Kovacevic 			if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
2214ae65004fSMichael Shamis 				if (test_mode == TDES_MODE_ECB) {
221564569ffaSGowrishankar Muthukrishnan 					memcpy(vec.pt.val, val[0].val,
2216ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
2217527cbf3dSMarko Kovacevic 				} else {
221864569ffaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, val[0].val,
2219ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
2220ae65004fSMichael Shamis 					memcpy(vec.pt.val, prev_out,
2221ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
2222ae65004fSMichael Shamis 				}
2223ae65004fSMichael Shamis 			} else {
2224ae65004fSMichael Shamis 				if (test_mode == TDES_MODE_ECB) {
222564569ffaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, val[0].val,
2226ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
2227ae65004fSMichael Shamis 				} else {
2228ae65004fSMichael Shamis 					memcpy(vec.iv.val, vec.ct.val,
2229ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
223064569ffaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, val[0].val,
2231ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
2232ae65004fSMichael Shamis 				}
2233527cbf3dSMarko Kovacevic 			}
2234527cbf3dSMarko Kovacevic 
2235527cbf3dSMarko Kovacevic 			if (j == TDES_INTERN_ITER - 1)
2236527cbf3dSMarko Kovacevic 				continue;
2237527cbf3dSMarko Kovacevic 
223864569ffaSGowrishankar Muthukrishnan 			memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE);
2239527cbf3dSMarko Kovacevic 
2240527cbf3dSMarko Kovacevic 			if (j == TDES_INTERN_ITER - 3)
224164569ffaSGowrishankar Muthukrishnan 				memcpy(prev_prev_out, val[0].val, TDES_BLOCK_SIZE);
2242527cbf3dSMarko Kovacevic 		}
2243527cbf3dSMarko Kovacevic 
224464569ffaSGowrishankar Muthukrishnan 		info.parse_writeback(val);
224564569ffaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2246527cbf3dSMarko Kovacevic 			fprintf(info.fp_wr, "\n");
2247527cbf3dSMarko Kovacevic 
2248527cbf3dSMarko Kovacevic 		if (i == TDES_EXTERN_ITER - 1)
2249527cbf3dSMarko Kovacevic 			continue;
2250527cbf3dSMarko Kovacevic 
2251527cbf3dSMarko Kovacevic 		/** update key */
2252527cbf3dSMarko Kovacevic 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2253527cbf3dSMarko Kovacevic 
2254527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.nb_keys == 0) {
2255527cbf3dSMarko Kovacevic 			if (memcmp(val_key.val, val_key.val + 8, 8) == 0)
2256527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 1;
2257527cbf3dSMarko Kovacevic 			else if (memcmp(val_key.val, val_key.val + 16, 8) == 0)
2258527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 2;
2259527cbf3dSMarko Kovacevic 			else
2260527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 3;
2261527cbf3dSMarko Kovacevic 
2262527cbf3dSMarko Kovacevic 		}
2263527cbf3dSMarko Kovacevic 
2264527cbf3dSMarko Kovacevic 		for (k = 0; k < TDES_BLOCK_SIZE; k++) {
2265527cbf3dSMarko Kovacevic 
2266527cbf3dSMarko Kovacevic 			switch (info.interim_info.tdes_data.nb_keys) {
2267527cbf3dSMarko Kovacevic 			case 3:
226864569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2269527cbf3dSMarko Kovacevic 				val_key.val[k + 8] ^= prev_out[k];
2270527cbf3dSMarko Kovacevic 				val_key.val[k + 16] ^= prev_prev_out[k];
2271527cbf3dSMarko Kovacevic 				break;
2272527cbf3dSMarko Kovacevic 			case 2:
227364569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2274527cbf3dSMarko Kovacevic 				val_key.val[k + 8] ^= prev_out[k];
227564569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 16] ^= val[0].val[k];
2276527cbf3dSMarko Kovacevic 				break;
2277527cbf3dSMarko Kovacevic 			default: /* case 1 */
227864569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
227964569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 8] ^= val[0].val[k];
228064569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 16] ^= val[0].val[k];
2281527cbf3dSMarko Kovacevic 				break;
2282527cbf3dSMarko Kovacevic 			}
2283527cbf3dSMarko Kovacevic 
2284527cbf3dSMarko Kovacevic 		}
2285527cbf3dSMarko Kovacevic 
2286527cbf3dSMarko Kovacevic 		for (k = 0; k < 24; k++)
22873d4e27fdSDavid Marchand 			val_key.val[k] = (rte_popcount32(val_key.val[k]) &
2288527cbf3dSMarko Kovacevic 					0x1) ?
2289527cbf3dSMarko Kovacevic 					val_key.val[k] : (val_key.val[k] ^ 0x1);
2290527cbf3dSMarko Kovacevic 
2291527cbf3dSMarko Kovacevic 		if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
2292ae65004fSMichael Shamis 			if (test_mode == TDES_MODE_ECB) {
229364569ffaSGowrishankar Muthukrishnan 				memcpy(vec.pt.val, val[0].val, TDES_BLOCK_SIZE);
2294ae65004fSMichael Shamis 			} else {
229564569ffaSGowrishankar Muthukrishnan 				memcpy(vec.iv.val, val[0].val, TDES_BLOCK_SIZE);
2296527cbf3dSMarko Kovacevic 				memcpy(vec.pt.val, prev_out, TDES_BLOCK_SIZE);
2297ae65004fSMichael Shamis 			}
2298ae65004fSMichael Shamis 		} else {
2299ae65004fSMichael Shamis 			if (test_mode == TDES_MODE_ECB) {
230064569ffaSGowrishankar Muthukrishnan 				memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE);
2301527cbf3dSMarko Kovacevic 			} else {
2302527cbf3dSMarko Kovacevic 				memcpy(vec.iv.val, prev_out, TDES_BLOCK_SIZE);
230364569ffaSGowrishankar Muthukrishnan 				memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE);
2304527cbf3dSMarko Kovacevic 			}
2305527cbf3dSMarko Kovacevic 		}
2306ae65004fSMichael Shamis 	}
2307527cbf3dSMarko Kovacevic 
23083d3408ddSGowrishankar Muthukrishnan 	rte_free(val[0].val);
23093d3408ddSGowrishankar Muthukrishnan 	rte_free(pt.val);
23103d3408ddSGowrishankar Muthukrishnan 	rte_free(ct.val);
23113d3408ddSGowrishankar Muthukrishnan 	rte_free(iv.val);
2312952e10cdSFan Zhang 
2313527cbf3dSMarko Kovacevic 	return 0;
2314527cbf3dSMarko Kovacevic }
2315527cbf3dSMarko Kovacevic 
2316527cbf3dSMarko Kovacevic static int
2317d3190431SMichael Shamis fips_mct_aes_ecb_test(void)
2318d3190431SMichael Shamis {
2319d3190431SMichael Shamis #define AES_BLOCK_SIZE	16
2320d3190431SMichael Shamis #define AES_EXTERN_ITER	100
2321d3190431SMichael Shamis #define AES_INTERN_ITER	1000
2322952e10cdSFan Zhang 	struct fips_val val = {NULL, 0}, val_key;
2323d3190431SMichael Shamis 	uint8_t prev_out[AES_BLOCK_SIZE] = {0};
2324d3190431SMichael Shamis 	uint32_t i, j, k;
2325d3190431SMichael Shamis 	int ret;
2326d3190431SMichael Shamis 
2327d3190431SMichael Shamis 	for (i = 0; i < AES_EXTERN_ITER; i++) {
2328d3190431SMichael Shamis 		if (i != 0)
2329d3190431SMichael Shamis 			update_info_vec(i);
2330d3190431SMichael Shamis 
2331d3190431SMichael Shamis 		fips_test_write_one_case();
2332d3190431SMichael Shamis 
2333d3190431SMichael Shamis 		for (j = 0; j < AES_INTERN_ITER; j++) {
2334d3190431SMichael Shamis 			ret = fips_run_test();
2335d3190431SMichael Shamis 			if (ret < 0) {
2336d3190431SMichael Shamis 				if (ret == -EPERM) {
233789be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
233889be27e3SBrandon Lo 						return ret;
233989be27e3SBrandon Lo 
2340d3190431SMichael Shamis 					fprintf(info.fp_wr, "Bypass\n");
2341d3190431SMichael Shamis 					return 0;
2342d3190431SMichael Shamis 				}
2343d3190431SMichael Shamis 
2344d3190431SMichael Shamis 				return ret;
2345d3190431SMichael Shamis 			}
2346d3190431SMichael Shamis 
2347952e10cdSFan Zhang 			ret = get_writeback_data(&val);
2348952e10cdSFan Zhang 			if (ret < 0)
2349952e10cdSFan Zhang 				return ret;
2350d3190431SMichael Shamis 
2351d3190431SMichael Shamis 			if (info.op == FIPS_TEST_ENC_AUTH_GEN)
2352d3190431SMichael Shamis 				memcpy(vec.pt.val, val.val, AES_BLOCK_SIZE);
2353d3190431SMichael Shamis 			else
2354d3190431SMichael Shamis 				memcpy(vec.ct.val, val.val, AES_BLOCK_SIZE);
2355d3190431SMichael Shamis 
2356d3190431SMichael Shamis 			if (j == AES_INTERN_ITER - 1)
2357d3190431SMichael Shamis 				continue;
2358d3190431SMichael Shamis 
2359d3190431SMichael Shamis 			memcpy(prev_out, val.val, AES_BLOCK_SIZE);
2360d3190431SMichael Shamis 		}
2361d3190431SMichael Shamis 
2362d3190431SMichael Shamis 		info.parse_writeback(&val);
2363d3190431SMichael Shamis 		fprintf(info.fp_wr, "\n");
2364d3190431SMichael Shamis 
2365d3190431SMichael Shamis 		if (i == AES_EXTERN_ITER - 1)
2366d3190431SMichael Shamis 			continue;
2367d3190431SMichael Shamis 
2368d3190431SMichael Shamis 		/** update key */
2369d3190431SMichael Shamis 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2370d3190431SMichael Shamis 		for (k = 0; k < vec.cipher_auth.key.len; k++) {
2371d3190431SMichael Shamis 			switch (vec.cipher_auth.key.len) {
2372d3190431SMichael Shamis 			case 16:
2373d3190431SMichael Shamis 				val_key.val[k] ^= val.val[k];
2374d3190431SMichael Shamis 				break;
2375d3190431SMichael Shamis 			case 24:
2376d3190431SMichael Shamis 				if (k < 8)
2377d3190431SMichael Shamis 					val_key.val[k] ^= prev_out[k + 8];
2378d3190431SMichael Shamis 				else
2379d3190431SMichael Shamis 					val_key.val[k] ^= val.val[k - 8];
2380d3190431SMichael Shamis 				break;
2381d3190431SMichael Shamis 			case 32:
2382d3190431SMichael Shamis 				if (k < 16)
2383d3190431SMichael Shamis 					val_key.val[k] ^= prev_out[k];
2384d3190431SMichael Shamis 				else
2385d3190431SMichael Shamis 					val_key.val[k] ^= val.val[k - 16];
2386d3190431SMichael Shamis 				break;
2387d3190431SMichael Shamis 			default:
2388d3190431SMichael Shamis 				return -1;
2389d3190431SMichael Shamis 			}
2390d3190431SMichael Shamis 		}
2391d3190431SMichael Shamis 	}
2392d3190431SMichael Shamis 
23933d3408ddSGowrishankar Muthukrishnan 	rte_free(val.val);
2394952e10cdSFan Zhang 
2395d3190431SMichael Shamis 	return 0;
2396d3190431SMichael Shamis }
2397d3190431SMichael Shamis static int
2398cd255ccfSMarko Kovacevic fips_mct_aes_test(void)
2399cd255ccfSMarko Kovacevic {
2400cd255ccfSMarko Kovacevic #define AES_BLOCK_SIZE	16
2401cd255ccfSMarko Kovacevic #define AES_EXTERN_ITER	100
2402cd255ccfSMarko Kovacevic #define AES_INTERN_ITER	1000
24038b8546aaSGowrishankar Muthukrishnan 	struct fips_val val[3] = {{NULL, 0},}, val_key,  pt, ct, iv;
2404cd255ccfSMarko Kovacevic 	uint8_t prev_out[AES_BLOCK_SIZE] = {0};
2405cd255ccfSMarko Kovacevic 	uint8_t prev_in[AES_BLOCK_SIZE] = {0};
2406cd255ccfSMarko Kovacevic 	uint32_t i, j, k;
2407cd255ccfSMarko Kovacevic 	int ret;
2408cd255ccfSMarko Kovacevic 
2409d3190431SMichael Shamis 	if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_ECB)
2410d3190431SMichael Shamis 		return fips_mct_aes_ecb_test();
2411d3190431SMichael Shamis 
2412e9ec7f61SGowrishankar Muthukrishnan 	pt.len = vec.pt.len;
24133d3408ddSGowrishankar Muthukrishnan 	pt.val = rte_malloc(NULL, pt.len, 0);
2414e9ec7f61SGowrishankar Muthukrishnan 	ct.len = vec.ct.len;
24153d3408ddSGowrishankar Muthukrishnan 	ct.val = rte_malloc(NULL, ct.len, 0);
2416e9ec7f61SGowrishankar Muthukrishnan 	iv.len = vec.iv.len;
24173d3408ddSGowrishankar Muthukrishnan 	iv.val = rte_malloc(NULL, iv.len, 0);
2418cd255ccfSMarko Kovacevic 	for (i = 0; i < AES_EXTERN_ITER; i++) {
24198b8546aaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON) {
2420cd255ccfSMarko Kovacevic 			if (i != 0)
2421cd255ccfSMarko Kovacevic 				update_info_vec(i);
2422cd255ccfSMarko Kovacevic 
2423cd255ccfSMarko Kovacevic 			fips_test_write_one_case();
24248b8546aaSGowrishankar Muthukrishnan 		}
2425cd255ccfSMarko Kovacevic 
2426cd255ccfSMarko Kovacevic 		for (j = 0; j < AES_INTERN_ITER; j++) {
2427cd255ccfSMarko Kovacevic 			ret = fips_run_test();
2428cd255ccfSMarko Kovacevic 			if (ret < 0) {
2429cd255ccfSMarko Kovacevic 				if (ret == -EPERM) {
243089be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
243189be27e3SBrandon Lo 						return ret;
243289be27e3SBrandon Lo 
2433cd255ccfSMarko Kovacevic 					fprintf(info.fp_wr, "Bypass\n");
2434cd255ccfSMarko Kovacevic 					return 0;
2435cd255ccfSMarko Kovacevic 				}
2436cd255ccfSMarko Kovacevic 
2437cd255ccfSMarko Kovacevic 				return ret;
2438cd255ccfSMarko Kovacevic 			}
2439cd255ccfSMarko Kovacevic 
24408b8546aaSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
2441afda6b01SCiara Power 			if (ret < 0)
2442afda6b01SCiara Power 				return ret;
2443cd255ccfSMarko Kovacevic 
2444cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
2445cd255ccfSMarko Kovacevic 				memcpy(prev_in, vec.ct.val, AES_BLOCK_SIZE);
2446cd255ccfSMarko Kovacevic 
2447cd255ccfSMarko Kovacevic 			if (j == 0) {
24488b8546aaSGowrishankar Muthukrishnan 				memcpy(prev_out, val[0].val, AES_BLOCK_SIZE);
24498b8546aaSGowrishankar Muthukrishnan 				memcpy(pt.val, vec.pt.val, pt.len);
24508b8546aaSGowrishankar Muthukrishnan 				memcpy(ct.val, vec.ct.val, ct.len);
24518b8546aaSGowrishankar Muthukrishnan 				memcpy(iv.val, vec.iv.val, iv.len);
2452cd255ccfSMarko Kovacevic 
2453cd255ccfSMarko Kovacevic 				if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
24548b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.pt.val, vec.iv.val, AES_BLOCK_SIZE);
24558b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
24568b8546aaSGowrishankar Muthukrishnan 					val[1].val = pt.val;
24578b8546aaSGowrishankar Muthukrishnan 					val[1].len = pt.len;
24588b8546aaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
24598b8546aaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2460cd255ccfSMarko Kovacevic 				} else {
24618b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, vec.iv.val, AES_BLOCK_SIZE);
24628b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE);
24638b8546aaSGowrishankar Muthukrishnan 					val[1].val = ct.val;
24648b8546aaSGowrishankar Muthukrishnan 					val[1].len = ct.len;
24658b8546aaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
24668b8546aaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2467cd255ccfSMarko Kovacevic 				}
2468cd255ccfSMarko Kovacevic 				continue;
2469cd255ccfSMarko Kovacevic 			}
2470cd255ccfSMarko Kovacevic 
2471cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
24728b8546aaSGowrishankar Muthukrishnan 				memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
2473cd255ccfSMarko Kovacevic 				memcpy(vec.pt.val, prev_out, AES_BLOCK_SIZE);
2474cd255ccfSMarko Kovacevic 			} else {
2475cd255ccfSMarko Kovacevic 				memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE);
2476cd255ccfSMarko Kovacevic 				memcpy(vec.ct.val, prev_out, AES_BLOCK_SIZE);
2477cd255ccfSMarko Kovacevic 			}
2478cd255ccfSMarko Kovacevic 
2479cd255ccfSMarko Kovacevic 			if (j == AES_INTERN_ITER - 1)
2480cd255ccfSMarko Kovacevic 				continue;
2481cd255ccfSMarko Kovacevic 
24828b8546aaSGowrishankar Muthukrishnan 			memcpy(prev_out, val[0].val, AES_BLOCK_SIZE);
2483cd255ccfSMarko Kovacevic 		}
2484cd255ccfSMarko Kovacevic 
24858b8546aaSGowrishankar Muthukrishnan 		info.parse_writeback(val);
24868b8546aaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2487cd255ccfSMarko Kovacevic 			fprintf(info.fp_wr, "\n");
2488cd255ccfSMarko Kovacevic 
2489e9ec7f61SGowrishankar Muthukrishnan 		if (i == AES_EXTERN_ITER - 1)
2490cd255ccfSMarko Kovacevic 			continue;
2491cd255ccfSMarko Kovacevic 
2492cd255ccfSMarko Kovacevic 		/** update key */
2493cd255ccfSMarko Kovacevic 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2494cd255ccfSMarko Kovacevic 		for (k = 0; k < vec.cipher_auth.key.len; k++) {
2495cd255ccfSMarko Kovacevic 			switch (vec.cipher_auth.key.len) {
2496cd255ccfSMarko Kovacevic 			case 16:
24978b8546aaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2498cd255ccfSMarko Kovacevic 				break;
2499cd255ccfSMarko Kovacevic 			case 24:
2500cd255ccfSMarko Kovacevic 				if (k < 8)
2501cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k + 8];
2502cd255ccfSMarko Kovacevic 				else
25038b8546aaSGowrishankar Muthukrishnan 					val_key.val[k] ^= val[0].val[k - 8];
2504cd255ccfSMarko Kovacevic 				break;
2505cd255ccfSMarko Kovacevic 			case 32:
2506cd255ccfSMarko Kovacevic 				if (k < 16)
2507cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k];
2508cd255ccfSMarko Kovacevic 				else
25098b8546aaSGowrishankar Muthukrishnan 					val_key.val[k] ^= val[0].val[k - 16];
2510cd255ccfSMarko Kovacevic 				break;
2511cd255ccfSMarko Kovacevic 			default:
2512cd255ccfSMarko Kovacevic 				return -1;
2513cd255ccfSMarko Kovacevic 			}
2514cd255ccfSMarko Kovacevic 		}
2515cd255ccfSMarko Kovacevic 
2516cd255ccfSMarko Kovacevic 		if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
25178b8546aaSGowrishankar Muthukrishnan 			memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
2518cd255ccfSMarko Kovacevic 	}
2519cd255ccfSMarko Kovacevic 
25203d3408ddSGowrishankar Muthukrishnan 	rte_free(val[0].val);
25213d3408ddSGowrishankar Muthukrishnan 	rte_free(pt.val);
25223d3408ddSGowrishankar Muthukrishnan 	rte_free(ct.val);
25233d3408ddSGowrishankar Muthukrishnan 	rte_free(iv.val);
2524952e10cdSFan Zhang 
2525cd255ccfSMarko Kovacevic 	return 0;
2526cd255ccfSMarko Kovacevic }
2527cd255ccfSMarko Kovacevic 
2528cd255ccfSMarko Kovacevic static int
2529f4797baeSDamian Nowak fips_mct_sha_test(void)
2530f4797baeSDamian Nowak {
2531f4797baeSDamian Nowak #define SHA_EXTERN_ITER	100
2532f4797baeSDamian Nowak #define SHA_INTERN_ITER	1000
25331ea7940eSGowrishankar Muthukrishnan 	uint8_t md_blocks = info.interim_info.sha_data.md_blocks;
2534fc78f69dSGowrishankar Muthukrishnan 	struct fips_val val = {NULL, 0};
25351ea7940eSGowrishankar Muthukrishnan 	struct fips_val  md[md_blocks];
2536f4797baeSDamian Nowak 	int ret;
25371ea7940eSGowrishankar Muthukrishnan 	uint32_t i, j, k, offset, max_outlen;
2538f4797baeSDamian Nowak 
25391ea7940eSGowrishankar Muthukrishnan 	max_outlen = md_blocks * vec.cipher_auth.digest.len;
25401ea7940eSGowrishankar Muthukrishnan 
25413d3408ddSGowrishankar Muthukrishnan 	rte_free(vec.cipher_auth.digest.val);
25423d3408ddSGowrishankar Muthukrishnan 	vec.cipher_auth.digest.val = rte_malloc(NULL, max_outlen, 0);
25431ea7940eSGowrishankar Muthukrishnan 
2544ce7ced4eSGowrishankar Muthukrishnan 	if (vec.pt.val)
2545d5c24714SGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, vec.pt.val, vec.cipher_auth.digest.len);
2546ce7ced4eSGowrishankar Muthukrishnan 
2547f4797baeSDamian Nowak 	rte_free(vec.pt.val);
25481ea7940eSGowrishankar Muthukrishnan 	vec.pt.val = rte_malloc(NULL, (MAX_DIGEST_SIZE*md_blocks), 0);
25491ea7940eSGowrishankar Muthukrishnan 
25501ea7940eSGowrishankar Muthukrishnan 	for (i = 0; i < md_blocks; i++)
25511ea7940eSGowrishankar Muthukrishnan 		md[i].val = rte_malloc(NULL, (MAX_DIGEST_SIZE*2), 0);
2552f4797baeSDamian Nowak 
2553d5c24714SGowrishankar Muthukrishnan 	if (info.file_type != FIPS_TYPE_JSON) {
2554f4797baeSDamian Nowak 		fips_test_write_one_case();
2555f4797baeSDamian Nowak 		fprintf(info.fp_wr, "\n");
2556d5c24714SGowrishankar Muthukrishnan 	}
2557f4797baeSDamian Nowak 
2558f4797baeSDamian Nowak 	for (j = 0; j < SHA_EXTERN_ITER; j++) {
25591ea7940eSGowrishankar Muthukrishnan 		for (i = 0; i < md_blocks; i++) {
25601ea7940eSGowrishankar Muthukrishnan 			memcpy(md[i].val, vec.cipher_auth.digest.val,
2561f4797baeSDamian Nowak 				vec.cipher_auth.digest.len);
25621ea7940eSGowrishankar Muthukrishnan 			md[i].len = vec.cipher_auth.digest.len;
25631ea7940eSGowrishankar Muthukrishnan 		}
2564d5c24714SGowrishankar Muthukrishnan 
2565f4797baeSDamian Nowak 		for (i = 0; i < (SHA_INTERN_ITER); i++) {
25661ea7940eSGowrishankar Muthukrishnan 			offset = 0;
25671ea7940eSGowrishankar Muthukrishnan 			for (k = 0; k < md_blocks; k++) {
25681ea7940eSGowrishankar Muthukrishnan 				memcpy(vec.pt.val + offset, md[k].val, (size_t)md[k].len);
25691ea7940eSGowrishankar Muthukrishnan 				offset += md[k].len;
25701ea7940eSGowrishankar Muthukrishnan 			}
25711ea7940eSGowrishankar Muthukrishnan 			vec.pt.len = offset;
2572f4797baeSDamian Nowak 
2573f4797baeSDamian Nowak 			ret = fips_run_test();
2574f4797baeSDamian Nowak 			if (ret < 0) {
25758a40ff39SArchana Muniganti 				if (ret == -EPERM || ret == -ENOTSUP) {
257689be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
257789be27e3SBrandon Lo 						return ret;
257889be27e3SBrandon Lo 
2579f4797baeSDamian Nowak 					fprintf(info.fp_wr, "Bypass\n\n");
2580f4797baeSDamian Nowak 					return 0;
2581f4797baeSDamian Nowak 				}
2582f4797baeSDamian Nowak 				return ret;
2583f4797baeSDamian Nowak 			}
2584f4797baeSDamian Nowak 
2585fc78f69dSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val);
2586afda6b01SCiara Power 			if (ret < 0)
2587afda6b01SCiara Power 				return ret;
2588f4797baeSDamian Nowak 
25891ea7940eSGowrishankar Muthukrishnan 			for (k = 1; k < md_blocks; k++) {
25901ea7940eSGowrishankar Muthukrishnan 				memcpy(md[k-1].val, md[k].val, md[k].len);
25911ea7940eSGowrishankar Muthukrishnan 				md[k-1].len = md[k].len;
2592f4797baeSDamian Nowak 			}
2593f4797baeSDamian Nowak 
25941ea7940eSGowrishankar Muthukrishnan 			memcpy(md[md_blocks-1].val, (val.val + vec.pt.len),
25951ea7940eSGowrishankar Muthukrishnan 				vec.cipher_auth.digest.len);
25961ea7940eSGowrishankar Muthukrishnan 			md[md_blocks-1].len = vec.cipher_auth.digest.len;
25971ea7940eSGowrishankar Muthukrishnan 		}
25981ea7940eSGowrishankar Muthukrishnan 
25991ea7940eSGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, md[md_blocks-1].val, md[md_blocks-1].len);
26001ea7940eSGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = md[md_blocks-1].len;
2601f4797baeSDamian Nowak 
2602ce7ced4eSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2603f4797baeSDamian Nowak 			fprintf(info.fp_wr, "COUNT = %u\n", j);
2604ce7ced4eSGowrishankar Muthukrishnan 
2605fc78f69dSGowrishankar Muthukrishnan 		info.parse_writeback(&val);
2606ce7ced4eSGowrishankar Muthukrishnan 
2607ce7ced4eSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2608ce7ced4eSGowrishankar Muthukrishnan 			fprintf(info.fp_wr, "\n");
2609d5c24714SGowrishankar Muthukrishnan 	}
2610f4797baeSDamian Nowak 
26111ea7940eSGowrishankar Muthukrishnan 	for (i = 0; i < (md_blocks); i++)
2612f4797baeSDamian Nowak 		rte_free(md[i].val);
2613f4797baeSDamian Nowak 
2614f4797baeSDamian Nowak 	rte_free(vec.pt.val);
2615f4797baeSDamian Nowak 
26163d3408ddSGowrishankar Muthukrishnan 	rte_free(val.val);
2617f4797baeSDamian Nowak 	return 0;
2618f4797baeSDamian Nowak }
2619f4797baeSDamian Nowak 
2620225f04fbSGowrishankar Muthukrishnan static int
2621225f04fbSGowrishankar Muthukrishnan fips_mct_shake_test(void)
2622225f04fbSGowrishankar Muthukrishnan {
2623225f04fbSGowrishankar Muthukrishnan #define SHAKE_EXTERN_ITER	100
2624225f04fbSGowrishankar Muthukrishnan #define SHAKE_INTERN_ITER	1000
2625225f04fbSGowrishankar Muthukrishnan 	uint32_t i, j, range, outlen, max_outlen;
2626225f04fbSGowrishankar Muthukrishnan 	struct fips_val val = {NULL, 0}, md;
2627225f04fbSGowrishankar Muthukrishnan 	uint8_t rightmost[2];
2628225f04fbSGowrishankar Muthukrishnan 	uint16_t *rightptr;
2629225f04fbSGowrishankar Muthukrishnan 	int ret;
2630225f04fbSGowrishankar Muthukrishnan 
2631225f04fbSGowrishankar Muthukrishnan 	max_outlen = vec.cipher_auth.digest.len;
2632225f04fbSGowrishankar Muthukrishnan 
26333d3408ddSGowrishankar Muthukrishnan 	rte_free(vec.cipher_auth.digest.val);
26343d3408ddSGowrishankar Muthukrishnan 	vec.cipher_auth.digest.val = rte_malloc(NULL, max_outlen, 0);
2635225f04fbSGowrishankar Muthukrishnan 
2636225f04fbSGowrishankar Muthukrishnan 	if (vec.pt.val)
2637225f04fbSGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, vec.pt.val, vec.pt.len);
2638225f04fbSGowrishankar Muthukrishnan 
2639225f04fbSGowrishankar Muthukrishnan 	rte_free(vec.pt.val);
2640225f04fbSGowrishankar Muthukrishnan 	vec.pt.val = rte_malloc(NULL, 16, 0);
2641225f04fbSGowrishankar Muthukrishnan 	vec.pt.len = 16;
2642225f04fbSGowrishankar Muthukrishnan 
2643225f04fbSGowrishankar Muthukrishnan 	md.val = rte_malloc(NULL, max_outlen, 0);
2644225f04fbSGowrishankar Muthukrishnan 	md.len = max_outlen;
2645225f04fbSGowrishankar Muthukrishnan 
2646225f04fbSGowrishankar Muthukrishnan 	if (info.file_type != FIPS_TYPE_JSON) {
2647225f04fbSGowrishankar Muthukrishnan 		fips_test_write_one_case();
2648225f04fbSGowrishankar Muthukrishnan 		fprintf(info.fp_wr, "\n");
2649225f04fbSGowrishankar Muthukrishnan 	}
2650225f04fbSGowrishankar Muthukrishnan 
2651225f04fbSGowrishankar Muthukrishnan 	range = max_outlen - info.interim_info.sha_data.min_outlen + 1;
2652225f04fbSGowrishankar Muthukrishnan 	outlen = max_outlen;
2653225f04fbSGowrishankar Muthukrishnan 	for (j = 0; j < SHAKE_EXTERN_ITER; j++) {
2654225f04fbSGowrishankar Muthukrishnan 		memset(md.val, 0, max_outlen);
2655225f04fbSGowrishankar Muthukrishnan 		memcpy(md.val, vec.cipher_auth.digest.val,
2656225f04fbSGowrishankar Muthukrishnan 			vec.cipher_auth.digest.len);
2657225f04fbSGowrishankar Muthukrishnan 
2658225f04fbSGowrishankar Muthukrishnan 		for (i = 0; i < (SHAKE_INTERN_ITER); i++) {
2659225f04fbSGowrishankar Muthukrishnan 			memset(vec.pt.val, 0, vec.pt.len);
2660225f04fbSGowrishankar Muthukrishnan 			memcpy(vec.pt.val, md.val, vec.pt.len);
2661225f04fbSGowrishankar Muthukrishnan 			vec.cipher_auth.digest.len = outlen;
2662225f04fbSGowrishankar Muthukrishnan 			ret = fips_run_test();
2663225f04fbSGowrishankar Muthukrishnan 			if (ret < 0) {
2664225f04fbSGowrishankar Muthukrishnan 				if (ret == -EPERM || ret == -ENOTSUP) {
2665225f04fbSGowrishankar Muthukrishnan 					if (info.file_type == FIPS_TYPE_JSON)
2666225f04fbSGowrishankar Muthukrishnan 						return ret;
2667225f04fbSGowrishankar Muthukrishnan 
2668225f04fbSGowrishankar Muthukrishnan 					fprintf(info.fp_wr, "Bypass\n\n");
2669225f04fbSGowrishankar Muthukrishnan 					return 0;
2670225f04fbSGowrishankar Muthukrishnan 				}
2671225f04fbSGowrishankar Muthukrishnan 				return ret;
2672225f04fbSGowrishankar Muthukrishnan 			}
2673225f04fbSGowrishankar Muthukrishnan 
2674225f04fbSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val);
2675225f04fbSGowrishankar Muthukrishnan 			if (ret < 0)
2676225f04fbSGowrishankar Muthukrishnan 				return ret;
2677225f04fbSGowrishankar Muthukrishnan 
2678225f04fbSGowrishankar Muthukrishnan 			memset(md.val, 0, max_outlen);
2679225f04fbSGowrishankar Muthukrishnan 			memcpy(md.val, (val.val + vec.pt.len),
2680225f04fbSGowrishankar Muthukrishnan 				vec.cipher_auth.digest.len);
2681225f04fbSGowrishankar Muthukrishnan 			md.len = outlen;
2682225f04fbSGowrishankar Muthukrishnan 			rightmost[0] = md.val[md.len-1];
2683225f04fbSGowrishankar Muthukrishnan 			rightmost[1] = md.val[md.len-2];
2684225f04fbSGowrishankar Muthukrishnan 			rightptr = (uint16_t *)rightmost;
2685225f04fbSGowrishankar Muthukrishnan 			outlen = info.interim_info.sha_data.min_outlen +
2686225f04fbSGowrishankar Muthukrishnan 				(*rightptr % range);
2687225f04fbSGowrishankar Muthukrishnan 		}
2688225f04fbSGowrishankar Muthukrishnan 
2689225f04fbSGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, md.val, md.len);
2690225f04fbSGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = md.len;
2691225f04fbSGowrishankar Muthukrishnan 
2692225f04fbSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2693225f04fbSGowrishankar Muthukrishnan 			fprintf(info.fp_wr, "COUNT = %u\n", j);
2694225f04fbSGowrishankar Muthukrishnan 
2695225f04fbSGowrishankar Muthukrishnan 		info.parse_writeback(&val);
2696225f04fbSGowrishankar Muthukrishnan 
2697225f04fbSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2698225f04fbSGowrishankar Muthukrishnan 			fprintf(info.fp_wr, "\n");
2699225f04fbSGowrishankar Muthukrishnan 	}
2700225f04fbSGowrishankar Muthukrishnan 
2701225f04fbSGowrishankar Muthukrishnan 	rte_free(md.val);
2702225f04fbSGowrishankar Muthukrishnan 	rte_free(vec.pt.val);
27033d3408ddSGowrishankar Muthukrishnan 	rte_free(val.val);
2704225f04fbSGowrishankar Muthukrishnan 	return 0;
2705225f04fbSGowrishankar Muthukrishnan }
2706f4797baeSDamian Nowak 
2707f4797baeSDamian Nowak static int
2708cd255ccfSMarko Kovacevic init_test_ops(void)
2709cd255ccfSMarko Kovacevic {
2710cd255ccfSMarko Kovacevic 	switch (info.algo) {
271175777166SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CBC:
2712c8956fd2SBrian Dooley 	case FIPS_TEST_ALGO_AES_CTR:
2713cd255ccfSMarko Kovacevic 	case FIPS_TEST_ALGO_AES:
271436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
271536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform  = prepare_aes_xform;
2716cd255ccfSMarko Kovacevic 		if (info.interim_info.aes_data.test_type == AESAVS_TYPE_MCT)
2717cd255ccfSMarko Kovacevic 			test_ops.test = fips_mct_aes_test;
2718cd255ccfSMarko Kovacevic 		else
2719cd255ccfSMarko Kovacevic 			test_ops.test = fips_generic_test;
2720cd255ccfSMarko Kovacevic 		break;
2721f64adb67SMarko Kovacevic 	case FIPS_TEST_ALGO_HMAC:
272236128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
272336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_hmac_xform;
2724f64adb67SMarko Kovacevic 		test_ops.test = fips_generic_test;
2725f64adb67SMarko Kovacevic 		break;
2726527cbf3dSMarko Kovacevic 	case FIPS_TEST_ALGO_TDES:
272736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
272836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_tdes_xform;
2729527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.test_type == TDES_MCT)
2730527cbf3dSMarko Kovacevic 			test_ops.test = fips_mct_tdes_test;
2731527cbf3dSMarko Kovacevic 		else
2732527cbf3dSMarko Kovacevic 			test_ops.test = fips_generic_test;
2733527cbf3dSMarko Kovacevic 		break;
2734e27268bdSBrian Dooley 	case FIPS_TEST_ALGO_AES_GMAC:
273536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
273636128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gmac_xform;
2737e27268bdSBrian Dooley 		test_ops.test = fips_generic_test;
2738e27268bdSBrian Dooley 		break;
27394aaad299SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_GCM:
274036128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_aead_op;
274136128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gcm_xform;
27424aaad299SMarko Kovacevic 		test_ops.test = fips_generic_test;
27434aaad299SMarko Kovacevic 		break;
2744ac026f46SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_CMAC:
274536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
274636128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_cmac_xform;
2747ac026f46SMarko Kovacevic 		test_ops.test = fips_generic_test;
2748ac026f46SMarko Kovacevic 		break;
2749305921f4SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_CCM:
275036128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_aead_op;
275136128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_ccm_xform;
2752305921f4SMarko Kovacevic 		test_ops.test = fips_generic_test;
2753305921f4SMarko Kovacevic 		break;
2754f4797baeSDamian Nowak 	case FIPS_TEST_ALGO_SHA:
275536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
275636128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_sha_xform;
2757f4797baeSDamian Nowak 		if (info.interim_info.sha_data.test_type == SHA_MCT)
2758225f04fbSGowrishankar Muthukrishnan 			if (info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_128 ||
2759225f04fbSGowrishankar Muthukrishnan 				info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_256)
2760225f04fbSGowrishankar Muthukrishnan 				test_ops.test = fips_mct_shake_test;
2761225f04fbSGowrishankar Muthukrishnan 			else
2762f4797baeSDamian Nowak 				test_ops.test = fips_mct_sha_test;
2763f4797baeSDamian Nowak 		else
2764f4797baeSDamian Nowak 			test_ops.test = fips_generic_test;
2765f4797baeSDamian Nowak 		break;
2766d5a9ea55SSucharitha Sarananaga 	case FIPS_TEST_ALGO_AES_XTS:
276736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
276836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_xts_xform;
276936128a67SGowrishankar Muthukrishnan 		test_ops.test = fips_generic_test;
277036128a67SGowrishankar Muthukrishnan 		break;
277136128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_RSA:
277236128a67SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = prepare_rsa_op;
277336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = prepare_rsa_xform;
2774d5a9ea55SSucharitha Sarananaga 		test_ops.test = fips_generic_test;
2775d5a9ea55SSucharitha Sarananaga 		break;
2776b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_ECDSA:
2777b455d261SGowrishankar Muthukrishnan 		if (info.op == FIPS_TEST_ASYM_KEYGEN) {
2778b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecfpm_op;
2779b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecfpm_xform;
2780b455d261SGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2781b455d261SGowrishankar Muthukrishnan 		} else {
2782b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecdsa_op;
2783b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecdsa_xform;
2784b455d261SGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2785b455d261SGowrishankar Muthukrishnan 		}
2786b455d261SGowrishankar Muthukrishnan 		break;
278712ede9acSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_EDDSA:
278812ede9acSGowrishankar Muthukrishnan 		if (info.op == FIPS_TEST_ASYM_KEYGEN) {
278912ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_edfpm_op;
279012ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_edfpm_xform;
279112ede9acSGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
279212ede9acSGowrishankar Muthukrishnan 		} else {
279312ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_eddsa_op;
279412ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_eddsa_xform;
279512ede9acSGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
279612ede9acSGowrishankar Muthukrishnan 		}
279712ede9acSGowrishankar Muthukrishnan 		break;
2798cd255ccfSMarko Kovacevic 	default:
2799efe3a8dbSMichael Shamis 		if (strstr(info.file_name, "TECB") ||
2800efe3a8dbSMichael Shamis 				strstr(info.file_name, "TCBC")) {
2801efe3a8dbSMichael Shamis 			info.algo = FIPS_TEST_ALGO_TDES;
280236128a67SGowrishankar Muthukrishnan 			test_ops.prepare_sym_op = prepare_cipher_op;
280336128a67SGowrishankar Muthukrishnan 			test_ops.prepare_sym_xform = prepare_tdes_xform;
2804efe3a8dbSMichael Shamis 			if (info.interim_info.tdes_data.test_type == TDES_MCT)
2805efe3a8dbSMichael Shamis 				test_ops.test = fips_mct_tdes_test;
2806efe3a8dbSMichael Shamis 			else
2807efe3a8dbSMichael Shamis 				test_ops.test = fips_generic_test;
2808efe3a8dbSMichael Shamis 			break;
2809efe3a8dbSMichael Shamis 		}
2810cd255ccfSMarko Kovacevic 		return -1;
2811cd255ccfSMarko Kovacevic 	}
2812cd255ccfSMarko Kovacevic 
2813cd255ccfSMarko Kovacevic 	return 0;
2814cd255ccfSMarko Kovacevic }
2815cd255ccfSMarko Kovacevic 
28163d0fad56SMarko Kovacevic static void
28173d0fad56SMarko Kovacevic print_test_block(void)
28183d0fad56SMarko Kovacevic {
28193d0fad56SMarko Kovacevic 	uint32_t i;
28203d0fad56SMarko Kovacevic 
28213d0fad56SMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++)
28223d0fad56SMarko Kovacevic 		printf("%s\n", info.vec[i]);
28233d0fad56SMarko Kovacevic 
28243d0fad56SMarko Kovacevic 	printf("\n");
28253d0fad56SMarko Kovacevic }
28263d0fad56SMarko Kovacevic 
28273d0fad56SMarko Kovacevic static int
28283d0fad56SMarko Kovacevic fips_test_one_file(void)
28293d0fad56SMarko Kovacevic {
28303d0fad56SMarko Kovacevic 	int fetch_ret = 0, ret;
28313d0fad56SMarko Kovacevic 
2832cd255ccfSMarko Kovacevic 	ret = init_test_ops();
2833cd255ccfSMarko Kovacevic 	if (ret < 0) {
2834cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Init test op\n", ret);
2835cd255ccfSMarko Kovacevic 		return ret;
2836cd255ccfSMarko Kovacevic 	}
2837cd255ccfSMarko Kovacevic 
2838cd255ccfSMarko Kovacevic 	while (ret >= 0 && fetch_ret == 0) {
28393d0fad56SMarko Kovacevic 		fetch_ret = fips_test_fetch_one_block();
28403d0fad56SMarko Kovacevic 		if (fetch_ret < 0) {
28413d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Fetch block\n",
28423d0fad56SMarko Kovacevic 					fetch_ret);
28433d0fad56SMarko Kovacevic 			ret = fetch_ret;
28443d0fad56SMarko Kovacevic 			goto error_one_case;
28453d0fad56SMarko Kovacevic 		}
28463d0fad56SMarko Kovacevic 
28473d0fad56SMarko Kovacevic 		if (info.nb_vec_lines == 0) {
28483d0fad56SMarko Kovacevic 			if (fetch_ret == -EOF)
28493d0fad56SMarko Kovacevic 				break;
28503d0fad56SMarko Kovacevic 
28513d0fad56SMarko Kovacevic 			fprintf(info.fp_wr, "\n");
28523d0fad56SMarko Kovacevic 			continue;
28533d0fad56SMarko Kovacevic 		}
28543d0fad56SMarko Kovacevic 
28553d0fad56SMarko Kovacevic 		ret = fips_test_parse_one_case();
28563d0fad56SMarko Kovacevic 		switch (ret) {
28573d0fad56SMarko Kovacevic 		case 0:
2858cd255ccfSMarko Kovacevic 			ret = test_ops.test();
28593d0fad56SMarko Kovacevic 			if (ret == 0)
28603d0fad56SMarko Kovacevic 				break;
28613d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: test block\n",
28623d0fad56SMarko Kovacevic 					ret);
28633d0fad56SMarko Kovacevic 			goto error_one_case;
28643d0fad56SMarko Kovacevic 		case 1:
28653d0fad56SMarko Kovacevic 			break;
28663d0fad56SMarko Kovacevic 		default:
28673d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
28683d0fad56SMarko Kovacevic 					ret);
28693d0fad56SMarko Kovacevic 			goto error_one_case;
28703d0fad56SMarko Kovacevic 		}
28713d0fad56SMarko Kovacevic 
28723d0fad56SMarko Kovacevic 		continue;
28733d0fad56SMarko Kovacevic error_one_case:
28743d0fad56SMarko Kovacevic 		print_test_block();
28753d0fad56SMarko Kovacevic 	}
28763d0fad56SMarko Kovacevic 
28773d0fad56SMarko Kovacevic 	fips_test_clear();
28783d0fad56SMarko Kovacevic 
287915bb59a5SCiara Power 	if (env.digest) {
2880952e10cdSFan Zhang 		rte_free(env.digest);
288115bb59a5SCiara Power 		env.digest = NULL;
288294dfc563SSamina Arshad 		env.digest_len = 0;
288315bb59a5SCiara Power 	}
2884952e10cdSFan Zhang 	rte_pktmbuf_free(env.mbuf);
2885cd255ccfSMarko Kovacevic 
2886952e10cdSFan Zhang 	return ret;
28873d0fad56SMarko Kovacevic }
288889be27e3SBrandon Lo 
28898d70a194SDavid Marchand #ifdef USE_JANSSON
289089be27e3SBrandon Lo static int
289189be27e3SBrandon Lo fips_test_json_init_writeback(void)
289289be27e3SBrandon Lo {
289389be27e3SBrandon Lo 	json_t *session_info, *session_write;
289489be27e3SBrandon Lo 	session_info = json_array_get(json_info.json_root, 0);
289589be27e3SBrandon Lo 	session_write = json_object();
289689be27e3SBrandon Lo 	json_info.json_write_root = json_array();
289789be27e3SBrandon Lo 
289889be27e3SBrandon Lo 	json_object_set(session_write, "jwt",
289989be27e3SBrandon Lo 		json_object_get(session_info, "jwt"));
290089be27e3SBrandon Lo 	json_object_set(session_write, "url",
290189be27e3SBrandon Lo 		json_object_get(session_info, "url"));
290289be27e3SBrandon Lo 	json_object_set(session_write, "isSample",
290389be27e3SBrandon Lo 		json_object_get(session_info, "isSample"));
290489be27e3SBrandon Lo 
290589be27e3SBrandon Lo 	json_info.is_sample = json_boolean_value(
290689be27e3SBrandon Lo 		json_object_get(session_info, "isSample"));
290789be27e3SBrandon Lo 
290889be27e3SBrandon Lo 	json_array_append_new(json_info.json_write_root, session_write);
290989be27e3SBrandon Lo 	return 0;
291089be27e3SBrandon Lo }
291189be27e3SBrandon Lo 
291289be27e3SBrandon Lo static int
291389be27e3SBrandon Lo fips_test_one_test_case(void)
291489be27e3SBrandon Lo {
291589be27e3SBrandon Lo 	int ret;
291689be27e3SBrandon Lo 
291789be27e3SBrandon Lo 	ret = fips_test_parse_one_json_case();
291889be27e3SBrandon Lo 
291989be27e3SBrandon Lo 	switch (ret) {
292089be27e3SBrandon Lo 	case 0:
292189be27e3SBrandon Lo 		ret = test_ops.test();
292289be27e3SBrandon Lo 		if ((ret == 0) || (ret == -EPERM || ret == -ENOTSUP))
292389be27e3SBrandon Lo 			break;
292489be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error %i: test block\n",
292589be27e3SBrandon Lo 				ret);
292689be27e3SBrandon Lo 		break;
292789be27e3SBrandon Lo 	default:
292889be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
292989be27e3SBrandon Lo 				ret);
293089be27e3SBrandon Lo 	}
293189be27e3SBrandon Lo 	return ret;
293289be27e3SBrandon Lo }
293389be27e3SBrandon Lo 
293489be27e3SBrandon Lo static int
293589be27e3SBrandon Lo fips_test_one_test_group(void)
293689be27e3SBrandon Lo {
293789be27e3SBrandon Lo 	int ret;
293889be27e3SBrandon Lo 	json_t *tests, *write_tests;
293989be27e3SBrandon Lo 	size_t test_idx, tests_size;
294089be27e3SBrandon Lo 
294189be27e3SBrandon Lo 	write_tests = json_array();
294289be27e3SBrandon Lo 	json_info.json_write_group = json_object();
294389be27e3SBrandon Lo 	json_object_set(json_info.json_write_group, "tgId",
294489be27e3SBrandon Lo 		json_object_get(json_info.json_test_group, "tgId"));
294589be27e3SBrandon Lo 	json_object_set_new(json_info.json_write_group, "tests", write_tests);
294689be27e3SBrandon Lo 
294789be27e3SBrandon Lo 	switch (info.algo) {
2948e27268bdSBrian Dooley 	case FIPS_TEST_ALGO_AES_GMAC:
294989be27e3SBrandon Lo 	case FIPS_TEST_ALGO_AES_GCM:
2950b09aac2dSBrandon Lo 		ret = parse_test_gcm_json_init();
295189be27e3SBrandon Lo 		break;
295255a7050eSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CCM:
295355a7050eSGowrishankar Muthukrishnan 		ret = parse_test_ccm_json_init();
295455a7050eSGowrishankar Muthukrishnan 		break;
2955443c93d8SBrandon Lo 	case FIPS_TEST_ALGO_HMAC:
2956443c93d8SBrandon Lo 		ret = parse_test_hmac_json_init();
2957443c93d8SBrandon Lo 		break;
295807da56a6SBrandon Lo 	case FIPS_TEST_ALGO_AES_CMAC:
295907da56a6SBrandon Lo 		ret = parse_test_cmac_json_init();
296007da56a6SBrandon Lo 		break;
2961f8e431edSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_XTS:
2962f8e431edSGowrishankar Muthukrishnan 		ret = parse_test_xts_json_init();
2963f8e431edSGowrishankar Muthukrishnan 		break;
2964f8e431edSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CBC:
2965c8956fd2SBrian Dooley 	case FIPS_TEST_ALGO_AES_CTR:
29668b8546aaSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES:
29678b8546aaSGowrishankar Muthukrishnan 		ret = parse_test_aes_json_init();
29688b8546aaSGowrishankar Muthukrishnan 		break;
2969d5c24714SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_SHA:
2970d5c24714SGowrishankar Muthukrishnan 		ret = parse_test_sha_json_init();
2971d5c24714SGowrishankar Muthukrishnan 		break;
297264569ffaSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_TDES:
297364569ffaSGowrishankar Muthukrishnan 		ret = parse_test_tdes_json_init();
297464569ffaSGowrishankar Muthukrishnan 		break;
297536128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_RSA:
297636128a67SGowrishankar Muthukrishnan 		ret = parse_test_rsa_json_init();
297736128a67SGowrishankar Muthukrishnan 		break;
2978b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_ECDSA:
2979b455d261SGowrishankar Muthukrishnan 		ret = parse_test_ecdsa_json_init();
2980b455d261SGowrishankar Muthukrishnan 		break;
298112ede9acSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_EDDSA:
298212ede9acSGowrishankar Muthukrishnan 		ret = parse_test_eddsa_json_init();
298312ede9acSGowrishankar Muthukrishnan 		break;
298489be27e3SBrandon Lo 	default:
298589be27e3SBrandon Lo 		return -EINVAL;
298689be27e3SBrandon Lo 	}
2987b09aac2dSBrandon Lo 
298889be27e3SBrandon Lo 	if (ret < 0)
298989be27e3SBrandon Lo 		return ret;
299089be27e3SBrandon Lo 
299189be27e3SBrandon Lo 	ret = fips_test_parse_one_json_group();
299289be27e3SBrandon Lo 	if (ret < 0)
299389be27e3SBrandon Lo 		return ret;
299489be27e3SBrandon Lo 
299589be27e3SBrandon Lo 	ret = init_test_ops();
299689be27e3SBrandon Lo 	if (ret < 0)
299789be27e3SBrandon Lo 		return ret;
299889be27e3SBrandon Lo 
299989be27e3SBrandon Lo 	tests = json_object_get(json_info.json_test_group, "tests");
300089be27e3SBrandon Lo 	tests_size = json_array_size(tests);
300189be27e3SBrandon Lo 	for (test_idx = 0; test_idx < tests_size; test_idx++) {
300289be27e3SBrandon Lo 		json_info.json_test_case = json_array_get(tests, test_idx);
300389be27e3SBrandon Lo 		if (fips_test_one_test_case() == 0)
300489be27e3SBrandon Lo 			json_array_append_new(write_tests, json_info.json_write_case);
300589be27e3SBrandon Lo 	}
300689be27e3SBrandon Lo 
300789be27e3SBrandon Lo 	return 0;
300889be27e3SBrandon Lo }
300989be27e3SBrandon Lo 
301089be27e3SBrandon Lo static int
301189be27e3SBrandon Lo fips_test_one_vector_set(void)
301289be27e3SBrandon Lo {
301389be27e3SBrandon Lo 	int ret;
3014b455d261SGowrishankar Muthukrishnan 	json_t *test_groups, *write_groups, *write_version, *write_set, *mode;
301589be27e3SBrandon Lo 	size_t group_idx, num_groups;
301689be27e3SBrandon Lo 
301789be27e3SBrandon Lo 	test_groups = json_object_get(json_info.json_vector_set, "testGroups");
301889be27e3SBrandon Lo 	num_groups = json_array_size(test_groups);
301989be27e3SBrandon Lo 
302089be27e3SBrandon Lo 	json_info.json_write_set = json_array();
302189be27e3SBrandon Lo 	write_version = json_object();
302289be27e3SBrandon Lo 	json_object_set_new(write_version, "acvVersion", json_string(ACVVERSION));
302389be27e3SBrandon Lo 	json_array_append_new(json_info.json_write_set, write_version);
302489be27e3SBrandon Lo 
302589be27e3SBrandon Lo 	write_set = json_object();
302689be27e3SBrandon Lo 	json_array_append(json_info.json_write_set, write_set);
302789be27e3SBrandon Lo 	write_groups = json_array();
302889be27e3SBrandon Lo 
302989be27e3SBrandon Lo 	json_object_set(write_set, "vsId",
303089be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "vsId"));
303189be27e3SBrandon Lo 	json_object_set(write_set, "algorithm",
303289be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "algorithm"));
3033b455d261SGowrishankar Muthukrishnan 	mode = json_object_get(json_info.json_vector_set, "mode");
3034b455d261SGowrishankar Muthukrishnan 	if (mode != NULL)
3035b455d261SGowrishankar Muthukrishnan 		json_object_set_new(write_set, "mode", mode);
3036b455d261SGowrishankar Muthukrishnan 
303789be27e3SBrandon Lo 	json_object_set(write_set, "revision",
303889be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "revision"));
303989be27e3SBrandon Lo 	json_object_set_new(write_set, "isSample",
304089be27e3SBrandon Lo 		json_boolean(json_info.is_sample));
304189be27e3SBrandon Lo 	json_object_set_new(write_set, "testGroups", write_groups);
304289be27e3SBrandon Lo 
304389be27e3SBrandon Lo 	ret = fips_test_parse_one_json_vector_set();
304489be27e3SBrandon Lo 	if (ret < 0) {
304589be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error: Unsupported or invalid vector set algorithm: %s\n",
304689be27e3SBrandon Lo 			json_string_value(json_object_get(json_info.json_vector_set, "algorithm")));
304789be27e3SBrandon Lo 		return ret;
304889be27e3SBrandon Lo 	}
304989be27e3SBrandon Lo 
305089be27e3SBrandon Lo 	for (group_idx = 0; group_idx < num_groups; group_idx++) {
305189be27e3SBrandon Lo 		json_info.json_test_group = json_array_get(test_groups, group_idx);
305289be27e3SBrandon Lo 		ret = fips_test_one_test_group();
305389be27e3SBrandon Lo 		json_array_append_new(write_groups, json_info.json_write_group);
305489be27e3SBrandon Lo 	}
305589be27e3SBrandon Lo 
305689be27e3SBrandon Lo 	return 0;
305789be27e3SBrandon Lo }
305889be27e3SBrandon Lo 
305989be27e3SBrandon Lo static int
306089be27e3SBrandon Lo fips_test_one_json_file(void)
306189be27e3SBrandon Lo {
306289be27e3SBrandon Lo 	size_t vector_set_idx, root_size;
306389be27e3SBrandon Lo 
306489be27e3SBrandon Lo 	root_size = json_array_size(json_info.json_root);
306589be27e3SBrandon Lo 	fips_test_json_init_writeback();
306689be27e3SBrandon Lo 
306789be27e3SBrandon Lo 	for (vector_set_idx = 1; vector_set_idx < root_size; vector_set_idx++) {
306889be27e3SBrandon Lo 		/* Vector set index starts at 1, the 0th index contains test session
306989be27e3SBrandon Lo 		 * information.
307089be27e3SBrandon Lo 		 */
307189be27e3SBrandon Lo 		json_info.json_vector_set = json_array_get(json_info.json_root, vector_set_idx);
307289be27e3SBrandon Lo 		fips_test_one_vector_set();
307389be27e3SBrandon Lo 		json_array_append_new(json_info.json_write_root, json_info.json_write_set);
3074d5c24714SGowrishankar Muthukrishnan 		json_incref(json_info.json_write_set);
307589be27e3SBrandon Lo 	}
307689be27e3SBrandon Lo 
307789be27e3SBrandon Lo 	json_dumpf(json_info.json_write_root, info.fp_wr, JSON_INDENT(4));
307889be27e3SBrandon Lo 	json_decref(json_info.json_write_root);
307989be27e3SBrandon Lo 
308089be27e3SBrandon Lo 	return 0;
308189be27e3SBrandon Lo }
30828d70a194SDavid Marchand #endif /* USE_JANSSON */
3083