xref: /dpdk/examples/fips_validation/main.c (revision badc0c6f6d6aa0d160c40e9d7d8f212411f5033e)
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
1045b455d261SGowrishankar Muthukrishnan prepare_ecfpm_op(void)
1046b455d261SGowrishankar Muthukrishnan {
1047b455d261SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
1048b455d261SGowrishankar Muthukrishnan 
1049b455d261SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1050b455d261SGowrishankar Muthukrishnan 
1051b455d261SGowrishankar Muthukrishnan 	asym = env.op->asym;
1052b455d261SGowrishankar Muthukrishnan 	asym->ecpm.scalar.data = vec.ecdsa.pkey.val;
1053b455d261SGowrishankar Muthukrishnan 	asym->ecpm.scalar.length = vec.ecdsa.pkey.len;
1054b455d261SGowrishankar Muthukrishnan 
1055b455d261SGowrishankar Muthukrishnan 	rte_free(vec.ecdsa.qx.val);
1056b455d261SGowrishankar Muthukrishnan 
1057b455d261SGowrishankar Muthukrishnan 	rte_free(vec.ecdsa.qy.val);
1058b455d261SGowrishankar Muthukrishnan 
1059b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qx.len = info.interim_info.ecdsa_data.curve_len;
1060b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qx.val = rte_zmalloc(NULL, vec.ecdsa.qx.len, 0);
1061b455d261SGowrishankar Muthukrishnan 
1062b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qy.len = vec.ecdsa.qx.len;
1063b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qy.val = rte_zmalloc(NULL, vec.ecdsa.qy.len, 0);
1064b455d261SGowrishankar Muthukrishnan 
1065b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.x.data = vec.ecdsa.qx.val;
1066b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.x.length = 0;
1067b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.y.data = vec.ecdsa.qy.val;
1068b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.y.length = 0;
1069b455d261SGowrishankar Muthukrishnan 
1070b455d261SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
1071b455d261SGowrishankar Muthukrishnan 
1072b455d261SGowrishankar Muthukrishnan 	return 0;
1073b455d261SGowrishankar Muthukrishnan }
1074b455d261SGowrishankar Muthukrishnan 
1075b455d261SGowrishankar Muthukrishnan static int
1076cd255ccfSMarko Kovacevic prepare_aes_xform(struct rte_crypto_sym_xform *xform)
1077cd255ccfSMarko Kovacevic {
1078cd255ccfSMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1079cd255ccfSMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1080cd255ccfSMarko Kovacevic 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1081cd255ccfSMarko Kovacevic 
1082cd255ccfSMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1083d3190431SMichael Shamis 	if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_CBC)
1084cd255ccfSMarko Kovacevic 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CBC;
1085c8956fd2SBrian Dooley 	else if (info.interim_info.aes_data.cipher_algo ==
1086c8956fd2SBrian Dooley 			RTE_CRYPTO_CIPHER_AES_CTR)
1087c8956fd2SBrian Dooley 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CTR;
1088d3190431SMichael Shamis 	else
1089d3190431SMichael Shamis 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_ECB;
1090d3190431SMichael Shamis 
1091cd255ccfSMarko Kovacevic 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1092cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1093cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1094cd255ccfSMarko Kovacevic 	cipher_xform->key.data = vec.cipher_auth.key.val;
1095cd255ccfSMarko Kovacevic 	cipher_xform->key.length = vec.cipher_auth.key.len;
1096c8956fd2SBrian Dooley 	if (cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CBC ||
1097c8956fd2SBrian Dooley 			cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CTR) {
1098cd255ccfSMarko Kovacevic 		cipher_xform->iv.length = vec.iv.len;
1099cd255ccfSMarko Kovacevic 		cipher_xform->iv.offset = IV_OFF;
1100d3190431SMichael Shamis 	} else {
1101d3190431SMichael Shamis 		cipher_xform->iv.length = 0;
1102d3190431SMichael Shamis 		cipher_xform->iv.offset = 0;
1103d3190431SMichael Shamis 	}
1104d3190431SMichael Shamis 	cap_idx.algo.cipher = cipher_xform->algo;
1105cd255ccfSMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1106cd255ccfSMarko Kovacevic 
1107cd255ccfSMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1108cd255ccfSMarko Kovacevic 	if (!cap) {
1109cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1110cd255ccfSMarko Kovacevic 				env.dev_id);
1111cd255ccfSMarko Kovacevic 		return -EINVAL;
1112cd255ccfSMarko Kovacevic 	}
1113cd255ccfSMarko Kovacevic 
1114cd255ccfSMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1115cd255ccfSMarko Kovacevic 			cipher_xform->key.length,
1116cd255ccfSMarko Kovacevic 			cipher_xform->iv.length) != 0) {
1117cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1118cd255ccfSMarko Kovacevic 				info.device_name, cipher_xform->key.length,
1119cd255ccfSMarko Kovacevic 				cipher_xform->iv.length);
1120cd255ccfSMarko Kovacevic 		return -EPERM;
1121cd255ccfSMarko Kovacevic 	}
1122cd255ccfSMarko Kovacevic 
1123cd255ccfSMarko Kovacevic 	return 0;
1124cd255ccfSMarko Kovacevic }
1125cd255ccfSMarko Kovacevic 
1126f64adb67SMarko Kovacevic static int
1127527cbf3dSMarko Kovacevic prepare_tdes_xform(struct rte_crypto_sym_xform *xform)
1128527cbf3dSMarko Kovacevic {
1129527cbf3dSMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1130527cbf3dSMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1131527cbf3dSMarko Kovacevic 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1132527cbf3dSMarko Kovacevic 
1133527cbf3dSMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1134527cbf3dSMarko Kovacevic 
1135efe3a8dbSMichael Shamis 	if (info.interim_info.tdes_data.test_mode == TDES_MODE_CBC)
1136527cbf3dSMarko Kovacevic 		cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_CBC;
1137efe3a8dbSMichael Shamis 	else
1138efe3a8dbSMichael Shamis 		cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_ECB;
1139527cbf3dSMarko Kovacevic 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1140527cbf3dSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1141527cbf3dSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1142527cbf3dSMarko Kovacevic 	cipher_xform->key.data = vec.cipher_auth.key.val;
1143527cbf3dSMarko Kovacevic 	cipher_xform->key.length = vec.cipher_auth.key.len;
1144efe3a8dbSMichael Shamis 
1145efe3a8dbSMichael Shamis 	if (cipher_xform->algo == RTE_CRYPTO_CIPHER_3DES_CBC) {
1146527cbf3dSMarko Kovacevic 		cipher_xform->iv.length = vec.iv.len;
1147527cbf3dSMarko Kovacevic 		cipher_xform->iv.offset = IV_OFF;
1148efe3a8dbSMichael Shamis 	} else {
1149efe3a8dbSMichael Shamis 		cipher_xform->iv.length = 0;
1150efe3a8dbSMichael Shamis 		cipher_xform->iv.offset = 0;
1151efe3a8dbSMichael Shamis 	}
1152efe3a8dbSMichael Shamis 	cap_idx.algo.cipher = cipher_xform->algo;
1153527cbf3dSMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1154527cbf3dSMarko Kovacevic 
1155527cbf3dSMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1156527cbf3dSMarko Kovacevic 	if (!cap) {
1157527cbf3dSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1158527cbf3dSMarko Kovacevic 				env.dev_id);
1159527cbf3dSMarko Kovacevic 		return -EINVAL;
1160527cbf3dSMarko Kovacevic 	}
1161527cbf3dSMarko Kovacevic 
1162527cbf3dSMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1163527cbf3dSMarko Kovacevic 			cipher_xform->key.length,
1164527cbf3dSMarko Kovacevic 			cipher_xform->iv.length) != 0) {
1165527cbf3dSMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1166527cbf3dSMarko Kovacevic 				info.device_name, cipher_xform->key.length,
1167527cbf3dSMarko Kovacevic 				cipher_xform->iv.length);
1168527cbf3dSMarko Kovacevic 		return -EPERM;
1169527cbf3dSMarko Kovacevic 	}
1170527cbf3dSMarko Kovacevic 
1171527cbf3dSMarko Kovacevic 	return 0;
1172527cbf3dSMarko Kovacevic }
1173527cbf3dSMarko Kovacevic 
1174527cbf3dSMarko Kovacevic static int
1175f64adb67SMarko Kovacevic prepare_hmac_xform(struct rte_crypto_sym_xform *xform)
1176f64adb67SMarko Kovacevic {
1177f64adb67SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1178f64adb67SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1179f64adb67SMarko Kovacevic 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1180f64adb67SMarko Kovacevic 
1181f64adb67SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1182f64adb67SMarko Kovacevic 
1183f64adb67SMarko Kovacevic 	auth_xform->algo = info.interim_info.hmac_data.algo;
1184f64adb67SMarko Kovacevic 	auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE;
1185f64adb67SMarko Kovacevic 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1186f64adb67SMarko Kovacevic 	auth_xform->key.data = vec.cipher_auth.key.val;
1187f64adb67SMarko Kovacevic 	auth_xform->key.length = vec.cipher_auth.key.len;
1188f64adb67SMarko Kovacevic 
1189f64adb67SMarko Kovacevic 	cap_idx.algo.auth = auth_xform->algo;
1190f64adb67SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1191f64adb67SMarko Kovacevic 
1192f64adb67SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1193f64adb67SMarko Kovacevic 	if (!cap) {
1194f64adb67SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1195f64adb67SMarko Kovacevic 				env.dev_id);
1196f64adb67SMarko Kovacevic 		return -EINVAL;
1197f64adb67SMarko Kovacevic 	}
1198f64adb67SMarko Kovacevic 
1199f64adb67SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_auth(cap,
1200f64adb67SMarko Kovacevic 			auth_xform->key.length,
1201f64adb67SMarko Kovacevic 			auth_xform->digest_length, 0) != 0) {
12028782b3b6SPablo de Lara 		RTE_LOG(ERR, USER1, "PMD %s key length %u Digest length %u\n",
1203f64adb67SMarko Kovacevic 				info.device_name, auth_xform->key.length,
1204f64adb67SMarko Kovacevic 				auth_xform->digest_length);
1205f64adb67SMarko Kovacevic 		return -EPERM;
1206f64adb67SMarko Kovacevic 	}
1207f64adb67SMarko Kovacevic 
1208f64adb67SMarko Kovacevic 	return 0;
1209f64adb67SMarko Kovacevic }
1210f64adb67SMarko Kovacevic 
1211d09abf2dSFan Zhang int
12124aaad299SMarko Kovacevic prepare_gcm_xform(struct rte_crypto_sym_xform *xform)
12134aaad299SMarko Kovacevic {
12144aaad299SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
12154aaad299SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
12164aaad299SMarko Kovacevic 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
12174aaad299SMarko Kovacevic 
12184aaad299SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
12194aaad299SMarko Kovacevic 
12204aaad299SMarko Kovacevic 	aead_xform->algo = RTE_CRYPTO_AEAD_AES_GCM;
12214aaad299SMarko Kovacevic 	aead_xform->aad_length = vec.aead.aad.len;
12224aaad299SMarko Kovacevic 	aead_xform->digest_length = vec.aead.digest.len;
12234aaad299SMarko Kovacevic 	aead_xform->iv.offset = IV_OFF;
12244aaad299SMarko Kovacevic 	aead_xform->iv.length = vec.iv.len;
12254aaad299SMarko Kovacevic 	aead_xform->key.data = vec.aead.key.val;
12264aaad299SMarko Kovacevic 	aead_xform->key.length = vec.aead.key.len;
12274aaad299SMarko Kovacevic 	aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
12284aaad299SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
12294aaad299SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_DECRYPT;
12304aaad299SMarko Kovacevic 
12314aaad299SMarko Kovacevic 	cap_idx.algo.aead = aead_xform->algo;
12324aaad299SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12334aaad299SMarko Kovacevic 
12344aaad299SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
12354aaad299SMarko Kovacevic 	if (!cap) {
12364aaad299SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
12374aaad299SMarko Kovacevic 				env.dev_id);
12384aaad299SMarko Kovacevic 		return -EINVAL;
12394aaad299SMarko Kovacevic 	}
12404aaad299SMarko Kovacevic 
12414aaad299SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_aead(cap,
12424aaad299SMarko Kovacevic 			aead_xform->key.length,
12434aaad299SMarko Kovacevic 			aead_xform->digest_length, aead_xform->aad_length,
12444aaad299SMarko Kovacevic 			aead_xform->iv.length) != 0) {
12454aaad299SMarko Kovacevic 		RTE_LOG(ERR, USER1,
12464aaad299SMarko Kovacevic 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
12474aaad299SMarko Kovacevic 				info.device_name, aead_xform->key.length,
12484aaad299SMarko Kovacevic 				aead_xform->digest_length,
12494aaad299SMarko Kovacevic 				aead_xform->aad_length,
12504aaad299SMarko Kovacevic 				aead_xform->iv.length);
12514aaad299SMarko Kovacevic 		return -EPERM;
12524aaad299SMarko Kovacevic 	}
12534aaad299SMarko Kovacevic 
12544aaad299SMarko Kovacevic 	return 0;
12554aaad299SMarko Kovacevic }
12564aaad299SMarko Kovacevic 
1257d09abf2dSFan Zhang int
1258d09abf2dSFan Zhang prepare_gmac_xform(struct rte_crypto_sym_xform *xform)
1259d09abf2dSFan Zhang {
1260d09abf2dSFan Zhang 	const struct rte_cryptodev_symmetric_capability *cap;
1261d09abf2dSFan Zhang 	struct rte_cryptodev_sym_capability_idx cap_idx;
1262d09abf2dSFan Zhang 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1263d09abf2dSFan Zhang 
1264d09abf2dSFan Zhang 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1265d09abf2dSFan Zhang 
1266d09abf2dSFan Zhang 	auth_xform->algo = RTE_CRYPTO_AUTH_AES_GMAC;
1267d09abf2dSFan Zhang 	auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1268d09abf2dSFan Zhang 			RTE_CRYPTO_AUTH_OP_GENERATE :
1269d09abf2dSFan Zhang 			RTE_CRYPTO_AUTH_OP_VERIFY;
1270d09abf2dSFan Zhang 	auth_xform->iv.offset = IV_OFF;
1271d09abf2dSFan Zhang 	auth_xform->iv.length = vec.iv.len;
1272d09abf2dSFan Zhang 	auth_xform->digest_length = vec.aead.digest.len;
1273d09abf2dSFan Zhang 	auth_xform->key.data = vec.aead.key.val;
1274d09abf2dSFan Zhang 	auth_xform->key.length = vec.aead.key.len;
1275d09abf2dSFan Zhang 
1276d09abf2dSFan Zhang 	cap_idx.algo.auth = auth_xform->algo;
1277d09abf2dSFan Zhang 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1278d09abf2dSFan Zhang 
1279d09abf2dSFan Zhang 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1280d09abf2dSFan Zhang 	if (!cap) {
1281d09abf2dSFan Zhang 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1282d09abf2dSFan Zhang 				env.dev_id);
1283d09abf2dSFan Zhang 		return -EINVAL;
1284d09abf2dSFan Zhang 	}
1285d09abf2dSFan Zhang 
1286d09abf2dSFan Zhang 	if (rte_cryptodev_sym_capability_check_auth(cap,
1287d09abf2dSFan Zhang 			auth_xform->key.length,
1288601b8a54SFan Zhang 			auth_xform->digest_length,
1289601b8a54SFan Zhang 			auth_xform->iv.length) != 0) {
1290601b8a54SFan Zhang 
1291601b8a54SFan Zhang 		RTE_LOG(ERR, USER1,
1292601b8a54SFan Zhang 			"PMD %s key length %u Digest length %u IV length %u\n",
1293d09abf2dSFan Zhang 				info.device_name, auth_xform->key.length,
1294601b8a54SFan Zhang 				auth_xform->digest_length,
1295601b8a54SFan Zhang 				auth_xform->iv.length);
1296d09abf2dSFan Zhang 		return -EPERM;
1297d09abf2dSFan Zhang 	}
1298d09abf2dSFan Zhang 
1299d09abf2dSFan Zhang 	return 0;
1300d09abf2dSFan Zhang }
1301d09abf2dSFan Zhang 
1302ac026f46SMarko Kovacevic static int
1303ac026f46SMarko Kovacevic prepare_cmac_xform(struct rte_crypto_sym_xform *xform)
1304ac026f46SMarko Kovacevic {
1305ac026f46SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1306ac026f46SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1307ac026f46SMarko Kovacevic 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1308ac026f46SMarko Kovacevic 
1309ac026f46SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1310ac026f46SMarko Kovacevic 
1311ac026f46SMarko Kovacevic 	auth_xform->algo = RTE_CRYPTO_AUTH_AES_CMAC;
1312ac026f46SMarko Kovacevic 	auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1313ac026f46SMarko Kovacevic 			RTE_CRYPTO_AUTH_OP_GENERATE : RTE_CRYPTO_AUTH_OP_VERIFY;
1314ac026f46SMarko Kovacevic 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1315ac026f46SMarko Kovacevic 	auth_xform->key.data = vec.cipher_auth.key.val;
1316ac026f46SMarko Kovacevic 	auth_xform->key.length = vec.cipher_auth.key.len;
1317ac026f46SMarko Kovacevic 
1318ac026f46SMarko Kovacevic 	cap_idx.algo.auth = auth_xform->algo;
1319ac026f46SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1320ac026f46SMarko Kovacevic 
1321ac026f46SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1322ac026f46SMarko Kovacevic 	if (!cap) {
1323ac026f46SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1324ac026f46SMarko Kovacevic 				env.dev_id);
1325ac026f46SMarko Kovacevic 		return -EINVAL;
1326ac026f46SMarko Kovacevic 	}
1327ac026f46SMarko Kovacevic 
1328ac026f46SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_auth(cap,
1329ac026f46SMarko Kovacevic 			auth_xform->key.length,
1330ac026f46SMarko Kovacevic 			auth_xform->digest_length, 0) != 0) {
13318782b3b6SPablo de Lara 		RTE_LOG(ERR, USER1, "PMD %s key length %u Digest length %u\n",
1332ac026f46SMarko Kovacevic 				info.device_name, auth_xform->key.length,
1333ac026f46SMarko Kovacevic 				auth_xform->digest_length);
1334ac026f46SMarko Kovacevic 		return -EPERM;
1335ac026f46SMarko Kovacevic 	}
1336ac026f46SMarko Kovacevic 
1337ac026f46SMarko Kovacevic 	return 0;
1338ac026f46SMarko Kovacevic }
1339ac026f46SMarko Kovacevic 
1340305921f4SMarko Kovacevic static int
1341305921f4SMarko Kovacevic prepare_ccm_xform(struct rte_crypto_sym_xform *xform)
1342305921f4SMarko Kovacevic {
1343305921f4SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1344305921f4SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1345305921f4SMarko Kovacevic 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
1346305921f4SMarko Kovacevic 
1347305921f4SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
1348305921f4SMarko Kovacevic 
1349305921f4SMarko Kovacevic 	aead_xform->algo = RTE_CRYPTO_AEAD_AES_CCM;
1350305921f4SMarko Kovacevic 	aead_xform->aad_length = vec.aead.aad.len;
1351305921f4SMarko Kovacevic 	aead_xform->digest_length = vec.aead.digest.len;
1352305921f4SMarko Kovacevic 	aead_xform->iv.offset = IV_OFF;
1353305921f4SMarko Kovacevic 	aead_xform->iv.length = vec.iv.len;
1354305921f4SMarko Kovacevic 	aead_xform->key.data = vec.aead.key.val;
1355305921f4SMarko Kovacevic 	aead_xform->key.length = vec.aead.key.len;
1356305921f4SMarko Kovacevic 	aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1357305921f4SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
1358305921f4SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_DECRYPT;
1359305921f4SMarko Kovacevic 
1360305921f4SMarko Kovacevic 	cap_idx.algo.aead = aead_xform->algo;
1361305921f4SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
1362305921f4SMarko Kovacevic 
1363305921f4SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1364305921f4SMarko Kovacevic 	if (!cap) {
1365305921f4SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1366305921f4SMarko Kovacevic 				env.dev_id);
1367305921f4SMarko Kovacevic 		return -EINVAL;
1368305921f4SMarko Kovacevic 	}
1369305921f4SMarko Kovacevic 
1370305921f4SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_aead(cap,
1371305921f4SMarko Kovacevic 			aead_xform->key.length,
1372305921f4SMarko Kovacevic 			aead_xform->digest_length, aead_xform->aad_length,
1373305921f4SMarko Kovacevic 			aead_xform->iv.length) != 0) {
1374305921f4SMarko Kovacevic 		RTE_LOG(ERR, USER1,
1375305921f4SMarko Kovacevic 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
1376305921f4SMarko Kovacevic 				info.device_name, aead_xform->key.length,
1377305921f4SMarko Kovacevic 				aead_xform->digest_length,
1378305921f4SMarko Kovacevic 				aead_xform->aad_length,
1379305921f4SMarko Kovacevic 				aead_xform->iv.length);
1380305921f4SMarko Kovacevic 		return -EPERM;
1381305921f4SMarko Kovacevic 	}
1382305921f4SMarko Kovacevic 
1383305921f4SMarko Kovacevic 	return 0;
1384305921f4SMarko Kovacevic }
1385305921f4SMarko Kovacevic 
1386f4797baeSDamian Nowak static int
1387f4797baeSDamian Nowak prepare_sha_xform(struct rte_crypto_sym_xform *xform)
1388f4797baeSDamian Nowak {
1389f4797baeSDamian Nowak 	const struct rte_cryptodev_symmetric_capability *cap;
1390f4797baeSDamian Nowak 	struct rte_cryptodev_sym_capability_idx cap_idx;
1391f4797baeSDamian Nowak 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1392f4797baeSDamian Nowak 
1393f4797baeSDamian Nowak 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1394f4797baeSDamian Nowak 
1395f4797baeSDamian Nowak 	auth_xform->algo = info.interim_info.sha_data.algo;
1396f4797baeSDamian Nowak 	auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE;
1397f4797baeSDamian Nowak 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1398f4797baeSDamian Nowak 
1399f4797baeSDamian Nowak 	cap_idx.algo.auth = auth_xform->algo;
1400f4797baeSDamian Nowak 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1401f4797baeSDamian Nowak 
1402f4797baeSDamian Nowak 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1403f4797baeSDamian Nowak 	if (!cap) {
1404f4797baeSDamian Nowak 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1405f4797baeSDamian Nowak 				env.dev_id);
1406f4797baeSDamian Nowak 		return -EINVAL;
1407f4797baeSDamian Nowak 	}
1408f4797baeSDamian Nowak 
1409f4797baeSDamian Nowak 	if (rte_cryptodev_sym_capability_check_auth(cap,
1410f4797baeSDamian Nowak 			auth_xform->key.length,
1411f4797baeSDamian Nowak 			auth_xform->digest_length, 0) != 0) {
1412f4797baeSDamian Nowak 		RTE_LOG(ERR, USER1, "PMD %s key length %u digest length %u\n",
1413f4797baeSDamian Nowak 				info.device_name, auth_xform->key.length,
1414f4797baeSDamian Nowak 				auth_xform->digest_length);
1415f4797baeSDamian Nowak 		return -EPERM;
1416f4797baeSDamian Nowak 	}
1417f4797baeSDamian Nowak 
1418f4797baeSDamian Nowak 	return 0;
1419f4797baeSDamian Nowak }
1420f4797baeSDamian Nowak 
1421d5a9ea55SSucharitha Sarananaga static int
1422d5a9ea55SSucharitha Sarananaga prepare_xts_xform(struct rte_crypto_sym_xform *xform)
1423d5a9ea55SSucharitha Sarananaga {
1424d5a9ea55SSucharitha Sarananaga 	const struct rte_cryptodev_symmetric_capability *cap;
1425d5a9ea55SSucharitha Sarananaga 	struct rte_cryptodev_sym_capability_idx cap_idx;
1426d5a9ea55SSucharitha Sarananaga 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1427d5a9ea55SSucharitha Sarananaga 
1428d5a9ea55SSucharitha Sarananaga 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1429d5a9ea55SSucharitha Sarananaga 
1430d5a9ea55SSucharitha Sarananaga 	cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_XTS;
1431d5a9ea55SSucharitha Sarananaga 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1432d5a9ea55SSucharitha Sarananaga 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1433d5a9ea55SSucharitha Sarananaga 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1434d5a9ea55SSucharitha Sarananaga 	cipher_xform->key.data = vec.cipher_auth.key.val;
1435d5a9ea55SSucharitha Sarananaga 	cipher_xform->key.length = vec.cipher_auth.key.len;
1436d5a9ea55SSucharitha Sarananaga 	cipher_xform->iv.length = vec.iv.len;
1437d5a9ea55SSucharitha Sarananaga 	cipher_xform->iv.offset = IV_OFF;
1438d5a9ea55SSucharitha Sarananaga 
1439d5a9ea55SSucharitha Sarananaga 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_XTS;
1440d5a9ea55SSucharitha Sarananaga 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1441d5a9ea55SSucharitha Sarananaga 
1442d5a9ea55SSucharitha Sarananaga 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1443d5a9ea55SSucharitha Sarananaga 	if (!cap) {
1444d5a9ea55SSucharitha Sarananaga 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1445d5a9ea55SSucharitha Sarananaga 				env.dev_id);
1446d5a9ea55SSucharitha Sarananaga 		return -EINVAL;
1447d5a9ea55SSucharitha Sarananaga 	}
1448d5a9ea55SSucharitha Sarananaga 
1449d5a9ea55SSucharitha Sarananaga 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1450d5a9ea55SSucharitha Sarananaga 			cipher_xform->key.length,
1451d5a9ea55SSucharitha Sarananaga 			cipher_xform->iv.length) != 0) {
1452d5a9ea55SSucharitha Sarananaga 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1453d5a9ea55SSucharitha Sarananaga 				info.device_name, cipher_xform->key.length,
1454d5a9ea55SSucharitha Sarananaga 				cipher_xform->iv.length);
1455d5a9ea55SSucharitha Sarananaga 		return -EPERM;
1456d5a9ea55SSucharitha Sarananaga 	}
1457d5a9ea55SSucharitha Sarananaga 
1458d5a9ea55SSucharitha Sarananaga 	return 0;
1459d5a9ea55SSucharitha Sarananaga }
1460d5a9ea55SSucharitha Sarananaga 
1461952e10cdSFan Zhang static int
146236128a67SGowrishankar Muthukrishnan prepare_rsa_xform(struct rte_crypto_asym_xform *xform)
146336128a67SGowrishankar Muthukrishnan {
146436128a67SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
146536128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
146636128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_info dev_info;
146736128a67SGowrishankar Muthukrishnan 
146836128a67SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_RSA;
146936128a67SGowrishankar Muthukrishnan 	xform->next = NULL;
147036128a67SGowrishankar Muthukrishnan 
147136128a67SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
147236128a67SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
147336128a67SGowrishankar Muthukrishnan 	if (!cap) {
147436128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
147536128a67SGowrishankar Muthukrishnan 				env.dev_id);
147636128a67SGowrishankar Muthukrishnan 		return -EINVAL;
147736128a67SGowrishankar Muthukrishnan 	}
147836128a67SGowrishankar Muthukrishnan 
147936128a67SGowrishankar Muthukrishnan 	switch (info.op) {
148036128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
148136128a67SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
148236128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
148336128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
148436128a67SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
148536128a67SGowrishankar Muthukrishnan 			return -EPERM;
148636128a67SGowrishankar Muthukrishnan 		}
148736128a67SGowrishankar Muthukrishnan 		break;
148836128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
148936128a67SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
149036128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
149136128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
149236128a67SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
149336128a67SGowrishankar Muthukrishnan 			return -EPERM;
149436128a67SGowrishankar Muthukrishnan 		}
149536128a67SGowrishankar Muthukrishnan 		break;
149636128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_KEYGEN:
149736128a67SGowrishankar Muthukrishnan 		break;
149836128a67SGowrishankar Muthukrishnan 	default:
149936128a67SGowrishankar Muthukrishnan 		break;
150036128a67SGowrishankar Muthukrishnan 	}
150136128a67SGowrishankar Muthukrishnan 
150236128a67SGowrishankar Muthukrishnan 	rte_cryptodev_info_get(env.dev_id, &dev_info);
150336128a67SGowrishankar Muthukrishnan 	xform->rsa.key_type = info.interim_info.rsa_data.privkey;
150436128a67SGowrishankar Muthukrishnan 	switch (xform->rsa.key_type) {
150536128a67SGowrishankar Muthukrishnan 	case RTE_RSA_KEY_TYPE_QT:
150636128a67SGowrishankar Muthukrishnan 		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT)) {
150736128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s does not support QT key type\n",
150836128a67SGowrishankar Muthukrishnan 				info.device_name);
150936128a67SGowrishankar Muthukrishnan 			return -EPERM;
151036128a67SGowrishankar Muthukrishnan 		}
151136128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.p.data = vec.rsa.p.val;
151236128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.p.length = vec.rsa.p.len;
151336128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.q.data = vec.rsa.q.val;
151436128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.q.length = vec.rsa.q.len;
151536128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dP.data = vec.rsa.dp.val;
151636128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dP.length = vec.rsa.dp.len;
151736128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dQ.data = vec.rsa.dq.val;
151836128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dQ.length = vec.rsa.dq.len;
151936128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.qInv.data = vec.rsa.qinv.val;
152036128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.qInv.length = vec.rsa.qinv.len;
152136128a67SGowrishankar Muthukrishnan 		break;
152236128a67SGowrishankar Muthukrishnan 	case RTE_RSA_KEY_TYPE_EXP:
152336128a67SGowrishankar Muthukrishnan 		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_EXP)) {
152436128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s does not support EXP key type\n",
152536128a67SGowrishankar Muthukrishnan 				info.device_name);
152636128a67SGowrishankar Muthukrishnan 			return -EPERM;
152736128a67SGowrishankar Muthukrishnan 		}
152836128a67SGowrishankar Muthukrishnan 		xform->rsa.d.data = vec.rsa.d.val;
152936128a67SGowrishankar Muthukrishnan 		xform->rsa.d.length = vec.rsa.d.len;
153036128a67SGowrishankar Muthukrishnan 		break;
153136128a67SGowrishankar Muthukrishnan 	default:
153236128a67SGowrishankar Muthukrishnan 		break;
153336128a67SGowrishankar Muthukrishnan 	}
153436128a67SGowrishankar Muthukrishnan 
153536128a67SGowrishankar Muthukrishnan 	xform->rsa.e.data = vec.rsa.e.val;
153636128a67SGowrishankar Muthukrishnan 	xform->rsa.e.length = vec.rsa.e.len;
153736128a67SGowrishankar Muthukrishnan 	xform->rsa.n.data = vec.rsa.n.val;
153836128a67SGowrishankar Muthukrishnan 	xform->rsa.n.length = vec.rsa.n.len;
153936128a67SGowrishankar Muthukrishnan 	return 0;
154036128a67SGowrishankar Muthukrishnan }
154136128a67SGowrishankar Muthukrishnan 
154236128a67SGowrishankar Muthukrishnan static int
1543b455d261SGowrishankar Muthukrishnan prepare_ecdsa_xform(struct rte_crypto_asym_xform *xform)
1544b455d261SGowrishankar Muthukrishnan {
1545b455d261SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1546b455d261SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1547b455d261SGowrishankar Muthukrishnan 
1548b455d261SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECDSA;
1549b455d261SGowrishankar Muthukrishnan 	xform->next = NULL;
1550b455d261SGowrishankar Muthukrishnan 
1551b455d261SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1552b455d261SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1553b455d261SGowrishankar Muthukrishnan 	if (!cap) {
1554b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1555b455d261SGowrishankar Muthukrishnan 				env.dev_id);
1556b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1557b455d261SGowrishankar Muthukrishnan 	}
1558b455d261SGowrishankar Muthukrishnan 
1559b455d261SGowrishankar Muthukrishnan 	switch (info.op) {
1560b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
1561b455d261SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1562b455d261SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
1563b455d261SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1564b455d261SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
1565b455d261SGowrishankar Muthukrishnan 			return -EPERM;
1566b455d261SGowrishankar Muthukrishnan 		}
1567*badc0c6fSGowrishankar Muthukrishnan 
1568*badc0c6fSGowrishankar Muthukrishnan 		xform->ec.pkey.data = vec.ecdsa.pkey.val;
1569*badc0c6fSGowrishankar Muthukrishnan 		xform->ec.pkey.length = vec.ecdsa.pkey.len;
1570b455d261SGowrishankar Muthukrishnan 		break;
1571b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
1572b455d261SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1573b455d261SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
1574b455d261SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1575b455d261SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
1576b455d261SGowrishankar Muthukrishnan 			return -EPERM;
1577b455d261SGowrishankar Muthukrishnan 		}
1578*badc0c6fSGowrishankar Muthukrishnan 
1579*badc0c6fSGowrishankar Muthukrishnan 		xform->ec.q.x.data = vec.ecdsa.qx.val;
1580*badc0c6fSGowrishankar Muthukrishnan 		xform->ec.q.x.length = vec.ecdsa.qx.len;
1581*badc0c6fSGowrishankar Muthukrishnan 		xform->ec.q.y.data = vec.ecdsa.qy.val;
1582*badc0c6fSGowrishankar Muthukrishnan 		xform->ec.q.y.length = vec.ecdsa.qy.len;
1583b455d261SGowrishankar Muthukrishnan 		break;
1584b455d261SGowrishankar Muthukrishnan 	default:
1585b455d261SGowrishankar Muthukrishnan 		break;
1586b455d261SGowrishankar Muthukrishnan 	}
1587b455d261SGowrishankar Muthukrishnan 
1588b455d261SGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id;
1589b455d261SGowrishankar Muthukrishnan 	return 0;
1590b455d261SGowrishankar Muthukrishnan }
1591b455d261SGowrishankar Muthukrishnan 
1592b455d261SGowrishankar Muthukrishnan static int
1593b455d261SGowrishankar Muthukrishnan prepare_ecfpm_xform(struct rte_crypto_asym_xform *xform)
1594b455d261SGowrishankar Muthukrishnan {
1595b455d261SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1596b455d261SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1597b455d261SGowrishankar Muthukrishnan 
1598b455d261SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECFPM;
1599b455d261SGowrishankar Muthukrishnan 	xform->next = NULL;
1600b455d261SGowrishankar Muthukrishnan 
1601b455d261SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1602b455d261SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1603b455d261SGowrishankar Muthukrishnan 	if (!cap) {
1604b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1605b455d261SGowrishankar Muthukrishnan 				env.dev_id);
1606b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1607b455d261SGowrishankar Muthukrishnan 	}
1608b455d261SGowrishankar Muthukrishnan 
1609b455d261SGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id;
1610b455d261SGowrishankar Muthukrishnan 	return 0;
1611b455d261SGowrishankar Muthukrishnan }
1612b455d261SGowrishankar Muthukrishnan 
1613b455d261SGowrishankar Muthukrishnan static int
1614cd255ccfSMarko Kovacevic get_writeback_data(struct fips_val *val)
1615cd255ccfSMarko Kovacevic {
1616952e10cdSFan Zhang 	struct rte_mbuf *m = env.mbuf;
1617952e10cdSFan Zhang 	uint16_t data_len = rte_pktmbuf_pkt_len(m);
1618952e10cdSFan Zhang 	uint16_t total_len = data_len + env.digest_len;
1619952e10cdSFan Zhang 	uint8_t *src, *dst, *wb_data;
1620952e10cdSFan Zhang 
1621952e10cdSFan Zhang 	/* in case val is reused for MCT test, try to free the buffer first */
1622952e10cdSFan Zhang 	if (val->val) {
16233d3408ddSGowrishankar Muthukrishnan 		rte_free(val->val);
1624952e10cdSFan Zhang 		val->val = NULL;
1625952e10cdSFan Zhang 	}
1626952e10cdSFan Zhang 
16273d3408ddSGowrishankar Muthukrishnan 	wb_data = dst = rte_malloc(NULL, total_len, 0);
1628952e10cdSFan Zhang 	if (!dst) {
1629952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error %i: Not enough memory\n", -ENOMEM);
1630952e10cdSFan Zhang 		return -ENOMEM;
1631952e10cdSFan Zhang 	}
1632952e10cdSFan Zhang 
1633952e10cdSFan Zhang 	while (m && data_len) {
1634952e10cdSFan Zhang 		uint16_t seg_len = RTE_MIN(rte_pktmbuf_data_len(m), data_len);
1635952e10cdSFan Zhang 
1636952e10cdSFan Zhang 		src = rte_pktmbuf_mtod(m, uint8_t *);
1637952e10cdSFan Zhang 		memcpy(dst, src, seg_len);
1638952e10cdSFan Zhang 		m = m->next;
1639952e10cdSFan Zhang 		data_len -= seg_len;
1640952e10cdSFan Zhang 		dst += seg_len;
1641952e10cdSFan Zhang 	}
1642952e10cdSFan Zhang 
1643952e10cdSFan Zhang 	if (data_len) {
1644952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error -1: write back data\n");
16453d3408ddSGowrishankar Muthukrishnan 		rte_free(wb_data);
1646952e10cdSFan Zhang 		return -1;
1647952e10cdSFan Zhang 	}
1648952e10cdSFan Zhang 
1649952e10cdSFan Zhang 	if (env.digest)
1650952e10cdSFan Zhang 		memcpy(dst, env.digest, env.digest_len);
1651952e10cdSFan Zhang 
1652952e10cdSFan Zhang 	val->val = wb_data;
1653952e10cdSFan Zhang 	val->len = total_len;
1654952e10cdSFan Zhang 
1655952e10cdSFan Zhang 	return 0;
1656cd255ccfSMarko Kovacevic }
1657cd255ccfSMarko Kovacevic 
1658cd255ccfSMarko Kovacevic static int
165936128a67SGowrishankar Muthukrishnan fips_run_sym_test(void)
1660cd255ccfSMarko Kovacevic {
1661cd255ccfSMarko Kovacevic 	struct rte_crypto_sym_xform xform = {0};
1662cd255ccfSMarko Kovacevic 	uint16_t n_deqd;
1663cd255ccfSMarko Kovacevic 	int ret;
1664cd255ccfSMarko Kovacevic 
166536128a67SGowrishankar Muthukrishnan 	if (!test_ops.prepare_sym_xform || !test_ops.prepare_sym_op)
166636128a67SGowrishankar Muthukrishnan 		return -EINVAL;
166736128a67SGowrishankar Muthukrishnan 
166836128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_sym_xform(&xform);
1669cd255ccfSMarko Kovacevic 	if (ret < 0)
1670cd255ccfSMarko Kovacevic 		return ret;
1671cd255ccfSMarko Kovacevic 
167236128a67SGowrishankar Muthukrishnan 	env.sym.sess = rte_cryptodev_sym_session_create(env.dev_id, &xform,
167336128a67SGowrishankar Muthukrishnan 						env.sym.sess_mpool);
167436128a67SGowrishankar Muthukrishnan 	if (!env.sym.sess)
167536128a67SGowrishankar Muthukrishnan 		return -ENOMEM;
1676cd255ccfSMarko Kovacevic 
167736128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_sym_op();
1678cd255ccfSMarko Kovacevic 	if (ret < 0) {
1679cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Prepare op\n",
1680cd255ccfSMarko Kovacevic 				ret);
1681083a2777SMarko Kovacevic 		goto exit;
1682cd255ccfSMarko Kovacevic 	}
1683cd255ccfSMarko Kovacevic 
1684cd255ccfSMarko Kovacevic 	if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) {
1685cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error: Failed enqueue\n");
1686083a2777SMarko Kovacevic 		ret = -1;
1687083a2777SMarko Kovacevic 		goto exit;
1688cd255ccfSMarko Kovacevic 	}
1689cd255ccfSMarko Kovacevic 
1690cd255ccfSMarko Kovacevic 	do {
1691cd255ccfSMarko Kovacevic 		struct rte_crypto_op *deqd_op;
1692cd255ccfSMarko Kovacevic 
169336128a67SGowrishankar Muthukrishnan 		n_deqd = rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1);
1694cd255ccfSMarko Kovacevic 	} while (n_deqd == 0);
1695cd255ccfSMarko Kovacevic 
1696cd255ccfSMarko Kovacevic 	vec.status = env.op->status;
1697cd255ccfSMarko Kovacevic 
1698083a2777SMarko Kovacevic exit:
169936128a67SGowrishankar Muthukrishnan 	rte_cryptodev_sym_session_free(env.dev_id, env.sym.sess);
170036128a67SGowrishankar Muthukrishnan 	env.sym.sess = NULL;
170136128a67SGowrishankar Muthukrishnan 	return ret;
1702bdce2564SAkhil Goyal }
1703cd255ccfSMarko Kovacevic 
170436128a67SGowrishankar Muthukrishnan static int
170536128a67SGowrishankar Muthukrishnan fips_run_asym_test(void)
170636128a67SGowrishankar Muthukrishnan {
170736128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_xform xform = {0};
170836128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
170936128a67SGowrishankar Muthukrishnan 	struct rte_crypto_op *deqd_op;
171036128a67SGowrishankar Muthukrishnan 	int ret;
171136128a67SGowrishankar Muthukrishnan 
1712b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_KEYGEN && info.algo != FIPS_TEST_ALGO_ECDSA) {
171336128a67SGowrishankar Muthukrishnan 		RTE_SET_USED(asym);
171436128a67SGowrishankar Muthukrishnan 		ret = 0;
171536128a67SGowrishankar Muthukrishnan 		goto exit;
171636128a67SGowrishankar Muthukrishnan 	}
171736128a67SGowrishankar Muthukrishnan 
171836128a67SGowrishankar Muthukrishnan 	if (!test_ops.prepare_asym_xform || !test_ops.prepare_asym_op)
171936128a67SGowrishankar Muthukrishnan 		return -EINVAL;
172036128a67SGowrishankar Muthukrishnan 
172136128a67SGowrishankar Muthukrishnan 	asym = env.op->asym;
172236128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_asym_xform(&xform);
172336128a67SGowrishankar Muthukrishnan 	if (ret < 0)
1724cd255ccfSMarko Kovacevic 		return ret;
172536128a67SGowrishankar Muthukrishnan 
172636128a67SGowrishankar Muthukrishnan 	ret = rte_cryptodev_asym_session_create(env.dev_id, &xform, env.asym.sess_mpool,
172736128a67SGowrishankar Muthukrishnan 			(void *)&env.asym.sess);
172836128a67SGowrishankar Muthukrishnan 	if (ret < 0)
172936128a67SGowrishankar Muthukrishnan 		return ret;
173036128a67SGowrishankar Muthukrishnan 
173136128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_asym_op();
173236128a67SGowrishankar Muthukrishnan 	if (ret < 0) {
173336128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Error %i: Prepare op\n", ret);
173436128a67SGowrishankar Muthukrishnan 		goto exit;
173536128a67SGowrishankar Muthukrishnan 	}
173636128a67SGowrishankar Muthukrishnan 
173736128a67SGowrishankar Muthukrishnan 	if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) {
173836128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Error: Failed enqueue\n");
173936128a67SGowrishankar Muthukrishnan 		ret = -1;
174036128a67SGowrishankar Muthukrishnan 		goto exit;
174136128a67SGowrishankar Muthukrishnan 	}
174236128a67SGowrishankar Muthukrishnan 
174336128a67SGowrishankar Muthukrishnan 	while (rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1) == 0)
174436128a67SGowrishankar Muthukrishnan 		rte_pause();
174536128a67SGowrishankar Muthukrishnan 
174636128a67SGowrishankar Muthukrishnan 	vec.status = env.op->status;
174736128a67SGowrishankar Muthukrishnan 
174836128a67SGowrishankar Muthukrishnan  exit:
174936128a67SGowrishankar Muthukrishnan 	if (env.asym.sess)
175036128a67SGowrishankar Muthukrishnan 		rte_cryptodev_asym_session_free(env.dev_id, env.asym.sess);
175136128a67SGowrishankar Muthukrishnan 
175236128a67SGowrishankar Muthukrishnan 	env.asym.sess = NULL;
175336128a67SGowrishankar Muthukrishnan 	return ret;
175436128a67SGowrishankar Muthukrishnan }
175536128a67SGowrishankar Muthukrishnan 
175636128a67SGowrishankar Muthukrishnan static int
175736128a67SGowrishankar Muthukrishnan fips_run_test(void)
175836128a67SGowrishankar Muthukrishnan {
175936128a67SGowrishankar Muthukrishnan 	int ret;
176036128a67SGowrishankar Muthukrishnan 
176136128a67SGowrishankar Muthukrishnan 	env.op = env.sym.op;
176236128a67SGowrishankar Muthukrishnan 	if (env.is_asym_test) {
1763a22a5228SGowrishankar Muthukrishnan 		if (info.op == FIPS_TEST_ASYM_KEYGEN &&
1764a22a5228SGowrishankar Muthukrishnan 			info.algo == FIPS_TEST_ALGO_ECDSA) {
1765a22a5228SGowrishankar Muthukrishnan 			env.op = env.asym.op;
1766a22a5228SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecfpm_xform;
1767a22a5228SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecfpm_op;
1768a22a5228SGowrishankar Muthukrishnan 			ret = fips_run_asym_test();
1769a22a5228SGowrishankar Muthukrishnan 			if (ret < 0)
1770a22a5228SGowrishankar Muthukrishnan 				return ret;
1771a22a5228SGowrishankar Muthukrishnan 
1772a22a5228SGowrishankar Muthukrishnan 			info.interim_info.ecdsa_data.pubkey_gen = 0;
1773a22a5228SGowrishankar Muthukrishnan 			return ret;
1774a22a5228SGowrishankar Muthukrishnan 		}
1775a22a5228SGowrishankar Muthukrishnan 
177636128a67SGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = parse_test_sha_hash_size(
177736128a67SGowrishankar Muthukrishnan 						info.interim_info.rsa_data.auth);
177836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_sha_xform;
177936128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
178036128a67SGowrishankar Muthukrishnan 		ret = fips_run_sym_test();
178136128a67SGowrishankar Muthukrishnan 		if (ret < 0)
178236128a67SGowrishankar Muthukrishnan 			return ret;
178336128a67SGowrishankar Muthukrishnan 	} else {
178436128a67SGowrishankar Muthukrishnan 		return fips_run_sym_test();
178536128a67SGowrishankar Muthukrishnan 	}
178636128a67SGowrishankar Muthukrishnan 
178736128a67SGowrishankar Muthukrishnan 	env.op = env.asym.op;
1788b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN &&
1789b455d261SGowrishankar Muthukrishnan 		info.algo == FIPS_TEST_ALGO_ECDSA &&
1790b455d261SGowrishankar Muthukrishnan 		info.interim_info.ecdsa_data.pubkey_gen == 1) {
1791b455d261SGowrishankar Muthukrishnan 		fips_prepare_asym_xform_t ecdsa_xform;
1792b455d261SGowrishankar Muthukrishnan 		fips_prepare_op_t ecdsa_op;
1793b455d261SGowrishankar Muthukrishnan 
1794b455d261SGowrishankar Muthukrishnan 		ecdsa_xform = test_ops.prepare_asym_xform;
1795b455d261SGowrishankar Muthukrishnan 		ecdsa_op = test_ops.prepare_asym_op;
1796b455d261SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_KEYGEN;
1797b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = prepare_ecfpm_xform;
1798b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = prepare_ecfpm_op;
1799b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
1800b455d261SGowrishankar Muthukrishnan 		if (ret < 0)
1801b455d261SGowrishankar Muthukrishnan 			return ret;
1802b455d261SGowrishankar Muthukrishnan 
1803b455d261SGowrishankar Muthukrishnan 		info.post_interim_writeback(NULL);
1804b455d261SGowrishankar Muthukrishnan 		info.interim_info.ecdsa_data.pubkey_gen = 0;
1805b455d261SGowrishankar Muthukrishnan 
1806b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = ecdsa_xform;
1807b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = ecdsa_op;
1808b455d261SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_SIGGEN;
1809b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
1810b455d261SGowrishankar Muthukrishnan 	} else {
1811b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
1812b455d261SGowrishankar Muthukrishnan 	}
1813b455d261SGowrishankar Muthukrishnan 
1814b455d261SGowrishankar Muthukrishnan 	return ret;
1815cd255ccfSMarko Kovacevic }
1816cd255ccfSMarko Kovacevic 
1817cd255ccfSMarko Kovacevic static int
1818cd255ccfSMarko Kovacevic fips_generic_test(void)
1819cd255ccfSMarko Kovacevic {
1820952e10cdSFan Zhang 	struct fips_val val = {NULL, 0};
1821cd255ccfSMarko Kovacevic 	int ret;
1822cd255ccfSMarko Kovacevic 
182389be27e3SBrandon Lo 	if (info.file_type != FIPS_TYPE_JSON)
1824cd255ccfSMarko Kovacevic 		fips_test_write_one_case();
1825cd255ccfSMarko Kovacevic 
1826cd255ccfSMarko Kovacevic 	ret = fips_run_test();
1827cd255ccfSMarko Kovacevic 	if (ret < 0) {
18288a40ff39SArchana Muniganti 		if (ret == -EPERM || ret == -ENOTSUP) {
182989be27e3SBrandon Lo 			if (info.file_type == FIPS_TYPE_JSON)
183089be27e3SBrandon Lo 				return ret;
183189be27e3SBrandon Lo 
1832cd255ccfSMarko Kovacevic 			fprintf(info.fp_wr, "Bypass\n\n");
1833cd255ccfSMarko Kovacevic 			return 0;
1834cd255ccfSMarko Kovacevic 		}
1835cd255ccfSMarko Kovacevic 
1836cd255ccfSMarko Kovacevic 		return ret;
1837cd255ccfSMarko Kovacevic 	}
1838cd255ccfSMarko Kovacevic 
183936128a67SGowrishankar Muthukrishnan 	if (!env.is_asym_test) {
1840952e10cdSFan Zhang 		ret = get_writeback_data(&val);
1841952e10cdSFan Zhang 		if (ret < 0)
1842952e10cdSFan Zhang 			return ret;
184336128a67SGowrishankar Muthukrishnan 	}
1844cd255ccfSMarko Kovacevic 
1845cd255ccfSMarko Kovacevic 	switch (info.file_type) {
1846cd255ccfSMarko Kovacevic 	case FIPS_TYPE_REQ:
1847cd255ccfSMarko Kovacevic 	case FIPS_TYPE_RSP:
184889be27e3SBrandon Lo 	case FIPS_TYPE_JSON:
1849cd255ccfSMarko Kovacevic 		if (info.parse_writeback == NULL)
1850cd255ccfSMarko Kovacevic 			return -EPERM;
1851cd255ccfSMarko Kovacevic 		ret = info.parse_writeback(&val);
1852cd255ccfSMarko Kovacevic 		if (ret < 0)
1853cd255ccfSMarko Kovacevic 			return ret;
1854cd255ccfSMarko Kovacevic 		break;
1855cd255ccfSMarko Kovacevic 	case FIPS_TYPE_FAX:
1856cd255ccfSMarko Kovacevic 		if (info.kat_check == NULL)
1857cd255ccfSMarko Kovacevic 			return -EPERM;
1858cd255ccfSMarko Kovacevic 		ret = info.kat_check(&val);
1859cd255ccfSMarko Kovacevic 		if (ret < 0)
1860cd255ccfSMarko Kovacevic 			return ret;
1861cd255ccfSMarko Kovacevic 		break;
1862f556293fSBrandon Lo 	default:
1863f556293fSBrandon Lo 		break;
1864cd255ccfSMarko Kovacevic 	}
1865cd255ccfSMarko Kovacevic 
186689be27e3SBrandon Lo 	if (info.file_type != FIPS_TYPE_JSON)
1867cd255ccfSMarko Kovacevic 		fprintf(info.fp_wr, "\n");
18683d3408ddSGowrishankar Muthukrishnan 	rte_free(val.val);
1869cd255ccfSMarko Kovacevic 
1870cd255ccfSMarko Kovacevic 	return 0;
1871cd255ccfSMarko Kovacevic }
1872cd255ccfSMarko Kovacevic 
1873cd255ccfSMarko Kovacevic static int
1874527cbf3dSMarko Kovacevic fips_mct_tdes_test(void)
1875527cbf3dSMarko Kovacevic {
1876527cbf3dSMarko Kovacevic #define TDES_BLOCK_SIZE		8
1877527cbf3dSMarko Kovacevic #define TDES_EXTERN_ITER	400
1878527cbf3dSMarko Kovacevic #define TDES_INTERN_ITER	10000
187964569ffaSGowrishankar Muthukrishnan 	struct fips_val val[3] = {{NULL, 0},}, val_key, pt, ct, iv;
18809252e81aSMarko Kovacevic 	uint8_t prev_out[TDES_BLOCK_SIZE] = {0};
18819252e81aSMarko Kovacevic 	uint8_t prev_prev_out[TDES_BLOCK_SIZE] = {0};
18829252e81aSMarko Kovacevic 	uint8_t prev_in[TDES_BLOCK_SIZE] = {0};
1883527cbf3dSMarko Kovacevic 	uint32_t i, j, k;
1884527cbf3dSMarko Kovacevic 	int ret;
1885ae65004fSMichael Shamis 	int test_mode = info.interim_info.tdes_data.test_mode;
1886527cbf3dSMarko Kovacevic 
188764569ffaSGowrishankar Muthukrishnan 	pt.len = vec.pt.len;
18883d3408ddSGowrishankar Muthukrishnan 	pt.val = rte_malloc(NULL, pt.len, 0);
188964569ffaSGowrishankar Muthukrishnan 	ct.len = vec.ct.len;
18903d3408ddSGowrishankar Muthukrishnan 	ct.val = rte_malloc(NULL, ct.len, 0);
189164569ffaSGowrishankar Muthukrishnan 	iv.len = vec.iv.len;
18923d3408ddSGowrishankar Muthukrishnan 	iv.val = rte_malloc(NULL, iv.len, 0);
189364569ffaSGowrishankar Muthukrishnan 
1894527cbf3dSMarko Kovacevic 	for (i = 0; i < TDES_EXTERN_ITER; i++) {
189564569ffaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON) {
189679365018SArchana Muniganti 			if ((i == 0) && (info.version == 21.4f)) {
18972b84d2bdSArchana Muniganti 				if (!(strstr(info.vec[0], "COUNT")))
18982b84d2bdSArchana Muniganti 					fprintf(info.fp_wr, "%s%u\n", "COUNT = ", 0);
189979365018SArchana Muniganti 			}
190079365018SArchana Muniganti 
190179365018SArchana Muniganti 			if (i != 0)
1902527cbf3dSMarko Kovacevic 				update_info_vec(i);
1903527cbf3dSMarko Kovacevic 
1904527cbf3dSMarko Kovacevic 			fips_test_write_one_case();
190564569ffaSGowrishankar Muthukrishnan 		}
1906527cbf3dSMarko Kovacevic 
1907527cbf3dSMarko Kovacevic 		for (j = 0; j < TDES_INTERN_ITER; j++) {
1908527cbf3dSMarko Kovacevic 			ret = fips_run_test();
1909527cbf3dSMarko Kovacevic 			if (ret < 0) {
1910527cbf3dSMarko Kovacevic 				if (ret == -EPERM) {
191189be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
191289be27e3SBrandon Lo 						return ret;
191389be27e3SBrandon Lo 
1914527cbf3dSMarko Kovacevic 					fprintf(info.fp_wr, "Bypass\n");
1915527cbf3dSMarko Kovacevic 					return 0;
1916527cbf3dSMarko Kovacevic 				}
1917527cbf3dSMarko Kovacevic 				return ret;
1918527cbf3dSMarko Kovacevic 			}
1919527cbf3dSMarko Kovacevic 
192064569ffaSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
1921952e10cdSFan Zhang 			if (ret < 0)
1922952e10cdSFan Zhang 				return ret;
1923527cbf3dSMarko Kovacevic 
1924527cbf3dSMarko Kovacevic 			if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
1925527cbf3dSMarko Kovacevic 				memcpy(prev_in, vec.ct.val, TDES_BLOCK_SIZE);
1926527cbf3dSMarko Kovacevic 
1927527cbf3dSMarko Kovacevic 			if (j == 0) {
192864569ffaSGowrishankar Muthukrishnan 				memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE);
192964569ffaSGowrishankar Muthukrishnan 				memcpy(pt.val, vec.pt.val, pt.len);
193064569ffaSGowrishankar Muthukrishnan 				memcpy(ct.val, vec.ct.val, ct.len);
193164569ffaSGowrishankar Muthukrishnan 				memcpy(iv.val, vec.iv.val, iv.len);
1932527cbf3dSMarko Kovacevic 
1933527cbf3dSMarko Kovacevic 				if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
1934ae65004fSMichael Shamis 					if (test_mode == TDES_MODE_ECB) {
193564569ffaSGowrishankar Muthukrishnan 						memcpy(vec.pt.val, val[0].val,
1936ae65004fSMichael Shamis 							   TDES_BLOCK_SIZE);
1937ae65004fSMichael Shamis 					} else {
1938527cbf3dSMarko Kovacevic 						memcpy(vec.pt.val, vec.iv.val,
1939527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
194064569ffaSGowrishankar Muthukrishnan 						memcpy(vec.iv.val, val[0].val,
1941527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
1942ae65004fSMichael Shamis 					}
194364569ffaSGowrishankar Muthukrishnan 					val[1].val = pt.val;
194464569ffaSGowrishankar Muthukrishnan 					val[1].len = pt.len;
194564569ffaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
194664569ffaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
1947ae65004fSMichael Shamis 				} else {
1948ae65004fSMichael Shamis 					if (test_mode == TDES_MODE_ECB) {
194964569ffaSGowrishankar Muthukrishnan 						memcpy(vec.ct.val, val[0].val,
1950ae65004fSMichael Shamis 							   TDES_BLOCK_SIZE);
1951527cbf3dSMarko Kovacevic 					} else {
1952527cbf3dSMarko Kovacevic 						memcpy(vec.iv.val, vec.ct.val,
1953527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
195464569ffaSGowrishankar Muthukrishnan 						memcpy(vec.ct.val, val[0].val,
1955527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
1956527cbf3dSMarko Kovacevic 					}
195764569ffaSGowrishankar Muthukrishnan 					val[1].val = ct.val;
195864569ffaSGowrishankar Muthukrishnan 					val[1].len = ct.len;
195964569ffaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
196064569ffaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
1961ae65004fSMichael Shamis 				}
1962527cbf3dSMarko Kovacevic 				continue;
1963527cbf3dSMarko Kovacevic 			}
1964527cbf3dSMarko Kovacevic 
1965527cbf3dSMarko Kovacevic 			if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
1966ae65004fSMichael Shamis 				if (test_mode == TDES_MODE_ECB) {
196764569ffaSGowrishankar Muthukrishnan 					memcpy(vec.pt.val, val[0].val,
1968ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1969527cbf3dSMarko Kovacevic 				} else {
197064569ffaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, val[0].val,
1971ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1972ae65004fSMichael Shamis 					memcpy(vec.pt.val, prev_out,
1973ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1974ae65004fSMichael Shamis 				}
1975ae65004fSMichael Shamis 			} else {
1976ae65004fSMichael Shamis 				if (test_mode == TDES_MODE_ECB) {
197764569ffaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, val[0].val,
1978ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1979ae65004fSMichael Shamis 				} else {
1980ae65004fSMichael Shamis 					memcpy(vec.iv.val, vec.ct.val,
1981ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
198264569ffaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, val[0].val,
1983ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1984ae65004fSMichael Shamis 				}
1985527cbf3dSMarko Kovacevic 			}
1986527cbf3dSMarko Kovacevic 
1987527cbf3dSMarko Kovacevic 			if (j == TDES_INTERN_ITER - 1)
1988527cbf3dSMarko Kovacevic 				continue;
1989527cbf3dSMarko Kovacevic 
199064569ffaSGowrishankar Muthukrishnan 			memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE);
1991527cbf3dSMarko Kovacevic 
1992527cbf3dSMarko Kovacevic 			if (j == TDES_INTERN_ITER - 3)
199364569ffaSGowrishankar Muthukrishnan 				memcpy(prev_prev_out, val[0].val, TDES_BLOCK_SIZE);
1994527cbf3dSMarko Kovacevic 		}
1995527cbf3dSMarko Kovacevic 
199664569ffaSGowrishankar Muthukrishnan 		info.parse_writeback(val);
199764569ffaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
1998527cbf3dSMarko Kovacevic 			fprintf(info.fp_wr, "\n");
1999527cbf3dSMarko Kovacevic 
2000527cbf3dSMarko Kovacevic 		if (i == TDES_EXTERN_ITER - 1)
2001527cbf3dSMarko Kovacevic 			continue;
2002527cbf3dSMarko Kovacevic 
2003527cbf3dSMarko Kovacevic 		/** update key */
2004527cbf3dSMarko Kovacevic 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2005527cbf3dSMarko Kovacevic 
2006527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.nb_keys == 0) {
2007527cbf3dSMarko Kovacevic 			if (memcmp(val_key.val, val_key.val + 8, 8) == 0)
2008527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 1;
2009527cbf3dSMarko Kovacevic 			else if (memcmp(val_key.val, val_key.val + 16, 8) == 0)
2010527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 2;
2011527cbf3dSMarko Kovacevic 			else
2012527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 3;
2013527cbf3dSMarko Kovacevic 
2014527cbf3dSMarko Kovacevic 		}
2015527cbf3dSMarko Kovacevic 
2016527cbf3dSMarko Kovacevic 		for (k = 0; k < TDES_BLOCK_SIZE; k++) {
2017527cbf3dSMarko Kovacevic 
2018527cbf3dSMarko Kovacevic 			switch (info.interim_info.tdes_data.nb_keys) {
2019527cbf3dSMarko Kovacevic 			case 3:
202064569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2021527cbf3dSMarko Kovacevic 				val_key.val[k + 8] ^= prev_out[k];
2022527cbf3dSMarko Kovacevic 				val_key.val[k + 16] ^= prev_prev_out[k];
2023527cbf3dSMarko Kovacevic 				break;
2024527cbf3dSMarko Kovacevic 			case 2:
202564569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2026527cbf3dSMarko Kovacevic 				val_key.val[k + 8] ^= prev_out[k];
202764569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 16] ^= val[0].val[k];
2028527cbf3dSMarko Kovacevic 				break;
2029527cbf3dSMarko Kovacevic 			default: /* case 1 */
203064569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
203164569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 8] ^= val[0].val[k];
203264569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 16] ^= val[0].val[k];
2033527cbf3dSMarko Kovacevic 				break;
2034527cbf3dSMarko Kovacevic 			}
2035527cbf3dSMarko Kovacevic 
2036527cbf3dSMarko Kovacevic 		}
2037527cbf3dSMarko Kovacevic 
2038527cbf3dSMarko Kovacevic 		for (k = 0; k < 24; k++)
20393d4e27fdSDavid Marchand 			val_key.val[k] = (rte_popcount32(val_key.val[k]) &
2040527cbf3dSMarko Kovacevic 					0x1) ?
2041527cbf3dSMarko Kovacevic 					val_key.val[k] : (val_key.val[k] ^ 0x1);
2042527cbf3dSMarko Kovacevic 
2043527cbf3dSMarko Kovacevic 		if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
2044ae65004fSMichael Shamis 			if (test_mode == TDES_MODE_ECB) {
204564569ffaSGowrishankar Muthukrishnan 				memcpy(vec.pt.val, val[0].val, TDES_BLOCK_SIZE);
2046ae65004fSMichael Shamis 			} else {
204764569ffaSGowrishankar Muthukrishnan 				memcpy(vec.iv.val, val[0].val, TDES_BLOCK_SIZE);
2048527cbf3dSMarko Kovacevic 				memcpy(vec.pt.val, prev_out, TDES_BLOCK_SIZE);
2049ae65004fSMichael Shamis 			}
2050ae65004fSMichael Shamis 		} else {
2051ae65004fSMichael Shamis 			if (test_mode == TDES_MODE_ECB) {
205264569ffaSGowrishankar Muthukrishnan 				memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE);
2053527cbf3dSMarko Kovacevic 			} else {
2054527cbf3dSMarko Kovacevic 				memcpy(vec.iv.val, prev_out, TDES_BLOCK_SIZE);
205564569ffaSGowrishankar Muthukrishnan 				memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE);
2056527cbf3dSMarko Kovacevic 			}
2057527cbf3dSMarko Kovacevic 		}
2058ae65004fSMichael Shamis 	}
2059527cbf3dSMarko Kovacevic 
20603d3408ddSGowrishankar Muthukrishnan 	rte_free(val[0].val);
20613d3408ddSGowrishankar Muthukrishnan 	rte_free(pt.val);
20623d3408ddSGowrishankar Muthukrishnan 	rte_free(ct.val);
20633d3408ddSGowrishankar Muthukrishnan 	rte_free(iv.val);
2064952e10cdSFan Zhang 
2065527cbf3dSMarko Kovacevic 	return 0;
2066527cbf3dSMarko Kovacevic }
2067527cbf3dSMarko Kovacevic 
2068527cbf3dSMarko Kovacevic static int
2069d3190431SMichael Shamis fips_mct_aes_ecb_test(void)
2070d3190431SMichael Shamis {
2071d3190431SMichael Shamis #define AES_BLOCK_SIZE	16
2072d3190431SMichael Shamis #define AES_EXTERN_ITER	100
2073d3190431SMichael Shamis #define AES_INTERN_ITER	1000
2074952e10cdSFan Zhang 	struct fips_val val = {NULL, 0}, val_key;
2075d3190431SMichael Shamis 	uint8_t prev_out[AES_BLOCK_SIZE] = {0};
2076d3190431SMichael Shamis 	uint32_t i, j, k;
2077d3190431SMichael Shamis 	int ret;
2078d3190431SMichael Shamis 
2079d3190431SMichael Shamis 	for (i = 0; i < AES_EXTERN_ITER; i++) {
2080d3190431SMichael Shamis 		if (i != 0)
2081d3190431SMichael Shamis 			update_info_vec(i);
2082d3190431SMichael Shamis 
2083d3190431SMichael Shamis 		fips_test_write_one_case();
2084d3190431SMichael Shamis 
2085d3190431SMichael Shamis 		for (j = 0; j < AES_INTERN_ITER; j++) {
2086d3190431SMichael Shamis 			ret = fips_run_test();
2087d3190431SMichael Shamis 			if (ret < 0) {
2088d3190431SMichael Shamis 				if (ret == -EPERM) {
208989be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
209089be27e3SBrandon Lo 						return ret;
209189be27e3SBrandon Lo 
2092d3190431SMichael Shamis 					fprintf(info.fp_wr, "Bypass\n");
2093d3190431SMichael Shamis 					return 0;
2094d3190431SMichael Shamis 				}
2095d3190431SMichael Shamis 
2096d3190431SMichael Shamis 				return ret;
2097d3190431SMichael Shamis 			}
2098d3190431SMichael Shamis 
2099952e10cdSFan Zhang 			ret = get_writeback_data(&val);
2100952e10cdSFan Zhang 			if (ret < 0)
2101952e10cdSFan Zhang 				return ret;
2102d3190431SMichael Shamis 
2103d3190431SMichael Shamis 			if (info.op == FIPS_TEST_ENC_AUTH_GEN)
2104d3190431SMichael Shamis 				memcpy(vec.pt.val, val.val, AES_BLOCK_SIZE);
2105d3190431SMichael Shamis 			else
2106d3190431SMichael Shamis 				memcpy(vec.ct.val, val.val, AES_BLOCK_SIZE);
2107d3190431SMichael Shamis 
2108d3190431SMichael Shamis 			if (j == AES_INTERN_ITER - 1)
2109d3190431SMichael Shamis 				continue;
2110d3190431SMichael Shamis 
2111d3190431SMichael Shamis 			memcpy(prev_out, val.val, AES_BLOCK_SIZE);
2112d3190431SMichael Shamis 		}
2113d3190431SMichael Shamis 
2114d3190431SMichael Shamis 		info.parse_writeback(&val);
2115d3190431SMichael Shamis 		fprintf(info.fp_wr, "\n");
2116d3190431SMichael Shamis 
2117d3190431SMichael Shamis 		if (i == AES_EXTERN_ITER - 1)
2118d3190431SMichael Shamis 			continue;
2119d3190431SMichael Shamis 
2120d3190431SMichael Shamis 		/** update key */
2121d3190431SMichael Shamis 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2122d3190431SMichael Shamis 		for (k = 0; k < vec.cipher_auth.key.len; k++) {
2123d3190431SMichael Shamis 			switch (vec.cipher_auth.key.len) {
2124d3190431SMichael Shamis 			case 16:
2125d3190431SMichael Shamis 				val_key.val[k] ^= val.val[k];
2126d3190431SMichael Shamis 				break;
2127d3190431SMichael Shamis 			case 24:
2128d3190431SMichael Shamis 				if (k < 8)
2129d3190431SMichael Shamis 					val_key.val[k] ^= prev_out[k + 8];
2130d3190431SMichael Shamis 				else
2131d3190431SMichael Shamis 					val_key.val[k] ^= val.val[k - 8];
2132d3190431SMichael Shamis 				break;
2133d3190431SMichael Shamis 			case 32:
2134d3190431SMichael Shamis 				if (k < 16)
2135d3190431SMichael Shamis 					val_key.val[k] ^= prev_out[k];
2136d3190431SMichael Shamis 				else
2137d3190431SMichael Shamis 					val_key.val[k] ^= val.val[k - 16];
2138d3190431SMichael Shamis 				break;
2139d3190431SMichael Shamis 			default:
2140d3190431SMichael Shamis 				return -1;
2141d3190431SMichael Shamis 			}
2142d3190431SMichael Shamis 		}
2143d3190431SMichael Shamis 	}
2144d3190431SMichael Shamis 
21453d3408ddSGowrishankar Muthukrishnan 	rte_free(val.val);
2146952e10cdSFan Zhang 
2147d3190431SMichael Shamis 	return 0;
2148d3190431SMichael Shamis }
2149d3190431SMichael Shamis static int
2150cd255ccfSMarko Kovacevic fips_mct_aes_test(void)
2151cd255ccfSMarko Kovacevic {
2152cd255ccfSMarko Kovacevic #define AES_BLOCK_SIZE	16
2153cd255ccfSMarko Kovacevic #define AES_EXTERN_ITER	100
2154cd255ccfSMarko Kovacevic #define AES_INTERN_ITER	1000
21558b8546aaSGowrishankar Muthukrishnan 	struct fips_val val[3] = {{NULL, 0},}, val_key,  pt, ct, iv;
2156cd255ccfSMarko Kovacevic 	uint8_t prev_out[AES_BLOCK_SIZE] = {0};
2157cd255ccfSMarko Kovacevic 	uint8_t prev_in[AES_BLOCK_SIZE] = {0};
2158cd255ccfSMarko Kovacevic 	uint32_t i, j, k;
2159cd255ccfSMarko Kovacevic 	int ret;
2160cd255ccfSMarko Kovacevic 
2161d3190431SMichael Shamis 	if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_ECB)
2162d3190431SMichael Shamis 		return fips_mct_aes_ecb_test();
2163d3190431SMichael Shamis 
2164e9ec7f61SGowrishankar Muthukrishnan 	pt.len = vec.pt.len;
21653d3408ddSGowrishankar Muthukrishnan 	pt.val = rte_malloc(NULL, pt.len, 0);
2166e9ec7f61SGowrishankar Muthukrishnan 	ct.len = vec.ct.len;
21673d3408ddSGowrishankar Muthukrishnan 	ct.val = rte_malloc(NULL, ct.len, 0);
2168e9ec7f61SGowrishankar Muthukrishnan 	iv.len = vec.iv.len;
21693d3408ddSGowrishankar Muthukrishnan 	iv.val = rte_malloc(NULL, iv.len, 0);
2170cd255ccfSMarko Kovacevic 	for (i = 0; i < AES_EXTERN_ITER; i++) {
21718b8546aaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON) {
2172cd255ccfSMarko Kovacevic 			if (i != 0)
2173cd255ccfSMarko Kovacevic 				update_info_vec(i);
2174cd255ccfSMarko Kovacevic 
2175cd255ccfSMarko Kovacevic 			fips_test_write_one_case();
21768b8546aaSGowrishankar Muthukrishnan 		}
2177cd255ccfSMarko Kovacevic 
2178cd255ccfSMarko Kovacevic 		for (j = 0; j < AES_INTERN_ITER; j++) {
2179cd255ccfSMarko Kovacevic 			ret = fips_run_test();
2180cd255ccfSMarko Kovacevic 			if (ret < 0) {
2181cd255ccfSMarko Kovacevic 				if (ret == -EPERM) {
218289be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
218389be27e3SBrandon Lo 						return ret;
218489be27e3SBrandon Lo 
2185cd255ccfSMarko Kovacevic 					fprintf(info.fp_wr, "Bypass\n");
2186cd255ccfSMarko Kovacevic 					return 0;
2187cd255ccfSMarko Kovacevic 				}
2188cd255ccfSMarko Kovacevic 
2189cd255ccfSMarko Kovacevic 				return ret;
2190cd255ccfSMarko Kovacevic 			}
2191cd255ccfSMarko Kovacevic 
21928b8546aaSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
2193afda6b01SCiara Power 			if (ret < 0)
2194afda6b01SCiara Power 				return ret;
2195cd255ccfSMarko Kovacevic 
2196cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
2197cd255ccfSMarko Kovacevic 				memcpy(prev_in, vec.ct.val, AES_BLOCK_SIZE);
2198cd255ccfSMarko Kovacevic 
2199cd255ccfSMarko Kovacevic 			if (j == 0) {
22008b8546aaSGowrishankar Muthukrishnan 				memcpy(prev_out, val[0].val, AES_BLOCK_SIZE);
22018b8546aaSGowrishankar Muthukrishnan 				memcpy(pt.val, vec.pt.val, pt.len);
22028b8546aaSGowrishankar Muthukrishnan 				memcpy(ct.val, vec.ct.val, ct.len);
22038b8546aaSGowrishankar Muthukrishnan 				memcpy(iv.val, vec.iv.val, iv.len);
2204cd255ccfSMarko Kovacevic 
2205cd255ccfSMarko Kovacevic 				if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
22068b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.pt.val, vec.iv.val, AES_BLOCK_SIZE);
22078b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
22088b8546aaSGowrishankar Muthukrishnan 					val[1].val = pt.val;
22098b8546aaSGowrishankar Muthukrishnan 					val[1].len = pt.len;
22108b8546aaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
22118b8546aaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2212cd255ccfSMarko Kovacevic 				} else {
22138b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, vec.iv.val, AES_BLOCK_SIZE);
22148b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE);
22158b8546aaSGowrishankar Muthukrishnan 					val[1].val = ct.val;
22168b8546aaSGowrishankar Muthukrishnan 					val[1].len = ct.len;
22178b8546aaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
22188b8546aaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2219cd255ccfSMarko Kovacevic 				}
2220cd255ccfSMarko Kovacevic 				continue;
2221cd255ccfSMarko Kovacevic 			}
2222cd255ccfSMarko Kovacevic 
2223cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
22248b8546aaSGowrishankar Muthukrishnan 				memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
2225cd255ccfSMarko Kovacevic 				memcpy(vec.pt.val, prev_out, AES_BLOCK_SIZE);
2226cd255ccfSMarko Kovacevic 			} else {
2227cd255ccfSMarko Kovacevic 				memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE);
2228cd255ccfSMarko Kovacevic 				memcpy(vec.ct.val, prev_out, AES_BLOCK_SIZE);
2229cd255ccfSMarko Kovacevic 			}
2230cd255ccfSMarko Kovacevic 
2231cd255ccfSMarko Kovacevic 			if (j == AES_INTERN_ITER - 1)
2232cd255ccfSMarko Kovacevic 				continue;
2233cd255ccfSMarko Kovacevic 
22348b8546aaSGowrishankar Muthukrishnan 			memcpy(prev_out, val[0].val, AES_BLOCK_SIZE);
2235cd255ccfSMarko Kovacevic 		}
2236cd255ccfSMarko Kovacevic 
22378b8546aaSGowrishankar Muthukrishnan 		info.parse_writeback(val);
22388b8546aaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2239cd255ccfSMarko Kovacevic 			fprintf(info.fp_wr, "\n");
2240cd255ccfSMarko Kovacevic 
2241e9ec7f61SGowrishankar Muthukrishnan 		if (i == AES_EXTERN_ITER - 1)
2242cd255ccfSMarko Kovacevic 			continue;
2243cd255ccfSMarko Kovacevic 
2244cd255ccfSMarko Kovacevic 		/** update key */
2245cd255ccfSMarko Kovacevic 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2246cd255ccfSMarko Kovacevic 		for (k = 0; k < vec.cipher_auth.key.len; k++) {
2247cd255ccfSMarko Kovacevic 			switch (vec.cipher_auth.key.len) {
2248cd255ccfSMarko Kovacevic 			case 16:
22498b8546aaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2250cd255ccfSMarko Kovacevic 				break;
2251cd255ccfSMarko Kovacevic 			case 24:
2252cd255ccfSMarko Kovacevic 				if (k < 8)
2253cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k + 8];
2254cd255ccfSMarko Kovacevic 				else
22558b8546aaSGowrishankar Muthukrishnan 					val_key.val[k] ^= val[0].val[k - 8];
2256cd255ccfSMarko Kovacevic 				break;
2257cd255ccfSMarko Kovacevic 			case 32:
2258cd255ccfSMarko Kovacevic 				if (k < 16)
2259cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k];
2260cd255ccfSMarko Kovacevic 				else
22618b8546aaSGowrishankar Muthukrishnan 					val_key.val[k] ^= val[0].val[k - 16];
2262cd255ccfSMarko Kovacevic 				break;
2263cd255ccfSMarko Kovacevic 			default:
2264cd255ccfSMarko Kovacevic 				return -1;
2265cd255ccfSMarko Kovacevic 			}
2266cd255ccfSMarko Kovacevic 		}
2267cd255ccfSMarko Kovacevic 
2268cd255ccfSMarko Kovacevic 		if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
22698b8546aaSGowrishankar Muthukrishnan 			memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
2270cd255ccfSMarko Kovacevic 	}
2271cd255ccfSMarko Kovacevic 
22723d3408ddSGowrishankar Muthukrishnan 	rte_free(val[0].val);
22733d3408ddSGowrishankar Muthukrishnan 	rte_free(pt.val);
22743d3408ddSGowrishankar Muthukrishnan 	rte_free(ct.val);
22753d3408ddSGowrishankar Muthukrishnan 	rte_free(iv.val);
2276952e10cdSFan Zhang 
2277cd255ccfSMarko Kovacevic 	return 0;
2278cd255ccfSMarko Kovacevic }
2279cd255ccfSMarko Kovacevic 
2280cd255ccfSMarko Kovacevic static int
2281f4797baeSDamian Nowak fips_mct_sha_test(void)
2282f4797baeSDamian Nowak {
2283f4797baeSDamian Nowak #define SHA_EXTERN_ITER	100
2284f4797baeSDamian Nowak #define SHA_INTERN_ITER	1000
22851ea7940eSGowrishankar Muthukrishnan 	uint8_t md_blocks = info.interim_info.sha_data.md_blocks;
2286fc78f69dSGowrishankar Muthukrishnan 	struct fips_val val = {NULL, 0};
22871ea7940eSGowrishankar Muthukrishnan 	struct fips_val  md[md_blocks];
2288f4797baeSDamian Nowak 	int ret;
22891ea7940eSGowrishankar Muthukrishnan 	uint32_t i, j, k, offset, max_outlen;
2290f4797baeSDamian Nowak 
22911ea7940eSGowrishankar Muthukrishnan 	max_outlen = md_blocks * vec.cipher_auth.digest.len;
22921ea7940eSGowrishankar Muthukrishnan 
22933d3408ddSGowrishankar Muthukrishnan 	rte_free(vec.cipher_auth.digest.val);
22943d3408ddSGowrishankar Muthukrishnan 	vec.cipher_auth.digest.val = rte_malloc(NULL, max_outlen, 0);
22951ea7940eSGowrishankar Muthukrishnan 
2296ce7ced4eSGowrishankar Muthukrishnan 	if (vec.pt.val)
2297d5c24714SGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, vec.pt.val, vec.cipher_auth.digest.len);
2298ce7ced4eSGowrishankar Muthukrishnan 
2299f4797baeSDamian Nowak 	rte_free(vec.pt.val);
23001ea7940eSGowrishankar Muthukrishnan 	vec.pt.val = rte_malloc(NULL, (MAX_DIGEST_SIZE*md_blocks), 0);
23011ea7940eSGowrishankar Muthukrishnan 
23021ea7940eSGowrishankar Muthukrishnan 	for (i = 0; i < md_blocks; i++)
23031ea7940eSGowrishankar Muthukrishnan 		md[i].val = rte_malloc(NULL, (MAX_DIGEST_SIZE*2), 0);
2304f4797baeSDamian Nowak 
2305d5c24714SGowrishankar Muthukrishnan 	if (info.file_type != FIPS_TYPE_JSON) {
2306f4797baeSDamian Nowak 		fips_test_write_one_case();
2307f4797baeSDamian Nowak 		fprintf(info.fp_wr, "\n");
2308d5c24714SGowrishankar Muthukrishnan 	}
2309f4797baeSDamian Nowak 
2310f4797baeSDamian Nowak 	for (j = 0; j < SHA_EXTERN_ITER; j++) {
23111ea7940eSGowrishankar Muthukrishnan 		for (i = 0; i < md_blocks; i++) {
23121ea7940eSGowrishankar Muthukrishnan 			memcpy(md[i].val, vec.cipher_auth.digest.val,
2313f4797baeSDamian Nowak 				vec.cipher_auth.digest.len);
23141ea7940eSGowrishankar Muthukrishnan 			md[i].len = vec.cipher_auth.digest.len;
23151ea7940eSGowrishankar Muthukrishnan 		}
2316d5c24714SGowrishankar Muthukrishnan 
2317f4797baeSDamian Nowak 		for (i = 0; i < (SHA_INTERN_ITER); i++) {
23181ea7940eSGowrishankar Muthukrishnan 			offset = 0;
23191ea7940eSGowrishankar Muthukrishnan 			for (k = 0; k < md_blocks; k++) {
23201ea7940eSGowrishankar Muthukrishnan 				memcpy(vec.pt.val + offset, md[k].val, (size_t)md[k].len);
23211ea7940eSGowrishankar Muthukrishnan 				offset += md[k].len;
23221ea7940eSGowrishankar Muthukrishnan 			}
23231ea7940eSGowrishankar Muthukrishnan 			vec.pt.len = offset;
2324f4797baeSDamian Nowak 
2325f4797baeSDamian Nowak 			ret = fips_run_test();
2326f4797baeSDamian Nowak 			if (ret < 0) {
23278a40ff39SArchana Muniganti 				if (ret == -EPERM || ret == -ENOTSUP) {
232889be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
232989be27e3SBrandon Lo 						return ret;
233089be27e3SBrandon Lo 
2331f4797baeSDamian Nowak 					fprintf(info.fp_wr, "Bypass\n\n");
2332f4797baeSDamian Nowak 					return 0;
2333f4797baeSDamian Nowak 				}
2334f4797baeSDamian Nowak 				return ret;
2335f4797baeSDamian Nowak 			}
2336f4797baeSDamian Nowak 
2337fc78f69dSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val);
2338afda6b01SCiara Power 			if (ret < 0)
2339afda6b01SCiara Power 				return ret;
2340f4797baeSDamian Nowak 
23411ea7940eSGowrishankar Muthukrishnan 			for (k = 1; k < md_blocks; k++) {
23421ea7940eSGowrishankar Muthukrishnan 				memcpy(md[k-1].val, md[k].val, md[k].len);
23431ea7940eSGowrishankar Muthukrishnan 				md[k-1].len = md[k].len;
2344f4797baeSDamian Nowak 			}
2345f4797baeSDamian Nowak 
23461ea7940eSGowrishankar Muthukrishnan 			memcpy(md[md_blocks-1].val, (val.val + vec.pt.len),
23471ea7940eSGowrishankar Muthukrishnan 				vec.cipher_auth.digest.len);
23481ea7940eSGowrishankar Muthukrishnan 			md[md_blocks-1].len = vec.cipher_auth.digest.len;
23491ea7940eSGowrishankar Muthukrishnan 		}
23501ea7940eSGowrishankar Muthukrishnan 
23511ea7940eSGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, md[md_blocks-1].val, md[md_blocks-1].len);
23521ea7940eSGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = md[md_blocks-1].len;
2353f4797baeSDamian Nowak 
2354ce7ced4eSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2355f4797baeSDamian Nowak 			fprintf(info.fp_wr, "COUNT = %u\n", j);
2356ce7ced4eSGowrishankar Muthukrishnan 
2357fc78f69dSGowrishankar Muthukrishnan 		info.parse_writeback(&val);
2358ce7ced4eSGowrishankar Muthukrishnan 
2359ce7ced4eSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2360ce7ced4eSGowrishankar Muthukrishnan 			fprintf(info.fp_wr, "\n");
2361d5c24714SGowrishankar Muthukrishnan 	}
2362f4797baeSDamian Nowak 
23631ea7940eSGowrishankar Muthukrishnan 	for (i = 0; i < (md_blocks); i++)
2364f4797baeSDamian Nowak 		rte_free(md[i].val);
2365f4797baeSDamian Nowak 
2366f4797baeSDamian Nowak 	rte_free(vec.pt.val);
2367f4797baeSDamian Nowak 
23683d3408ddSGowrishankar Muthukrishnan 	rte_free(val.val);
2369f4797baeSDamian Nowak 	return 0;
2370f4797baeSDamian Nowak }
2371f4797baeSDamian Nowak 
2372225f04fbSGowrishankar Muthukrishnan static int
2373225f04fbSGowrishankar Muthukrishnan fips_mct_shake_test(void)
2374225f04fbSGowrishankar Muthukrishnan {
2375225f04fbSGowrishankar Muthukrishnan #define SHAKE_EXTERN_ITER	100
2376225f04fbSGowrishankar Muthukrishnan #define SHAKE_INTERN_ITER	1000
2377225f04fbSGowrishankar Muthukrishnan 	uint32_t i, j, range, outlen, max_outlen;
2378225f04fbSGowrishankar Muthukrishnan 	struct fips_val val = {NULL, 0}, md;
2379225f04fbSGowrishankar Muthukrishnan 	uint8_t rightmost[2];
2380225f04fbSGowrishankar Muthukrishnan 	uint16_t *rightptr;
2381225f04fbSGowrishankar Muthukrishnan 	int ret;
2382225f04fbSGowrishankar Muthukrishnan 
2383225f04fbSGowrishankar Muthukrishnan 	max_outlen = vec.cipher_auth.digest.len;
2384225f04fbSGowrishankar Muthukrishnan 
23853d3408ddSGowrishankar Muthukrishnan 	rte_free(vec.cipher_auth.digest.val);
23863d3408ddSGowrishankar Muthukrishnan 	vec.cipher_auth.digest.val = rte_malloc(NULL, max_outlen, 0);
2387225f04fbSGowrishankar Muthukrishnan 
2388225f04fbSGowrishankar Muthukrishnan 	if (vec.pt.val)
2389225f04fbSGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, vec.pt.val, vec.pt.len);
2390225f04fbSGowrishankar Muthukrishnan 
2391225f04fbSGowrishankar Muthukrishnan 	rte_free(vec.pt.val);
2392225f04fbSGowrishankar Muthukrishnan 	vec.pt.val = rte_malloc(NULL, 16, 0);
2393225f04fbSGowrishankar Muthukrishnan 	vec.pt.len = 16;
2394225f04fbSGowrishankar Muthukrishnan 
2395225f04fbSGowrishankar Muthukrishnan 	md.val = rte_malloc(NULL, max_outlen, 0);
2396225f04fbSGowrishankar Muthukrishnan 	md.len = max_outlen;
2397225f04fbSGowrishankar Muthukrishnan 
2398225f04fbSGowrishankar Muthukrishnan 	if (info.file_type != FIPS_TYPE_JSON) {
2399225f04fbSGowrishankar Muthukrishnan 		fips_test_write_one_case();
2400225f04fbSGowrishankar Muthukrishnan 		fprintf(info.fp_wr, "\n");
2401225f04fbSGowrishankar Muthukrishnan 	}
2402225f04fbSGowrishankar Muthukrishnan 
2403225f04fbSGowrishankar Muthukrishnan 	range = max_outlen - info.interim_info.sha_data.min_outlen + 1;
2404225f04fbSGowrishankar Muthukrishnan 	outlen = max_outlen;
2405225f04fbSGowrishankar Muthukrishnan 	for (j = 0; j < SHAKE_EXTERN_ITER; j++) {
2406225f04fbSGowrishankar Muthukrishnan 		memset(md.val, 0, max_outlen);
2407225f04fbSGowrishankar Muthukrishnan 		memcpy(md.val, vec.cipher_auth.digest.val,
2408225f04fbSGowrishankar Muthukrishnan 			vec.cipher_auth.digest.len);
2409225f04fbSGowrishankar Muthukrishnan 
2410225f04fbSGowrishankar Muthukrishnan 		for (i = 0; i < (SHAKE_INTERN_ITER); i++) {
2411225f04fbSGowrishankar Muthukrishnan 			memset(vec.pt.val, 0, vec.pt.len);
2412225f04fbSGowrishankar Muthukrishnan 			memcpy(vec.pt.val, md.val, vec.pt.len);
2413225f04fbSGowrishankar Muthukrishnan 			vec.cipher_auth.digest.len = outlen;
2414225f04fbSGowrishankar Muthukrishnan 			ret = fips_run_test();
2415225f04fbSGowrishankar Muthukrishnan 			if (ret < 0) {
2416225f04fbSGowrishankar Muthukrishnan 				if (ret == -EPERM || ret == -ENOTSUP) {
2417225f04fbSGowrishankar Muthukrishnan 					if (info.file_type == FIPS_TYPE_JSON)
2418225f04fbSGowrishankar Muthukrishnan 						return ret;
2419225f04fbSGowrishankar Muthukrishnan 
2420225f04fbSGowrishankar Muthukrishnan 					fprintf(info.fp_wr, "Bypass\n\n");
2421225f04fbSGowrishankar Muthukrishnan 					return 0;
2422225f04fbSGowrishankar Muthukrishnan 				}
2423225f04fbSGowrishankar Muthukrishnan 				return ret;
2424225f04fbSGowrishankar Muthukrishnan 			}
2425225f04fbSGowrishankar Muthukrishnan 
2426225f04fbSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val);
2427225f04fbSGowrishankar Muthukrishnan 			if (ret < 0)
2428225f04fbSGowrishankar Muthukrishnan 				return ret;
2429225f04fbSGowrishankar Muthukrishnan 
2430225f04fbSGowrishankar Muthukrishnan 			memset(md.val, 0, max_outlen);
2431225f04fbSGowrishankar Muthukrishnan 			memcpy(md.val, (val.val + vec.pt.len),
2432225f04fbSGowrishankar Muthukrishnan 				vec.cipher_auth.digest.len);
2433225f04fbSGowrishankar Muthukrishnan 			md.len = outlen;
2434225f04fbSGowrishankar Muthukrishnan 			rightmost[0] = md.val[md.len-1];
2435225f04fbSGowrishankar Muthukrishnan 			rightmost[1] = md.val[md.len-2];
2436225f04fbSGowrishankar Muthukrishnan 			rightptr = (uint16_t *)rightmost;
2437225f04fbSGowrishankar Muthukrishnan 			outlen = info.interim_info.sha_data.min_outlen +
2438225f04fbSGowrishankar Muthukrishnan 				(*rightptr % range);
2439225f04fbSGowrishankar Muthukrishnan 		}
2440225f04fbSGowrishankar Muthukrishnan 
2441225f04fbSGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, md.val, md.len);
2442225f04fbSGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = md.len;
2443225f04fbSGowrishankar Muthukrishnan 
2444225f04fbSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2445225f04fbSGowrishankar Muthukrishnan 			fprintf(info.fp_wr, "COUNT = %u\n", j);
2446225f04fbSGowrishankar Muthukrishnan 
2447225f04fbSGowrishankar Muthukrishnan 		info.parse_writeback(&val);
2448225f04fbSGowrishankar Muthukrishnan 
2449225f04fbSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2450225f04fbSGowrishankar Muthukrishnan 			fprintf(info.fp_wr, "\n");
2451225f04fbSGowrishankar Muthukrishnan 	}
2452225f04fbSGowrishankar Muthukrishnan 
2453225f04fbSGowrishankar Muthukrishnan 	rte_free(md.val);
2454225f04fbSGowrishankar Muthukrishnan 	rte_free(vec.pt.val);
24553d3408ddSGowrishankar Muthukrishnan 	rte_free(val.val);
2456225f04fbSGowrishankar Muthukrishnan 	return 0;
2457225f04fbSGowrishankar Muthukrishnan }
2458f4797baeSDamian Nowak 
2459f4797baeSDamian Nowak static int
2460cd255ccfSMarko Kovacevic init_test_ops(void)
2461cd255ccfSMarko Kovacevic {
2462cd255ccfSMarko Kovacevic 	switch (info.algo) {
246375777166SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CBC:
2464c8956fd2SBrian Dooley 	case FIPS_TEST_ALGO_AES_CTR:
2465cd255ccfSMarko Kovacevic 	case FIPS_TEST_ALGO_AES:
246636128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
246736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform  = prepare_aes_xform;
2468cd255ccfSMarko Kovacevic 		if (info.interim_info.aes_data.test_type == AESAVS_TYPE_MCT)
2469cd255ccfSMarko Kovacevic 			test_ops.test = fips_mct_aes_test;
2470cd255ccfSMarko Kovacevic 		else
2471cd255ccfSMarko Kovacevic 			test_ops.test = fips_generic_test;
2472cd255ccfSMarko Kovacevic 		break;
2473f64adb67SMarko Kovacevic 	case FIPS_TEST_ALGO_HMAC:
247436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
247536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_hmac_xform;
2476f64adb67SMarko Kovacevic 		test_ops.test = fips_generic_test;
2477f64adb67SMarko Kovacevic 		break;
2478527cbf3dSMarko Kovacevic 	case FIPS_TEST_ALGO_TDES:
247936128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
248036128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_tdes_xform;
2481527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.test_type == TDES_MCT)
2482527cbf3dSMarko Kovacevic 			test_ops.test = fips_mct_tdes_test;
2483527cbf3dSMarko Kovacevic 		else
2484527cbf3dSMarko Kovacevic 			test_ops.test = fips_generic_test;
2485527cbf3dSMarko Kovacevic 		break;
2486e27268bdSBrian Dooley 	case FIPS_TEST_ALGO_AES_GMAC:
248736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
248836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gmac_xform;
2489e27268bdSBrian Dooley 		test_ops.test = fips_generic_test;
2490e27268bdSBrian Dooley 		break;
24914aaad299SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_GCM:
249236128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_aead_op;
249336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gcm_xform;
24944aaad299SMarko Kovacevic 		test_ops.test = fips_generic_test;
24954aaad299SMarko Kovacevic 		break;
2496ac026f46SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_CMAC:
249736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
249836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_cmac_xform;
2499ac026f46SMarko Kovacevic 		test_ops.test = fips_generic_test;
2500ac026f46SMarko Kovacevic 		break;
2501305921f4SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_CCM:
250236128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_aead_op;
250336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_ccm_xform;
2504305921f4SMarko Kovacevic 		test_ops.test = fips_generic_test;
2505305921f4SMarko Kovacevic 		break;
2506f4797baeSDamian Nowak 	case FIPS_TEST_ALGO_SHA:
250736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
250836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_sha_xform;
2509f4797baeSDamian Nowak 		if (info.interim_info.sha_data.test_type == SHA_MCT)
2510225f04fbSGowrishankar Muthukrishnan 			if (info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_128 ||
2511225f04fbSGowrishankar Muthukrishnan 				info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_256)
2512225f04fbSGowrishankar Muthukrishnan 				test_ops.test = fips_mct_shake_test;
2513225f04fbSGowrishankar Muthukrishnan 			else
2514f4797baeSDamian Nowak 				test_ops.test = fips_mct_sha_test;
2515f4797baeSDamian Nowak 		else
2516f4797baeSDamian Nowak 			test_ops.test = fips_generic_test;
2517f4797baeSDamian Nowak 		break;
2518d5a9ea55SSucharitha Sarananaga 	case FIPS_TEST_ALGO_AES_XTS:
251936128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
252036128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_xts_xform;
252136128a67SGowrishankar Muthukrishnan 		test_ops.test = fips_generic_test;
252236128a67SGowrishankar Muthukrishnan 		break;
252336128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_RSA:
252436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = prepare_rsa_op;
252536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = prepare_rsa_xform;
2526d5a9ea55SSucharitha Sarananaga 		test_ops.test = fips_generic_test;
2527d5a9ea55SSucharitha Sarananaga 		break;
2528b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_ECDSA:
2529b455d261SGowrishankar Muthukrishnan 		if (info.op == FIPS_TEST_ASYM_KEYGEN) {
2530b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecfpm_op;
2531b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecfpm_xform;
2532b455d261SGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2533b455d261SGowrishankar Muthukrishnan 		} else {
2534b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecdsa_op;
2535b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecdsa_xform;
2536b455d261SGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2537b455d261SGowrishankar Muthukrishnan 		}
2538b455d261SGowrishankar Muthukrishnan 		break;
2539cd255ccfSMarko Kovacevic 	default:
2540efe3a8dbSMichael Shamis 		if (strstr(info.file_name, "TECB") ||
2541efe3a8dbSMichael Shamis 				strstr(info.file_name, "TCBC")) {
2542efe3a8dbSMichael Shamis 			info.algo = FIPS_TEST_ALGO_TDES;
254336128a67SGowrishankar Muthukrishnan 			test_ops.prepare_sym_op = prepare_cipher_op;
254436128a67SGowrishankar Muthukrishnan 			test_ops.prepare_sym_xform = prepare_tdes_xform;
2545efe3a8dbSMichael Shamis 			if (info.interim_info.tdes_data.test_type == TDES_MCT)
2546efe3a8dbSMichael Shamis 				test_ops.test = fips_mct_tdes_test;
2547efe3a8dbSMichael Shamis 			else
2548efe3a8dbSMichael Shamis 				test_ops.test = fips_generic_test;
2549efe3a8dbSMichael Shamis 			break;
2550efe3a8dbSMichael Shamis 		}
2551cd255ccfSMarko Kovacevic 		return -1;
2552cd255ccfSMarko Kovacevic 	}
2553cd255ccfSMarko Kovacevic 
2554cd255ccfSMarko Kovacevic 	return 0;
2555cd255ccfSMarko Kovacevic }
2556cd255ccfSMarko Kovacevic 
25573d0fad56SMarko Kovacevic static void
25583d0fad56SMarko Kovacevic print_test_block(void)
25593d0fad56SMarko Kovacevic {
25603d0fad56SMarko Kovacevic 	uint32_t i;
25613d0fad56SMarko Kovacevic 
25623d0fad56SMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++)
25633d0fad56SMarko Kovacevic 		printf("%s\n", info.vec[i]);
25643d0fad56SMarko Kovacevic 
25653d0fad56SMarko Kovacevic 	printf("\n");
25663d0fad56SMarko Kovacevic }
25673d0fad56SMarko Kovacevic 
25683d0fad56SMarko Kovacevic static int
25693d0fad56SMarko Kovacevic fips_test_one_file(void)
25703d0fad56SMarko Kovacevic {
25713d0fad56SMarko Kovacevic 	int fetch_ret = 0, ret;
25723d0fad56SMarko Kovacevic 
2573cd255ccfSMarko Kovacevic 	ret = init_test_ops();
2574cd255ccfSMarko Kovacevic 	if (ret < 0) {
2575cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Init test op\n", ret);
2576cd255ccfSMarko Kovacevic 		return ret;
2577cd255ccfSMarko Kovacevic 	}
2578cd255ccfSMarko Kovacevic 
2579cd255ccfSMarko Kovacevic 	while (ret >= 0 && fetch_ret == 0) {
25803d0fad56SMarko Kovacevic 		fetch_ret = fips_test_fetch_one_block();
25813d0fad56SMarko Kovacevic 		if (fetch_ret < 0) {
25823d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Fetch block\n",
25833d0fad56SMarko Kovacevic 					fetch_ret);
25843d0fad56SMarko Kovacevic 			ret = fetch_ret;
25853d0fad56SMarko Kovacevic 			goto error_one_case;
25863d0fad56SMarko Kovacevic 		}
25873d0fad56SMarko Kovacevic 
25883d0fad56SMarko Kovacevic 		if (info.nb_vec_lines == 0) {
25893d0fad56SMarko Kovacevic 			if (fetch_ret == -EOF)
25903d0fad56SMarko Kovacevic 				break;
25913d0fad56SMarko Kovacevic 
25923d0fad56SMarko Kovacevic 			fprintf(info.fp_wr, "\n");
25933d0fad56SMarko Kovacevic 			continue;
25943d0fad56SMarko Kovacevic 		}
25953d0fad56SMarko Kovacevic 
25963d0fad56SMarko Kovacevic 		ret = fips_test_parse_one_case();
25973d0fad56SMarko Kovacevic 		switch (ret) {
25983d0fad56SMarko Kovacevic 		case 0:
2599cd255ccfSMarko Kovacevic 			ret = test_ops.test();
26003d0fad56SMarko Kovacevic 			if (ret == 0)
26013d0fad56SMarko Kovacevic 				break;
26023d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: test block\n",
26033d0fad56SMarko Kovacevic 					ret);
26043d0fad56SMarko Kovacevic 			goto error_one_case;
26053d0fad56SMarko Kovacevic 		case 1:
26063d0fad56SMarko Kovacevic 			break;
26073d0fad56SMarko Kovacevic 		default:
26083d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
26093d0fad56SMarko Kovacevic 					ret);
26103d0fad56SMarko Kovacevic 			goto error_one_case;
26113d0fad56SMarko Kovacevic 		}
26123d0fad56SMarko Kovacevic 
26133d0fad56SMarko Kovacevic 		continue;
26143d0fad56SMarko Kovacevic error_one_case:
26153d0fad56SMarko Kovacevic 		print_test_block();
26163d0fad56SMarko Kovacevic 	}
26173d0fad56SMarko Kovacevic 
26183d0fad56SMarko Kovacevic 	fips_test_clear();
26193d0fad56SMarko Kovacevic 
262015bb59a5SCiara Power 	if (env.digest) {
2621952e10cdSFan Zhang 		rte_free(env.digest);
262215bb59a5SCiara Power 		env.digest = NULL;
262394dfc563SSamina Arshad 		env.digest_len = 0;
262415bb59a5SCiara Power 	}
2625952e10cdSFan Zhang 	rte_pktmbuf_free(env.mbuf);
2626cd255ccfSMarko Kovacevic 
2627952e10cdSFan Zhang 	return ret;
26283d0fad56SMarko Kovacevic }
262989be27e3SBrandon Lo 
26308d70a194SDavid Marchand #ifdef USE_JANSSON
263189be27e3SBrandon Lo static int
263289be27e3SBrandon Lo fips_test_json_init_writeback(void)
263389be27e3SBrandon Lo {
263489be27e3SBrandon Lo 	json_t *session_info, *session_write;
263589be27e3SBrandon Lo 	session_info = json_array_get(json_info.json_root, 0);
263689be27e3SBrandon Lo 	session_write = json_object();
263789be27e3SBrandon Lo 	json_info.json_write_root = json_array();
263889be27e3SBrandon Lo 
263989be27e3SBrandon Lo 	json_object_set(session_write, "jwt",
264089be27e3SBrandon Lo 		json_object_get(session_info, "jwt"));
264189be27e3SBrandon Lo 	json_object_set(session_write, "url",
264289be27e3SBrandon Lo 		json_object_get(session_info, "url"));
264389be27e3SBrandon Lo 	json_object_set(session_write, "isSample",
264489be27e3SBrandon Lo 		json_object_get(session_info, "isSample"));
264589be27e3SBrandon Lo 
264689be27e3SBrandon Lo 	json_info.is_sample = json_boolean_value(
264789be27e3SBrandon Lo 		json_object_get(session_info, "isSample"));
264889be27e3SBrandon Lo 
264989be27e3SBrandon Lo 	json_array_append_new(json_info.json_write_root, session_write);
265089be27e3SBrandon Lo 	return 0;
265189be27e3SBrandon Lo }
265289be27e3SBrandon Lo 
265389be27e3SBrandon Lo static int
265489be27e3SBrandon Lo fips_test_one_test_case(void)
265589be27e3SBrandon Lo {
265689be27e3SBrandon Lo 	int ret;
265789be27e3SBrandon Lo 
265889be27e3SBrandon Lo 	ret = fips_test_parse_one_json_case();
265989be27e3SBrandon Lo 
266089be27e3SBrandon Lo 	switch (ret) {
266189be27e3SBrandon Lo 	case 0:
266289be27e3SBrandon Lo 		ret = test_ops.test();
266389be27e3SBrandon Lo 		if ((ret == 0) || (ret == -EPERM || ret == -ENOTSUP))
266489be27e3SBrandon Lo 			break;
266589be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error %i: test block\n",
266689be27e3SBrandon Lo 				ret);
266789be27e3SBrandon Lo 		break;
266889be27e3SBrandon Lo 	default:
266989be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
267089be27e3SBrandon Lo 				ret);
267189be27e3SBrandon Lo 	}
267289be27e3SBrandon Lo 	return ret;
267389be27e3SBrandon Lo }
267489be27e3SBrandon Lo 
267589be27e3SBrandon Lo static int
267689be27e3SBrandon Lo fips_test_one_test_group(void)
267789be27e3SBrandon Lo {
267889be27e3SBrandon Lo 	int ret;
267989be27e3SBrandon Lo 	json_t *tests, *write_tests;
268089be27e3SBrandon Lo 	size_t test_idx, tests_size;
268189be27e3SBrandon Lo 
268289be27e3SBrandon Lo 	write_tests = json_array();
268389be27e3SBrandon Lo 	json_info.json_write_group = json_object();
268489be27e3SBrandon Lo 	json_object_set(json_info.json_write_group, "tgId",
268589be27e3SBrandon Lo 		json_object_get(json_info.json_test_group, "tgId"));
268689be27e3SBrandon Lo 	json_object_set_new(json_info.json_write_group, "tests", write_tests);
268789be27e3SBrandon Lo 
268889be27e3SBrandon Lo 	switch (info.algo) {
2689e27268bdSBrian Dooley 	case FIPS_TEST_ALGO_AES_GMAC:
269089be27e3SBrandon Lo 	case FIPS_TEST_ALGO_AES_GCM:
2691b09aac2dSBrandon Lo 		ret = parse_test_gcm_json_init();
269289be27e3SBrandon Lo 		break;
269355a7050eSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CCM:
269455a7050eSGowrishankar Muthukrishnan 		ret = parse_test_ccm_json_init();
269555a7050eSGowrishankar Muthukrishnan 		break;
2696443c93d8SBrandon Lo 	case FIPS_TEST_ALGO_HMAC:
2697443c93d8SBrandon Lo 		ret = parse_test_hmac_json_init();
2698443c93d8SBrandon Lo 		break;
269907da56a6SBrandon Lo 	case FIPS_TEST_ALGO_AES_CMAC:
270007da56a6SBrandon Lo 		ret = parse_test_cmac_json_init();
270107da56a6SBrandon Lo 		break;
2702f8e431edSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_XTS:
2703f8e431edSGowrishankar Muthukrishnan 		ret = parse_test_xts_json_init();
2704f8e431edSGowrishankar Muthukrishnan 		break;
2705f8e431edSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CBC:
2706c8956fd2SBrian Dooley 	case FIPS_TEST_ALGO_AES_CTR:
27078b8546aaSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES:
27088b8546aaSGowrishankar Muthukrishnan 		ret = parse_test_aes_json_init();
27098b8546aaSGowrishankar Muthukrishnan 		break;
2710d5c24714SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_SHA:
2711d5c24714SGowrishankar Muthukrishnan 		ret = parse_test_sha_json_init();
2712d5c24714SGowrishankar Muthukrishnan 		break;
271364569ffaSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_TDES:
271464569ffaSGowrishankar Muthukrishnan 		ret = parse_test_tdes_json_init();
271564569ffaSGowrishankar Muthukrishnan 		break;
271636128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_RSA:
271736128a67SGowrishankar Muthukrishnan 		ret = parse_test_rsa_json_init();
271836128a67SGowrishankar Muthukrishnan 		break;
2719b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_ECDSA:
2720b455d261SGowrishankar Muthukrishnan 		ret = parse_test_ecdsa_json_init();
2721b455d261SGowrishankar Muthukrishnan 		break;
272289be27e3SBrandon Lo 	default:
272389be27e3SBrandon Lo 		return -EINVAL;
272489be27e3SBrandon Lo 	}
2725b09aac2dSBrandon Lo 
272689be27e3SBrandon Lo 	if (ret < 0)
272789be27e3SBrandon Lo 		return ret;
272889be27e3SBrandon Lo 
272989be27e3SBrandon Lo 	ret = fips_test_parse_one_json_group();
273089be27e3SBrandon Lo 	if (ret < 0)
273189be27e3SBrandon Lo 		return ret;
273289be27e3SBrandon Lo 
273389be27e3SBrandon Lo 	ret = init_test_ops();
273489be27e3SBrandon Lo 	if (ret < 0)
273589be27e3SBrandon Lo 		return ret;
273689be27e3SBrandon Lo 
273789be27e3SBrandon Lo 	tests = json_object_get(json_info.json_test_group, "tests");
273889be27e3SBrandon Lo 	tests_size = json_array_size(tests);
273989be27e3SBrandon Lo 	for (test_idx = 0; test_idx < tests_size; test_idx++) {
274089be27e3SBrandon Lo 		json_info.json_test_case = json_array_get(tests, test_idx);
274189be27e3SBrandon Lo 		if (fips_test_one_test_case() == 0)
274289be27e3SBrandon Lo 			json_array_append_new(write_tests, json_info.json_write_case);
274389be27e3SBrandon Lo 	}
274489be27e3SBrandon Lo 
274589be27e3SBrandon Lo 	return 0;
274689be27e3SBrandon Lo }
274789be27e3SBrandon Lo 
274889be27e3SBrandon Lo static int
274989be27e3SBrandon Lo fips_test_one_vector_set(void)
275089be27e3SBrandon Lo {
275189be27e3SBrandon Lo 	int ret;
2752b455d261SGowrishankar Muthukrishnan 	json_t *test_groups, *write_groups, *write_version, *write_set, *mode;
275389be27e3SBrandon Lo 	size_t group_idx, num_groups;
275489be27e3SBrandon Lo 
275589be27e3SBrandon Lo 	test_groups = json_object_get(json_info.json_vector_set, "testGroups");
275689be27e3SBrandon Lo 	num_groups = json_array_size(test_groups);
275789be27e3SBrandon Lo 
275889be27e3SBrandon Lo 	json_info.json_write_set = json_array();
275989be27e3SBrandon Lo 	write_version = json_object();
276089be27e3SBrandon Lo 	json_object_set_new(write_version, "acvVersion", json_string(ACVVERSION));
276189be27e3SBrandon Lo 	json_array_append_new(json_info.json_write_set, write_version);
276289be27e3SBrandon Lo 
276389be27e3SBrandon Lo 	write_set = json_object();
276489be27e3SBrandon Lo 	json_array_append(json_info.json_write_set, write_set);
276589be27e3SBrandon Lo 	write_groups = json_array();
276689be27e3SBrandon Lo 
276789be27e3SBrandon Lo 	json_object_set(write_set, "vsId",
276889be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "vsId"));
276989be27e3SBrandon Lo 	json_object_set(write_set, "algorithm",
277089be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "algorithm"));
2771b455d261SGowrishankar Muthukrishnan 	mode = json_object_get(json_info.json_vector_set, "mode");
2772b455d261SGowrishankar Muthukrishnan 	if (mode != NULL)
2773b455d261SGowrishankar Muthukrishnan 		json_object_set_new(write_set, "mode", mode);
2774b455d261SGowrishankar Muthukrishnan 
277589be27e3SBrandon Lo 	json_object_set(write_set, "revision",
277689be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "revision"));
277789be27e3SBrandon Lo 	json_object_set_new(write_set, "isSample",
277889be27e3SBrandon Lo 		json_boolean(json_info.is_sample));
277989be27e3SBrandon Lo 	json_object_set_new(write_set, "testGroups", write_groups);
278089be27e3SBrandon Lo 
278189be27e3SBrandon Lo 	ret = fips_test_parse_one_json_vector_set();
278289be27e3SBrandon Lo 	if (ret < 0) {
278389be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error: Unsupported or invalid vector set algorithm: %s\n",
278489be27e3SBrandon Lo 			json_string_value(json_object_get(json_info.json_vector_set, "algorithm")));
278589be27e3SBrandon Lo 		return ret;
278689be27e3SBrandon Lo 	}
278789be27e3SBrandon Lo 
278889be27e3SBrandon Lo 	for (group_idx = 0; group_idx < num_groups; group_idx++) {
278989be27e3SBrandon Lo 		json_info.json_test_group = json_array_get(test_groups, group_idx);
279089be27e3SBrandon Lo 		ret = fips_test_one_test_group();
279189be27e3SBrandon Lo 		json_array_append_new(write_groups, json_info.json_write_group);
279289be27e3SBrandon Lo 	}
279389be27e3SBrandon Lo 
279489be27e3SBrandon Lo 	return 0;
279589be27e3SBrandon Lo }
279689be27e3SBrandon Lo 
279789be27e3SBrandon Lo static int
279889be27e3SBrandon Lo fips_test_one_json_file(void)
279989be27e3SBrandon Lo {
280089be27e3SBrandon Lo 	size_t vector_set_idx, root_size;
280189be27e3SBrandon Lo 
280289be27e3SBrandon Lo 	root_size = json_array_size(json_info.json_root);
280389be27e3SBrandon Lo 	fips_test_json_init_writeback();
280489be27e3SBrandon Lo 
280589be27e3SBrandon Lo 	for (vector_set_idx = 1; vector_set_idx < root_size; vector_set_idx++) {
280689be27e3SBrandon Lo 		/* Vector set index starts at 1, the 0th index contains test session
280789be27e3SBrandon Lo 		 * information.
280889be27e3SBrandon Lo 		 */
280989be27e3SBrandon Lo 		json_info.json_vector_set = json_array_get(json_info.json_root, vector_set_idx);
281089be27e3SBrandon Lo 		fips_test_one_vector_set();
281189be27e3SBrandon Lo 		json_array_append_new(json_info.json_write_root, json_info.json_write_set);
2812d5c24714SGowrishankar Muthukrishnan 		json_incref(json_info.json_write_set);
281389be27e3SBrandon Lo 	}
281489be27e3SBrandon Lo 
281589be27e3SBrandon Lo 	json_dumpf(json_info.json_write_root, info.fp_wr, JSON_INDENT(4));
281689be27e3SBrandon Lo 	json_decref(json_info.json_write_root);
281789be27e3SBrandon Lo 
281889be27e3SBrandon Lo 	return 0;
281989be27e3SBrandon Lo }
28208d70a194SDavid Marchand #endif /* USE_JANSSON */
2821