xref: /dpdk/examples/fips_validation/main.c (revision 12ede9ac497fed989a1f4d0357e839cbe7d1e45b)
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 	asym->rsa.padding.type = info.interim_info.rsa_data.padding;
93036128a67SGowrishankar Muthukrishnan 	asym->rsa.padding.hash = info.interim_info.rsa_data.auth;
93136128a67SGowrishankar Muthukrishnan 
93236128a67SGowrishankar Muthukrishnan 	if (env.digest) {
933ae5ae3bfSGowrishankar Muthukrishnan 		if (asym->rsa.padding.type == RTE_CRYPTO_RSA_PADDING_PKCS1_5) {
934ae5ae3bfSGowrishankar Muthukrishnan 			int b_len = 0;
935ae5ae3bfSGowrishankar Muthukrishnan 			uint8_t b[32];
936ae5ae3bfSGowrishankar Muthukrishnan 
937ae5ae3bfSGowrishankar Muthukrishnan 			b_len = get_hash_oid(asym->rsa.padding.hash, b);
938ae5ae3bfSGowrishankar Muthukrishnan 			if (b_len < 0) {
939ae5ae3bfSGowrishankar Muthukrishnan 				RTE_LOG(ERR, USER1, "Failed to get digest info for hash %d\n",
940ae5ae3bfSGowrishankar Muthukrishnan 					asym->rsa.padding.hash);
941ae5ae3bfSGowrishankar Muthukrishnan 				return -EINVAL;
942ae5ae3bfSGowrishankar Muthukrishnan 			}
943ae5ae3bfSGowrishankar Muthukrishnan 
944ae5ae3bfSGowrishankar Muthukrishnan 			if (b_len) {
945ae5ae3bfSGowrishankar Muthukrishnan 				msg.len = env.digest_len + b_len;
946ae5ae3bfSGowrishankar Muthukrishnan 				msg.val = rte_zmalloc(NULL, msg.len, 0);
947ae5ae3bfSGowrishankar Muthukrishnan 				rte_memcpy(msg.val, b, b_len);
948ae5ae3bfSGowrishankar Muthukrishnan 				rte_memcpy(msg.val + b_len, env.digest, env.digest_len);
949ae5ae3bfSGowrishankar Muthukrishnan 				rte_free(env.digest);
950ae5ae3bfSGowrishankar Muthukrishnan 				env.digest = msg.val;
951ae5ae3bfSGowrishankar Muthukrishnan 				env.digest_len = msg.len;
952ae5ae3bfSGowrishankar Muthukrishnan 			}
953ae5ae3bfSGowrishankar Muthukrishnan 		}
95436128a67SGowrishankar Muthukrishnan 		msg.val = env.digest;
95536128a67SGowrishankar Muthukrishnan 		msg.len = env.digest_len;
95636128a67SGowrishankar Muthukrishnan 	} else {
95736128a67SGowrishankar Muthukrishnan 		msg.val = vec.pt.val;
95836128a67SGowrishankar Muthukrishnan 		msg.len = vec.pt.len;
95936128a67SGowrishankar Muthukrishnan 	}
96036128a67SGowrishankar Muthukrishnan 
96136128a67SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
96236128a67SGowrishankar Muthukrishnan 		asym->rsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
96336128a67SGowrishankar Muthukrishnan 		asym->rsa.message.data = msg.val;
96436128a67SGowrishankar Muthukrishnan 		asym->rsa.message.length = msg.len;
96536128a67SGowrishankar Muthukrishnan 
96636128a67SGowrishankar Muthukrishnan 		rte_free(vec.rsa.signature.val);
96736128a67SGowrishankar Muthukrishnan 
96836128a67SGowrishankar Muthukrishnan 		vec.rsa.signature.val = rte_zmalloc(NULL, vec.rsa.n.len, 0);
96936128a67SGowrishankar Muthukrishnan 		vec.rsa.signature.len = vec.rsa.n.len;
97036128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.data = vec.rsa.signature.val;
97136128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.length = 0;
97236128a67SGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGVER) {
97336128a67SGowrishankar Muthukrishnan 		asym->rsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
97436128a67SGowrishankar Muthukrishnan 		asym->rsa.message.data = msg.val;
97536128a67SGowrishankar Muthukrishnan 		asym->rsa.message.length = msg.len;
97636128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.data = vec.rsa.signature.val;
97736128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.length = vec.rsa.signature.len;
97836128a67SGowrishankar Muthukrishnan 	} else {
97936128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op);
98036128a67SGowrishankar Muthukrishnan 		return -EINVAL;
98136128a67SGowrishankar Muthukrishnan 	}
98236128a67SGowrishankar Muthukrishnan 
98336128a67SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
984c05e4ab7SThomas Monjalon 
985c05e4ab7SThomas Monjalon 	return 0;
9864aaad299SMarko Kovacevic }
9874aaad299SMarko Kovacevic 
9884aaad299SMarko Kovacevic static int
989b455d261SGowrishankar Muthukrishnan prepare_ecdsa_op(void)
990b455d261SGowrishankar Muthukrishnan {
991b455d261SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
992b455d261SGowrishankar Muthukrishnan 	struct fips_val msg;
993b455d261SGowrishankar Muthukrishnan 
994b455d261SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
995b455d261SGowrishankar Muthukrishnan 
996b455d261SGowrishankar Muthukrishnan 	asym = env.op->asym;
997b455d261SGowrishankar Muthukrishnan 	if (env.digest) {
998b455d261SGowrishankar Muthukrishnan 		msg.val = env.digest;
999b455d261SGowrishankar Muthukrishnan 		msg.len = env.digest_len;
1000b455d261SGowrishankar Muthukrishnan 	} else {
1001b455d261SGowrishankar Muthukrishnan 		msg.val = vec.pt.val;
1002b455d261SGowrishankar Muthukrishnan 		msg.len = vec.pt.len;
1003b455d261SGowrishankar Muthukrishnan 	}
1004b455d261SGowrishankar Muthukrishnan 
1005b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
1006b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
1007b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.data = msg.val;
1008b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.length = msg.len;
1009b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.k.data = vec.ecdsa.k.val;
1010b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.k.length = vec.ecdsa.k.len;
1011b455d261SGowrishankar Muthukrishnan 
1012b455d261SGowrishankar Muthukrishnan 		rte_free(vec.ecdsa.r.val);
1013b455d261SGowrishankar Muthukrishnan 
1014b455d261SGowrishankar Muthukrishnan 		rte_free(vec.ecdsa.s.val);
1015b455d261SGowrishankar Muthukrishnan 
1016b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.r.len = info.interim_info.ecdsa_data.curve_len;
1017b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.r.val = rte_zmalloc(NULL, vec.ecdsa.r.len, 0);
1018b455d261SGowrishankar Muthukrishnan 
1019b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.s.len = vec.ecdsa.r.len;
1020b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.s.val = rte_zmalloc(NULL, vec.ecdsa.s.len, 0);
1021b455d261SGowrishankar Muthukrishnan 
1022b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.data = vec.ecdsa.r.val;
1023b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.length = 0;
1024b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.data = vec.ecdsa.s.val;
1025b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.length = 0;
1026b455d261SGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGVER) {
1027b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
1028b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.data = msg.val;
1029b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.length = msg.len;
1030b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.data = vec.ecdsa.r.val;
1031b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.length = vec.ecdsa.r.len;
1032b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.data = vec.ecdsa.s.val;
1033b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.length = vec.ecdsa.s.len;
1034b455d261SGowrishankar Muthukrishnan 	} else {
1035b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op);
1036b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1037b455d261SGowrishankar Muthukrishnan 	}
1038b455d261SGowrishankar Muthukrishnan 
1039b455d261SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
1040b455d261SGowrishankar Muthukrishnan 
1041b455d261SGowrishankar Muthukrishnan 	return 0;
1042b455d261SGowrishankar Muthukrishnan }
1043b455d261SGowrishankar Muthukrishnan 
1044b455d261SGowrishankar Muthukrishnan static int
1045*12ede9acSGowrishankar Muthukrishnan prepare_eddsa_op(void)
1046*12ede9acSGowrishankar Muthukrishnan {
1047*12ede9acSGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
1048*12ede9acSGowrishankar Muthukrishnan 	struct fips_val msg;
1049*12ede9acSGowrishankar Muthukrishnan 
1050*12ede9acSGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1051*12ede9acSGowrishankar Muthukrishnan 
1052*12ede9acSGowrishankar Muthukrishnan 	asym = env.op->asym;
1053*12ede9acSGowrishankar Muthukrishnan 	if (env.digest) {
1054*12ede9acSGowrishankar Muthukrishnan 		msg.val = env.digest;
1055*12ede9acSGowrishankar Muthukrishnan 		msg.len = env.digest_len;
1056*12ede9acSGowrishankar Muthukrishnan 	} else {
1057*12ede9acSGowrishankar Muthukrishnan 		msg.val = vec.pt.val;
1058*12ede9acSGowrishankar Muthukrishnan 		msg.len = vec.pt.len;
1059*12ede9acSGowrishankar Muthukrishnan 	}
1060*12ede9acSGowrishankar Muthukrishnan 
1061*12ede9acSGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
1062*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
1063*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.message.data = msg.val;
1064*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.message.length = msg.len;
1065*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.context.data = vec.eddsa.ctx.val;
1066*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.context.length = vec.eddsa.ctx.len;
1067*12ede9acSGowrishankar Muthukrishnan 
1068*12ede9acSGowrishankar Muthukrishnan 		rte_free(vec.eddsa.sign.val);
1069*12ede9acSGowrishankar Muthukrishnan 
1070*12ede9acSGowrishankar Muthukrishnan 		vec.eddsa.sign.len = info.interim_info.eddsa_data.curve_len;
1071*12ede9acSGowrishankar Muthukrishnan 		vec.eddsa.sign.val = rte_zmalloc(NULL, vec.eddsa.sign.len, 0);
1072*12ede9acSGowrishankar Muthukrishnan 
1073*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.sign.data = vec.eddsa.sign.val;
1074*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.sign.length = 0;
1075*12ede9acSGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGVER) {
1076*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
1077*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.message.data = msg.val;
1078*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.message.length = msg.len;
1079*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.sign.data = vec.eddsa.sign.val;
1080*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.sign.length = vec.eddsa.sign.len;
1081*12ede9acSGowrishankar Muthukrishnan 	} else {
1082*12ede9acSGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op);
1083*12ede9acSGowrishankar Muthukrishnan 		return -EINVAL;
1084*12ede9acSGowrishankar Muthukrishnan 	}
1085*12ede9acSGowrishankar Muthukrishnan 
1086*12ede9acSGowrishankar Muthukrishnan 	if (info.interim_info.eddsa_data.curve_id == RTE_CRYPTO_EC_GROUP_ED25519) {
1087*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.instance = RTE_CRYPTO_EDCURVE_25519;
1088*12ede9acSGowrishankar Muthukrishnan 		if (info.interim_info.eddsa_data.prehash)
1089*12ede9acSGowrishankar Muthukrishnan 			asym->eddsa.instance = RTE_CRYPTO_EDCURVE_25519PH;
1090*12ede9acSGowrishankar Muthukrishnan 		if (vec.eddsa.ctx.len > 0)
1091*12ede9acSGowrishankar Muthukrishnan 			asym->eddsa.instance = RTE_CRYPTO_EDCURVE_25519CTX;
1092*12ede9acSGowrishankar Muthukrishnan 	} else {
1093*12ede9acSGowrishankar Muthukrishnan 		asym->eddsa.instance = RTE_CRYPTO_EDCURVE_448;
1094*12ede9acSGowrishankar Muthukrishnan 		if (info.interim_info.eddsa_data.prehash)
1095*12ede9acSGowrishankar Muthukrishnan 			asym->eddsa.instance = RTE_CRYPTO_EDCURVE_448PH;
1096*12ede9acSGowrishankar Muthukrishnan 	}
1097*12ede9acSGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
1098*12ede9acSGowrishankar Muthukrishnan 
1099*12ede9acSGowrishankar Muthukrishnan 	return 0;
1100*12ede9acSGowrishankar Muthukrishnan }
1101*12ede9acSGowrishankar Muthukrishnan 
1102*12ede9acSGowrishankar Muthukrishnan static int
1103b455d261SGowrishankar Muthukrishnan prepare_ecfpm_op(void)
1104b455d261SGowrishankar Muthukrishnan {
1105b455d261SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
1106b455d261SGowrishankar Muthukrishnan 
1107b455d261SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1108b455d261SGowrishankar Muthukrishnan 
1109b455d261SGowrishankar Muthukrishnan 	asym = env.op->asym;
1110b455d261SGowrishankar Muthukrishnan 	asym->ecpm.scalar.data = vec.ecdsa.pkey.val;
1111b455d261SGowrishankar Muthukrishnan 	asym->ecpm.scalar.length = vec.ecdsa.pkey.len;
1112b455d261SGowrishankar Muthukrishnan 
1113b455d261SGowrishankar Muthukrishnan 	rte_free(vec.ecdsa.qx.val);
1114b455d261SGowrishankar Muthukrishnan 
1115b455d261SGowrishankar Muthukrishnan 	rte_free(vec.ecdsa.qy.val);
1116b455d261SGowrishankar Muthukrishnan 
1117b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qx.len = info.interim_info.ecdsa_data.curve_len;
1118b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qx.val = rte_zmalloc(NULL, vec.ecdsa.qx.len, 0);
1119b455d261SGowrishankar Muthukrishnan 
1120b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qy.len = vec.ecdsa.qx.len;
1121b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qy.val = rte_zmalloc(NULL, vec.ecdsa.qy.len, 0);
1122b455d261SGowrishankar Muthukrishnan 
1123b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.x.data = vec.ecdsa.qx.val;
1124b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.x.length = 0;
1125b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.y.data = vec.ecdsa.qy.val;
1126b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.y.length = 0;
1127b455d261SGowrishankar Muthukrishnan 
1128b455d261SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
1129b455d261SGowrishankar Muthukrishnan 
1130b455d261SGowrishankar Muthukrishnan 	return 0;
1131b455d261SGowrishankar Muthukrishnan }
1132b455d261SGowrishankar Muthukrishnan 
1133b455d261SGowrishankar Muthukrishnan static int
1134*12ede9acSGowrishankar Muthukrishnan prepare_edfpm_op(void)
1135*12ede9acSGowrishankar Muthukrishnan {
1136*12ede9acSGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
1137*12ede9acSGowrishankar Muthukrishnan 
1138*12ede9acSGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1139*12ede9acSGowrishankar Muthukrishnan 
1140*12ede9acSGowrishankar Muthukrishnan 	asym = env.op->asym;
1141*12ede9acSGowrishankar Muthukrishnan 	asym->ecpm.scalar.data = vec.eddsa.pkey.val;
1142*12ede9acSGowrishankar Muthukrishnan 	asym->ecpm.scalar.length = vec.eddsa.pkey.len;
1143*12ede9acSGowrishankar Muthukrishnan 
1144*12ede9acSGowrishankar Muthukrishnan 	rte_free(vec.eddsa.q.val);
1145*12ede9acSGowrishankar Muthukrishnan 
1146*12ede9acSGowrishankar Muthukrishnan 	vec.eddsa.q.len = info.interim_info.eddsa_data.curve_len;
1147*12ede9acSGowrishankar Muthukrishnan 	vec.eddsa.q.val = rte_zmalloc(NULL, vec.eddsa.q.len, 0);
1148*12ede9acSGowrishankar Muthukrishnan 
1149*12ede9acSGowrishankar Muthukrishnan 	asym->ecpm.r.x.data = vec.eddsa.q.val;
1150*12ede9acSGowrishankar Muthukrishnan 	asym->ecpm.r.x.length = 0;
1151*12ede9acSGowrishankar Muthukrishnan 	asym->flags |= RTE_CRYPTO_ASYM_FLAG_PUB_KEY_COMPRESSED;
1152*12ede9acSGowrishankar Muthukrishnan 
1153*12ede9acSGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
1154*12ede9acSGowrishankar Muthukrishnan 
1155*12ede9acSGowrishankar Muthukrishnan 	return 0;
1156*12ede9acSGowrishankar Muthukrishnan }
1157*12ede9acSGowrishankar Muthukrishnan 
1158*12ede9acSGowrishankar Muthukrishnan static int
1159cd255ccfSMarko Kovacevic prepare_aes_xform(struct rte_crypto_sym_xform *xform)
1160cd255ccfSMarko Kovacevic {
1161cd255ccfSMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1162cd255ccfSMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1163cd255ccfSMarko Kovacevic 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1164cd255ccfSMarko Kovacevic 
1165cd255ccfSMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1166d3190431SMichael Shamis 	if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_CBC)
1167cd255ccfSMarko Kovacevic 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CBC;
1168c8956fd2SBrian Dooley 	else if (info.interim_info.aes_data.cipher_algo ==
1169c8956fd2SBrian Dooley 			RTE_CRYPTO_CIPHER_AES_CTR)
1170c8956fd2SBrian Dooley 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CTR;
1171d3190431SMichael Shamis 	else
1172d3190431SMichael Shamis 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_ECB;
1173d3190431SMichael Shamis 
1174cd255ccfSMarko Kovacevic 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1175cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1176cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1177cd255ccfSMarko Kovacevic 	cipher_xform->key.data = vec.cipher_auth.key.val;
1178cd255ccfSMarko Kovacevic 	cipher_xform->key.length = vec.cipher_auth.key.len;
1179c8956fd2SBrian Dooley 	if (cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CBC ||
1180c8956fd2SBrian Dooley 			cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CTR) {
1181cd255ccfSMarko Kovacevic 		cipher_xform->iv.length = vec.iv.len;
1182cd255ccfSMarko Kovacevic 		cipher_xform->iv.offset = IV_OFF;
1183d3190431SMichael Shamis 	} else {
1184d3190431SMichael Shamis 		cipher_xform->iv.length = 0;
1185d3190431SMichael Shamis 		cipher_xform->iv.offset = 0;
1186d3190431SMichael Shamis 	}
1187d3190431SMichael Shamis 	cap_idx.algo.cipher = cipher_xform->algo;
1188cd255ccfSMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1189cd255ccfSMarko Kovacevic 
1190cd255ccfSMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1191cd255ccfSMarko Kovacevic 	if (!cap) {
1192cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1193cd255ccfSMarko Kovacevic 				env.dev_id);
1194cd255ccfSMarko Kovacevic 		return -EINVAL;
1195cd255ccfSMarko Kovacevic 	}
1196cd255ccfSMarko Kovacevic 
1197cd255ccfSMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1198cd255ccfSMarko Kovacevic 			cipher_xform->key.length,
1199cd255ccfSMarko Kovacevic 			cipher_xform->iv.length) != 0) {
1200cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1201cd255ccfSMarko Kovacevic 				info.device_name, cipher_xform->key.length,
1202cd255ccfSMarko Kovacevic 				cipher_xform->iv.length);
1203cd255ccfSMarko Kovacevic 		return -EPERM;
1204cd255ccfSMarko Kovacevic 	}
1205cd255ccfSMarko Kovacevic 
1206cd255ccfSMarko Kovacevic 	return 0;
1207cd255ccfSMarko Kovacevic }
1208cd255ccfSMarko Kovacevic 
1209f64adb67SMarko Kovacevic static int
1210527cbf3dSMarko Kovacevic prepare_tdes_xform(struct rte_crypto_sym_xform *xform)
1211527cbf3dSMarko Kovacevic {
1212527cbf3dSMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1213527cbf3dSMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1214527cbf3dSMarko Kovacevic 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1215527cbf3dSMarko Kovacevic 
1216527cbf3dSMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1217527cbf3dSMarko Kovacevic 
1218efe3a8dbSMichael Shamis 	if (info.interim_info.tdes_data.test_mode == TDES_MODE_CBC)
1219527cbf3dSMarko Kovacevic 		cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_CBC;
1220efe3a8dbSMichael Shamis 	else
1221efe3a8dbSMichael Shamis 		cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_ECB;
1222527cbf3dSMarko Kovacevic 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1223527cbf3dSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1224527cbf3dSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1225527cbf3dSMarko Kovacevic 	cipher_xform->key.data = vec.cipher_auth.key.val;
1226527cbf3dSMarko Kovacevic 	cipher_xform->key.length = vec.cipher_auth.key.len;
1227efe3a8dbSMichael Shamis 
1228efe3a8dbSMichael Shamis 	if (cipher_xform->algo == RTE_CRYPTO_CIPHER_3DES_CBC) {
1229527cbf3dSMarko Kovacevic 		cipher_xform->iv.length = vec.iv.len;
1230527cbf3dSMarko Kovacevic 		cipher_xform->iv.offset = IV_OFF;
1231efe3a8dbSMichael Shamis 	} else {
1232efe3a8dbSMichael Shamis 		cipher_xform->iv.length = 0;
1233efe3a8dbSMichael Shamis 		cipher_xform->iv.offset = 0;
1234efe3a8dbSMichael Shamis 	}
1235efe3a8dbSMichael Shamis 	cap_idx.algo.cipher = cipher_xform->algo;
1236527cbf3dSMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1237527cbf3dSMarko Kovacevic 
1238527cbf3dSMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1239527cbf3dSMarko Kovacevic 	if (!cap) {
1240527cbf3dSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1241527cbf3dSMarko Kovacevic 				env.dev_id);
1242527cbf3dSMarko Kovacevic 		return -EINVAL;
1243527cbf3dSMarko Kovacevic 	}
1244527cbf3dSMarko Kovacevic 
1245527cbf3dSMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1246527cbf3dSMarko Kovacevic 			cipher_xform->key.length,
1247527cbf3dSMarko Kovacevic 			cipher_xform->iv.length) != 0) {
1248527cbf3dSMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1249527cbf3dSMarko Kovacevic 				info.device_name, cipher_xform->key.length,
1250527cbf3dSMarko Kovacevic 				cipher_xform->iv.length);
1251527cbf3dSMarko Kovacevic 		return -EPERM;
1252527cbf3dSMarko Kovacevic 	}
1253527cbf3dSMarko Kovacevic 
1254527cbf3dSMarko Kovacevic 	return 0;
1255527cbf3dSMarko Kovacevic }
1256527cbf3dSMarko Kovacevic 
1257527cbf3dSMarko Kovacevic static int
1258f64adb67SMarko Kovacevic prepare_hmac_xform(struct rte_crypto_sym_xform *xform)
1259f64adb67SMarko Kovacevic {
1260f64adb67SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1261f64adb67SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1262f64adb67SMarko Kovacevic 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1263f64adb67SMarko Kovacevic 
1264f64adb67SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1265f64adb67SMarko Kovacevic 
1266f64adb67SMarko Kovacevic 	auth_xform->algo = info.interim_info.hmac_data.algo;
1267f64adb67SMarko Kovacevic 	auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE;
1268f64adb67SMarko Kovacevic 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1269f64adb67SMarko Kovacevic 	auth_xform->key.data = vec.cipher_auth.key.val;
1270f64adb67SMarko Kovacevic 	auth_xform->key.length = vec.cipher_auth.key.len;
1271f64adb67SMarko Kovacevic 
1272f64adb67SMarko Kovacevic 	cap_idx.algo.auth = auth_xform->algo;
1273f64adb67SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1274f64adb67SMarko Kovacevic 
1275f64adb67SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1276f64adb67SMarko Kovacevic 	if (!cap) {
1277f64adb67SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1278f64adb67SMarko Kovacevic 				env.dev_id);
1279f64adb67SMarko Kovacevic 		return -EINVAL;
1280f64adb67SMarko Kovacevic 	}
1281f64adb67SMarko Kovacevic 
1282f64adb67SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_auth(cap,
1283f64adb67SMarko Kovacevic 			auth_xform->key.length,
1284f64adb67SMarko Kovacevic 			auth_xform->digest_length, 0) != 0) {
12858782b3b6SPablo de Lara 		RTE_LOG(ERR, USER1, "PMD %s key length %u Digest length %u\n",
1286f64adb67SMarko Kovacevic 				info.device_name, auth_xform->key.length,
1287f64adb67SMarko Kovacevic 				auth_xform->digest_length);
1288f64adb67SMarko Kovacevic 		return -EPERM;
1289f64adb67SMarko Kovacevic 	}
1290f64adb67SMarko Kovacevic 
1291f64adb67SMarko Kovacevic 	return 0;
1292f64adb67SMarko Kovacevic }
1293f64adb67SMarko Kovacevic 
1294d09abf2dSFan Zhang int
12954aaad299SMarko Kovacevic prepare_gcm_xform(struct rte_crypto_sym_xform *xform)
12964aaad299SMarko Kovacevic {
12974aaad299SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
12984aaad299SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
12994aaad299SMarko Kovacevic 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
13004aaad299SMarko Kovacevic 
13014aaad299SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
13024aaad299SMarko Kovacevic 
13034aaad299SMarko Kovacevic 	aead_xform->algo = RTE_CRYPTO_AEAD_AES_GCM;
13044aaad299SMarko Kovacevic 	aead_xform->aad_length = vec.aead.aad.len;
13054aaad299SMarko Kovacevic 	aead_xform->digest_length = vec.aead.digest.len;
13064aaad299SMarko Kovacevic 	aead_xform->iv.offset = IV_OFF;
13074aaad299SMarko Kovacevic 	aead_xform->iv.length = vec.iv.len;
13084aaad299SMarko Kovacevic 	aead_xform->key.data = vec.aead.key.val;
13094aaad299SMarko Kovacevic 	aead_xform->key.length = vec.aead.key.len;
13104aaad299SMarko Kovacevic 	aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
13114aaad299SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
13124aaad299SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_DECRYPT;
13134aaad299SMarko Kovacevic 
13144aaad299SMarko Kovacevic 	cap_idx.algo.aead = aead_xform->algo;
13154aaad299SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
13164aaad299SMarko Kovacevic 
13174aaad299SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
13184aaad299SMarko Kovacevic 	if (!cap) {
13194aaad299SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
13204aaad299SMarko Kovacevic 				env.dev_id);
13214aaad299SMarko Kovacevic 		return -EINVAL;
13224aaad299SMarko Kovacevic 	}
13234aaad299SMarko Kovacevic 
13244aaad299SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_aead(cap,
13254aaad299SMarko Kovacevic 			aead_xform->key.length,
13264aaad299SMarko Kovacevic 			aead_xform->digest_length, aead_xform->aad_length,
13274aaad299SMarko Kovacevic 			aead_xform->iv.length) != 0) {
13284aaad299SMarko Kovacevic 		RTE_LOG(ERR, USER1,
13294aaad299SMarko Kovacevic 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
13304aaad299SMarko Kovacevic 				info.device_name, aead_xform->key.length,
13314aaad299SMarko Kovacevic 				aead_xform->digest_length,
13324aaad299SMarko Kovacevic 				aead_xform->aad_length,
13334aaad299SMarko Kovacevic 				aead_xform->iv.length);
13344aaad299SMarko Kovacevic 		return -EPERM;
13354aaad299SMarko Kovacevic 	}
13364aaad299SMarko Kovacevic 
13374aaad299SMarko Kovacevic 	return 0;
13384aaad299SMarko Kovacevic }
13394aaad299SMarko Kovacevic 
1340d09abf2dSFan Zhang int
1341d09abf2dSFan Zhang prepare_gmac_xform(struct rte_crypto_sym_xform *xform)
1342d09abf2dSFan Zhang {
1343d09abf2dSFan Zhang 	const struct rte_cryptodev_symmetric_capability *cap;
1344d09abf2dSFan Zhang 	struct rte_cryptodev_sym_capability_idx cap_idx;
1345d09abf2dSFan Zhang 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1346d09abf2dSFan Zhang 
1347d09abf2dSFan Zhang 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1348d09abf2dSFan Zhang 
1349d09abf2dSFan Zhang 	auth_xform->algo = RTE_CRYPTO_AUTH_AES_GMAC;
1350d09abf2dSFan Zhang 	auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1351d09abf2dSFan Zhang 			RTE_CRYPTO_AUTH_OP_GENERATE :
1352d09abf2dSFan Zhang 			RTE_CRYPTO_AUTH_OP_VERIFY;
1353d09abf2dSFan Zhang 	auth_xform->iv.offset = IV_OFF;
1354d09abf2dSFan Zhang 	auth_xform->iv.length = vec.iv.len;
1355d09abf2dSFan Zhang 	auth_xform->digest_length = vec.aead.digest.len;
1356d09abf2dSFan Zhang 	auth_xform->key.data = vec.aead.key.val;
1357d09abf2dSFan Zhang 	auth_xform->key.length = vec.aead.key.len;
1358d09abf2dSFan Zhang 
1359d09abf2dSFan Zhang 	cap_idx.algo.auth = auth_xform->algo;
1360d09abf2dSFan Zhang 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1361d09abf2dSFan Zhang 
1362d09abf2dSFan Zhang 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1363d09abf2dSFan Zhang 	if (!cap) {
1364d09abf2dSFan Zhang 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1365d09abf2dSFan Zhang 				env.dev_id);
1366d09abf2dSFan Zhang 		return -EINVAL;
1367d09abf2dSFan Zhang 	}
1368d09abf2dSFan Zhang 
1369d09abf2dSFan Zhang 	if (rte_cryptodev_sym_capability_check_auth(cap,
1370d09abf2dSFan Zhang 			auth_xform->key.length,
1371601b8a54SFan Zhang 			auth_xform->digest_length,
1372601b8a54SFan Zhang 			auth_xform->iv.length) != 0) {
1373601b8a54SFan Zhang 
1374601b8a54SFan Zhang 		RTE_LOG(ERR, USER1,
1375601b8a54SFan Zhang 			"PMD %s key length %u Digest length %u IV length %u\n",
1376d09abf2dSFan Zhang 				info.device_name, auth_xform->key.length,
1377601b8a54SFan Zhang 				auth_xform->digest_length,
1378601b8a54SFan Zhang 				auth_xform->iv.length);
1379d09abf2dSFan Zhang 		return -EPERM;
1380d09abf2dSFan Zhang 	}
1381d09abf2dSFan Zhang 
1382d09abf2dSFan Zhang 	return 0;
1383d09abf2dSFan Zhang }
1384d09abf2dSFan Zhang 
1385ac026f46SMarko Kovacevic static int
1386ac026f46SMarko Kovacevic prepare_cmac_xform(struct rte_crypto_sym_xform *xform)
1387ac026f46SMarko Kovacevic {
1388ac026f46SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1389ac026f46SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1390ac026f46SMarko Kovacevic 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1391ac026f46SMarko Kovacevic 
1392ac026f46SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1393ac026f46SMarko Kovacevic 
1394ac026f46SMarko Kovacevic 	auth_xform->algo = RTE_CRYPTO_AUTH_AES_CMAC;
1395ac026f46SMarko Kovacevic 	auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1396ac026f46SMarko Kovacevic 			RTE_CRYPTO_AUTH_OP_GENERATE : RTE_CRYPTO_AUTH_OP_VERIFY;
1397ac026f46SMarko Kovacevic 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1398ac026f46SMarko Kovacevic 	auth_xform->key.data = vec.cipher_auth.key.val;
1399ac026f46SMarko Kovacevic 	auth_xform->key.length = vec.cipher_auth.key.len;
1400ac026f46SMarko Kovacevic 
1401ac026f46SMarko Kovacevic 	cap_idx.algo.auth = auth_xform->algo;
1402ac026f46SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1403ac026f46SMarko Kovacevic 
1404ac026f46SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1405ac026f46SMarko Kovacevic 	if (!cap) {
1406ac026f46SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1407ac026f46SMarko Kovacevic 				env.dev_id);
1408ac026f46SMarko Kovacevic 		return -EINVAL;
1409ac026f46SMarko Kovacevic 	}
1410ac026f46SMarko Kovacevic 
1411ac026f46SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_auth(cap,
1412ac026f46SMarko Kovacevic 			auth_xform->key.length,
1413ac026f46SMarko Kovacevic 			auth_xform->digest_length, 0) != 0) {
14148782b3b6SPablo de Lara 		RTE_LOG(ERR, USER1, "PMD %s key length %u Digest length %u\n",
1415ac026f46SMarko Kovacevic 				info.device_name, auth_xform->key.length,
1416ac026f46SMarko Kovacevic 				auth_xform->digest_length);
1417ac026f46SMarko Kovacevic 		return -EPERM;
1418ac026f46SMarko Kovacevic 	}
1419ac026f46SMarko Kovacevic 
1420ac026f46SMarko Kovacevic 	return 0;
1421ac026f46SMarko Kovacevic }
1422ac026f46SMarko Kovacevic 
1423305921f4SMarko Kovacevic static int
1424305921f4SMarko Kovacevic prepare_ccm_xform(struct rte_crypto_sym_xform *xform)
1425305921f4SMarko Kovacevic {
1426305921f4SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1427305921f4SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1428305921f4SMarko Kovacevic 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
1429305921f4SMarko Kovacevic 
1430305921f4SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
1431305921f4SMarko Kovacevic 
1432305921f4SMarko Kovacevic 	aead_xform->algo = RTE_CRYPTO_AEAD_AES_CCM;
1433305921f4SMarko Kovacevic 	aead_xform->aad_length = vec.aead.aad.len;
1434305921f4SMarko Kovacevic 	aead_xform->digest_length = vec.aead.digest.len;
1435305921f4SMarko Kovacevic 	aead_xform->iv.offset = IV_OFF;
1436305921f4SMarko Kovacevic 	aead_xform->iv.length = vec.iv.len;
1437305921f4SMarko Kovacevic 	aead_xform->key.data = vec.aead.key.val;
1438305921f4SMarko Kovacevic 	aead_xform->key.length = vec.aead.key.len;
1439305921f4SMarko Kovacevic 	aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1440305921f4SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
1441305921f4SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_DECRYPT;
1442305921f4SMarko Kovacevic 
1443305921f4SMarko Kovacevic 	cap_idx.algo.aead = aead_xform->algo;
1444305921f4SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
1445305921f4SMarko Kovacevic 
1446305921f4SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1447305921f4SMarko Kovacevic 	if (!cap) {
1448305921f4SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1449305921f4SMarko Kovacevic 				env.dev_id);
1450305921f4SMarko Kovacevic 		return -EINVAL;
1451305921f4SMarko Kovacevic 	}
1452305921f4SMarko Kovacevic 
1453305921f4SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_aead(cap,
1454305921f4SMarko Kovacevic 			aead_xform->key.length,
1455305921f4SMarko Kovacevic 			aead_xform->digest_length, aead_xform->aad_length,
1456305921f4SMarko Kovacevic 			aead_xform->iv.length) != 0) {
1457305921f4SMarko Kovacevic 		RTE_LOG(ERR, USER1,
1458305921f4SMarko Kovacevic 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
1459305921f4SMarko Kovacevic 				info.device_name, aead_xform->key.length,
1460305921f4SMarko Kovacevic 				aead_xform->digest_length,
1461305921f4SMarko Kovacevic 				aead_xform->aad_length,
1462305921f4SMarko Kovacevic 				aead_xform->iv.length);
1463305921f4SMarko Kovacevic 		return -EPERM;
1464305921f4SMarko Kovacevic 	}
1465305921f4SMarko Kovacevic 
1466305921f4SMarko Kovacevic 	return 0;
1467305921f4SMarko Kovacevic }
1468305921f4SMarko Kovacevic 
1469f4797baeSDamian Nowak static int
1470f4797baeSDamian Nowak prepare_sha_xform(struct rte_crypto_sym_xform *xform)
1471f4797baeSDamian Nowak {
1472f4797baeSDamian Nowak 	const struct rte_cryptodev_symmetric_capability *cap;
1473f4797baeSDamian Nowak 	struct rte_cryptodev_sym_capability_idx cap_idx;
1474f4797baeSDamian Nowak 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1475f4797baeSDamian Nowak 
1476f4797baeSDamian Nowak 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1477f4797baeSDamian Nowak 
1478f4797baeSDamian Nowak 	auth_xform->algo = info.interim_info.sha_data.algo;
1479f4797baeSDamian Nowak 	auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE;
1480f4797baeSDamian Nowak 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1481f4797baeSDamian Nowak 
1482f4797baeSDamian Nowak 	cap_idx.algo.auth = auth_xform->algo;
1483f4797baeSDamian Nowak 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1484f4797baeSDamian Nowak 
1485f4797baeSDamian Nowak 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1486f4797baeSDamian Nowak 	if (!cap) {
1487f4797baeSDamian Nowak 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1488f4797baeSDamian Nowak 				env.dev_id);
1489f4797baeSDamian Nowak 		return -EINVAL;
1490f4797baeSDamian Nowak 	}
1491f4797baeSDamian Nowak 
1492f4797baeSDamian Nowak 	if (rte_cryptodev_sym_capability_check_auth(cap,
1493f4797baeSDamian Nowak 			auth_xform->key.length,
1494f4797baeSDamian Nowak 			auth_xform->digest_length, 0) != 0) {
1495f4797baeSDamian Nowak 		RTE_LOG(ERR, USER1, "PMD %s key length %u digest length %u\n",
1496f4797baeSDamian Nowak 				info.device_name, auth_xform->key.length,
1497f4797baeSDamian Nowak 				auth_xform->digest_length);
1498f4797baeSDamian Nowak 		return -EPERM;
1499f4797baeSDamian Nowak 	}
1500f4797baeSDamian Nowak 
1501f4797baeSDamian Nowak 	return 0;
1502f4797baeSDamian Nowak }
1503f4797baeSDamian Nowak 
1504d5a9ea55SSucharitha Sarananaga static int
1505d5a9ea55SSucharitha Sarananaga prepare_xts_xform(struct rte_crypto_sym_xform *xform)
1506d5a9ea55SSucharitha Sarananaga {
1507d5a9ea55SSucharitha Sarananaga 	const struct rte_cryptodev_symmetric_capability *cap;
1508d5a9ea55SSucharitha Sarananaga 	struct rte_cryptodev_sym_capability_idx cap_idx;
1509d5a9ea55SSucharitha Sarananaga 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1510d5a9ea55SSucharitha Sarananaga 
1511d5a9ea55SSucharitha Sarananaga 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1512d5a9ea55SSucharitha Sarananaga 
1513d5a9ea55SSucharitha Sarananaga 	cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_XTS;
1514d5a9ea55SSucharitha Sarananaga 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1515d5a9ea55SSucharitha Sarananaga 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1516d5a9ea55SSucharitha Sarananaga 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1517d5a9ea55SSucharitha Sarananaga 	cipher_xform->key.data = vec.cipher_auth.key.val;
1518d5a9ea55SSucharitha Sarananaga 	cipher_xform->key.length = vec.cipher_auth.key.len;
1519d5a9ea55SSucharitha Sarananaga 	cipher_xform->iv.length = vec.iv.len;
1520d5a9ea55SSucharitha Sarananaga 	cipher_xform->iv.offset = IV_OFF;
1521d5a9ea55SSucharitha Sarananaga 
1522d5a9ea55SSucharitha Sarananaga 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_XTS;
1523d5a9ea55SSucharitha Sarananaga 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1524d5a9ea55SSucharitha Sarananaga 
1525d5a9ea55SSucharitha Sarananaga 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1526d5a9ea55SSucharitha Sarananaga 	if (!cap) {
1527d5a9ea55SSucharitha Sarananaga 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1528d5a9ea55SSucharitha Sarananaga 				env.dev_id);
1529d5a9ea55SSucharitha Sarananaga 		return -EINVAL;
1530d5a9ea55SSucharitha Sarananaga 	}
1531d5a9ea55SSucharitha Sarananaga 
1532d5a9ea55SSucharitha Sarananaga 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1533d5a9ea55SSucharitha Sarananaga 			cipher_xform->key.length,
1534d5a9ea55SSucharitha Sarananaga 			cipher_xform->iv.length) != 0) {
1535d5a9ea55SSucharitha Sarananaga 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1536d5a9ea55SSucharitha Sarananaga 				info.device_name, cipher_xform->key.length,
1537d5a9ea55SSucharitha Sarananaga 				cipher_xform->iv.length);
1538d5a9ea55SSucharitha Sarananaga 		return -EPERM;
1539d5a9ea55SSucharitha Sarananaga 	}
1540d5a9ea55SSucharitha Sarananaga 
1541d5a9ea55SSucharitha Sarananaga 	return 0;
1542d5a9ea55SSucharitha Sarananaga }
1543d5a9ea55SSucharitha Sarananaga 
1544952e10cdSFan Zhang static int
154536128a67SGowrishankar Muthukrishnan prepare_rsa_xform(struct rte_crypto_asym_xform *xform)
154636128a67SGowrishankar Muthukrishnan {
154736128a67SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
154836128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
154936128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_info dev_info;
155036128a67SGowrishankar Muthukrishnan 
155136128a67SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_RSA;
155236128a67SGowrishankar Muthukrishnan 	xform->next = NULL;
155336128a67SGowrishankar Muthukrishnan 
155436128a67SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
155536128a67SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
155636128a67SGowrishankar Muthukrishnan 	if (!cap) {
155736128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
155836128a67SGowrishankar Muthukrishnan 				env.dev_id);
155936128a67SGowrishankar Muthukrishnan 		return -EINVAL;
156036128a67SGowrishankar Muthukrishnan 	}
156136128a67SGowrishankar Muthukrishnan 
156236128a67SGowrishankar Muthukrishnan 	switch (info.op) {
156336128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
156436128a67SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
156536128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
156636128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
156736128a67SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
156836128a67SGowrishankar Muthukrishnan 			return -EPERM;
156936128a67SGowrishankar Muthukrishnan 		}
157036128a67SGowrishankar Muthukrishnan 		break;
157136128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
157236128a67SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
157336128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
157436128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
157536128a67SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
157636128a67SGowrishankar Muthukrishnan 			return -EPERM;
157736128a67SGowrishankar Muthukrishnan 		}
157836128a67SGowrishankar Muthukrishnan 		break;
157936128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_KEYGEN:
158036128a67SGowrishankar Muthukrishnan 		break;
158136128a67SGowrishankar Muthukrishnan 	default:
158236128a67SGowrishankar Muthukrishnan 		break;
158336128a67SGowrishankar Muthukrishnan 	}
158436128a67SGowrishankar Muthukrishnan 
158536128a67SGowrishankar Muthukrishnan 	rte_cryptodev_info_get(env.dev_id, &dev_info);
158636128a67SGowrishankar Muthukrishnan 	xform->rsa.key_type = info.interim_info.rsa_data.privkey;
158736128a67SGowrishankar Muthukrishnan 	switch (xform->rsa.key_type) {
158836128a67SGowrishankar Muthukrishnan 	case RTE_RSA_KEY_TYPE_QT:
158936128a67SGowrishankar Muthukrishnan 		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT)) {
159036128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s does not support QT key type\n",
159136128a67SGowrishankar Muthukrishnan 				info.device_name);
159236128a67SGowrishankar Muthukrishnan 			return -EPERM;
159336128a67SGowrishankar Muthukrishnan 		}
159436128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.p.data = vec.rsa.p.val;
159536128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.p.length = vec.rsa.p.len;
159636128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.q.data = vec.rsa.q.val;
159736128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.q.length = vec.rsa.q.len;
159836128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dP.data = vec.rsa.dp.val;
159936128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dP.length = vec.rsa.dp.len;
160036128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dQ.data = vec.rsa.dq.val;
160136128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dQ.length = vec.rsa.dq.len;
160236128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.qInv.data = vec.rsa.qinv.val;
160336128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.qInv.length = vec.rsa.qinv.len;
160436128a67SGowrishankar Muthukrishnan 		break;
160536128a67SGowrishankar Muthukrishnan 	case RTE_RSA_KEY_TYPE_EXP:
160636128a67SGowrishankar Muthukrishnan 		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_EXP)) {
160736128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s does not support EXP key type\n",
160836128a67SGowrishankar Muthukrishnan 				info.device_name);
160936128a67SGowrishankar Muthukrishnan 			return -EPERM;
161036128a67SGowrishankar Muthukrishnan 		}
161136128a67SGowrishankar Muthukrishnan 		xform->rsa.d.data = vec.rsa.d.val;
161236128a67SGowrishankar Muthukrishnan 		xform->rsa.d.length = vec.rsa.d.len;
161336128a67SGowrishankar Muthukrishnan 		break;
161436128a67SGowrishankar Muthukrishnan 	default:
161536128a67SGowrishankar Muthukrishnan 		break;
161636128a67SGowrishankar Muthukrishnan 	}
161736128a67SGowrishankar Muthukrishnan 
161836128a67SGowrishankar Muthukrishnan 	xform->rsa.e.data = vec.rsa.e.val;
161936128a67SGowrishankar Muthukrishnan 	xform->rsa.e.length = vec.rsa.e.len;
162036128a67SGowrishankar Muthukrishnan 	xform->rsa.n.data = vec.rsa.n.val;
162136128a67SGowrishankar Muthukrishnan 	xform->rsa.n.length = vec.rsa.n.len;
162236128a67SGowrishankar Muthukrishnan 	return 0;
162336128a67SGowrishankar Muthukrishnan }
162436128a67SGowrishankar Muthukrishnan 
162536128a67SGowrishankar Muthukrishnan static int
1626b455d261SGowrishankar Muthukrishnan prepare_ecdsa_xform(struct rte_crypto_asym_xform *xform)
1627b455d261SGowrishankar Muthukrishnan {
1628b455d261SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1629b455d261SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1630b455d261SGowrishankar Muthukrishnan 
1631b455d261SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECDSA;
1632b455d261SGowrishankar Muthukrishnan 	xform->next = NULL;
1633b455d261SGowrishankar Muthukrishnan 
1634b455d261SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1635b455d261SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1636b455d261SGowrishankar Muthukrishnan 	if (!cap) {
1637b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1638b455d261SGowrishankar Muthukrishnan 				env.dev_id);
1639b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1640b455d261SGowrishankar Muthukrishnan 	}
1641b455d261SGowrishankar Muthukrishnan 
1642b455d261SGowrishankar Muthukrishnan 	switch (info.op) {
1643b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
1644b455d261SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1645b455d261SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
1646b455d261SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1647b455d261SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
1648b455d261SGowrishankar Muthukrishnan 			return -EPERM;
1649b455d261SGowrishankar Muthukrishnan 		}
1650badc0c6fSGowrishankar Muthukrishnan 
1651badc0c6fSGowrishankar Muthukrishnan 		xform->ec.pkey.data = vec.ecdsa.pkey.val;
1652badc0c6fSGowrishankar Muthukrishnan 		xform->ec.pkey.length = vec.ecdsa.pkey.len;
1653b455d261SGowrishankar Muthukrishnan 		break;
1654b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
1655b455d261SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1656b455d261SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
1657b455d261SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1658b455d261SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
1659b455d261SGowrishankar Muthukrishnan 			return -EPERM;
1660b455d261SGowrishankar Muthukrishnan 		}
1661badc0c6fSGowrishankar Muthukrishnan 
1662badc0c6fSGowrishankar Muthukrishnan 		xform->ec.q.x.data = vec.ecdsa.qx.val;
1663badc0c6fSGowrishankar Muthukrishnan 		xform->ec.q.x.length = vec.ecdsa.qx.len;
1664badc0c6fSGowrishankar Muthukrishnan 		xform->ec.q.y.data = vec.ecdsa.qy.val;
1665badc0c6fSGowrishankar Muthukrishnan 		xform->ec.q.y.length = vec.ecdsa.qy.len;
1666b455d261SGowrishankar Muthukrishnan 		break;
1667b455d261SGowrishankar Muthukrishnan 	default:
1668b455d261SGowrishankar Muthukrishnan 		break;
1669b455d261SGowrishankar Muthukrishnan 	}
1670b455d261SGowrishankar Muthukrishnan 
1671b455d261SGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id;
1672b455d261SGowrishankar Muthukrishnan 	return 0;
1673b455d261SGowrishankar Muthukrishnan }
1674b455d261SGowrishankar Muthukrishnan 
1675b455d261SGowrishankar Muthukrishnan static int
1676*12ede9acSGowrishankar Muthukrishnan prepare_eddsa_xform(struct rte_crypto_asym_xform *xform)
1677*12ede9acSGowrishankar Muthukrishnan {
1678*12ede9acSGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1679*12ede9acSGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1680*12ede9acSGowrishankar Muthukrishnan 
1681*12ede9acSGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_EDDSA;
1682*12ede9acSGowrishankar Muthukrishnan 	xform->next = NULL;
1683*12ede9acSGowrishankar Muthukrishnan 
1684*12ede9acSGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1685*12ede9acSGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1686*12ede9acSGowrishankar Muthukrishnan 	if (!cap) {
1687*12ede9acSGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1688*12ede9acSGowrishankar Muthukrishnan 				env.dev_id);
1689*12ede9acSGowrishankar Muthukrishnan 		return -EINVAL;
1690*12ede9acSGowrishankar Muthukrishnan 	}
1691*12ede9acSGowrishankar Muthukrishnan 
1692*12ede9acSGowrishankar Muthukrishnan 	switch (info.op) {
1693*12ede9acSGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
1694*12ede9acSGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1695*12ede9acSGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
1696*12ede9acSGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1697*12ede9acSGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
1698*12ede9acSGowrishankar Muthukrishnan 			return -EPERM;
1699*12ede9acSGowrishankar Muthukrishnan 		}
1700*12ede9acSGowrishankar Muthukrishnan 
1701*12ede9acSGowrishankar Muthukrishnan 		xform->ec.pkey.data = vec.eddsa.pkey.val;
1702*12ede9acSGowrishankar Muthukrishnan 		xform->ec.pkey.length = vec.eddsa.pkey.len;
1703*12ede9acSGowrishankar Muthukrishnan 		xform->ec.q.x.data = vec.eddsa.q.val;
1704*12ede9acSGowrishankar Muthukrishnan 		xform->ec.q.x.length = vec.eddsa.q.len;
1705*12ede9acSGowrishankar Muthukrishnan 		break;
1706*12ede9acSGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
1707*12ede9acSGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1708*12ede9acSGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
1709*12ede9acSGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1710*12ede9acSGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
1711*12ede9acSGowrishankar Muthukrishnan 			return -EPERM;
1712*12ede9acSGowrishankar Muthukrishnan 		}
1713*12ede9acSGowrishankar Muthukrishnan 
1714*12ede9acSGowrishankar Muthukrishnan 		xform->ec.q.x.data = vec.eddsa.q.val;
1715*12ede9acSGowrishankar Muthukrishnan 		xform->ec.q.x.length = vec.eddsa.q.len;
1716*12ede9acSGowrishankar Muthukrishnan 		break;
1717*12ede9acSGowrishankar Muthukrishnan 	default:
1718*12ede9acSGowrishankar Muthukrishnan 		break;
1719*12ede9acSGowrishankar Muthukrishnan 	}
1720*12ede9acSGowrishankar Muthukrishnan 
1721*12ede9acSGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.eddsa_data.curve_id;
1722*12ede9acSGowrishankar Muthukrishnan 	return 0;
1723*12ede9acSGowrishankar Muthukrishnan }
1724*12ede9acSGowrishankar Muthukrishnan 
1725*12ede9acSGowrishankar Muthukrishnan static int
1726b455d261SGowrishankar Muthukrishnan prepare_ecfpm_xform(struct rte_crypto_asym_xform *xform)
1727b455d261SGowrishankar Muthukrishnan {
1728b455d261SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1729b455d261SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1730b455d261SGowrishankar Muthukrishnan 
1731b455d261SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECFPM;
1732b455d261SGowrishankar Muthukrishnan 	xform->next = NULL;
1733b455d261SGowrishankar Muthukrishnan 
1734b455d261SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1735b455d261SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1736b455d261SGowrishankar Muthukrishnan 	if (!cap) {
1737b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1738b455d261SGowrishankar Muthukrishnan 				env.dev_id);
1739b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1740b455d261SGowrishankar Muthukrishnan 	}
1741b455d261SGowrishankar Muthukrishnan 
1742b455d261SGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id;
1743b455d261SGowrishankar Muthukrishnan 	return 0;
1744b455d261SGowrishankar Muthukrishnan }
1745b455d261SGowrishankar Muthukrishnan 
1746b455d261SGowrishankar Muthukrishnan static int
1747*12ede9acSGowrishankar Muthukrishnan prepare_edfpm_xform(struct rte_crypto_asym_xform *xform)
1748*12ede9acSGowrishankar Muthukrishnan {
1749*12ede9acSGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1750*12ede9acSGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1751*12ede9acSGowrishankar Muthukrishnan 
1752*12ede9acSGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECFPM;
1753*12ede9acSGowrishankar Muthukrishnan 	xform->next = NULL;
1754*12ede9acSGowrishankar Muthukrishnan 
1755*12ede9acSGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1756*12ede9acSGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1757*12ede9acSGowrishankar Muthukrishnan 	if (!cap) {
1758*12ede9acSGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1759*12ede9acSGowrishankar Muthukrishnan 				env.dev_id);
1760*12ede9acSGowrishankar Muthukrishnan 		return -EINVAL;
1761*12ede9acSGowrishankar Muthukrishnan 	}
1762*12ede9acSGowrishankar Muthukrishnan 
1763*12ede9acSGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.eddsa_data.curve_id;
1764*12ede9acSGowrishankar Muthukrishnan 	return 0;
1765*12ede9acSGowrishankar Muthukrishnan }
1766*12ede9acSGowrishankar Muthukrishnan 
1767*12ede9acSGowrishankar Muthukrishnan static int
1768cd255ccfSMarko Kovacevic get_writeback_data(struct fips_val *val)
1769cd255ccfSMarko Kovacevic {
1770952e10cdSFan Zhang 	struct rte_mbuf *m = env.mbuf;
1771952e10cdSFan Zhang 	uint16_t data_len = rte_pktmbuf_pkt_len(m);
1772952e10cdSFan Zhang 	uint16_t total_len = data_len + env.digest_len;
1773952e10cdSFan Zhang 	uint8_t *src, *dst, *wb_data;
1774952e10cdSFan Zhang 
1775952e10cdSFan Zhang 	/* in case val is reused for MCT test, try to free the buffer first */
1776952e10cdSFan Zhang 	if (val->val) {
17773d3408ddSGowrishankar Muthukrishnan 		rte_free(val->val);
1778952e10cdSFan Zhang 		val->val = NULL;
1779952e10cdSFan Zhang 	}
1780952e10cdSFan Zhang 
17813d3408ddSGowrishankar Muthukrishnan 	wb_data = dst = rte_malloc(NULL, total_len, 0);
1782952e10cdSFan Zhang 	if (!dst) {
1783952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error %i: Not enough memory\n", -ENOMEM);
1784952e10cdSFan Zhang 		return -ENOMEM;
1785952e10cdSFan Zhang 	}
1786952e10cdSFan Zhang 
1787952e10cdSFan Zhang 	while (m && data_len) {
1788952e10cdSFan Zhang 		uint16_t seg_len = RTE_MIN(rte_pktmbuf_data_len(m), data_len);
1789952e10cdSFan Zhang 
1790952e10cdSFan Zhang 		src = rte_pktmbuf_mtod(m, uint8_t *);
1791952e10cdSFan Zhang 		memcpy(dst, src, seg_len);
1792952e10cdSFan Zhang 		m = m->next;
1793952e10cdSFan Zhang 		data_len -= seg_len;
1794952e10cdSFan Zhang 		dst += seg_len;
1795952e10cdSFan Zhang 	}
1796952e10cdSFan Zhang 
1797952e10cdSFan Zhang 	if (data_len) {
1798952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error -1: write back data\n");
17993d3408ddSGowrishankar Muthukrishnan 		rte_free(wb_data);
1800952e10cdSFan Zhang 		return -1;
1801952e10cdSFan Zhang 	}
1802952e10cdSFan Zhang 
1803952e10cdSFan Zhang 	if (env.digest)
1804952e10cdSFan Zhang 		memcpy(dst, env.digest, env.digest_len);
1805952e10cdSFan Zhang 
1806952e10cdSFan Zhang 	val->val = wb_data;
1807952e10cdSFan Zhang 	val->len = total_len;
1808952e10cdSFan Zhang 
1809952e10cdSFan Zhang 	return 0;
1810cd255ccfSMarko Kovacevic }
1811cd255ccfSMarko Kovacevic 
1812cd255ccfSMarko Kovacevic static int
181336128a67SGowrishankar Muthukrishnan fips_run_sym_test(void)
1814cd255ccfSMarko Kovacevic {
1815cd255ccfSMarko Kovacevic 	struct rte_crypto_sym_xform xform = {0};
1816cd255ccfSMarko Kovacevic 	uint16_t n_deqd;
1817cd255ccfSMarko Kovacevic 	int ret;
1818cd255ccfSMarko Kovacevic 
181936128a67SGowrishankar Muthukrishnan 	if (!test_ops.prepare_sym_xform || !test_ops.prepare_sym_op)
182036128a67SGowrishankar Muthukrishnan 		return -EINVAL;
182136128a67SGowrishankar Muthukrishnan 
182236128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_sym_xform(&xform);
1823cd255ccfSMarko Kovacevic 	if (ret < 0)
1824cd255ccfSMarko Kovacevic 		return ret;
1825cd255ccfSMarko Kovacevic 
182636128a67SGowrishankar Muthukrishnan 	env.sym.sess = rte_cryptodev_sym_session_create(env.dev_id, &xform,
182736128a67SGowrishankar Muthukrishnan 						env.sym.sess_mpool);
182836128a67SGowrishankar Muthukrishnan 	if (!env.sym.sess)
182936128a67SGowrishankar Muthukrishnan 		return -ENOMEM;
1830cd255ccfSMarko Kovacevic 
183136128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_sym_op();
1832cd255ccfSMarko Kovacevic 	if (ret < 0) {
1833cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Prepare op\n",
1834cd255ccfSMarko Kovacevic 				ret);
1835083a2777SMarko Kovacevic 		goto exit;
1836cd255ccfSMarko Kovacevic 	}
1837cd255ccfSMarko Kovacevic 
1838cd255ccfSMarko Kovacevic 	if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) {
1839cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error: Failed enqueue\n");
1840083a2777SMarko Kovacevic 		ret = -1;
1841083a2777SMarko Kovacevic 		goto exit;
1842cd255ccfSMarko Kovacevic 	}
1843cd255ccfSMarko Kovacevic 
1844cd255ccfSMarko Kovacevic 	do {
1845cd255ccfSMarko Kovacevic 		struct rte_crypto_op *deqd_op;
1846cd255ccfSMarko Kovacevic 
184736128a67SGowrishankar Muthukrishnan 		n_deqd = rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1);
1848cd255ccfSMarko Kovacevic 	} while (n_deqd == 0);
1849cd255ccfSMarko Kovacevic 
1850cd255ccfSMarko Kovacevic 	vec.status = env.op->status;
1851cd255ccfSMarko Kovacevic 
1852083a2777SMarko Kovacevic exit:
185336128a67SGowrishankar Muthukrishnan 	rte_cryptodev_sym_session_free(env.dev_id, env.sym.sess);
185436128a67SGowrishankar Muthukrishnan 	env.sym.sess = NULL;
185536128a67SGowrishankar Muthukrishnan 	return ret;
1856bdce2564SAkhil Goyal }
1857cd255ccfSMarko Kovacevic 
185836128a67SGowrishankar Muthukrishnan static int
185936128a67SGowrishankar Muthukrishnan fips_run_asym_test(void)
186036128a67SGowrishankar Muthukrishnan {
186136128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_xform xform = {0};
186236128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
186336128a67SGowrishankar Muthukrishnan 	struct rte_crypto_op *deqd_op;
186436128a67SGowrishankar Muthukrishnan 	int ret;
186536128a67SGowrishankar Muthukrishnan 
1866*12ede9acSGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_KEYGEN &&
1867*12ede9acSGowrishankar Muthukrishnan 		(info.algo != FIPS_TEST_ALGO_ECDSA &&
1868*12ede9acSGowrishankar Muthukrishnan 		 info.algo != FIPS_TEST_ALGO_EDDSA)) {
186936128a67SGowrishankar Muthukrishnan 		RTE_SET_USED(asym);
187036128a67SGowrishankar Muthukrishnan 		ret = 0;
187136128a67SGowrishankar Muthukrishnan 		goto exit;
187236128a67SGowrishankar Muthukrishnan 	}
187336128a67SGowrishankar Muthukrishnan 
187436128a67SGowrishankar Muthukrishnan 	if (!test_ops.prepare_asym_xform || !test_ops.prepare_asym_op)
187536128a67SGowrishankar Muthukrishnan 		return -EINVAL;
187636128a67SGowrishankar Muthukrishnan 
187736128a67SGowrishankar Muthukrishnan 	asym = env.op->asym;
187836128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_asym_xform(&xform);
187936128a67SGowrishankar Muthukrishnan 	if (ret < 0)
1880cd255ccfSMarko Kovacevic 		return ret;
188136128a67SGowrishankar Muthukrishnan 
188236128a67SGowrishankar Muthukrishnan 	ret = rte_cryptodev_asym_session_create(env.dev_id, &xform, env.asym.sess_mpool,
188336128a67SGowrishankar Muthukrishnan 			(void *)&env.asym.sess);
188436128a67SGowrishankar Muthukrishnan 	if (ret < 0)
188536128a67SGowrishankar Muthukrishnan 		return ret;
188636128a67SGowrishankar Muthukrishnan 
188736128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_asym_op();
188836128a67SGowrishankar Muthukrishnan 	if (ret < 0) {
188936128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Error %i: Prepare op\n", ret);
189036128a67SGowrishankar Muthukrishnan 		goto exit;
189136128a67SGowrishankar Muthukrishnan 	}
189236128a67SGowrishankar Muthukrishnan 
189336128a67SGowrishankar Muthukrishnan 	if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) {
189436128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Error: Failed enqueue\n");
189536128a67SGowrishankar Muthukrishnan 		ret = -1;
189636128a67SGowrishankar Muthukrishnan 		goto exit;
189736128a67SGowrishankar Muthukrishnan 	}
189836128a67SGowrishankar Muthukrishnan 
189936128a67SGowrishankar Muthukrishnan 	while (rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1) == 0)
190036128a67SGowrishankar Muthukrishnan 		rte_pause();
190136128a67SGowrishankar Muthukrishnan 
190236128a67SGowrishankar Muthukrishnan 	vec.status = env.op->status;
190336128a67SGowrishankar Muthukrishnan 
190436128a67SGowrishankar Muthukrishnan  exit:
190536128a67SGowrishankar Muthukrishnan 	if (env.asym.sess)
190636128a67SGowrishankar Muthukrishnan 		rte_cryptodev_asym_session_free(env.dev_id, env.asym.sess);
190736128a67SGowrishankar Muthukrishnan 
190836128a67SGowrishankar Muthukrishnan 	env.asym.sess = NULL;
190936128a67SGowrishankar Muthukrishnan 	return ret;
191036128a67SGowrishankar Muthukrishnan }
191136128a67SGowrishankar Muthukrishnan 
191236128a67SGowrishankar Muthukrishnan static int
191336128a67SGowrishankar Muthukrishnan fips_run_test(void)
191436128a67SGowrishankar Muthukrishnan {
191536128a67SGowrishankar Muthukrishnan 	int ret;
191636128a67SGowrishankar Muthukrishnan 
1917*12ede9acSGowrishankar Muthukrishnan 	env.op = NULL;
1918*12ede9acSGowrishankar Muthukrishnan 	if (!env.is_asym_test) {
191936128a67SGowrishankar Muthukrishnan 		env.op = env.sym.op;
192036128a67SGowrishankar Muthukrishnan 		return fips_run_sym_test();
192136128a67SGowrishankar Muthukrishnan 	}
192236128a67SGowrishankar Muthukrishnan 
1923*12ede9acSGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_KEYGEN) {
1924*12ede9acSGowrishankar Muthukrishnan 		if (info.algo == FIPS_TEST_ALGO_ECDSA) {
1925*12ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecfpm_xform;
1926*12ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecfpm_op;
1927*12ede9acSGowrishankar Muthukrishnan 			info.interim_info.ecdsa_data.pubkey_gen = 0;
1928b455d261SGowrishankar Muthukrishnan 
1929*12ede9acSGowrishankar Muthukrishnan 		} else if (info.algo == FIPS_TEST_ALGO_EDDSA) {
1930*12ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_edfpm_xform;
1931*12ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_edfpm_op;
1932*12ede9acSGowrishankar Muthukrishnan 			info.interim_info.eddsa_data.pubkey_gen = 0;
1933*12ede9acSGowrishankar Muthukrishnan 		}
1934*12ede9acSGowrishankar Muthukrishnan 
1935*12ede9acSGowrishankar Muthukrishnan 		env.op = env.asym.op;
1936*12ede9acSGowrishankar Muthukrishnan 		return fips_run_asym_test();
1937*12ede9acSGowrishankar Muthukrishnan 	}
1938*12ede9acSGowrishankar Muthukrishnan 
1939*12ede9acSGowrishankar Muthukrishnan 	if (info.algo == FIPS_TEST_ALGO_ECDSA) {
1940*12ede9acSGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len =
1941*12ede9acSGowrishankar Muthukrishnan 			parse_test_sha_hash_size(info.interim_info.ecdsa_data.auth);
1942*12ede9acSGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_sha_xform;
1943*12ede9acSGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
1944*12ede9acSGowrishankar Muthukrishnan 
1945*12ede9acSGowrishankar Muthukrishnan 		env.op = env.sym.op;
1946*12ede9acSGowrishankar Muthukrishnan 		ret = fips_run_sym_test();
1947*12ede9acSGowrishankar Muthukrishnan 		if (ret < 0)
1948*12ede9acSGowrishankar Muthukrishnan 			return ret;
1949*12ede9acSGowrishankar Muthukrishnan 	}
1950*12ede9acSGowrishankar Muthukrishnan 
1951*12ede9acSGowrishankar Muthukrishnan 	env.op = env.asym.op;
1952*12ede9acSGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
1953*12ede9acSGowrishankar Muthukrishnan 		fips_prepare_asym_xform_t old_xform;
1954*12ede9acSGowrishankar Muthukrishnan 		fips_prepare_op_t old_op;
1955*12ede9acSGowrishankar Muthukrishnan 
1956*12ede9acSGowrishankar Muthukrishnan 		old_xform = test_ops.prepare_asym_xform;
1957*12ede9acSGowrishankar Muthukrishnan 		old_op = test_ops.prepare_asym_op;
1958*12ede9acSGowrishankar Muthukrishnan 
1959*12ede9acSGowrishankar Muthukrishnan 		if (info.algo == FIPS_TEST_ALGO_ECDSA &&
1960*12ede9acSGowrishankar Muthukrishnan 		    info.interim_info.ecdsa_data.pubkey_gen == 1) {
1961b455d261SGowrishankar Muthukrishnan 			info.op = FIPS_TEST_ASYM_KEYGEN;
1962b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecfpm_xform;
1963b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecfpm_op;
1964*12ede9acSGowrishankar Muthukrishnan 
1965b455d261SGowrishankar Muthukrishnan 			ret = fips_run_asym_test();
1966b455d261SGowrishankar Muthukrishnan 			if (ret < 0)
1967b455d261SGowrishankar Muthukrishnan 				return ret;
1968b455d261SGowrishankar Muthukrishnan 
1969b455d261SGowrishankar Muthukrishnan 			info.post_interim_writeback(NULL);
1970b455d261SGowrishankar Muthukrishnan 			info.interim_info.ecdsa_data.pubkey_gen = 0;
1971b455d261SGowrishankar Muthukrishnan 
1972*12ede9acSGowrishankar Muthukrishnan 		} else if (info.algo == FIPS_TEST_ALGO_EDDSA &&
1973*12ede9acSGowrishankar Muthukrishnan 				   info.interim_info.eddsa_data.pubkey_gen == 1) {
1974*12ede9acSGowrishankar Muthukrishnan 			info.op = FIPS_TEST_ASYM_KEYGEN;
1975*12ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_edfpm_xform;
1976*12ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_edfpm_op;
1977*12ede9acSGowrishankar Muthukrishnan 
1978*12ede9acSGowrishankar Muthukrishnan 			const struct rte_cryptodev_asymmetric_xform_capability *cap;
1979*12ede9acSGowrishankar Muthukrishnan 			struct rte_cryptodev_asym_capability_idx cap_idx;
1980*12ede9acSGowrishankar Muthukrishnan 
1981*12ede9acSGowrishankar Muthukrishnan 			cap_idx.type = RTE_CRYPTO_ASYM_XFORM_EDDSA;
1982*12ede9acSGowrishankar Muthukrishnan 			cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1983*12ede9acSGowrishankar Muthukrishnan 			if (!cap) {
1984*12ede9acSGowrishankar Muthukrishnan 				RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1985*12ede9acSGowrishankar Muthukrishnan 						env.dev_id);
1986*12ede9acSGowrishankar Muthukrishnan 				return -EINVAL;
1987*12ede9acSGowrishankar Muthukrishnan 			}
1988*12ede9acSGowrishankar Muthukrishnan 
1989*12ede9acSGowrishankar Muthukrishnan 			if (cap->op_types & (1 << RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE)) {
1990*12ede9acSGowrishankar Muthukrishnan 				ret = fips_run_asym_test();
1991*12ede9acSGowrishankar Muthukrishnan 				if (ret < 0)
1992*12ede9acSGowrishankar Muthukrishnan 					return ret;
1993*12ede9acSGowrishankar Muthukrishnan 			} else {
1994*12ede9acSGowrishankar Muthukrishnan 				/* Below is only a workaround by using known keys. */
1995*12ede9acSGowrishankar Muthukrishnan 				struct rte_crypto_asym_xform xform = {0};
1996*12ede9acSGowrishankar Muthukrishnan 
1997*12ede9acSGowrishankar Muthukrishnan 				prepare_edfpm_xform(&xform);
1998*12ede9acSGowrishankar Muthukrishnan 				prepare_edfpm_op();
1999*12ede9acSGowrishankar Muthukrishnan 				uint8_t pkey25519[] = {
2000*12ede9acSGowrishankar Muthukrishnan 					0x83, 0x3f, 0xe6, 0x24, 0x09, 0x23, 0x7b, 0x9d,
2001*12ede9acSGowrishankar Muthukrishnan 					0x62, 0xec, 0x77, 0x58, 0x75, 0x20, 0x91, 0x1e,
2002*12ede9acSGowrishankar Muthukrishnan 					0x9a, 0x75, 0x9c, 0xec, 0x1d, 0x19, 0x75, 0x5b,
2003*12ede9acSGowrishankar Muthukrishnan 					0x7d, 0xa9, 0x01, 0xb9, 0x6d, 0xca, 0x3d, 0x42
2004*12ede9acSGowrishankar Muthukrishnan 				};
2005*12ede9acSGowrishankar Muthukrishnan 				uint8_t q25519[] = {
2006*12ede9acSGowrishankar Muthukrishnan 					0xec, 0x17, 0x2b, 0x93, 0xad, 0x5e, 0x56, 0x3b,
2007*12ede9acSGowrishankar Muthukrishnan 					0xf4, 0x93, 0x2c, 0x70, 0xe1, 0x24, 0x50, 0x34,
2008*12ede9acSGowrishankar Muthukrishnan 					0xc3, 0x54, 0x67, 0xef, 0x2e, 0xfd, 0x4d, 0x64,
2009*12ede9acSGowrishankar Muthukrishnan 					0xeb, 0xf8, 0x19, 0x68, 0x34, 0x67, 0xe2, 0xbf
2010*12ede9acSGowrishankar Muthukrishnan 				};
2011*12ede9acSGowrishankar Muthukrishnan 				uint8_t pkey448[] = {
2012*12ede9acSGowrishankar Muthukrishnan 					0xd6, 0x5d, 0xf3, 0x41, 0xad, 0x13, 0xe0, 0x08,
2013*12ede9acSGowrishankar Muthukrishnan 					0x56, 0x76, 0x88, 0xba, 0xed, 0xda, 0x8e, 0x9d,
2014*12ede9acSGowrishankar Muthukrishnan 					0xcd, 0xc1, 0x7d, 0xc0, 0x24, 0x97, 0x4e, 0xa5,
2015*12ede9acSGowrishankar Muthukrishnan 					0xb4, 0x22, 0x7b, 0x65, 0x30, 0xe3, 0x39, 0xbf,
2016*12ede9acSGowrishankar Muthukrishnan 					0xf2, 0x1f, 0x99, 0xe6, 0x8c, 0xa6, 0x96, 0x8f,
2017*12ede9acSGowrishankar Muthukrishnan 					0x3c, 0xca, 0x6d, 0xfe, 0x0f, 0xb9, 0xf4, 0xfa,
2018*12ede9acSGowrishankar Muthukrishnan 					0xb4, 0xfa, 0x13, 0x5d, 0x55, 0x42, 0xea, 0x3f,
2019*12ede9acSGowrishankar Muthukrishnan 					0x01
2020*12ede9acSGowrishankar Muthukrishnan 				};
2021*12ede9acSGowrishankar Muthukrishnan 				uint8_t q448[] = {
2022*12ede9acSGowrishankar Muthukrishnan 					0xdf, 0x97, 0x05, 0xf5, 0x8e, 0xdb, 0xab, 0x80,
2023*12ede9acSGowrishankar Muthukrishnan 					0x2c, 0x7f, 0x83, 0x63, 0xcf, 0xe5, 0x56, 0x0a,
2024*12ede9acSGowrishankar Muthukrishnan 					0xb1, 0xc6, 0x13, 0x2c, 0x20, 0xa9, 0xf1, 0xdd,
2025*12ede9acSGowrishankar Muthukrishnan 					0x16, 0x34, 0x83, 0xa2, 0x6f, 0x8a, 0xc5, 0x3a,
2026*12ede9acSGowrishankar Muthukrishnan 					0x39, 0xd6, 0x80, 0x8b, 0xf4, 0xa1, 0xdf, 0xbd,
2027*12ede9acSGowrishankar Muthukrishnan 					0x26, 0x1b, 0x09, 0x9b, 0xb0, 0x3b, 0x3f, 0xb5,
2028*12ede9acSGowrishankar Muthukrishnan 					0x09, 0x06, 0xcb, 0x28, 0xbd, 0x8a, 0x08, 0x1f,
2029*12ede9acSGowrishankar Muthukrishnan 					0x00
2030*12ede9acSGowrishankar Muthukrishnan 				};
2031*12ede9acSGowrishankar Muthukrishnan 				if (info.interim_info.eddsa_data.curve_id ==
2032*12ede9acSGowrishankar Muthukrishnan 					RTE_CRYPTO_EC_GROUP_ED25519) {
2033*12ede9acSGowrishankar Muthukrishnan 					memcpy(vec.eddsa.pkey.val, pkey25519, RTE_DIM(pkey25519));
2034*12ede9acSGowrishankar Muthukrishnan 					vec.eddsa.pkey.len = 32;
2035*12ede9acSGowrishankar Muthukrishnan 					memcpy(vec.eddsa.q.val, q25519, RTE_DIM(q25519));
2036*12ede9acSGowrishankar Muthukrishnan 					vec.eddsa.q.len = 32;
2037*12ede9acSGowrishankar Muthukrishnan 				} else {
2038*12ede9acSGowrishankar Muthukrishnan 					memcpy(vec.eddsa.pkey.val, pkey448, RTE_DIM(pkey448));
2039*12ede9acSGowrishankar Muthukrishnan 					vec.eddsa.pkey.len = 32;
2040*12ede9acSGowrishankar Muthukrishnan 					memcpy(vec.eddsa.q.val, q448, RTE_DIM(q448));
2041*12ede9acSGowrishankar Muthukrishnan 					vec.eddsa.q.len = 32;
2042*12ede9acSGowrishankar Muthukrishnan 				}
2043*12ede9acSGowrishankar Muthukrishnan 			}
2044*12ede9acSGowrishankar Muthukrishnan 			info.post_interim_writeback(NULL);
2045*12ede9acSGowrishankar Muthukrishnan 			info.interim_info.eddsa_data.pubkey_gen = 0;
2046*12ede9acSGowrishankar Muthukrishnan 
2047*12ede9acSGowrishankar Muthukrishnan 		}
2048*12ede9acSGowrishankar Muthukrishnan 
2049*12ede9acSGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = old_xform;
2050*12ede9acSGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = old_op;
2051b455d261SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_SIGGEN;
2052b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
2053b455d261SGowrishankar Muthukrishnan 	} else {
2054b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
2055b455d261SGowrishankar Muthukrishnan 	}
2056b455d261SGowrishankar Muthukrishnan 
2057b455d261SGowrishankar Muthukrishnan 	return ret;
2058cd255ccfSMarko Kovacevic }
2059cd255ccfSMarko Kovacevic 
2060cd255ccfSMarko Kovacevic static int
2061cd255ccfSMarko Kovacevic fips_generic_test(void)
2062cd255ccfSMarko Kovacevic {
2063952e10cdSFan Zhang 	struct fips_val val = {NULL, 0};
2064cd255ccfSMarko Kovacevic 	int ret;
2065cd255ccfSMarko Kovacevic 
206689be27e3SBrandon Lo 	if (info.file_type != FIPS_TYPE_JSON)
2067cd255ccfSMarko Kovacevic 		fips_test_write_one_case();
2068cd255ccfSMarko Kovacevic 
2069cd255ccfSMarko Kovacevic 	ret = fips_run_test();
2070cd255ccfSMarko Kovacevic 	if (ret < 0) {
20718a40ff39SArchana Muniganti 		if (ret == -EPERM || ret == -ENOTSUP) {
207289be27e3SBrandon Lo 			if (info.file_type == FIPS_TYPE_JSON)
207389be27e3SBrandon Lo 				return ret;
207489be27e3SBrandon Lo 
2075cd255ccfSMarko Kovacevic 			fprintf(info.fp_wr, "Bypass\n\n");
2076cd255ccfSMarko Kovacevic 			return 0;
2077cd255ccfSMarko Kovacevic 		}
2078cd255ccfSMarko Kovacevic 
2079cd255ccfSMarko Kovacevic 		return ret;
2080cd255ccfSMarko Kovacevic 	}
2081cd255ccfSMarko Kovacevic 
208236128a67SGowrishankar Muthukrishnan 	if (!env.is_asym_test) {
2083952e10cdSFan Zhang 		ret = get_writeback_data(&val);
2084952e10cdSFan Zhang 		if (ret < 0)
2085952e10cdSFan Zhang 			return ret;
208636128a67SGowrishankar Muthukrishnan 	}
2087cd255ccfSMarko Kovacevic 
2088cd255ccfSMarko Kovacevic 	switch (info.file_type) {
2089cd255ccfSMarko Kovacevic 	case FIPS_TYPE_REQ:
2090cd255ccfSMarko Kovacevic 	case FIPS_TYPE_RSP:
209189be27e3SBrandon Lo 	case FIPS_TYPE_JSON:
2092cd255ccfSMarko Kovacevic 		if (info.parse_writeback == NULL)
2093cd255ccfSMarko Kovacevic 			return -EPERM;
2094cd255ccfSMarko Kovacevic 		ret = info.parse_writeback(&val);
2095cd255ccfSMarko Kovacevic 		if (ret < 0)
2096cd255ccfSMarko Kovacevic 			return ret;
2097cd255ccfSMarko Kovacevic 		break;
2098cd255ccfSMarko Kovacevic 	case FIPS_TYPE_FAX:
2099cd255ccfSMarko Kovacevic 		if (info.kat_check == NULL)
2100cd255ccfSMarko Kovacevic 			return -EPERM;
2101cd255ccfSMarko Kovacevic 		ret = info.kat_check(&val);
2102cd255ccfSMarko Kovacevic 		if (ret < 0)
2103cd255ccfSMarko Kovacevic 			return ret;
2104cd255ccfSMarko Kovacevic 		break;
2105f556293fSBrandon Lo 	default:
2106f556293fSBrandon Lo 		break;
2107cd255ccfSMarko Kovacevic 	}
2108cd255ccfSMarko Kovacevic 
210989be27e3SBrandon Lo 	if (info.file_type != FIPS_TYPE_JSON)
2110cd255ccfSMarko Kovacevic 		fprintf(info.fp_wr, "\n");
21113d3408ddSGowrishankar Muthukrishnan 	rte_free(val.val);
2112cd255ccfSMarko Kovacevic 
2113cd255ccfSMarko Kovacevic 	return 0;
2114cd255ccfSMarko Kovacevic }
2115cd255ccfSMarko Kovacevic 
2116cd255ccfSMarko Kovacevic static int
2117527cbf3dSMarko Kovacevic fips_mct_tdes_test(void)
2118527cbf3dSMarko Kovacevic {
2119527cbf3dSMarko Kovacevic #define TDES_BLOCK_SIZE		8
2120527cbf3dSMarko Kovacevic #define TDES_EXTERN_ITER	400
2121527cbf3dSMarko Kovacevic #define TDES_INTERN_ITER	10000
212264569ffaSGowrishankar Muthukrishnan 	struct fips_val val[3] = {{NULL, 0},}, val_key, pt, ct, iv;
21239252e81aSMarko Kovacevic 	uint8_t prev_out[TDES_BLOCK_SIZE] = {0};
21249252e81aSMarko Kovacevic 	uint8_t prev_prev_out[TDES_BLOCK_SIZE] = {0};
21259252e81aSMarko Kovacevic 	uint8_t prev_in[TDES_BLOCK_SIZE] = {0};
2126527cbf3dSMarko Kovacevic 	uint32_t i, j, k;
2127527cbf3dSMarko Kovacevic 	int ret;
2128ae65004fSMichael Shamis 	int test_mode = info.interim_info.tdes_data.test_mode;
2129527cbf3dSMarko Kovacevic 
213064569ffaSGowrishankar Muthukrishnan 	pt.len = vec.pt.len;
21313d3408ddSGowrishankar Muthukrishnan 	pt.val = rte_malloc(NULL, pt.len, 0);
213264569ffaSGowrishankar Muthukrishnan 	ct.len = vec.ct.len;
21333d3408ddSGowrishankar Muthukrishnan 	ct.val = rte_malloc(NULL, ct.len, 0);
213464569ffaSGowrishankar Muthukrishnan 	iv.len = vec.iv.len;
21353d3408ddSGowrishankar Muthukrishnan 	iv.val = rte_malloc(NULL, iv.len, 0);
213664569ffaSGowrishankar Muthukrishnan 
2137527cbf3dSMarko Kovacevic 	for (i = 0; i < TDES_EXTERN_ITER; i++) {
213864569ffaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON) {
213979365018SArchana Muniganti 			if ((i == 0) && (info.version == 21.4f)) {
21402b84d2bdSArchana Muniganti 				if (!(strstr(info.vec[0], "COUNT")))
21412b84d2bdSArchana Muniganti 					fprintf(info.fp_wr, "%s%u\n", "COUNT = ", 0);
214279365018SArchana Muniganti 			}
214379365018SArchana Muniganti 
214479365018SArchana Muniganti 			if (i != 0)
2145527cbf3dSMarko Kovacevic 				update_info_vec(i);
2146527cbf3dSMarko Kovacevic 
2147527cbf3dSMarko Kovacevic 			fips_test_write_one_case();
214864569ffaSGowrishankar Muthukrishnan 		}
2149527cbf3dSMarko Kovacevic 
2150527cbf3dSMarko Kovacevic 		for (j = 0; j < TDES_INTERN_ITER; j++) {
2151527cbf3dSMarko Kovacevic 			ret = fips_run_test();
2152527cbf3dSMarko Kovacevic 			if (ret < 0) {
2153527cbf3dSMarko Kovacevic 				if (ret == -EPERM) {
215489be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
215589be27e3SBrandon Lo 						return ret;
215689be27e3SBrandon Lo 
2157527cbf3dSMarko Kovacevic 					fprintf(info.fp_wr, "Bypass\n");
2158527cbf3dSMarko Kovacevic 					return 0;
2159527cbf3dSMarko Kovacevic 				}
2160527cbf3dSMarko Kovacevic 				return ret;
2161527cbf3dSMarko Kovacevic 			}
2162527cbf3dSMarko Kovacevic 
216364569ffaSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
2164952e10cdSFan Zhang 			if (ret < 0)
2165952e10cdSFan Zhang 				return ret;
2166527cbf3dSMarko Kovacevic 
2167527cbf3dSMarko Kovacevic 			if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
2168527cbf3dSMarko Kovacevic 				memcpy(prev_in, vec.ct.val, TDES_BLOCK_SIZE);
2169527cbf3dSMarko Kovacevic 
2170527cbf3dSMarko Kovacevic 			if (j == 0) {
217164569ffaSGowrishankar Muthukrishnan 				memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE);
217264569ffaSGowrishankar Muthukrishnan 				memcpy(pt.val, vec.pt.val, pt.len);
217364569ffaSGowrishankar Muthukrishnan 				memcpy(ct.val, vec.ct.val, ct.len);
217464569ffaSGowrishankar Muthukrishnan 				memcpy(iv.val, vec.iv.val, iv.len);
2175527cbf3dSMarko Kovacevic 
2176527cbf3dSMarko Kovacevic 				if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
2177ae65004fSMichael Shamis 					if (test_mode == TDES_MODE_ECB) {
217864569ffaSGowrishankar Muthukrishnan 						memcpy(vec.pt.val, val[0].val,
2179ae65004fSMichael Shamis 							   TDES_BLOCK_SIZE);
2180ae65004fSMichael Shamis 					} else {
2181527cbf3dSMarko Kovacevic 						memcpy(vec.pt.val, vec.iv.val,
2182527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
218364569ffaSGowrishankar Muthukrishnan 						memcpy(vec.iv.val, val[0].val,
2184527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
2185ae65004fSMichael Shamis 					}
218664569ffaSGowrishankar Muthukrishnan 					val[1].val = pt.val;
218764569ffaSGowrishankar Muthukrishnan 					val[1].len = pt.len;
218864569ffaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
218964569ffaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2190ae65004fSMichael Shamis 				} else {
2191ae65004fSMichael Shamis 					if (test_mode == TDES_MODE_ECB) {
219264569ffaSGowrishankar Muthukrishnan 						memcpy(vec.ct.val, val[0].val,
2193ae65004fSMichael Shamis 							   TDES_BLOCK_SIZE);
2194527cbf3dSMarko Kovacevic 					} else {
2195527cbf3dSMarko Kovacevic 						memcpy(vec.iv.val, vec.ct.val,
2196527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
219764569ffaSGowrishankar Muthukrishnan 						memcpy(vec.ct.val, val[0].val,
2198527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
2199527cbf3dSMarko Kovacevic 					}
220064569ffaSGowrishankar Muthukrishnan 					val[1].val = ct.val;
220164569ffaSGowrishankar Muthukrishnan 					val[1].len = ct.len;
220264569ffaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
220364569ffaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2204ae65004fSMichael Shamis 				}
2205527cbf3dSMarko Kovacevic 				continue;
2206527cbf3dSMarko Kovacevic 			}
2207527cbf3dSMarko Kovacevic 
2208527cbf3dSMarko Kovacevic 			if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
2209ae65004fSMichael Shamis 				if (test_mode == TDES_MODE_ECB) {
221064569ffaSGowrishankar Muthukrishnan 					memcpy(vec.pt.val, val[0].val,
2211ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
2212527cbf3dSMarko Kovacevic 				} else {
221364569ffaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, val[0].val,
2214ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
2215ae65004fSMichael Shamis 					memcpy(vec.pt.val, prev_out,
2216ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
2217ae65004fSMichael Shamis 				}
2218ae65004fSMichael Shamis 			} else {
2219ae65004fSMichael Shamis 				if (test_mode == TDES_MODE_ECB) {
222064569ffaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, val[0].val,
2221ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
2222ae65004fSMichael Shamis 				} else {
2223ae65004fSMichael Shamis 					memcpy(vec.iv.val, vec.ct.val,
2224ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
222564569ffaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, val[0].val,
2226ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
2227ae65004fSMichael Shamis 				}
2228527cbf3dSMarko Kovacevic 			}
2229527cbf3dSMarko Kovacevic 
2230527cbf3dSMarko Kovacevic 			if (j == TDES_INTERN_ITER - 1)
2231527cbf3dSMarko Kovacevic 				continue;
2232527cbf3dSMarko Kovacevic 
223364569ffaSGowrishankar Muthukrishnan 			memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE);
2234527cbf3dSMarko Kovacevic 
2235527cbf3dSMarko Kovacevic 			if (j == TDES_INTERN_ITER - 3)
223664569ffaSGowrishankar Muthukrishnan 				memcpy(prev_prev_out, val[0].val, TDES_BLOCK_SIZE);
2237527cbf3dSMarko Kovacevic 		}
2238527cbf3dSMarko Kovacevic 
223964569ffaSGowrishankar Muthukrishnan 		info.parse_writeback(val);
224064569ffaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2241527cbf3dSMarko Kovacevic 			fprintf(info.fp_wr, "\n");
2242527cbf3dSMarko Kovacevic 
2243527cbf3dSMarko Kovacevic 		if (i == TDES_EXTERN_ITER - 1)
2244527cbf3dSMarko Kovacevic 			continue;
2245527cbf3dSMarko Kovacevic 
2246527cbf3dSMarko Kovacevic 		/** update key */
2247527cbf3dSMarko Kovacevic 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2248527cbf3dSMarko Kovacevic 
2249527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.nb_keys == 0) {
2250527cbf3dSMarko Kovacevic 			if (memcmp(val_key.val, val_key.val + 8, 8) == 0)
2251527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 1;
2252527cbf3dSMarko Kovacevic 			else if (memcmp(val_key.val, val_key.val + 16, 8) == 0)
2253527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 2;
2254527cbf3dSMarko Kovacevic 			else
2255527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 3;
2256527cbf3dSMarko Kovacevic 
2257527cbf3dSMarko Kovacevic 		}
2258527cbf3dSMarko Kovacevic 
2259527cbf3dSMarko Kovacevic 		for (k = 0; k < TDES_BLOCK_SIZE; k++) {
2260527cbf3dSMarko Kovacevic 
2261527cbf3dSMarko Kovacevic 			switch (info.interim_info.tdes_data.nb_keys) {
2262527cbf3dSMarko Kovacevic 			case 3:
226364569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2264527cbf3dSMarko Kovacevic 				val_key.val[k + 8] ^= prev_out[k];
2265527cbf3dSMarko Kovacevic 				val_key.val[k + 16] ^= prev_prev_out[k];
2266527cbf3dSMarko Kovacevic 				break;
2267527cbf3dSMarko Kovacevic 			case 2:
226864569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2269527cbf3dSMarko Kovacevic 				val_key.val[k + 8] ^= prev_out[k];
227064569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 16] ^= val[0].val[k];
2271527cbf3dSMarko Kovacevic 				break;
2272527cbf3dSMarko Kovacevic 			default: /* case 1 */
227364569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
227464569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 8] ^= val[0].val[k];
227564569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 16] ^= val[0].val[k];
2276527cbf3dSMarko Kovacevic 				break;
2277527cbf3dSMarko Kovacevic 			}
2278527cbf3dSMarko Kovacevic 
2279527cbf3dSMarko Kovacevic 		}
2280527cbf3dSMarko Kovacevic 
2281527cbf3dSMarko Kovacevic 		for (k = 0; k < 24; k++)
22823d4e27fdSDavid Marchand 			val_key.val[k] = (rte_popcount32(val_key.val[k]) &
2283527cbf3dSMarko Kovacevic 					0x1) ?
2284527cbf3dSMarko Kovacevic 					val_key.val[k] : (val_key.val[k] ^ 0x1);
2285527cbf3dSMarko Kovacevic 
2286527cbf3dSMarko Kovacevic 		if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
2287ae65004fSMichael Shamis 			if (test_mode == TDES_MODE_ECB) {
228864569ffaSGowrishankar Muthukrishnan 				memcpy(vec.pt.val, val[0].val, TDES_BLOCK_SIZE);
2289ae65004fSMichael Shamis 			} else {
229064569ffaSGowrishankar Muthukrishnan 				memcpy(vec.iv.val, val[0].val, TDES_BLOCK_SIZE);
2291527cbf3dSMarko Kovacevic 				memcpy(vec.pt.val, prev_out, TDES_BLOCK_SIZE);
2292ae65004fSMichael Shamis 			}
2293ae65004fSMichael Shamis 		} else {
2294ae65004fSMichael Shamis 			if (test_mode == TDES_MODE_ECB) {
229564569ffaSGowrishankar Muthukrishnan 				memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE);
2296527cbf3dSMarko Kovacevic 			} else {
2297527cbf3dSMarko Kovacevic 				memcpy(vec.iv.val, prev_out, TDES_BLOCK_SIZE);
229864569ffaSGowrishankar Muthukrishnan 				memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE);
2299527cbf3dSMarko Kovacevic 			}
2300527cbf3dSMarko Kovacevic 		}
2301ae65004fSMichael Shamis 	}
2302527cbf3dSMarko Kovacevic 
23033d3408ddSGowrishankar Muthukrishnan 	rte_free(val[0].val);
23043d3408ddSGowrishankar Muthukrishnan 	rte_free(pt.val);
23053d3408ddSGowrishankar Muthukrishnan 	rte_free(ct.val);
23063d3408ddSGowrishankar Muthukrishnan 	rte_free(iv.val);
2307952e10cdSFan Zhang 
2308527cbf3dSMarko Kovacevic 	return 0;
2309527cbf3dSMarko Kovacevic }
2310527cbf3dSMarko Kovacevic 
2311527cbf3dSMarko Kovacevic static int
2312d3190431SMichael Shamis fips_mct_aes_ecb_test(void)
2313d3190431SMichael Shamis {
2314d3190431SMichael Shamis #define AES_BLOCK_SIZE	16
2315d3190431SMichael Shamis #define AES_EXTERN_ITER	100
2316d3190431SMichael Shamis #define AES_INTERN_ITER	1000
2317952e10cdSFan Zhang 	struct fips_val val = {NULL, 0}, val_key;
2318d3190431SMichael Shamis 	uint8_t prev_out[AES_BLOCK_SIZE] = {0};
2319d3190431SMichael Shamis 	uint32_t i, j, k;
2320d3190431SMichael Shamis 	int ret;
2321d3190431SMichael Shamis 
2322d3190431SMichael Shamis 	for (i = 0; i < AES_EXTERN_ITER; i++) {
2323d3190431SMichael Shamis 		if (i != 0)
2324d3190431SMichael Shamis 			update_info_vec(i);
2325d3190431SMichael Shamis 
2326d3190431SMichael Shamis 		fips_test_write_one_case();
2327d3190431SMichael Shamis 
2328d3190431SMichael Shamis 		for (j = 0; j < AES_INTERN_ITER; j++) {
2329d3190431SMichael Shamis 			ret = fips_run_test();
2330d3190431SMichael Shamis 			if (ret < 0) {
2331d3190431SMichael Shamis 				if (ret == -EPERM) {
233289be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
233389be27e3SBrandon Lo 						return ret;
233489be27e3SBrandon Lo 
2335d3190431SMichael Shamis 					fprintf(info.fp_wr, "Bypass\n");
2336d3190431SMichael Shamis 					return 0;
2337d3190431SMichael Shamis 				}
2338d3190431SMichael Shamis 
2339d3190431SMichael Shamis 				return ret;
2340d3190431SMichael Shamis 			}
2341d3190431SMichael Shamis 
2342952e10cdSFan Zhang 			ret = get_writeback_data(&val);
2343952e10cdSFan Zhang 			if (ret < 0)
2344952e10cdSFan Zhang 				return ret;
2345d3190431SMichael Shamis 
2346d3190431SMichael Shamis 			if (info.op == FIPS_TEST_ENC_AUTH_GEN)
2347d3190431SMichael Shamis 				memcpy(vec.pt.val, val.val, AES_BLOCK_SIZE);
2348d3190431SMichael Shamis 			else
2349d3190431SMichael Shamis 				memcpy(vec.ct.val, val.val, AES_BLOCK_SIZE);
2350d3190431SMichael Shamis 
2351d3190431SMichael Shamis 			if (j == AES_INTERN_ITER - 1)
2352d3190431SMichael Shamis 				continue;
2353d3190431SMichael Shamis 
2354d3190431SMichael Shamis 			memcpy(prev_out, val.val, AES_BLOCK_SIZE);
2355d3190431SMichael Shamis 		}
2356d3190431SMichael Shamis 
2357d3190431SMichael Shamis 		info.parse_writeback(&val);
2358d3190431SMichael Shamis 		fprintf(info.fp_wr, "\n");
2359d3190431SMichael Shamis 
2360d3190431SMichael Shamis 		if (i == AES_EXTERN_ITER - 1)
2361d3190431SMichael Shamis 			continue;
2362d3190431SMichael Shamis 
2363d3190431SMichael Shamis 		/** update key */
2364d3190431SMichael Shamis 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2365d3190431SMichael Shamis 		for (k = 0; k < vec.cipher_auth.key.len; k++) {
2366d3190431SMichael Shamis 			switch (vec.cipher_auth.key.len) {
2367d3190431SMichael Shamis 			case 16:
2368d3190431SMichael Shamis 				val_key.val[k] ^= val.val[k];
2369d3190431SMichael Shamis 				break;
2370d3190431SMichael Shamis 			case 24:
2371d3190431SMichael Shamis 				if (k < 8)
2372d3190431SMichael Shamis 					val_key.val[k] ^= prev_out[k + 8];
2373d3190431SMichael Shamis 				else
2374d3190431SMichael Shamis 					val_key.val[k] ^= val.val[k - 8];
2375d3190431SMichael Shamis 				break;
2376d3190431SMichael Shamis 			case 32:
2377d3190431SMichael Shamis 				if (k < 16)
2378d3190431SMichael Shamis 					val_key.val[k] ^= prev_out[k];
2379d3190431SMichael Shamis 				else
2380d3190431SMichael Shamis 					val_key.val[k] ^= val.val[k - 16];
2381d3190431SMichael Shamis 				break;
2382d3190431SMichael Shamis 			default:
2383d3190431SMichael Shamis 				return -1;
2384d3190431SMichael Shamis 			}
2385d3190431SMichael Shamis 		}
2386d3190431SMichael Shamis 	}
2387d3190431SMichael Shamis 
23883d3408ddSGowrishankar Muthukrishnan 	rte_free(val.val);
2389952e10cdSFan Zhang 
2390d3190431SMichael Shamis 	return 0;
2391d3190431SMichael Shamis }
2392d3190431SMichael Shamis static int
2393cd255ccfSMarko Kovacevic fips_mct_aes_test(void)
2394cd255ccfSMarko Kovacevic {
2395cd255ccfSMarko Kovacevic #define AES_BLOCK_SIZE	16
2396cd255ccfSMarko Kovacevic #define AES_EXTERN_ITER	100
2397cd255ccfSMarko Kovacevic #define AES_INTERN_ITER	1000
23988b8546aaSGowrishankar Muthukrishnan 	struct fips_val val[3] = {{NULL, 0},}, val_key,  pt, ct, iv;
2399cd255ccfSMarko Kovacevic 	uint8_t prev_out[AES_BLOCK_SIZE] = {0};
2400cd255ccfSMarko Kovacevic 	uint8_t prev_in[AES_BLOCK_SIZE] = {0};
2401cd255ccfSMarko Kovacevic 	uint32_t i, j, k;
2402cd255ccfSMarko Kovacevic 	int ret;
2403cd255ccfSMarko Kovacevic 
2404d3190431SMichael Shamis 	if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_ECB)
2405d3190431SMichael Shamis 		return fips_mct_aes_ecb_test();
2406d3190431SMichael Shamis 
2407e9ec7f61SGowrishankar Muthukrishnan 	pt.len = vec.pt.len;
24083d3408ddSGowrishankar Muthukrishnan 	pt.val = rte_malloc(NULL, pt.len, 0);
2409e9ec7f61SGowrishankar Muthukrishnan 	ct.len = vec.ct.len;
24103d3408ddSGowrishankar Muthukrishnan 	ct.val = rte_malloc(NULL, ct.len, 0);
2411e9ec7f61SGowrishankar Muthukrishnan 	iv.len = vec.iv.len;
24123d3408ddSGowrishankar Muthukrishnan 	iv.val = rte_malloc(NULL, iv.len, 0);
2413cd255ccfSMarko Kovacevic 	for (i = 0; i < AES_EXTERN_ITER; i++) {
24148b8546aaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON) {
2415cd255ccfSMarko Kovacevic 			if (i != 0)
2416cd255ccfSMarko Kovacevic 				update_info_vec(i);
2417cd255ccfSMarko Kovacevic 
2418cd255ccfSMarko Kovacevic 			fips_test_write_one_case();
24198b8546aaSGowrishankar Muthukrishnan 		}
2420cd255ccfSMarko Kovacevic 
2421cd255ccfSMarko Kovacevic 		for (j = 0; j < AES_INTERN_ITER; j++) {
2422cd255ccfSMarko Kovacevic 			ret = fips_run_test();
2423cd255ccfSMarko Kovacevic 			if (ret < 0) {
2424cd255ccfSMarko Kovacevic 				if (ret == -EPERM) {
242589be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
242689be27e3SBrandon Lo 						return ret;
242789be27e3SBrandon Lo 
2428cd255ccfSMarko Kovacevic 					fprintf(info.fp_wr, "Bypass\n");
2429cd255ccfSMarko Kovacevic 					return 0;
2430cd255ccfSMarko Kovacevic 				}
2431cd255ccfSMarko Kovacevic 
2432cd255ccfSMarko Kovacevic 				return ret;
2433cd255ccfSMarko Kovacevic 			}
2434cd255ccfSMarko Kovacevic 
24358b8546aaSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
2436afda6b01SCiara Power 			if (ret < 0)
2437afda6b01SCiara Power 				return ret;
2438cd255ccfSMarko Kovacevic 
2439cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
2440cd255ccfSMarko Kovacevic 				memcpy(prev_in, vec.ct.val, AES_BLOCK_SIZE);
2441cd255ccfSMarko Kovacevic 
2442cd255ccfSMarko Kovacevic 			if (j == 0) {
24438b8546aaSGowrishankar Muthukrishnan 				memcpy(prev_out, val[0].val, AES_BLOCK_SIZE);
24448b8546aaSGowrishankar Muthukrishnan 				memcpy(pt.val, vec.pt.val, pt.len);
24458b8546aaSGowrishankar Muthukrishnan 				memcpy(ct.val, vec.ct.val, ct.len);
24468b8546aaSGowrishankar Muthukrishnan 				memcpy(iv.val, vec.iv.val, iv.len);
2447cd255ccfSMarko Kovacevic 
2448cd255ccfSMarko Kovacevic 				if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
24498b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.pt.val, vec.iv.val, AES_BLOCK_SIZE);
24508b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
24518b8546aaSGowrishankar Muthukrishnan 					val[1].val = pt.val;
24528b8546aaSGowrishankar Muthukrishnan 					val[1].len = pt.len;
24538b8546aaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
24548b8546aaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2455cd255ccfSMarko Kovacevic 				} else {
24568b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, vec.iv.val, AES_BLOCK_SIZE);
24578b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE);
24588b8546aaSGowrishankar Muthukrishnan 					val[1].val = ct.val;
24598b8546aaSGowrishankar Muthukrishnan 					val[1].len = ct.len;
24608b8546aaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
24618b8546aaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2462cd255ccfSMarko Kovacevic 				}
2463cd255ccfSMarko Kovacevic 				continue;
2464cd255ccfSMarko Kovacevic 			}
2465cd255ccfSMarko Kovacevic 
2466cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
24678b8546aaSGowrishankar Muthukrishnan 				memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
2468cd255ccfSMarko Kovacevic 				memcpy(vec.pt.val, prev_out, AES_BLOCK_SIZE);
2469cd255ccfSMarko Kovacevic 			} else {
2470cd255ccfSMarko Kovacevic 				memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE);
2471cd255ccfSMarko Kovacevic 				memcpy(vec.ct.val, prev_out, AES_BLOCK_SIZE);
2472cd255ccfSMarko Kovacevic 			}
2473cd255ccfSMarko Kovacevic 
2474cd255ccfSMarko Kovacevic 			if (j == AES_INTERN_ITER - 1)
2475cd255ccfSMarko Kovacevic 				continue;
2476cd255ccfSMarko Kovacevic 
24778b8546aaSGowrishankar Muthukrishnan 			memcpy(prev_out, val[0].val, AES_BLOCK_SIZE);
2478cd255ccfSMarko Kovacevic 		}
2479cd255ccfSMarko Kovacevic 
24808b8546aaSGowrishankar Muthukrishnan 		info.parse_writeback(val);
24818b8546aaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2482cd255ccfSMarko Kovacevic 			fprintf(info.fp_wr, "\n");
2483cd255ccfSMarko Kovacevic 
2484e9ec7f61SGowrishankar Muthukrishnan 		if (i == AES_EXTERN_ITER - 1)
2485cd255ccfSMarko Kovacevic 			continue;
2486cd255ccfSMarko Kovacevic 
2487cd255ccfSMarko Kovacevic 		/** update key */
2488cd255ccfSMarko Kovacevic 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2489cd255ccfSMarko Kovacevic 		for (k = 0; k < vec.cipher_auth.key.len; k++) {
2490cd255ccfSMarko Kovacevic 			switch (vec.cipher_auth.key.len) {
2491cd255ccfSMarko Kovacevic 			case 16:
24928b8546aaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2493cd255ccfSMarko Kovacevic 				break;
2494cd255ccfSMarko Kovacevic 			case 24:
2495cd255ccfSMarko Kovacevic 				if (k < 8)
2496cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k + 8];
2497cd255ccfSMarko Kovacevic 				else
24988b8546aaSGowrishankar Muthukrishnan 					val_key.val[k] ^= val[0].val[k - 8];
2499cd255ccfSMarko Kovacevic 				break;
2500cd255ccfSMarko Kovacevic 			case 32:
2501cd255ccfSMarko Kovacevic 				if (k < 16)
2502cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k];
2503cd255ccfSMarko Kovacevic 				else
25048b8546aaSGowrishankar Muthukrishnan 					val_key.val[k] ^= val[0].val[k - 16];
2505cd255ccfSMarko Kovacevic 				break;
2506cd255ccfSMarko Kovacevic 			default:
2507cd255ccfSMarko Kovacevic 				return -1;
2508cd255ccfSMarko Kovacevic 			}
2509cd255ccfSMarko Kovacevic 		}
2510cd255ccfSMarko Kovacevic 
2511cd255ccfSMarko Kovacevic 		if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
25128b8546aaSGowrishankar Muthukrishnan 			memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
2513cd255ccfSMarko Kovacevic 	}
2514cd255ccfSMarko Kovacevic 
25153d3408ddSGowrishankar Muthukrishnan 	rte_free(val[0].val);
25163d3408ddSGowrishankar Muthukrishnan 	rte_free(pt.val);
25173d3408ddSGowrishankar Muthukrishnan 	rte_free(ct.val);
25183d3408ddSGowrishankar Muthukrishnan 	rte_free(iv.val);
2519952e10cdSFan Zhang 
2520cd255ccfSMarko Kovacevic 	return 0;
2521cd255ccfSMarko Kovacevic }
2522cd255ccfSMarko Kovacevic 
2523cd255ccfSMarko Kovacevic static int
2524f4797baeSDamian Nowak fips_mct_sha_test(void)
2525f4797baeSDamian Nowak {
2526f4797baeSDamian Nowak #define SHA_EXTERN_ITER	100
2527f4797baeSDamian Nowak #define SHA_INTERN_ITER	1000
25281ea7940eSGowrishankar Muthukrishnan 	uint8_t md_blocks = info.interim_info.sha_data.md_blocks;
2529fc78f69dSGowrishankar Muthukrishnan 	struct fips_val val = {NULL, 0};
25301ea7940eSGowrishankar Muthukrishnan 	struct fips_val  md[md_blocks];
2531f4797baeSDamian Nowak 	int ret;
25321ea7940eSGowrishankar Muthukrishnan 	uint32_t i, j, k, offset, max_outlen;
2533f4797baeSDamian Nowak 
25341ea7940eSGowrishankar Muthukrishnan 	max_outlen = md_blocks * vec.cipher_auth.digest.len;
25351ea7940eSGowrishankar Muthukrishnan 
25363d3408ddSGowrishankar Muthukrishnan 	rte_free(vec.cipher_auth.digest.val);
25373d3408ddSGowrishankar Muthukrishnan 	vec.cipher_auth.digest.val = rte_malloc(NULL, max_outlen, 0);
25381ea7940eSGowrishankar Muthukrishnan 
2539ce7ced4eSGowrishankar Muthukrishnan 	if (vec.pt.val)
2540d5c24714SGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, vec.pt.val, vec.cipher_auth.digest.len);
2541ce7ced4eSGowrishankar Muthukrishnan 
2542f4797baeSDamian Nowak 	rte_free(vec.pt.val);
25431ea7940eSGowrishankar Muthukrishnan 	vec.pt.val = rte_malloc(NULL, (MAX_DIGEST_SIZE*md_blocks), 0);
25441ea7940eSGowrishankar Muthukrishnan 
25451ea7940eSGowrishankar Muthukrishnan 	for (i = 0; i < md_blocks; i++)
25461ea7940eSGowrishankar Muthukrishnan 		md[i].val = rte_malloc(NULL, (MAX_DIGEST_SIZE*2), 0);
2547f4797baeSDamian Nowak 
2548d5c24714SGowrishankar Muthukrishnan 	if (info.file_type != FIPS_TYPE_JSON) {
2549f4797baeSDamian Nowak 		fips_test_write_one_case();
2550f4797baeSDamian Nowak 		fprintf(info.fp_wr, "\n");
2551d5c24714SGowrishankar Muthukrishnan 	}
2552f4797baeSDamian Nowak 
2553f4797baeSDamian Nowak 	for (j = 0; j < SHA_EXTERN_ITER; j++) {
25541ea7940eSGowrishankar Muthukrishnan 		for (i = 0; i < md_blocks; i++) {
25551ea7940eSGowrishankar Muthukrishnan 			memcpy(md[i].val, vec.cipher_auth.digest.val,
2556f4797baeSDamian Nowak 				vec.cipher_auth.digest.len);
25571ea7940eSGowrishankar Muthukrishnan 			md[i].len = vec.cipher_auth.digest.len;
25581ea7940eSGowrishankar Muthukrishnan 		}
2559d5c24714SGowrishankar Muthukrishnan 
2560f4797baeSDamian Nowak 		for (i = 0; i < (SHA_INTERN_ITER); i++) {
25611ea7940eSGowrishankar Muthukrishnan 			offset = 0;
25621ea7940eSGowrishankar Muthukrishnan 			for (k = 0; k < md_blocks; k++) {
25631ea7940eSGowrishankar Muthukrishnan 				memcpy(vec.pt.val + offset, md[k].val, (size_t)md[k].len);
25641ea7940eSGowrishankar Muthukrishnan 				offset += md[k].len;
25651ea7940eSGowrishankar Muthukrishnan 			}
25661ea7940eSGowrishankar Muthukrishnan 			vec.pt.len = offset;
2567f4797baeSDamian Nowak 
2568f4797baeSDamian Nowak 			ret = fips_run_test();
2569f4797baeSDamian Nowak 			if (ret < 0) {
25708a40ff39SArchana Muniganti 				if (ret == -EPERM || ret == -ENOTSUP) {
257189be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
257289be27e3SBrandon Lo 						return ret;
257389be27e3SBrandon Lo 
2574f4797baeSDamian Nowak 					fprintf(info.fp_wr, "Bypass\n\n");
2575f4797baeSDamian Nowak 					return 0;
2576f4797baeSDamian Nowak 				}
2577f4797baeSDamian Nowak 				return ret;
2578f4797baeSDamian Nowak 			}
2579f4797baeSDamian Nowak 
2580fc78f69dSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val);
2581afda6b01SCiara Power 			if (ret < 0)
2582afda6b01SCiara Power 				return ret;
2583f4797baeSDamian Nowak 
25841ea7940eSGowrishankar Muthukrishnan 			for (k = 1; k < md_blocks; k++) {
25851ea7940eSGowrishankar Muthukrishnan 				memcpy(md[k-1].val, md[k].val, md[k].len);
25861ea7940eSGowrishankar Muthukrishnan 				md[k-1].len = md[k].len;
2587f4797baeSDamian Nowak 			}
2588f4797baeSDamian Nowak 
25891ea7940eSGowrishankar Muthukrishnan 			memcpy(md[md_blocks-1].val, (val.val + vec.pt.len),
25901ea7940eSGowrishankar Muthukrishnan 				vec.cipher_auth.digest.len);
25911ea7940eSGowrishankar Muthukrishnan 			md[md_blocks-1].len = vec.cipher_auth.digest.len;
25921ea7940eSGowrishankar Muthukrishnan 		}
25931ea7940eSGowrishankar Muthukrishnan 
25941ea7940eSGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, md[md_blocks-1].val, md[md_blocks-1].len);
25951ea7940eSGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = md[md_blocks-1].len;
2596f4797baeSDamian Nowak 
2597ce7ced4eSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2598f4797baeSDamian Nowak 			fprintf(info.fp_wr, "COUNT = %u\n", j);
2599ce7ced4eSGowrishankar Muthukrishnan 
2600fc78f69dSGowrishankar Muthukrishnan 		info.parse_writeback(&val);
2601ce7ced4eSGowrishankar Muthukrishnan 
2602ce7ced4eSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2603ce7ced4eSGowrishankar Muthukrishnan 			fprintf(info.fp_wr, "\n");
2604d5c24714SGowrishankar Muthukrishnan 	}
2605f4797baeSDamian Nowak 
26061ea7940eSGowrishankar Muthukrishnan 	for (i = 0; i < (md_blocks); i++)
2607f4797baeSDamian Nowak 		rte_free(md[i].val);
2608f4797baeSDamian Nowak 
2609f4797baeSDamian Nowak 	rte_free(vec.pt.val);
2610f4797baeSDamian Nowak 
26113d3408ddSGowrishankar Muthukrishnan 	rte_free(val.val);
2612f4797baeSDamian Nowak 	return 0;
2613f4797baeSDamian Nowak }
2614f4797baeSDamian Nowak 
2615225f04fbSGowrishankar Muthukrishnan static int
2616225f04fbSGowrishankar Muthukrishnan fips_mct_shake_test(void)
2617225f04fbSGowrishankar Muthukrishnan {
2618225f04fbSGowrishankar Muthukrishnan #define SHAKE_EXTERN_ITER	100
2619225f04fbSGowrishankar Muthukrishnan #define SHAKE_INTERN_ITER	1000
2620225f04fbSGowrishankar Muthukrishnan 	uint32_t i, j, range, outlen, max_outlen;
2621225f04fbSGowrishankar Muthukrishnan 	struct fips_val val = {NULL, 0}, md;
2622225f04fbSGowrishankar Muthukrishnan 	uint8_t rightmost[2];
2623225f04fbSGowrishankar Muthukrishnan 	uint16_t *rightptr;
2624225f04fbSGowrishankar Muthukrishnan 	int ret;
2625225f04fbSGowrishankar Muthukrishnan 
2626225f04fbSGowrishankar Muthukrishnan 	max_outlen = vec.cipher_auth.digest.len;
2627225f04fbSGowrishankar Muthukrishnan 
26283d3408ddSGowrishankar Muthukrishnan 	rte_free(vec.cipher_auth.digest.val);
26293d3408ddSGowrishankar Muthukrishnan 	vec.cipher_auth.digest.val = rte_malloc(NULL, max_outlen, 0);
2630225f04fbSGowrishankar Muthukrishnan 
2631225f04fbSGowrishankar Muthukrishnan 	if (vec.pt.val)
2632225f04fbSGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, vec.pt.val, vec.pt.len);
2633225f04fbSGowrishankar Muthukrishnan 
2634225f04fbSGowrishankar Muthukrishnan 	rte_free(vec.pt.val);
2635225f04fbSGowrishankar Muthukrishnan 	vec.pt.val = rte_malloc(NULL, 16, 0);
2636225f04fbSGowrishankar Muthukrishnan 	vec.pt.len = 16;
2637225f04fbSGowrishankar Muthukrishnan 
2638225f04fbSGowrishankar Muthukrishnan 	md.val = rte_malloc(NULL, max_outlen, 0);
2639225f04fbSGowrishankar Muthukrishnan 	md.len = max_outlen;
2640225f04fbSGowrishankar Muthukrishnan 
2641225f04fbSGowrishankar Muthukrishnan 	if (info.file_type != FIPS_TYPE_JSON) {
2642225f04fbSGowrishankar Muthukrishnan 		fips_test_write_one_case();
2643225f04fbSGowrishankar Muthukrishnan 		fprintf(info.fp_wr, "\n");
2644225f04fbSGowrishankar Muthukrishnan 	}
2645225f04fbSGowrishankar Muthukrishnan 
2646225f04fbSGowrishankar Muthukrishnan 	range = max_outlen - info.interim_info.sha_data.min_outlen + 1;
2647225f04fbSGowrishankar Muthukrishnan 	outlen = max_outlen;
2648225f04fbSGowrishankar Muthukrishnan 	for (j = 0; j < SHAKE_EXTERN_ITER; j++) {
2649225f04fbSGowrishankar Muthukrishnan 		memset(md.val, 0, max_outlen);
2650225f04fbSGowrishankar Muthukrishnan 		memcpy(md.val, vec.cipher_auth.digest.val,
2651225f04fbSGowrishankar Muthukrishnan 			vec.cipher_auth.digest.len);
2652225f04fbSGowrishankar Muthukrishnan 
2653225f04fbSGowrishankar Muthukrishnan 		for (i = 0; i < (SHAKE_INTERN_ITER); i++) {
2654225f04fbSGowrishankar Muthukrishnan 			memset(vec.pt.val, 0, vec.pt.len);
2655225f04fbSGowrishankar Muthukrishnan 			memcpy(vec.pt.val, md.val, vec.pt.len);
2656225f04fbSGowrishankar Muthukrishnan 			vec.cipher_auth.digest.len = outlen;
2657225f04fbSGowrishankar Muthukrishnan 			ret = fips_run_test();
2658225f04fbSGowrishankar Muthukrishnan 			if (ret < 0) {
2659225f04fbSGowrishankar Muthukrishnan 				if (ret == -EPERM || ret == -ENOTSUP) {
2660225f04fbSGowrishankar Muthukrishnan 					if (info.file_type == FIPS_TYPE_JSON)
2661225f04fbSGowrishankar Muthukrishnan 						return ret;
2662225f04fbSGowrishankar Muthukrishnan 
2663225f04fbSGowrishankar Muthukrishnan 					fprintf(info.fp_wr, "Bypass\n\n");
2664225f04fbSGowrishankar Muthukrishnan 					return 0;
2665225f04fbSGowrishankar Muthukrishnan 				}
2666225f04fbSGowrishankar Muthukrishnan 				return ret;
2667225f04fbSGowrishankar Muthukrishnan 			}
2668225f04fbSGowrishankar Muthukrishnan 
2669225f04fbSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val);
2670225f04fbSGowrishankar Muthukrishnan 			if (ret < 0)
2671225f04fbSGowrishankar Muthukrishnan 				return ret;
2672225f04fbSGowrishankar Muthukrishnan 
2673225f04fbSGowrishankar Muthukrishnan 			memset(md.val, 0, max_outlen);
2674225f04fbSGowrishankar Muthukrishnan 			memcpy(md.val, (val.val + vec.pt.len),
2675225f04fbSGowrishankar Muthukrishnan 				vec.cipher_auth.digest.len);
2676225f04fbSGowrishankar Muthukrishnan 			md.len = outlen;
2677225f04fbSGowrishankar Muthukrishnan 			rightmost[0] = md.val[md.len-1];
2678225f04fbSGowrishankar Muthukrishnan 			rightmost[1] = md.val[md.len-2];
2679225f04fbSGowrishankar Muthukrishnan 			rightptr = (uint16_t *)rightmost;
2680225f04fbSGowrishankar Muthukrishnan 			outlen = info.interim_info.sha_data.min_outlen +
2681225f04fbSGowrishankar Muthukrishnan 				(*rightptr % range);
2682225f04fbSGowrishankar Muthukrishnan 		}
2683225f04fbSGowrishankar Muthukrishnan 
2684225f04fbSGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, md.val, md.len);
2685225f04fbSGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = md.len;
2686225f04fbSGowrishankar Muthukrishnan 
2687225f04fbSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2688225f04fbSGowrishankar Muthukrishnan 			fprintf(info.fp_wr, "COUNT = %u\n", j);
2689225f04fbSGowrishankar Muthukrishnan 
2690225f04fbSGowrishankar Muthukrishnan 		info.parse_writeback(&val);
2691225f04fbSGowrishankar Muthukrishnan 
2692225f04fbSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2693225f04fbSGowrishankar Muthukrishnan 			fprintf(info.fp_wr, "\n");
2694225f04fbSGowrishankar Muthukrishnan 	}
2695225f04fbSGowrishankar Muthukrishnan 
2696225f04fbSGowrishankar Muthukrishnan 	rte_free(md.val);
2697225f04fbSGowrishankar Muthukrishnan 	rte_free(vec.pt.val);
26983d3408ddSGowrishankar Muthukrishnan 	rte_free(val.val);
2699225f04fbSGowrishankar Muthukrishnan 	return 0;
2700225f04fbSGowrishankar Muthukrishnan }
2701f4797baeSDamian Nowak 
2702f4797baeSDamian Nowak static int
2703cd255ccfSMarko Kovacevic init_test_ops(void)
2704cd255ccfSMarko Kovacevic {
2705cd255ccfSMarko Kovacevic 	switch (info.algo) {
270675777166SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CBC:
2707c8956fd2SBrian Dooley 	case FIPS_TEST_ALGO_AES_CTR:
2708cd255ccfSMarko Kovacevic 	case FIPS_TEST_ALGO_AES:
270936128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
271036128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform  = prepare_aes_xform;
2711cd255ccfSMarko Kovacevic 		if (info.interim_info.aes_data.test_type == AESAVS_TYPE_MCT)
2712cd255ccfSMarko Kovacevic 			test_ops.test = fips_mct_aes_test;
2713cd255ccfSMarko Kovacevic 		else
2714cd255ccfSMarko Kovacevic 			test_ops.test = fips_generic_test;
2715cd255ccfSMarko Kovacevic 		break;
2716f64adb67SMarko Kovacevic 	case FIPS_TEST_ALGO_HMAC:
271736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
271836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_hmac_xform;
2719f64adb67SMarko Kovacevic 		test_ops.test = fips_generic_test;
2720f64adb67SMarko Kovacevic 		break;
2721527cbf3dSMarko Kovacevic 	case FIPS_TEST_ALGO_TDES:
272236128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
272336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_tdes_xform;
2724527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.test_type == TDES_MCT)
2725527cbf3dSMarko Kovacevic 			test_ops.test = fips_mct_tdes_test;
2726527cbf3dSMarko Kovacevic 		else
2727527cbf3dSMarko Kovacevic 			test_ops.test = fips_generic_test;
2728527cbf3dSMarko Kovacevic 		break;
2729e27268bdSBrian Dooley 	case FIPS_TEST_ALGO_AES_GMAC:
273036128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
273136128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gmac_xform;
2732e27268bdSBrian Dooley 		test_ops.test = fips_generic_test;
2733e27268bdSBrian Dooley 		break;
27344aaad299SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_GCM:
273536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_aead_op;
273636128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gcm_xform;
27374aaad299SMarko Kovacevic 		test_ops.test = fips_generic_test;
27384aaad299SMarko Kovacevic 		break;
2739ac026f46SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_CMAC:
274036128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
274136128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_cmac_xform;
2742ac026f46SMarko Kovacevic 		test_ops.test = fips_generic_test;
2743ac026f46SMarko Kovacevic 		break;
2744305921f4SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_CCM:
274536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_aead_op;
274636128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_ccm_xform;
2747305921f4SMarko Kovacevic 		test_ops.test = fips_generic_test;
2748305921f4SMarko Kovacevic 		break;
2749f4797baeSDamian Nowak 	case FIPS_TEST_ALGO_SHA:
275036128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
275136128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_sha_xform;
2752f4797baeSDamian Nowak 		if (info.interim_info.sha_data.test_type == SHA_MCT)
2753225f04fbSGowrishankar Muthukrishnan 			if (info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_128 ||
2754225f04fbSGowrishankar Muthukrishnan 				info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_256)
2755225f04fbSGowrishankar Muthukrishnan 				test_ops.test = fips_mct_shake_test;
2756225f04fbSGowrishankar Muthukrishnan 			else
2757f4797baeSDamian Nowak 				test_ops.test = fips_mct_sha_test;
2758f4797baeSDamian Nowak 		else
2759f4797baeSDamian Nowak 			test_ops.test = fips_generic_test;
2760f4797baeSDamian Nowak 		break;
2761d5a9ea55SSucharitha Sarananaga 	case FIPS_TEST_ALGO_AES_XTS:
276236128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
276336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_xts_xform;
276436128a67SGowrishankar Muthukrishnan 		test_ops.test = fips_generic_test;
276536128a67SGowrishankar Muthukrishnan 		break;
276636128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_RSA:
276736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = prepare_rsa_op;
276836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = prepare_rsa_xform;
2769d5a9ea55SSucharitha Sarananaga 		test_ops.test = fips_generic_test;
2770d5a9ea55SSucharitha Sarananaga 		break;
2771b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_ECDSA:
2772b455d261SGowrishankar Muthukrishnan 		if (info.op == FIPS_TEST_ASYM_KEYGEN) {
2773b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecfpm_op;
2774b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecfpm_xform;
2775b455d261SGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2776b455d261SGowrishankar Muthukrishnan 		} else {
2777b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecdsa_op;
2778b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecdsa_xform;
2779b455d261SGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2780b455d261SGowrishankar Muthukrishnan 		}
2781b455d261SGowrishankar Muthukrishnan 		break;
2782*12ede9acSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_EDDSA:
2783*12ede9acSGowrishankar Muthukrishnan 		if (info.op == FIPS_TEST_ASYM_KEYGEN) {
2784*12ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_edfpm_op;
2785*12ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_edfpm_xform;
2786*12ede9acSGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2787*12ede9acSGowrishankar Muthukrishnan 		} else {
2788*12ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_eddsa_op;
2789*12ede9acSGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_eddsa_xform;
2790*12ede9acSGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2791*12ede9acSGowrishankar Muthukrishnan 		}
2792*12ede9acSGowrishankar Muthukrishnan 		break;
2793cd255ccfSMarko Kovacevic 	default:
2794efe3a8dbSMichael Shamis 		if (strstr(info.file_name, "TECB") ||
2795efe3a8dbSMichael Shamis 				strstr(info.file_name, "TCBC")) {
2796efe3a8dbSMichael Shamis 			info.algo = FIPS_TEST_ALGO_TDES;
279736128a67SGowrishankar Muthukrishnan 			test_ops.prepare_sym_op = prepare_cipher_op;
279836128a67SGowrishankar Muthukrishnan 			test_ops.prepare_sym_xform = prepare_tdes_xform;
2799efe3a8dbSMichael Shamis 			if (info.interim_info.tdes_data.test_type == TDES_MCT)
2800efe3a8dbSMichael Shamis 				test_ops.test = fips_mct_tdes_test;
2801efe3a8dbSMichael Shamis 			else
2802efe3a8dbSMichael Shamis 				test_ops.test = fips_generic_test;
2803efe3a8dbSMichael Shamis 			break;
2804efe3a8dbSMichael Shamis 		}
2805cd255ccfSMarko Kovacevic 		return -1;
2806cd255ccfSMarko Kovacevic 	}
2807cd255ccfSMarko Kovacevic 
2808cd255ccfSMarko Kovacevic 	return 0;
2809cd255ccfSMarko Kovacevic }
2810cd255ccfSMarko Kovacevic 
28113d0fad56SMarko Kovacevic static void
28123d0fad56SMarko Kovacevic print_test_block(void)
28133d0fad56SMarko Kovacevic {
28143d0fad56SMarko Kovacevic 	uint32_t i;
28153d0fad56SMarko Kovacevic 
28163d0fad56SMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++)
28173d0fad56SMarko Kovacevic 		printf("%s\n", info.vec[i]);
28183d0fad56SMarko Kovacevic 
28193d0fad56SMarko Kovacevic 	printf("\n");
28203d0fad56SMarko Kovacevic }
28213d0fad56SMarko Kovacevic 
28223d0fad56SMarko Kovacevic static int
28233d0fad56SMarko Kovacevic fips_test_one_file(void)
28243d0fad56SMarko Kovacevic {
28253d0fad56SMarko Kovacevic 	int fetch_ret = 0, ret;
28263d0fad56SMarko Kovacevic 
2827cd255ccfSMarko Kovacevic 	ret = init_test_ops();
2828cd255ccfSMarko Kovacevic 	if (ret < 0) {
2829cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Init test op\n", ret);
2830cd255ccfSMarko Kovacevic 		return ret;
2831cd255ccfSMarko Kovacevic 	}
2832cd255ccfSMarko Kovacevic 
2833cd255ccfSMarko Kovacevic 	while (ret >= 0 && fetch_ret == 0) {
28343d0fad56SMarko Kovacevic 		fetch_ret = fips_test_fetch_one_block();
28353d0fad56SMarko Kovacevic 		if (fetch_ret < 0) {
28363d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Fetch block\n",
28373d0fad56SMarko Kovacevic 					fetch_ret);
28383d0fad56SMarko Kovacevic 			ret = fetch_ret;
28393d0fad56SMarko Kovacevic 			goto error_one_case;
28403d0fad56SMarko Kovacevic 		}
28413d0fad56SMarko Kovacevic 
28423d0fad56SMarko Kovacevic 		if (info.nb_vec_lines == 0) {
28433d0fad56SMarko Kovacevic 			if (fetch_ret == -EOF)
28443d0fad56SMarko Kovacevic 				break;
28453d0fad56SMarko Kovacevic 
28463d0fad56SMarko Kovacevic 			fprintf(info.fp_wr, "\n");
28473d0fad56SMarko Kovacevic 			continue;
28483d0fad56SMarko Kovacevic 		}
28493d0fad56SMarko Kovacevic 
28503d0fad56SMarko Kovacevic 		ret = fips_test_parse_one_case();
28513d0fad56SMarko Kovacevic 		switch (ret) {
28523d0fad56SMarko Kovacevic 		case 0:
2853cd255ccfSMarko Kovacevic 			ret = test_ops.test();
28543d0fad56SMarko Kovacevic 			if (ret == 0)
28553d0fad56SMarko Kovacevic 				break;
28563d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: test block\n",
28573d0fad56SMarko Kovacevic 					ret);
28583d0fad56SMarko Kovacevic 			goto error_one_case;
28593d0fad56SMarko Kovacevic 		case 1:
28603d0fad56SMarko Kovacevic 			break;
28613d0fad56SMarko Kovacevic 		default:
28623d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
28633d0fad56SMarko Kovacevic 					ret);
28643d0fad56SMarko Kovacevic 			goto error_one_case;
28653d0fad56SMarko Kovacevic 		}
28663d0fad56SMarko Kovacevic 
28673d0fad56SMarko Kovacevic 		continue;
28683d0fad56SMarko Kovacevic error_one_case:
28693d0fad56SMarko Kovacevic 		print_test_block();
28703d0fad56SMarko Kovacevic 	}
28713d0fad56SMarko Kovacevic 
28723d0fad56SMarko Kovacevic 	fips_test_clear();
28733d0fad56SMarko Kovacevic 
287415bb59a5SCiara Power 	if (env.digest) {
2875952e10cdSFan Zhang 		rte_free(env.digest);
287615bb59a5SCiara Power 		env.digest = NULL;
287794dfc563SSamina Arshad 		env.digest_len = 0;
287815bb59a5SCiara Power 	}
2879952e10cdSFan Zhang 	rte_pktmbuf_free(env.mbuf);
2880cd255ccfSMarko Kovacevic 
2881952e10cdSFan Zhang 	return ret;
28823d0fad56SMarko Kovacevic }
288389be27e3SBrandon Lo 
28848d70a194SDavid Marchand #ifdef USE_JANSSON
288589be27e3SBrandon Lo static int
288689be27e3SBrandon Lo fips_test_json_init_writeback(void)
288789be27e3SBrandon Lo {
288889be27e3SBrandon Lo 	json_t *session_info, *session_write;
288989be27e3SBrandon Lo 	session_info = json_array_get(json_info.json_root, 0);
289089be27e3SBrandon Lo 	session_write = json_object();
289189be27e3SBrandon Lo 	json_info.json_write_root = json_array();
289289be27e3SBrandon Lo 
289389be27e3SBrandon Lo 	json_object_set(session_write, "jwt",
289489be27e3SBrandon Lo 		json_object_get(session_info, "jwt"));
289589be27e3SBrandon Lo 	json_object_set(session_write, "url",
289689be27e3SBrandon Lo 		json_object_get(session_info, "url"));
289789be27e3SBrandon Lo 	json_object_set(session_write, "isSample",
289889be27e3SBrandon Lo 		json_object_get(session_info, "isSample"));
289989be27e3SBrandon Lo 
290089be27e3SBrandon Lo 	json_info.is_sample = json_boolean_value(
290189be27e3SBrandon Lo 		json_object_get(session_info, "isSample"));
290289be27e3SBrandon Lo 
290389be27e3SBrandon Lo 	json_array_append_new(json_info.json_write_root, session_write);
290489be27e3SBrandon Lo 	return 0;
290589be27e3SBrandon Lo }
290689be27e3SBrandon Lo 
290789be27e3SBrandon Lo static int
290889be27e3SBrandon Lo fips_test_one_test_case(void)
290989be27e3SBrandon Lo {
291089be27e3SBrandon Lo 	int ret;
291189be27e3SBrandon Lo 
291289be27e3SBrandon Lo 	ret = fips_test_parse_one_json_case();
291389be27e3SBrandon Lo 
291489be27e3SBrandon Lo 	switch (ret) {
291589be27e3SBrandon Lo 	case 0:
291689be27e3SBrandon Lo 		ret = test_ops.test();
291789be27e3SBrandon Lo 		if ((ret == 0) || (ret == -EPERM || ret == -ENOTSUP))
291889be27e3SBrandon Lo 			break;
291989be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error %i: test block\n",
292089be27e3SBrandon Lo 				ret);
292189be27e3SBrandon Lo 		break;
292289be27e3SBrandon Lo 	default:
292389be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
292489be27e3SBrandon Lo 				ret);
292589be27e3SBrandon Lo 	}
292689be27e3SBrandon Lo 	return ret;
292789be27e3SBrandon Lo }
292889be27e3SBrandon Lo 
292989be27e3SBrandon Lo static int
293089be27e3SBrandon Lo fips_test_one_test_group(void)
293189be27e3SBrandon Lo {
293289be27e3SBrandon Lo 	int ret;
293389be27e3SBrandon Lo 	json_t *tests, *write_tests;
293489be27e3SBrandon Lo 	size_t test_idx, tests_size;
293589be27e3SBrandon Lo 
293689be27e3SBrandon Lo 	write_tests = json_array();
293789be27e3SBrandon Lo 	json_info.json_write_group = json_object();
293889be27e3SBrandon Lo 	json_object_set(json_info.json_write_group, "tgId",
293989be27e3SBrandon Lo 		json_object_get(json_info.json_test_group, "tgId"));
294089be27e3SBrandon Lo 	json_object_set_new(json_info.json_write_group, "tests", write_tests);
294189be27e3SBrandon Lo 
294289be27e3SBrandon Lo 	switch (info.algo) {
2943e27268bdSBrian Dooley 	case FIPS_TEST_ALGO_AES_GMAC:
294489be27e3SBrandon Lo 	case FIPS_TEST_ALGO_AES_GCM:
2945b09aac2dSBrandon Lo 		ret = parse_test_gcm_json_init();
294689be27e3SBrandon Lo 		break;
294755a7050eSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CCM:
294855a7050eSGowrishankar Muthukrishnan 		ret = parse_test_ccm_json_init();
294955a7050eSGowrishankar Muthukrishnan 		break;
2950443c93d8SBrandon Lo 	case FIPS_TEST_ALGO_HMAC:
2951443c93d8SBrandon Lo 		ret = parse_test_hmac_json_init();
2952443c93d8SBrandon Lo 		break;
295307da56a6SBrandon Lo 	case FIPS_TEST_ALGO_AES_CMAC:
295407da56a6SBrandon Lo 		ret = parse_test_cmac_json_init();
295507da56a6SBrandon Lo 		break;
2956f8e431edSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_XTS:
2957f8e431edSGowrishankar Muthukrishnan 		ret = parse_test_xts_json_init();
2958f8e431edSGowrishankar Muthukrishnan 		break;
2959f8e431edSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CBC:
2960c8956fd2SBrian Dooley 	case FIPS_TEST_ALGO_AES_CTR:
29618b8546aaSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES:
29628b8546aaSGowrishankar Muthukrishnan 		ret = parse_test_aes_json_init();
29638b8546aaSGowrishankar Muthukrishnan 		break;
2964d5c24714SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_SHA:
2965d5c24714SGowrishankar Muthukrishnan 		ret = parse_test_sha_json_init();
2966d5c24714SGowrishankar Muthukrishnan 		break;
296764569ffaSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_TDES:
296864569ffaSGowrishankar Muthukrishnan 		ret = parse_test_tdes_json_init();
296964569ffaSGowrishankar Muthukrishnan 		break;
297036128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_RSA:
297136128a67SGowrishankar Muthukrishnan 		ret = parse_test_rsa_json_init();
297236128a67SGowrishankar Muthukrishnan 		break;
2973b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_ECDSA:
2974b455d261SGowrishankar Muthukrishnan 		ret = parse_test_ecdsa_json_init();
2975b455d261SGowrishankar Muthukrishnan 		break;
2976*12ede9acSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_EDDSA:
2977*12ede9acSGowrishankar Muthukrishnan 		ret = parse_test_eddsa_json_init();
2978*12ede9acSGowrishankar Muthukrishnan 		break;
297989be27e3SBrandon Lo 	default:
298089be27e3SBrandon Lo 		return -EINVAL;
298189be27e3SBrandon Lo 	}
2982b09aac2dSBrandon Lo 
298389be27e3SBrandon Lo 	if (ret < 0)
298489be27e3SBrandon Lo 		return ret;
298589be27e3SBrandon Lo 
298689be27e3SBrandon Lo 	ret = fips_test_parse_one_json_group();
298789be27e3SBrandon Lo 	if (ret < 0)
298889be27e3SBrandon Lo 		return ret;
298989be27e3SBrandon Lo 
299089be27e3SBrandon Lo 	ret = init_test_ops();
299189be27e3SBrandon Lo 	if (ret < 0)
299289be27e3SBrandon Lo 		return ret;
299389be27e3SBrandon Lo 
299489be27e3SBrandon Lo 	tests = json_object_get(json_info.json_test_group, "tests");
299589be27e3SBrandon Lo 	tests_size = json_array_size(tests);
299689be27e3SBrandon Lo 	for (test_idx = 0; test_idx < tests_size; test_idx++) {
299789be27e3SBrandon Lo 		json_info.json_test_case = json_array_get(tests, test_idx);
299889be27e3SBrandon Lo 		if (fips_test_one_test_case() == 0)
299989be27e3SBrandon Lo 			json_array_append_new(write_tests, json_info.json_write_case);
300089be27e3SBrandon Lo 	}
300189be27e3SBrandon Lo 
300289be27e3SBrandon Lo 	return 0;
300389be27e3SBrandon Lo }
300489be27e3SBrandon Lo 
300589be27e3SBrandon Lo static int
300689be27e3SBrandon Lo fips_test_one_vector_set(void)
300789be27e3SBrandon Lo {
300889be27e3SBrandon Lo 	int ret;
3009b455d261SGowrishankar Muthukrishnan 	json_t *test_groups, *write_groups, *write_version, *write_set, *mode;
301089be27e3SBrandon Lo 	size_t group_idx, num_groups;
301189be27e3SBrandon Lo 
301289be27e3SBrandon Lo 	test_groups = json_object_get(json_info.json_vector_set, "testGroups");
301389be27e3SBrandon Lo 	num_groups = json_array_size(test_groups);
301489be27e3SBrandon Lo 
301589be27e3SBrandon Lo 	json_info.json_write_set = json_array();
301689be27e3SBrandon Lo 	write_version = json_object();
301789be27e3SBrandon Lo 	json_object_set_new(write_version, "acvVersion", json_string(ACVVERSION));
301889be27e3SBrandon Lo 	json_array_append_new(json_info.json_write_set, write_version);
301989be27e3SBrandon Lo 
302089be27e3SBrandon Lo 	write_set = json_object();
302189be27e3SBrandon Lo 	json_array_append(json_info.json_write_set, write_set);
302289be27e3SBrandon Lo 	write_groups = json_array();
302389be27e3SBrandon Lo 
302489be27e3SBrandon Lo 	json_object_set(write_set, "vsId",
302589be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "vsId"));
302689be27e3SBrandon Lo 	json_object_set(write_set, "algorithm",
302789be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "algorithm"));
3028b455d261SGowrishankar Muthukrishnan 	mode = json_object_get(json_info.json_vector_set, "mode");
3029b455d261SGowrishankar Muthukrishnan 	if (mode != NULL)
3030b455d261SGowrishankar Muthukrishnan 		json_object_set_new(write_set, "mode", mode);
3031b455d261SGowrishankar Muthukrishnan 
303289be27e3SBrandon Lo 	json_object_set(write_set, "revision",
303389be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "revision"));
303489be27e3SBrandon Lo 	json_object_set_new(write_set, "isSample",
303589be27e3SBrandon Lo 		json_boolean(json_info.is_sample));
303689be27e3SBrandon Lo 	json_object_set_new(write_set, "testGroups", write_groups);
303789be27e3SBrandon Lo 
303889be27e3SBrandon Lo 	ret = fips_test_parse_one_json_vector_set();
303989be27e3SBrandon Lo 	if (ret < 0) {
304089be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error: Unsupported or invalid vector set algorithm: %s\n",
304189be27e3SBrandon Lo 			json_string_value(json_object_get(json_info.json_vector_set, "algorithm")));
304289be27e3SBrandon Lo 		return ret;
304389be27e3SBrandon Lo 	}
304489be27e3SBrandon Lo 
304589be27e3SBrandon Lo 	for (group_idx = 0; group_idx < num_groups; group_idx++) {
304689be27e3SBrandon Lo 		json_info.json_test_group = json_array_get(test_groups, group_idx);
304789be27e3SBrandon Lo 		ret = fips_test_one_test_group();
304889be27e3SBrandon Lo 		json_array_append_new(write_groups, json_info.json_write_group);
304989be27e3SBrandon Lo 	}
305089be27e3SBrandon Lo 
305189be27e3SBrandon Lo 	return 0;
305289be27e3SBrandon Lo }
305389be27e3SBrandon Lo 
305489be27e3SBrandon Lo static int
305589be27e3SBrandon Lo fips_test_one_json_file(void)
305689be27e3SBrandon Lo {
305789be27e3SBrandon Lo 	size_t vector_set_idx, root_size;
305889be27e3SBrandon Lo 
305989be27e3SBrandon Lo 	root_size = json_array_size(json_info.json_root);
306089be27e3SBrandon Lo 	fips_test_json_init_writeback();
306189be27e3SBrandon Lo 
306289be27e3SBrandon Lo 	for (vector_set_idx = 1; vector_set_idx < root_size; vector_set_idx++) {
306389be27e3SBrandon Lo 		/* Vector set index starts at 1, the 0th index contains test session
306489be27e3SBrandon Lo 		 * information.
306589be27e3SBrandon Lo 		 */
306689be27e3SBrandon Lo 		json_info.json_vector_set = json_array_get(json_info.json_root, vector_set_idx);
306789be27e3SBrandon Lo 		fips_test_one_vector_set();
306889be27e3SBrandon Lo 		json_array_append_new(json_info.json_write_root, json_info.json_write_set);
3069d5c24714SGowrishankar Muthukrishnan 		json_incref(json_info.json_write_set);
307089be27e3SBrandon Lo 	}
307189be27e3SBrandon Lo 
307289be27e3SBrandon Lo 	json_dumpf(json_info.json_write_root, info.fp_wr, JSON_INDENT(4));
307389be27e3SBrandon Lo 	json_decref(json_info.json_write_root);
307489be27e3SBrandon Lo 
307589be27e3SBrandon Lo 	return 0;
307689be27e3SBrandon Lo }
30778d70a194SDavid Marchand #endif /* USE_JANSSON */
3078