xref: /dpdk/examples/fips_validation/main.c (revision b455d261eb89951733c24cf75467b30441c232df)
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>
153d0fad56SMarko Kovacevic 
163d0fad56SMarko Kovacevic #include "fips_validation.h"
1741d561cbSFan Zhang #include "fips_dev_self_test.h"
183d0fad56SMarko Kovacevic 
19fc6e6515SIbtisam Tariq enum {
20fc6e6515SIbtisam Tariq #define OPT_REQ_FILE_PATH           "req-file"
21fc6e6515SIbtisam Tariq 	OPT_REQ_FILE_PATH_NUM = 256,
22fc6e6515SIbtisam Tariq #define OPT_RSP_FILE_PATH           "rsp-file"
23fc6e6515SIbtisam Tariq 	OPT_RSP_FILE_PATH_NUM,
24fc6e6515SIbtisam Tariq #define OPT_MBUF_DATAROOM           "mbuf-dataroom"
25fc6e6515SIbtisam Tariq 	OPT_MBUF_DATAROOM_NUM,
26fc6e6515SIbtisam Tariq #define OPT_FOLDER                  "path-is-folder"
27fc6e6515SIbtisam Tariq 	OPT_FOLDER_NUM,
28fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV               "cryptodev"
29fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_NUM,
30fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_ID            "cryptodev-id"
31fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_ID_NUM,
32fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_ST            "self-test"
33fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_ST_NUM,
34fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_BK_ID         "broken-test-id"
35fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_BK_ID_NUM,
36fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_BK_DIR_KEY    "broken-test-dir"
37fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_BK_DIR_KEY_NUM,
3889be27e3SBrandon Lo #define OPT_USE_JSON                "use-json"
3989be27e3SBrandon Lo 	OPT_USE_JSON_NUM,
4036128a67SGowrishankar Muthukrishnan #define OPT_CRYPTODEV_ASYM          "asymmetric"
4136128a67SGowrishankar Muthukrishnan 	OPT_CRYPTODEV_ASYM_NUM,
42fc6e6515SIbtisam Tariq };
433d0fad56SMarko Kovacevic 
443d0fad56SMarko Kovacevic struct fips_test_vector vec;
453d0fad56SMarko Kovacevic struct fips_test_interim_info info;
463d0fad56SMarko Kovacevic 
478d70a194SDavid Marchand #ifdef USE_JANSSON
4858cc9880SBrandon Lo struct fips_test_json_info json_info;
498d70a194SDavid Marchand #endif /* USE_JANSSON */
5058cc9880SBrandon Lo 
513d0fad56SMarko Kovacevic struct cryptodev_fips_validate_env {
523d0fad56SMarko Kovacevic 	const char *req_path;
533d0fad56SMarko Kovacevic 	const char *rsp_path;
543d0fad56SMarko Kovacevic 	uint32_t is_path_folder;
55952e10cdSFan Zhang 	uint8_t dev_id;
563d0fad56SMarko Kovacevic 	struct rte_mempool *mpool;
5736128a67SGowrishankar Muthukrishnan 	struct fips_sym_env {
58261bbff7SFan Zhang 		struct rte_mempool *sess_mpool;
593d0fad56SMarko Kovacevic 		struct rte_mempool *op_pool;
6036128a67SGowrishankar Muthukrishnan 		struct rte_cryptodev_sym_session *sess;
6136128a67SGowrishankar Muthukrishnan 		struct rte_crypto_op *op;
6236128a67SGowrishankar Muthukrishnan 	} sym;
6336128a67SGowrishankar Muthukrishnan 	struct fips_asym_env {
6436128a67SGowrishankar Muthukrishnan 		struct rte_mempool *sess_mpool;
6536128a67SGowrishankar Muthukrishnan 		struct rte_mempool *op_pool;
6636128a67SGowrishankar Muthukrishnan 		struct rte_cryptodev_asym_session *sess;
6736128a67SGowrishankar Muthukrishnan 		struct rte_crypto_op *op;
6836128a67SGowrishankar Muthukrishnan 	} asym;
6936128a67SGowrishankar Muthukrishnan 	struct rte_crypto_op *op;
7036128a67SGowrishankar Muthukrishnan 	uint8_t dev_support_sgl;
7136128a67SGowrishankar Muthukrishnan 	uint16_t mbuf_data_room;
723d0fad56SMarko Kovacevic 	struct rte_mbuf *mbuf;
73952e10cdSFan Zhang 	uint8_t *digest;
74952e10cdSFan Zhang 	uint16_t digest_len;
7536128a67SGowrishankar Muthukrishnan 	bool is_asym_test;
76952e10cdSFan Zhang 	uint16_t self_test;
7741d561cbSFan Zhang 	struct fips_dev_broken_test_config *broken_test_config;
783d0fad56SMarko Kovacevic } env;
793d0fad56SMarko Kovacevic 
803d0fad56SMarko Kovacevic static int
8136128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_sym_init(void)
8236128a67SGowrishankar Muthukrishnan {
8336128a67SGowrishankar Muthukrishnan 	uint32_t sess_sz = rte_cryptodev_sym_get_private_session_size(
8436128a67SGowrishankar Muthukrishnan 							env.dev_id);
8536128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_info dev_info;
8636128a67SGowrishankar Muthukrishnan 	struct fips_sym_env *sym = &env.sym;
8736128a67SGowrishankar Muthukrishnan 	int ret;
8836128a67SGowrishankar Muthukrishnan 
8936128a67SGowrishankar Muthukrishnan 	rte_cryptodev_info_get(env.dev_id, &dev_info);
9036128a67SGowrishankar Muthukrishnan 	if (dev_info.feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)
9136128a67SGowrishankar Muthukrishnan 		env.dev_support_sgl = 1;
9236128a67SGowrishankar Muthukrishnan 	else
9336128a67SGowrishankar Muthukrishnan 		env.dev_support_sgl = 0;
9436128a67SGowrishankar Muthukrishnan 
9536128a67SGowrishankar Muthukrishnan 	ret = -ENOMEM;
9636128a67SGowrishankar Muthukrishnan 	sym->sess_mpool = rte_cryptodev_sym_session_pool_create(
9736128a67SGowrishankar Muthukrishnan 			"FIPS_SYM_SESS_MEMPOOL", 16, sess_sz, 0, 0, rte_socket_id());
9836128a67SGowrishankar Muthukrishnan 	if (!sym->sess_mpool)
9936128a67SGowrishankar Muthukrishnan 		goto error_exit;
10036128a67SGowrishankar Muthukrishnan 
10136128a67SGowrishankar Muthukrishnan 	sym->op_pool = rte_crypto_op_pool_create(
10236128a67SGowrishankar Muthukrishnan 			"FIPS_OP_SYM_POOL",
10336128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
10436128a67SGowrishankar Muthukrishnan 			1, 0,
10536128a67SGowrishankar Muthukrishnan 			16,
10636128a67SGowrishankar Muthukrishnan 			rte_socket_id());
10736128a67SGowrishankar Muthukrishnan 	if (!sym->op_pool)
10836128a67SGowrishankar Muthukrishnan 		goto error_exit;
10936128a67SGowrishankar Muthukrishnan 
11036128a67SGowrishankar Muthukrishnan 	sym->op = rte_crypto_op_alloc(sym->op_pool, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11136128a67SGowrishankar Muthukrishnan 	if (!sym->op)
11236128a67SGowrishankar Muthukrishnan 		goto error_exit;
11336128a67SGowrishankar Muthukrishnan 
11436128a67SGowrishankar Muthukrishnan 	return 0;
11536128a67SGowrishankar Muthukrishnan 
11636128a67SGowrishankar Muthukrishnan error_exit:
11736128a67SGowrishankar Muthukrishnan 	rte_mempool_free(sym->sess_mpool);
11836128a67SGowrishankar Muthukrishnan 	rte_mempool_free(sym->op_pool);
11936128a67SGowrishankar Muthukrishnan 	return ret;
12036128a67SGowrishankar Muthukrishnan }
12136128a67SGowrishankar Muthukrishnan 
12236128a67SGowrishankar Muthukrishnan static void
12336128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_sym_uninit(void)
12436128a67SGowrishankar Muthukrishnan {
12536128a67SGowrishankar Muthukrishnan 	struct fips_sym_env *sym = &env.sym;
12636128a67SGowrishankar Muthukrishnan 
12736128a67SGowrishankar Muthukrishnan 	rte_pktmbuf_free(env.mbuf);
12836128a67SGowrishankar Muthukrishnan 	rte_crypto_op_free(sym->op);
12936128a67SGowrishankar Muthukrishnan 	rte_cryptodev_sym_session_free(env.dev_id, sym->sess);
13036128a67SGowrishankar Muthukrishnan 	rte_mempool_free(sym->sess_mpool);
13136128a67SGowrishankar Muthukrishnan 	rte_mempool_free(sym->op_pool);
13236128a67SGowrishankar Muthukrishnan }
13336128a67SGowrishankar Muthukrishnan 
13436128a67SGowrishankar Muthukrishnan static int
13536128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_asym_init(void)
13636128a67SGowrishankar Muthukrishnan {
13736128a67SGowrishankar Muthukrishnan 	struct fips_asym_env *asym = &env.asym;
13836128a67SGowrishankar Muthukrishnan 	int ret;
13936128a67SGowrishankar Muthukrishnan 
14036128a67SGowrishankar Muthukrishnan 	ret = -ENOMEM;
14136128a67SGowrishankar Muthukrishnan 	asym->sess_mpool = rte_cryptodev_asym_session_pool_create(
14236128a67SGowrishankar Muthukrishnan 			"FIPS_ASYM_SESS_MEMPOOL", 16, 0, 0, rte_socket_id());
14336128a67SGowrishankar Muthukrishnan 	if (!asym->sess_mpool)
14436128a67SGowrishankar Muthukrishnan 		goto error_exit;
14536128a67SGowrishankar Muthukrishnan 
14636128a67SGowrishankar Muthukrishnan 	asym->op_pool = rte_crypto_op_pool_create(
14736128a67SGowrishankar Muthukrishnan 			"FIPS_OP_ASYM_POOL",
14836128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
14936128a67SGowrishankar Muthukrishnan 			1, 0,
15036128a67SGowrishankar Muthukrishnan 			16,
15136128a67SGowrishankar Muthukrishnan 			rte_socket_id());
15236128a67SGowrishankar Muthukrishnan 	if (!asym->op_pool)
15336128a67SGowrishankar Muthukrishnan 		goto error_exit;
15436128a67SGowrishankar Muthukrishnan 
15536128a67SGowrishankar Muthukrishnan 	asym->op = rte_crypto_op_alloc(asym->op_pool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
15636128a67SGowrishankar Muthukrishnan 	if (!asym->op)
15736128a67SGowrishankar Muthukrishnan 		goto error_exit;
15836128a67SGowrishankar Muthukrishnan 
15936128a67SGowrishankar Muthukrishnan 	return 0;
16036128a67SGowrishankar Muthukrishnan 
16136128a67SGowrishankar Muthukrishnan error_exit:
16236128a67SGowrishankar Muthukrishnan 	rte_mempool_free(asym->sess_mpool);
16336128a67SGowrishankar Muthukrishnan 	rte_mempool_free(asym->op_pool);
16436128a67SGowrishankar Muthukrishnan 	return ret;
16536128a67SGowrishankar Muthukrishnan }
16636128a67SGowrishankar Muthukrishnan 
16736128a67SGowrishankar Muthukrishnan static void
16836128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_asym_uninit(void)
16936128a67SGowrishankar Muthukrishnan {
17036128a67SGowrishankar Muthukrishnan 	struct fips_asym_env *asym = &env.asym;
17136128a67SGowrishankar Muthukrishnan 
17236128a67SGowrishankar Muthukrishnan 	rte_crypto_op_free(asym->op);
17336128a67SGowrishankar Muthukrishnan 	rte_cryptodev_asym_session_free(env.dev_id, asym->sess);
17436128a67SGowrishankar Muthukrishnan 	rte_mempool_free(asym->sess_mpool);
17536128a67SGowrishankar Muthukrishnan 	rte_mempool_free(asym->op_pool);
17636128a67SGowrishankar Muthukrishnan }
17736128a67SGowrishankar Muthukrishnan 
17836128a67SGowrishankar Muthukrishnan static int
17936128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_init(void)
1803d0fad56SMarko Kovacevic {
181c9030ae3SAnoob Joseph 	struct rte_cryptodev_config conf = {rte_socket_id(), 1, 0};
182bdce2564SAkhil Goyal 	struct rte_cryptodev_qp_conf qp_conf = {128, NULL};
183952e10cdSFan Zhang 	uint32_t nb_mbufs = UINT16_MAX / env.mbuf_data_room + 1;
1843d0fad56SMarko Kovacevic 	int ret;
1853d0fad56SMarko Kovacevic 
18641d561cbSFan Zhang 	if (env.self_test) {
18741d561cbSFan Zhang 		ret = fips_dev_self_test(env.dev_id, env.broken_test_config);
18841d561cbSFan Zhang 		if (ret < 0) {
18936128a67SGowrishankar Muthukrishnan 			rte_cryptodev_stop(env.dev_id);
19074645f64SAkhil Goyal 			rte_cryptodev_close(env.dev_id);
19141d561cbSFan Zhang 
19241d561cbSFan Zhang 			return ret;
19341d561cbSFan Zhang 		}
19441d561cbSFan Zhang 	}
19541d561cbSFan Zhang 
1963d0fad56SMarko Kovacevic 	ret = rte_cryptodev_configure(env.dev_id, &conf);
1973d0fad56SMarko Kovacevic 	if (ret < 0)
1983d0fad56SMarko Kovacevic 		return ret;
1993d0fad56SMarko Kovacevic 
20036128a67SGowrishankar Muthukrishnan 	ret = -ENOMEM;
201952e10cdSFan Zhang 	env.mpool = rte_pktmbuf_pool_create("FIPS_MEMPOOL", nb_mbufs,
202952e10cdSFan Zhang 			0, 0, sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM +
203952e10cdSFan Zhang 			env.mbuf_data_room, rte_socket_id());
2043d0fad56SMarko Kovacevic 	if (!env.mpool)
2053d0fad56SMarko Kovacevic 		return ret;
2063d0fad56SMarko Kovacevic 
20736128a67SGowrishankar Muthukrishnan 	ret = cryptodev_fips_validate_app_sym_init();
2083d0fad56SMarko Kovacevic 	if (ret < 0)
209261bbff7SFan Zhang 		goto error_exit;
210261bbff7SFan Zhang 
21136128a67SGowrishankar Muthukrishnan 	if (env.is_asym_test) {
21236128a67SGowrishankar Muthukrishnan 		ret = cryptodev_fips_validate_app_asym_init();
21336128a67SGowrishankar Muthukrishnan 		if (ret < 0)
2143d0fad56SMarko Kovacevic 			goto error_exit;
21536128a67SGowrishankar Muthukrishnan 	}
2163d0fad56SMarko Kovacevic 
21736128a67SGowrishankar Muthukrishnan 	qp_conf.mp_session = env.sym.sess_mpool;
218261bbff7SFan Zhang 
219261bbff7SFan Zhang 	ret = rte_cryptodev_queue_pair_setup(env.dev_id, 0, &qp_conf,
220261bbff7SFan Zhang 			rte_socket_id());
221261bbff7SFan Zhang 	if (ret < 0)
222261bbff7SFan Zhang 		goto error_exit;
223261bbff7SFan Zhang 
2243b2311ccSFan Zhang 	ret = rte_cryptodev_start(env.dev_id);
2253b2311ccSFan Zhang 	if (ret < 0)
2263b2311ccSFan Zhang 		goto error_exit;
2273b2311ccSFan Zhang 
2283d0fad56SMarko Kovacevic 	return 0;
2293d0fad56SMarko Kovacevic 
2303d0fad56SMarko Kovacevic error_exit:
2313d0fad56SMarko Kovacevic 	rte_mempool_free(env.mpool);
2323d0fad56SMarko Kovacevic 	return ret;
2333d0fad56SMarko Kovacevic }
2343d0fad56SMarko Kovacevic 
2353d0fad56SMarko Kovacevic static void
2363d0fad56SMarko Kovacevic cryptodev_fips_validate_app_uninit(void)
2373d0fad56SMarko Kovacevic {
23836128a67SGowrishankar Muthukrishnan 	cryptodev_fips_validate_app_sym_uninit();
23936128a67SGowrishankar Muthukrishnan 
24036128a67SGowrishankar Muthukrishnan 	if (env.is_asym_test)
24136128a67SGowrishankar Muthukrishnan 		cryptodev_fips_validate_app_asym_uninit();
24236128a67SGowrishankar Muthukrishnan 
2433d0fad56SMarko Kovacevic 	rte_mempool_free(env.mpool);
24436128a67SGowrishankar Muthukrishnan 	rte_cryptodev_stop(env.dev_id);
24536128a67SGowrishankar Muthukrishnan 	rte_cryptodev_close(env.dev_id);
2463d0fad56SMarko Kovacevic }
2473d0fad56SMarko Kovacevic 
2483d0fad56SMarko Kovacevic static int
2493d0fad56SMarko Kovacevic fips_test_one_file(void);
2503d0fad56SMarko Kovacevic 
2518d70a194SDavid Marchand #ifdef USE_JANSSON
25289be27e3SBrandon Lo static int
25389be27e3SBrandon Lo fips_test_one_json_file(void);
2548d70a194SDavid Marchand #endif /* USE_JANSSON */
25589be27e3SBrandon Lo 
2563d0fad56SMarko Kovacevic static int
2573d0fad56SMarko Kovacevic parse_cryptodev_arg(char *arg)
2583d0fad56SMarko Kovacevic {
2593d0fad56SMarko Kovacevic 	int id = rte_cryptodev_get_dev_id(arg);
2603d0fad56SMarko Kovacevic 
2613d0fad56SMarko Kovacevic 	if (id < 0) {
2623d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev name %s\n",
2633d0fad56SMarko Kovacevic 				id, arg);
2643d0fad56SMarko Kovacevic 		return id;
2653d0fad56SMarko Kovacevic 	}
2663d0fad56SMarko Kovacevic 
267952e10cdSFan Zhang 	env.dev_id = (uint8_t)id;
2683d0fad56SMarko Kovacevic 
2693d0fad56SMarko Kovacevic 	return 0;
2703d0fad56SMarko Kovacevic }
2713d0fad56SMarko Kovacevic 
2723d0fad56SMarko Kovacevic static int
2733d0fad56SMarko Kovacevic parse_cryptodev_id_arg(char *arg)
2743d0fad56SMarko Kovacevic {
2753d0fad56SMarko Kovacevic 	uint32_t cryptodev_id;
2763d0fad56SMarko Kovacevic 
2773d0fad56SMarko Kovacevic 	if (parser_read_uint32(&cryptodev_id, arg) < 0) {
2783d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
2793d0fad56SMarko Kovacevic 				-EINVAL, arg);
2803d0fad56SMarko Kovacevic 		return -1;
2813d0fad56SMarko Kovacevic 	}
2823d0fad56SMarko Kovacevic 
2833d0fad56SMarko Kovacevic 
284e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(cryptodev_id)) {
2853d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
2863d0fad56SMarko Kovacevic 				cryptodev_id, arg);
2873d0fad56SMarko Kovacevic 		return -1;
2883d0fad56SMarko Kovacevic 	}
2893d0fad56SMarko Kovacevic 
290952e10cdSFan Zhang 	env.dev_id = (uint8_t)cryptodev_id;
2913d0fad56SMarko Kovacevic 
2923d0fad56SMarko Kovacevic 	return 0;
2933d0fad56SMarko Kovacevic }
2943d0fad56SMarko Kovacevic 
2953d0fad56SMarko Kovacevic static void
2963d0fad56SMarko Kovacevic cryptodev_fips_validate_usage(const char *prgname)
2973d0fad56SMarko Kovacevic {
298952e10cdSFan Zhang 	uint32_t def_mbuf_seg_size = DEF_MBUF_SEG_SIZE;
2993d0fad56SMarko Kovacevic 	printf("%s [EAL options] --\n"
3003d0fad56SMarko Kovacevic 		"  --%s: REQUEST-FILE-PATH\n"
3013d0fad56SMarko Kovacevic 		"  --%s: RESPONSE-FILE-PATH\n"
3023d0fad56SMarko Kovacevic 		"  --%s: indicating both paths are folders\n"
303952e10cdSFan Zhang 		"  --%s: mbuf dataroom size (default %u bytes)\n"
3043d0fad56SMarko Kovacevic 		"  --%s: CRYPTODEV-NAME\n"
30541d561cbSFan Zhang 		"  --%s: CRYPTODEV-ID-NAME\n"
30641d561cbSFan Zhang 		"  --%s: self test indicator\n"
30741d561cbSFan Zhang 		"  --%s: self broken test ID\n"
30841d561cbSFan Zhang 		"  --%s: self broken test direction\n",
309fc6e6515SIbtisam Tariq 		prgname, OPT_REQ_FILE_PATH, OPT_RSP_FILE_PATH,
310fc6e6515SIbtisam Tariq 		OPT_FOLDER, OPT_MBUF_DATAROOM, def_mbuf_seg_size,
311fc6e6515SIbtisam Tariq 		OPT_CRYPTODEV, OPT_CRYPTODEV_ID, OPT_CRYPTODEV_ST,
312fc6e6515SIbtisam Tariq 		OPT_CRYPTODEV_BK_ID, OPT_CRYPTODEV_BK_DIR_KEY);
3133d0fad56SMarko Kovacevic }
3143d0fad56SMarko Kovacevic 
3153d0fad56SMarko Kovacevic static int
3163d0fad56SMarko Kovacevic cryptodev_fips_validate_parse_args(int argc, char **argv)
3173d0fad56SMarko Kovacevic {
3183d0fad56SMarko Kovacevic 	int opt, ret;
3193d0fad56SMarko Kovacevic 	char *prgname = argv[0];
3203d0fad56SMarko Kovacevic 	char **argvopt;
3213d0fad56SMarko Kovacevic 	int option_index;
3223d0fad56SMarko Kovacevic 	struct option lgopts[] = {
323fc6e6515SIbtisam Tariq 		{OPT_REQ_FILE_PATH, required_argument,
324fc6e6515SIbtisam Tariq 				NULL, OPT_REQ_FILE_PATH_NUM},
325fc6e6515SIbtisam Tariq 		{OPT_RSP_FILE_PATH, required_argument,
326fc6e6515SIbtisam Tariq 				NULL, OPT_RSP_FILE_PATH_NUM},
327fc6e6515SIbtisam Tariq 		{OPT_FOLDER, no_argument,
328fc6e6515SIbtisam Tariq 				NULL, OPT_FOLDER_NUM},
329fc6e6515SIbtisam Tariq 		{OPT_MBUF_DATAROOM, required_argument,
330fc6e6515SIbtisam Tariq 				NULL, OPT_MBUF_DATAROOM_NUM},
331fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV, required_argument,
332fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_NUM},
333fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV_ID, required_argument,
334fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_ID_NUM},
335fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV_ST, no_argument,
336fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_ST_NUM},
337fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV_BK_ID, required_argument,
338fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_BK_ID_NUM},
339fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV_BK_DIR_KEY, required_argument,
340fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_BK_DIR_KEY_NUM},
34136128a67SGowrishankar Muthukrishnan 		{OPT_CRYPTODEV_ASYM, no_argument,
34236128a67SGowrishankar Muthukrishnan 				NULL, OPT_CRYPTODEV_ASYM_NUM},
3433d0fad56SMarko Kovacevic 		{NULL, 0, 0, 0}
3443d0fad56SMarko Kovacevic 	};
3453d0fad56SMarko Kovacevic 
3463d0fad56SMarko Kovacevic 	argvopt = argv;
3473d0fad56SMarko Kovacevic 
348952e10cdSFan Zhang 	env.mbuf_data_room = DEF_MBUF_SEG_SIZE;
349952e10cdSFan Zhang 	if (rte_cryptodev_count())
350952e10cdSFan Zhang 		env.dev_id = 0;
351952e10cdSFan Zhang 	else {
352952e10cdSFan Zhang 		cryptodev_fips_validate_usage(prgname);
353952e10cdSFan Zhang 		return -EINVAL;
354952e10cdSFan Zhang 	}
355952e10cdSFan Zhang 
3563d0fad56SMarko Kovacevic 	while ((opt = getopt_long(argc, argvopt, "s:",
3573d0fad56SMarko Kovacevic 				  lgopts, &option_index)) != EOF) {
3583d0fad56SMarko Kovacevic 
3593d0fad56SMarko Kovacevic 		switch (opt) {
360fc6e6515SIbtisam Tariq 		case OPT_REQ_FILE_PATH_NUM:
3613d0fad56SMarko Kovacevic 			env.req_path = optarg;
362fc6e6515SIbtisam Tariq 			break;
363fc6e6515SIbtisam Tariq 
364fc6e6515SIbtisam Tariq 		case OPT_RSP_FILE_PATH_NUM:
3653d0fad56SMarko Kovacevic 			env.rsp_path = optarg;
366fc6e6515SIbtisam Tariq 			break;
367fc6e6515SIbtisam Tariq 
368fc6e6515SIbtisam Tariq 		case OPT_FOLDER_NUM:
3693d0fad56SMarko Kovacevic 			env.is_path_folder = 1;
370fc6e6515SIbtisam Tariq 			break;
371fc6e6515SIbtisam Tariq 
372fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_NUM:
3733d0fad56SMarko Kovacevic 			ret = parse_cryptodev_arg(optarg);
3743d0fad56SMarko Kovacevic 			if (ret < 0) {
3753d0fad56SMarko Kovacevic 				cryptodev_fips_validate_usage(prgname);
3763d0fad56SMarko Kovacevic 				return -EINVAL;
3773d0fad56SMarko Kovacevic 			}
378fc6e6515SIbtisam Tariq 			break;
379fc6e6515SIbtisam Tariq 
380fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_ID_NUM:
3813d0fad56SMarko Kovacevic 			ret = parse_cryptodev_id_arg(optarg);
3823d0fad56SMarko Kovacevic 			if (ret < 0) {
3833d0fad56SMarko Kovacevic 				cryptodev_fips_validate_usage(prgname);
3843d0fad56SMarko Kovacevic 				return -EINVAL;
3853d0fad56SMarko Kovacevic 			}
386fc6e6515SIbtisam Tariq 			break;
387fc6e6515SIbtisam Tariq 
388fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_ST_NUM:
38941d561cbSFan Zhang 			env.self_test = 1;
390fc6e6515SIbtisam Tariq 			break;
391fc6e6515SIbtisam Tariq 
392fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_BK_ID_NUM:
39341d561cbSFan Zhang 			if (!env.broken_test_config) {
39441d561cbSFan Zhang 				env.broken_test_config = rte_malloc(
39541d561cbSFan Zhang 					NULL,
39641d561cbSFan Zhang 					sizeof(*env.broken_test_config),
39741d561cbSFan Zhang 					0);
39841d561cbSFan Zhang 				if (!env.broken_test_config)
39941d561cbSFan Zhang 					return -ENOMEM;
40041d561cbSFan Zhang 
40141d561cbSFan Zhang 				env.broken_test_config->expect_fail_dir =
40241d561cbSFan Zhang 					self_test_dir_enc_auth_gen;
40341d561cbSFan Zhang 			}
40441d561cbSFan Zhang 
40541d561cbSFan Zhang 			if (parser_read_uint32(
40641d561cbSFan Zhang 				&env.broken_test_config->expect_fail_test_idx,
40741d561cbSFan Zhang 					optarg) < 0) {
40841d561cbSFan Zhang 				rte_free(env.broken_test_config);
40941d561cbSFan Zhang 				cryptodev_fips_validate_usage(prgname);
41041d561cbSFan Zhang 				return -EINVAL;
41141d561cbSFan Zhang 			}
412fc6e6515SIbtisam Tariq 			break;
413fc6e6515SIbtisam Tariq 
414fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_BK_DIR_KEY_NUM:
41541d561cbSFan Zhang 			if (!env.broken_test_config) {
41641d561cbSFan Zhang 				env.broken_test_config = rte_malloc(
41741d561cbSFan Zhang 					NULL,
41841d561cbSFan Zhang 					sizeof(*env.broken_test_config),
41941d561cbSFan Zhang 					0);
42041d561cbSFan Zhang 				if (!env.broken_test_config)
42141d561cbSFan Zhang 					return -ENOMEM;
42241d561cbSFan Zhang 
423fc6e6515SIbtisam Tariq 				env.broken_test_config->expect_fail_test_idx =
424fc6e6515SIbtisam Tariq 					0;
42541d561cbSFan Zhang 			}
42641d561cbSFan Zhang 
427fc6e6515SIbtisam Tariq 			if (strcmp(optarg, "enc") == 0)
42841d561cbSFan Zhang 				env.broken_test_config->expect_fail_dir =
42941d561cbSFan Zhang 					self_test_dir_enc_auth_gen;
430fc6e6515SIbtisam Tariq 			else if (strcmp(optarg, "dec")
43141d561cbSFan Zhang 					== 0)
43241d561cbSFan Zhang 				env.broken_test_config->expect_fail_dir =
43341d561cbSFan Zhang 					self_test_dir_dec_auth_verify;
43441d561cbSFan Zhang 			else {
43541d561cbSFan Zhang 				rte_free(env.broken_test_config);
43641d561cbSFan Zhang 				cryptodev_fips_validate_usage(prgname);
43741d561cbSFan Zhang 				return -EINVAL;
43841d561cbSFan Zhang 			}
439fc6e6515SIbtisam Tariq 			break;
440952e10cdSFan Zhang 
441fc6e6515SIbtisam Tariq 
442fc6e6515SIbtisam Tariq 		case OPT_MBUF_DATAROOM_NUM:
443fc6e6515SIbtisam Tariq 			if (parser_read_uint16(&env.mbuf_data_room,
444952e10cdSFan Zhang 					optarg) < 0) {
445952e10cdSFan Zhang 				cryptodev_fips_validate_usage(prgname);
446952e10cdSFan Zhang 				return -EINVAL;
447952e10cdSFan Zhang 			}
448952e10cdSFan Zhang 
449fc6e6515SIbtisam Tariq 			if (env.mbuf_data_room == 0) {
4503d0fad56SMarko Kovacevic 				cryptodev_fips_validate_usage(prgname);
4513d0fad56SMarko Kovacevic 				return -EINVAL;
4523d0fad56SMarko Kovacevic 			}
4533d0fad56SMarko Kovacevic 			break;
454fc6e6515SIbtisam Tariq 
45536128a67SGowrishankar Muthukrishnan 		case OPT_CRYPTODEV_ASYM_NUM:
45636128a67SGowrishankar Muthukrishnan 			env.is_asym_test = true;
45736128a67SGowrishankar Muthukrishnan 			break;
45836128a67SGowrishankar Muthukrishnan 
4593d0fad56SMarko Kovacevic 		default:
460fc6e6515SIbtisam Tariq 			cryptodev_fips_validate_usage(prgname);
461fc6e6515SIbtisam Tariq 			return -EINVAL;
4623d0fad56SMarko Kovacevic 		}
4633d0fad56SMarko Kovacevic 	}
4643d0fad56SMarko Kovacevic 
4651442ab1aSOlivier Matz 	if ((env.req_path == NULL && env.rsp_path != NULL) ||
4661442ab1aSOlivier Matz 			(env.req_path != NULL && env.rsp_path == NULL)) {
4671442ab1aSOlivier Matz 		RTE_LOG(ERR, USER1, "Missing req path or rsp path\n");
4681442ab1aSOlivier Matz 		cryptodev_fips_validate_usage(prgname);
4691442ab1aSOlivier Matz 		return -EINVAL;
4701442ab1aSOlivier Matz 	}
4711442ab1aSOlivier Matz 
4721442ab1aSOlivier Matz 	if (env.req_path == NULL && env.self_test == 0) {
4731442ab1aSOlivier Matz 		RTE_LOG(ERR, USER1, "--self-test must be set if req path is missing\n");
4743d0fad56SMarko Kovacevic 		cryptodev_fips_validate_usage(prgname);
4753d0fad56SMarko Kovacevic 		return -EINVAL;
4763d0fad56SMarko Kovacevic 	}
4773d0fad56SMarko Kovacevic 
4783d0fad56SMarko Kovacevic 	return 0;
4793d0fad56SMarko Kovacevic }
4803d0fad56SMarko Kovacevic 
4813d0fad56SMarko Kovacevic int
4823d0fad56SMarko Kovacevic main(int argc, char *argv[])
4833d0fad56SMarko Kovacevic {
4843d0fad56SMarko Kovacevic 	int ret;
4853d0fad56SMarko Kovacevic 
4863d0fad56SMarko Kovacevic 	ret = rte_eal_init(argc, argv);
4873d0fad56SMarko Kovacevic 	if (ret < 0) {
4883d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
4893d0fad56SMarko Kovacevic 		return -1;
4903d0fad56SMarko Kovacevic 	}
4913d0fad56SMarko Kovacevic 
4923d0fad56SMarko Kovacevic 	argc -= ret;
4933d0fad56SMarko Kovacevic 	argv += ret;
4943d0fad56SMarko Kovacevic 
4953d0fad56SMarko Kovacevic 	ret = cryptodev_fips_validate_parse_args(argc, argv);
4963d0fad56SMarko Kovacevic 	if (ret < 0)
4973d0fad56SMarko Kovacevic 		rte_exit(EXIT_FAILURE, "Failed to parse arguments!\n");
4983d0fad56SMarko Kovacevic 
49936128a67SGowrishankar Muthukrishnan 	ret = cryptodev_fips_validate_app_init();
5003d0fad56SMarko Kovacevic 	if (ret < 0) {
5013d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
5023d0fad56SMarko Kovacevic 		return -1;
5033d0fad56SMarko Kovacevic 	}
5043d0fad56SMarko Kovacevic 
5051442ab1aSOlivier Matz 	if (env.req_path == NULL || env.rsp_path == NULL) {
5061442ab1aSOlivier Matz 		printf("No request, exit.\n");
5071442ab1aSOlivier Matz 		goto exit;
5081442ab1aSOlivier Matz 	}
5091442ab1aSOlivier Matz 
5103d0fad56SMarko Kovacevic 	if (!env.is_path_folder) {
5113d0fad56SMarko Kovacevic 		printf("Processing file %s... ", env.req_path);
5123d0fad56SMarko Kovacevic 
5133d0fad56SMarko Kovacevic 		ret = fips_test_init(env.req_path, env.rsp_path,
5143d0fad56SMarko Kovacevic 			rte_cryptodev_name_get(env.dev_id));
5153d0fad56SMarko Kovacevic 		if (ret < 0) {
5163d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
5173d0fad56SMarko Kovacevic 					ret, env.req_path);
5183d0fad56SMarko Kovacevic 			goto exit;
5193d0fad56SMarko Kovacevic 		}
5203d0fad56SMarko Kovacevic 
5218d70a194SDavid Marchand #ifdef USE_JANSSON
52289be27e3SBrandon Lo 		if (info.file_type == FIPS_TYPE_JSON) {
52389be27e3SBrandon Lo 			ret = fips_test_one_json_file();
52489be27e3SBrandon Lo 			json_decref(json_info.json_root);
52589be27e3SBrandon Lo 		}  else {
5263d0fad56SMarko Kovacevic 			ret = fips_test_one_file();
52789be27e3SBrandon Lo 		}
5288d70a194SDavid Marchand #else /* USE_JANSSON */
52989be27e3SBrandon Lo 		ret = fips_test_one_file();
5308d70a194SDavid Marchand #endif /* USE_JANSSON */
53189be27e3SBrandon Lo 
5323d0fad56SMarko Kovacevic 		if (ret < 0) {
5333d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
5343d0fad56SMarko Kovacevic 					ret, env.req_path);
5353d0fad56SMarko Kovacevic 			goto exit;
5363d0fad56SMarko Kovacevic 		}
5373d0fad56SMarko Kovacevic 
5383d0fad56SMarko Kovacevic 		printf("Done\n");
5393d0fad56SMarko Kovacevic 
5403d0fad56SMarko Kovacevic 	} else {
5413d0fad56SMarko Kovacevic 		struct dirent *dir;
5423d0fad56SMarko Kovacevic 		DIR *d_req, *d_rsp;
5433d0fad56SMarko Kovacevic 		char req_path[1024];
5443d0fad56SMarko Kovacevic 		char rsp_path[1024];
5453d0fad56SMarko Kovacevic 
5463d0fad56SMarko Kovacevic 		d_req = opendir(env.req_path);
5473d0fad56SMarko Kovacevic 		if (!d_req) {
5483d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Path %s not exist\n",
5493d0fad56SMarko Kovacevic 					-EINVAL, env.req_path);
5503d0fad56SMarko Kovacevic 			goto exit;
5513d0fad56SMarko Kovacevic 		}
5523d0fad56SMarko Kovacevic 
5533d0fad56SMarko Kovacevic 		d_rsp = opendir(env.rsp_path);
5543d0fad56SMarko Kovacevic 		if (!d_rsp) {
5553d0fad56SMarko Kovacevic 			ret = mkdir(env.rsp_path, 0700);
5563d0fad56SMarko Kovacevic 			if (ret == 0)
5573d0fad56SMarko Kovacevic 				d_rsp = opendir(env.rsp_path);
5583d0fad56SMarko Kovacevic 			else {
5593d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Invalid %s\n",
5603d0fad56SMarko Kovacevic 						-EINVAL, env.rsp_path);
5613d0fad56SMarko Kovacevic 				goto exit;
5623d0fad56SMarko Kovacevic 			}
5633d0fad56SMarko Kovacevic 		}
5643d0fad56SMarko Kovacevic 		closedir(d_rsp);
5653d0fad56SMarko Kovacevic 
5663d0fad56SMarko Kovacevic 		while ((dir = readdir(d_req)) != NULL) {
5673d0fad56SMarko Kovacevic 			if (strstr(dir->d_name, "req") == NULL)
5683d0fad56SMarko Kovacevic 				continue;
5693d0fad56SMarko Kovacevic 
5703d0fad56SMarko Kovacevic 			snprintf(req_path, 1023, "%s/%s", env.req_path,
5713d0fad56SMarko Kovacevic 					dir->d_name);
5723d0fad56SMarko Kovacevic 			snprintf(rsp_path, 1023, "%s/%s", env.rsp_path,
5733d0fad56SMarko Kovacevic 					dir->d_name);
5743d0fad56SMarko Kovacevic 			strlcpy(strstr(rsp_path, "req"), "rsp", 4);
5753d0fad56SMarko Kovacevic 
5763d0fad56SMarko Kovacevic 			printf("Processing file %s... ", req_path);
5773d0fad56SMarko Kovacevic 
5783d0fad56SMarko Kovacevic 			ret = fips_test_init(req_path, rsp_path,
5793d0fad56SMarko Kovacevic 			rte_cryptodev_name_get(env.dev_id));
5803d0fad56SMarko Kovacevic 			if (ret < 0) {
5813d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
5823d0fad56SMarko Kovacevic 						ret, req_path);
5833d0fad56SMarko Kovacevic 				break;
5843d0fad56SMarko Kovacevic 			}
5853d0fad56SMarko Kovacevic 
5868d70a194SDavid Marchand #ifdef USE_JANSSON
58789be27e3SBrandon Lo 			if (info.file_type == FIPS_TYPE_JSON) {
58889be27e3SBrandon Lo 				ret = fips_test_one_json_file();
58989be27e3SBrandon Lo 				json_decref(json_info.json_root);
59089be27e3SBrandon Lo 			} else {
5913d0fad56SMarko Kovacevic 				ret = fips_test_one_file();
59289be27e3SBrandon Lo 			}
5938d70a194SDavid Marchand #else /* USE_JANSSON */
59489be27e3SBrandon Lo 			ret = fips_test_one_file();
5958d70a194SDavid Marchand #endif /* USE_JANSSON */
59689be27e3SBrandon Lo 
5973d0fad56SMarko Kovacevic 			if (ret < 0) {
5983d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
5993d0fad56SMarko Kovacevic 						ret, req_path);
6003d0fad56SMarko Kovacevic 				break;
6013d0fad56SMarko Kovacevic 			}
6023d0fad56SMarko Kovacevic 
6033d0fad56SMarko Kovacevic 			printf("Done\n");
6043d0fad56SMarko Kovacevic 		}
6053d0fad56SMarko Kovacevic 
6063d0fad56SMarko Kovacevic 		closedir(d_req);
6073d0fad56SMarko Kovacevic 	}
6083d0fad56SMarko Kovacevic 
6093d0fad56SMarko Kovacevic 
6103d0fad56SMarko Kovacevic exit:
6113d0fad56SMarko Kovacevic 	fips_test_clear();
6123d0fad56SMarko Kovacevic 	cryptodev_fips_validate_app_uninit();
6133d0fad56SMarko Kovacevic 
61410aa3757SChengchang Tang 	/* clean up the EAL */
61510aa3757SChengchang Tang 	rte_eal_cleanup();
61610aa3757SChengchang Tang 
6173d0fad56SMarko Kovacevic 	return ret;
6183d0fad56SMarko Kovacevic 
6193d0fad56SMarko Kovacevic }
6203d0fad56SMarko Kovacevic 
621cd255ccfSMarko Kovacevic #define IV_OFF (sizeof(struct rte_crypto_op) + sizeof(struct rte_crypto_sym_op))
622cd255ccfSMarko Kovacevic #define CRYPTODEV_FIPS_MAX_RETRIES	16
623cd255ccfSMarko Kovacevic 
624d09abf2dSFan Zhang struct fips_test_ops test_ops;
625cd255ccfSMarko Kovacevic 
626cd255ccfSMarko Kovacevic static int
627952e10cdSFan Zhang prepare_data_mbufs(struct fips_val *val)
628952e10cdSFan Zhang {
629952e10cdSFan Zhang 	struct rte_mbuf *m, *head = 0;
630952e10cdSFan Zhang 	uint8_t *src = val->val;
631952e10cdSFan Zhang 	uint32_t total_len = val->len;
632952e10cdSFan Zhang 	uint16_t nb_seg;
633952e10cdSFan Zhang 	int ret = 0;
634952e10cdSFan Zhang 
635952e10cdSFan Zhang 	rte_pktmbuf_free(env.mbuf);
636952e10cdSFan Zhang 
637952e10cdSFan Zhang 	if (total_len > RTE_MBUF_MAX_NB_SEGS) {
638952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Data len %u too big\n", total_len);
639952e10cdSFan Zhang 		return -EPERM;
640952e10cdSFan Zhang 	}
641952e10cdSFan Zhang 
642952e10cdSFan Zhang 	nb_seg = total_len / env.mbuf_data_room;
643952e10cdSFan Zhang 	if (total_len % env.mbuf_data_room)
644952e10cdSFan Zhang 		nb_seg++;
645952e10cdSFan Zhang 
646952e10cdSFan Zhang 	m = rte_pktmbuf_alloc(env.mpool);
647952e10cdSFan Zhang 	if (!m) {
648952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error %i: Not enough mbuf\n",
649952e10cdSFan Zhang 				-ENOMEM);
650952e10cdSFan Zhang 		return -ENOMEM;
651952e10cdSFan Zhang 	}
652952e10cdSFan Zhang 	head = m;
653952e10cdSFan Zhang 
654952e10cdSFan Zhang 	while (nb_seg) {
655952e10cdSFan Zhang 		uint16_t len = RTE_MIN(total_len, env.mbuf_data_room);
656952e10cdSFan Zhang 		uint8_t *dst = (uint8_t *)rte_pktmbuf_append(m, len);
657952e10cdSFan Zhang 
658952e10cdSFan Zhang 		if (!dst) {
659952e10cdSFan Zhang 			RTE_LOG(ERR, USER1, "Error %i: MBUF too small\n",
660952e10cdSFan Zhang 					-ENOMEM);
661952e10cdSFan Zhang 			ret = -ENOMEM;
662952e10cdSFan Zhang 			goto error_exit;
663952e10cdSFan Zhang 		}
664952e10cdSFan Zhang 
665952e10cdSFan Zhang 		memcpy(dst, src, len);
666952e10cdSFan Zhang 
667952e10cdSFan Zhang 		if (head != m) {
668952e10cdSFan Zhang 			ret = rte_pktmbuf_chain(head, m);
669952e10cdSFan Zhang 			if (ret) {
670952e10cdSFan Zhang 				rte_pktmbuf_free(m);
671952e10cdSFan Zhang 				RTE_LOG(ERR, USER1, "Error %i: SGL build\n",
672952e10cdSFan Zhang 						ret);
673952e10cdSFan Zhang 				goto error_exit;
674952e10cdSFan Zhang 			}
675952e10cdSFan Zhang 		}
676952e10cdSFan Zhang 		total_len -= len;
677952e10cdSFan Zhang 
678952e10cdSFan Zhang 		if (total_len) {
679952e10cdSFan Zhang 			if (!env.dev_support_sgl) {
680952e10cdSFan Zhang 				RTE_LOG(ERR, USER1, "SGL not supported\n");
681952e10cdSFan Zhang 				ret = -EPERM;
682952e10cdSFan Zhang 				goto error_exit;
683952e10cdSFan Zhang 			}
684952e10cdSFan Zhang 
685952e10cdSFan Zhang 			m = rte_pktmbuf_alloc(env.mpool);
686952e10cdSFan Zhang 			if (!m) {
687952e10cdSFan Zhang 				RTE_LOG(ERR, USER1, "Error %i: No memory\n",
688952e10cdSFan Zhang 						-ENOMEM);
689952e10cdSFan Zhang 				goto error_exit;
690952e10cdSFan Zhang 			}
691952e10cdSFan Zhang 		} else
692952e10cdSFan Zhang 			break;
693952e10cdSFan Zhang 
694952e10cdSFan Zhang 		src += len;
695952e10cdSFan Zhang 		nb_seg--;
696952e10cdSFan Zhang 	}
697952e10cdSFan Zhang 
698952e10cdSFan Zhang 	if (total_len) {
699952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error %i: Failed to store all data\n",
700952e10cdSFan Zhang 				-ENOMEM);
701952e10cdSFan Zhang 		goto error_exit;
702952e10cdSFan Zhang 	}
703952e10cdSFan Zhang 
704952e10cdSFan Zhang 	env.mbuf = head;
705952e10cdSFan Zhang 
706952e10cdSFan Zhang 	return 0;
707952e10cdSFan Zhang 
708952e10cdSFan Zhang error_exit:
709952e10cdSFan Zhang 	rte_pktmbuf_free(head);
710952e10cdSFan Zhang 	return ret;
711952e10cdSFan Zhang }
712952e10cdSFan Zhang 
713952e10cdSFan Zhang static int
714cd255ccfSMarko Kovacevic prepare_cipher_op(void)
715cd255ccfSMarko Kovacevic {
716cd255ccfSMarko Kovacevic 	struct rte_crypto_sym_op *sym = env.op->sym;
717cd255ccfSMarko Kovacevic 	uint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *, IV_OFF);
718952e10cdSFan Zhang 	int ret;
719cd255ccfSMarko Kovacevic 
720cd255ccfSMarko Kovacevic 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
721cd255ccfSMarko Kovacevic 
722cd255ccfSMarko Kovacevic 	memcpy(iv, vec.iv.val, vec.iv.len);
723cd255ccfSMarko Kovacevic 
724cd255ccfSMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
725952e10cdSFan Zhang 		ret = prepare_data_mbufs(&vec.pt);
726952e10cdSFan Zhang 		if (ret < 0)
727952e10cdSFan Zhang 			return ret;
728cd255ccfSMarko Kovacevic 
729cd255ccfSMarko Kovacevic 		sym->cipher.data.length = vec.pt.len;
730cd255ccfSMarko Kovacevic 	} else {
731952e10cdSFan Zhang 		ret = prepare_data_mbufs(&vec.ct);
732952e10cdSFan Zhang 		if (ret < 0)
733952e10cdSFan Zhang 			return ret;
734cd255ccfSMarko Kovacevic 
735cd255ccfSMarko Kovacevic 		sym->cipher.data.length = vec.ct.len;
736cd255ccfSMarko Kovacevic 	}
737cd255ccfSMarko Kovacevic 
73836128a67SGowrishankar Muthukrishnan 	rte_crypto_op_attach_sym_session(env.op, env.sym.sess);
739cd255ccfSMarko Kovacevic 
740952e10cdSFan Zhang 	sym->m_src = env.mbuf;
741952e10cdSFan Zhang 	sym->cipher.data.offset = 0;
742952e10cdSFan Zhang 
743cd255ccfSMarko Kovacevic 	return 0;
744cd255ccfSMarko Kovacevic }
745cd255ccfSMarko Kovacevic 
746d09abf2dSFan Zhang int
747f64adb67SMarko Kovacevic prepare_auth_op(void)
748f64adb67SMarko Kovacevic {
749f64adb67SMarko Kovacevic 	struct rte_crypto_sym_op *sym = env.op->sym;
750952e10cdSFan Zhang 	int ret;
751f64adb67SMarko Kovacevic 
752f64adb67SMarko Kovacevic 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
753952e10cdSFan Zhang 
754e27268bdSBrian Dooley 	if (info.interim_info.gcm_data.gen_iv == 1) {
755e27268bdSBrian Dooley 		uint32_t i;
756e27268bdSBrian Dooley 
757e27268bdSBrian Dooley 		if (!vec.iv.val) {
758e27268bdSBrian Dooley 			vec.iv.val = rte_malloc(0, vec.iv.len, 0);
759e27268bdSBrian Dooley 			if (!vec.iv.val)
760e27268bdSBrian Dooley 				return -ENOMEM;
761e27268bdSBrian Dooley 		}
762e27268bdSBrian Dooley 
763e27268bdSBrian Dooley 		for (i = 0; i < vec.iv.len; i++) {
764e27268bdSBrian Dooley 			int random = rand();
765e27268bdSBrian Dooley 			vec.iv.val[i] = (uint8_t)random;
766e27268bdSBrian Dooley 		}
767e27268bdSBrian Dooley 	}
768e27268bdSBrian Dooley 
769d09abf2dSFan Zhang 	if (vec.iv.len) {
770d09abf2dSFan Zhang 		uint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *,
771d09abf2dSFan Zhang 				IV_OFF);
772d09abf2dSFan Zhang 		memset(iv, 0, vec.iv.len);
773d09abf2dSFan Zhang 		if (vec.iv.val)
774d09abf2dSFan Zhang 			memcpy(iv, vec.iv.val, vec.iv.len);
775d09abf2dSFan Zhang 	}
776d09abf2dSFan Zhang 
777952e10cdSFan Zhang 	ret = prepare_data_mbufs(&vec.pt);
778952e10cdSFan Zhang 	if (ret < 0)
779952e10cdSFan Zhang 		return ret;
780952e10cdSFan Zhang 
781952e10cdSFan Zhang 	rte_free(env.digest);
782952e10cdSFan Zhang 
783952e10cdSFan Zhang 	env.digest = rte_zmalloc(NULL, vec.cipher_auth.digest.len,
784952e10cdSFan Zhang 			RTE_CACHE_LINE_SIZE);
785952e10cdSFan Zhang 	if (!env.digest) {
786952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Not enough memory\n");
787952e10cdSFan Zhang 		return -ENOMEM;
788952e10cdSFan Zhang 	}
789952e10cdSFan Zhang 	env.digest_len = vec.cipher_auth.digest.len;
790f64adb67SMarko Kovacevic 
791f64adb67SMarko Kovacevic 	sym->m_src = env.mbuf;
792f64adb67SMarko Kovacevic 	sym->auth.data.offset = 0;
793f64adb67SMarko Kovacevic 	sym->auth.data.length = vec.pt.len;
794952e10cdSFan Zhang 	sym->auth.digest.data = env.digest;
795952e10cdSFan Zhang 	sym->auth.digest.phys_addr = rte_malloc_virt2iova(env.digest);
796f64adb67SMarko Kovacevic 
79782cfb9c2SFan Zhang 	if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
798952e10cdSFan Zhang 		memcpy(env.digest, vec.cipher_auth.digest.val,
79982cfb9c2SFan Zhang 				vec.cipher_auth.digest.len);
800f64adb67SMarko Kovacevic 
80136128a67SGowrishankar Muthukrishnan 	rte_crypto_op_attach_sym_session(env.op, env.sym.sess);
802c05e4ab7SThomas Monjalon 
803c05e4ab7SThomas Monjalon 	return 0;
804f64adb67SMarko Kovacevic }
805f64adb67SMarko Kovacevic 
806d09abf2dSFan Zhang int
8074aaad299SMarko Kovacevic prepare_aead_op(void)
8084aaad299SMarko Kovacevic {
8094aaad299SMarko Kovacevic 	struct rte_crypto_sym_op *sym = env.op->sym;
8104aaad299SMarko Kovacevic 	uint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *, IV_OFF);
811952e10cdSFan Zhang 	int ret;
8124aaad299SMarko Kovacevic 
8134aaad299SMarko Kovacevic 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8144aaad299SMarko Kovacevic 
815305921f4SMarko Kovacevic 	if (info.algo == FIPS_TEST_ALGO_AES_CCM)
816952e10cdSFan Zhang 		iv++;
8174aaad299SMarko Kovacevic 
818952e10cdSFan Zhang 	if (vec.iv.val)
819952e10cdSFan Zhang 		memcpy(iv, vec.iv.val, vec.iv.len);
820952e10cdSFan Zhang 	else
821952e10cdSFan Zhang 		/* if REQ file has iv length but not data, default as all 0 */
822952e10cdSFan Zhang 		memset(iv, 0, vec.iv.len);
8234aaad299SMarko Kovacevic 
8244aaad299SMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
825952e10cdSFan Zhang 		ret = prepare_data_mbufs(&vec.pt);
826952e10cdSFan Zhang 		if (ret < 0)
827952e10cdSFan Zhang 			return ret;
8284aaad299SMarko Kovacevic 
829952e10cdSFan Zhang 		rte_free(env.digest);
830952e10cdSFan Zhang 		env.digest = rte_zmalloc(NULL, vec.aead.digest.len,
831952e10cdSFan Zhang 				RTE_CACHE_LINE_SIZE);
832952e10cdSFan Zhang 		if (!env.digest) {
833952e10cdSFan Zhang 			RTE_LOG(ERR, USER1, "Not enough memory\n");
8344aaad299SMarko Kovacevic 			return -ENOMEM;
8354aaad299SMarko Kovacevic 		}
836952e10cdSFan Zhang 		env.digest_len = vec.cipher_auth.digest.len;
8374aaad299SMarko Kovacevic 
8384aaad299SMarko Kovacevic 		sym->aead.data.length = vec.pt.len;
839952e10cdSFan Zhang 		sym->aead.digest.data = env.digest;
840952e10cdSFan Zhang 		sym->aead.digest.phys_addr = rte_malloc_virt2iova(env.digest);
8414aaad299SMarko Kovacevic 	} else {
842952e10cdSFan Zhang 		ret = prepare_data_mbufs(&vec.ct);
843952e10cdSFan Zhang 		if (ret < 0)
844952e10cdSFan Zhang 			return ret;
8454aaad299SMarko Kovacevic 
8464aaad299SMarko Kovacevic 		sym->aead.data.length = vec.ct.len;
8474aaad299SMarko Kovacevic 		sym->aead.digest.data = vec.aead.digest.val;
8484aaad299SMarko Kovacevic 		sym->aead.digest.phys_addr = rte_malloc_virt2iova(
8494aaad299SMarko Kovacevic 				sym->aead.digest.data);
8504aaad299SMarko Kovacevic 	}
8514aaad299SMarko Kovacevic 
852952e10cdSFan Zhang 	sym->m_src = env.mbuf;
853952e10cdSFan Zhang 	sym->aead.data.offset = 0;
854952e10cdSFan Zhang 	sym->aead.aad.data = vec.aead.aad.val;
855952e10cdSFan Zhang 	sym->aead.aad.phys_addr = rte_malloc_virt2iova(sym->aead.aad.data);
856952e10cdSFan Zhang 
85736128a67SGowrishankar Muthukrishnan 	rte_crypto_op_attach_sym_session(env.op, env.sym.sess);
85836128a67SGowrishankar Muthukrishnan 
85936128a67SGowrishankar Muthukrishnan 	return 0;
86036128a67SGowrishankar Muthukrishnan }
86136128a67SGowrishankar Muthukrishnan 
86236128a67SGowrishankar Muthukrishnan static int
863ae5ae3bfSGowrishankar Muthukrishnan get_hash_oid(enum rte_crypto_auth_algorithm hash, uint8_t *buf)
864ae5ae3bfSGowrishankar Muthukrishnan {
865ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha512[] = {0x30, 0x51, 0x30, 0x0d, 0x06, 0x09,
866ae5ae3bfSGowrishankar Muthukrishnan 				  0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
867ae5ae3bfSGowrishankar Muthukrishnan 				  0x04, 0x02, 0x03, 0x05, 0x00, 0x04,
868ae5ae3bfSGowrishankar Muthukrishnan 				  0x40};
869ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha384[] = {0x30, 0x41, 0x30, 0x0d, 0x06, 0x09,
870ae5ae3bfSGowrishankar Muthukrishnan 				  0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
871ae5ae3bfSGowrishankar Muthukrishnan 				  0x04, 0x02, 0x02, 0x05, 0x00, 0x04,
872ae5ae3bfSGowrishankar Muthukrishnan 				  0x30};
873ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha256[] = {0x30, 0x31, 0x30, 0x0d, 0x06, 0x09,
874ae5ae3bfSGowrishankar Muthukrishnan 				  0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
875ae5ae3bfSGowrishankar Muthukrishnan 				  0x04, 0x02, 0x01, 0x05, 0x00, 0x04,
876ae5ae3bfSGowrishankar Muthukrishnan 				  0x20};
877ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha224[] = {0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09,
878ae5ae3bfSGowrishankar Muthukrishnan 				  0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
879ae5ae3bfSGowrishankar Muthukrishnan 				  0x04, 0x02, 0x04, 0x05, 0x00, 0x04,
880ae5ae3bfSGowrishankar Muthukrishnan 				  0x1c};
881ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha1[] = {0x30, 0x21, 0x30, 0x09, 0x06, 0x05,
882ae5ae3bfSGowrishankar Muthukrishnan 				0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05,
883ae5ae3bfSGowrishankar Muthukrishnan 				0x00, 0x04, 0x14};
884ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t *id = NULL;
885ae5ae3bfSGowrishankar Muthukrishnan 	int id_len = 0;
886ae5ae3bfSGowrishankar Muthukrishnan 
887ae5ae3bfSGowrishankar Muthukrishnan 	switch (hash) {
888ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA1:
889ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha1;
890ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha1);
891ae5ae3bfSGowrishankar Muthukrishnan 		break;
892ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA224:
893ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha224;
894ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha224);
895ae5ae3bfSGowrishankar Muthukrishnan 		break;
896ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA256:
897ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha256;
898ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha256);
899ae5ae3bfSGowrishankar Muthukrishnan 		break;
900ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA384:
901ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha384;
902ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha384);
903ae5ae3bfSGowrishankar Muthukrishnan 		break;
904ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA512:
905ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha512;
906ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha512);
907ae5ae3bfSGowrishankar Muthukrishnan 		break;
908ae5ae3bfSGowrishankar Muthukrishnan 	default:
909ae5ae3bfSGowrishankar Muthukrishnan 		id_len = -1;
910ae5ae3bfSGowrishankar Muthukrishnan 		break;
911ae5ae3bfSGowrishankar Muthukrishnan 	}
912ae5ae3bfSGowrishankar Muthukrishnan 
913ae5ae3bfSGowrishankar Muthukrishnan 	if (id != NULL)
914ae5ae3bfSGowrishankar Muthukrishnan 		rte_memcpy(buf, id, id_len);
915ae5ae3bfSGowrishankar Muthukrishnan 
916ae5ae3bfSGowrishankar Muthukrishnan 	return id_len;
917ae5ae3bfSGowrishankar Muthukrishnan }
918ae5ae3bfSGowrishankar Muthukrishnan 
919ae5ae3bfSGowrishankar Muthukrishnan static int
92036128a67SGowrishankar Muthukrishnan prepare_rsa_op(void)
92136128a67SGowrishankar Muthukrishnan {
92236128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
92336128a67SGowrishankar Muthukrishnan 	struct fips_val msg;
92436128a67SGowrishankar Muthukrishnan 
92536128a67SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
92636128a67SGowrishankar Muthukrishnan 
92736128a67SGowrishankar Muthukrishnan 	asym = env.op->asym;
92836128a67SGowrishankar Muthukrishnan 	asym->rsa.padding.type = info.interim_info.rsa_data.padding;
92936128a67SGowrishankar Muthukrishnan 	asym->rsa.padding.hash = info.interim_info.rsa_data.auth;
93036128a67SGowrishankar Muthukrishnan 
93136128a67SGowrishankar Muthukrishnan 	if (env.digest) {
932ae5ae3bfSGowrishankar Muthukrishnan 		if (asym->rsa.padding.type == RTE_CRYPTO_RSA_PADDING_PKCS1_5) {
933ae5ae3bfSGowrishankar Muthukrishnan 			int b_len = 0;
934ae5ae3bfSGowrishankar Muthukrishnan 			uint8_t b[32];
935ae5ae3bfSGowrishankar Muthukrishnan 
936ae5ae3bfSGowrishankar Muthukrishnan 			b_len = get_hash_oid(asym->rsa.padding.hash, b);
937ae5ae3bfSGowrishankar Muthukrishnan 			if (b_len < 0) {
938ae5ae3bfSGowrishankar Muthukrishnan 				RTE_LOG(ERR, USER1, "Failed to get digest info for hash %d\n",
939ae5ae3bfSGowrishankar Muthukrishnan 					asym->rsa.padding.hash);
940ae5ae3bfSGowrishankar Muthukrishnan 				return -EINVAL;
941ae5ae3bfSGowrishankar Muthukrishnan 			}
942ae5ae3bfSGowrishankar Muthukrishnan 
943ae5ae3bfSGowrishankar Muthukrishnan 			if (b_len) {
944ae5ae3bfSGowrishankar Muthukrishnan 				msg.len = env.digest_len + b_len;
945ae5ae3bfSGowrishankar Muthukrishnan 				msg.val = rte_zmalloc(NULL, msg.len, 0);
946ae5ae3bfSGowrishankar Muthukrishnan 				rte_memcpy(msg.val, b, b_len);
947ae5ae3bfSGowrishankar Muthukrishnan 				rte_memcpy(msg.val + b_len, env.digest, env.digest_len);
948ae5ae3bfSGowrishankar Muthukrishnan 				rte_free(env.digest);
949ae5ae3bfSGowrishankar Muthukrishnan 				env.digest = msg.val;
950ae5ae3bfSGowrishankar Muthukrishnan 				env.digest_len = msg.len;
951ae5ae3bfSGowrishankar Muthukrishnan 			}
952ae5ae3bfSGowrishankar Muthukrishnan 		}
95336128a67SGowrishankar Muthukrishnan 		msg.val = env.digest;
95436128a67SGowrishankar Muthukrishnan 		msg.len = env.digest_len;
95536128a67SGowrishankar Muthukrishnan 	} else {
95636128a67SGowrishankar Muthukrishnan 		msg.val = vec.pt.val;
95736128a67SGowrishankar Muthukrishnan 		msg.len = vec.pt.len;
95836128a67SGowrishankar Muthukrishnan 	}
95936128a67SGowrishankar Muthukrishnan 
96036128a67SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
96136128a67SGowrishankar Muthukrishnan 		asym->rsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
96236128a67SGowrishankar Muthukrishnan 		asym->rsa.message.data = msg.val;
96336128a67SGowrishankar Muthukrishnan 		asym->rsa.message.length = msg.len;
96436128a67SGowrishankar Muthukrishnan 
96536128a67SGowrishankar Muthukrishnan 		if (vec.rsa.signature.val)
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
989*b455d261SGowrishankar Muthukrishnan prepare_ecdsa_op(void)
990*b455d261SGowrishankar Muthukrishnan {
991*b455d261SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
992*b455d261SGowrishankar Muthukrishnan 	struct fips_val msg;
993*b455d261SGowrishankar Muthukrishnan 
994*b455d261SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
995*b455d261SGowrishankar Muthukrishnan 
996*b455d261SGowrishankar Muthukrishnan 	asym = env.op->asym;
997*b455d261SGowrishankar Muthukrishnan 	if (env.digest) {
998*b455d261SGowrishankar Muthukrishnan 		msg.val = env.digest;
999*b455d261SGowrishankar Muthukrishnan 		msg.len = env.digest_len;
1000*b455d261SGowrishankar Muthukrishnan 	} else {
1001*b455d261SGowrishankar Muthukrishnan 		msg.val = vec.pt.val;
1002*b455d261SGowrishankar Muthukrishnan 		msg.len = vec.pt.len;
1003*b455d261SGowrishankar Muthukrishnan 	}
1004*b455d261SGowrishankar Muthukrishnan 
1005*b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
1006*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
1007*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.data = msg.val;
1008*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.length = msg.len;
1009*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.pkey.data = vec.ecdsa.pkey.val;
1010*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.pkey.length = vec.ecdsa.pkey.len;
1011*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.k.data = vec.ecdsa.k.val;
1012*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.k.length = vec.ecdsa.k.len;
1013*b455d261SGowrishankar Muthukrishnan 
1014*b455d261SGowrishankar Muthukrishnan 		if (vec.ecdsa.r.val)
1015*b455d261SGowrishankar Muthukrishnan 			rte_free(vec.ecdsa.r.val);
1016*b455d261SGowrishankar Muthukrishnan 
1017*b455d261SGowrishankar Muthukrishnan 		if (vec.ecdsa.s.val)
1018*b455d261SGowrishankar Muthukrishnan 			rte_free(vec.ecdsa.s.val);
1019*b455d261SGowrishankar Muthukrishnan 
1020*b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.r.len = info.interim_info.ecdsa_data.curve_len;
1021*b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.r.val = rte_zmalloc(NULL, vec.ecdsa.r.len, 0);
1022*b455d261SGowrishankar Muthukrishnan 
1023*b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.s.len = vec.ecdsa.r.len;
1024*b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.s.val = rte_zmalloc(NULL, vec.ecdsa.s.len, 0);
1025*b455d261SGowrishankar Muthukrishnan 
1026*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.data = vec.ecdsa.r.val;
1027*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.length = 0;
1028*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.data = vec.ecdsa.s.val;
1029*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.length = 0;
1030*b455d261SGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGVER) {
1031*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
1032*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.data = msg.val;
1033*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.length = msg.len;
1034*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.q.x.data = vec.ecdsa.qx.val;
1035*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.q.x.length = vec.ecdsa.qx.len;
1036*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.q.y.data = vec.ecdsa.qy.val;
1037*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.q.y.length = vec.ecdsa.qy.len;
1038*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.data = vec.ecdsa.r.val;
1039*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.length = vec.ecdsa.r.len;
1040*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.data = vec.ecdsa.s.val;
1041*b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.length = vec.ecdsa.s.len;
1042*b455d261SGowrishankar Muthukrishnan 	} else {
1043*b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op);
1044*b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1045*b455d261SGowrishankar Muthukrishnan 	}
1046*b455d261SGowrishankar Muthukrishnan 
1047*b455d261SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
1048*b455d261SGowrishankar Muthukrishnan 
1049*b455d261SGowrishankar Muthukrishnan 	return 0;
1050*b455d261SGowrishankar Muthukrishnan }
1051*b455d261SGowrishankar Muthukrishnan 
1052*b455d261SGowrishankar Muthukrishnan static int
1053*b455d261SGowrishankar Muthukrishnan prepare_ecfpm_op(void)
1054*b455d261SGowrishankar Muthukrishnan {
1055*b455d261SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
1056*b455d261SGowrishankar Muthukrishnan 
1057*b455d261SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1058*b455d261SGowrishankar Muthukrishnan 
1059*b455d261SGowrishankar Muthukrishnan 	asym = env.op->asym;
1060*b455d261SGowrishankar Muthukrishnan 	asym->ecpm.scalar.data = vec.ecdsa.pkey.val;
1061*b455d261SGowrishankar Muthukrishnan 	asym->ecpm.scalar.length = vec.ecdsa.pkey.len;
1062*b455d261SGowrishankar Muthukrishnan 
1063*b455d261SGowrishankar Muthukrishnan 	if (vec.ecdsa.qx.val)
1064*b455d261SGowrishankar Muthukrishnan 		rte_free(vec.ecdsa.qx.val);
1065*b455d261SGowrishankar Muthukrishnan 
1066*b455d261SGowrishankar Muthukrishnan 	if (vec.ecdsa.qy.val)
1067*b455d261SGowrishankar Muthukrishnan 		rte_free(vec.ecdsa.qy.val);
1068*b455d261SGowrishankar Muthukrishnan 
1069*b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qx.len = info.interim_info.ecdsa_data.curve_len;
1070*b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qx.val = rte_zmalloc(NULL, vec.ecdsa.qx.len, 0);
1071*b455d261SGowrishankar Muthukrishnan 
1072*b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qy.len = vec.ecdsa.qx.len;
1073*b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qy.val = rte_zmalloc(NULL, vec.ecdsa.qy.len, 0);
1074*b455d261SGowrishankar Muthukrishnan 
1075*b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.x.data = vec.ecdsa.qx.val;
1076*b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.x.length = 0;
1077*b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.y.data = vec.ecdsa.qy.val;
1078*b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.y.length = 0;
1079*b455d261SGowrishankar Muthukrishnan 
1080*b455d261SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
1081*b455d261SGowrishankar Muthukrishnan 
1082*b455d261SGowrishankar Muthukrishnan 	return 0;
1083*b455d261SGowrishankar Muthukrishnan }
1084*b455d261SGowrishankar Muthukrishnan 
1085*b455d261SGowrishankar Muthukrishnan static int
1086cd255ccfSMarko Kovacevic prepare_aes_xform(struct rte_crypto_sym_xform *xform)
1087cd255ccfSMarko Kovacevic {
1088cd255ccfSMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1089cd255ccfSMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1090cd255ccfSMarko Kovacevic 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1091cd255ccfSMarko Kovacevic 
1092cd255ccfSMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1093d3190431SMichael Shamis 	if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_CBC)
1094cd255ccfSMarko Kovacevic 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CBC;
1095c8956fd2SBrian Dooley 	else if (info.interim_info.aes_data.cipher_algo ==
1096c8956fd2SBrian Dooley 			RTE_CRYPTO_CIPHER_AES_CTR)
1097c8956fd2SBrian Dooley 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CTR;
1098d3190431SMichael Shamis 	else
1099d3190431SMichael Shamis 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_ECB;
1100d3190431SMichael Shamis 
1101cd255ccfSMarko Kovacevic 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1102cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1103cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1104cd255ccfSMarko Kovacevic 	cipher_xform->key.data = vec.cipher_auth.key.val;
1105cd255ccfSMarko Kovacevic 	cipher_xform->key.length = vec.cipher_auth.key.len;
1106c8956fd2SBrian Dooley 	if (cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CBC ||
1107c8956fd2SBrian Dooley 			cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CTR) {
1108cd255ccfSMarko Kovacevic 		cipher_xform->iv.length = vec.iv.len;
1109cd255ccfSMarko Kovacevic 		cipher_xform->iv.offset = IV_OFF;
1110d3190431SMichael Shamis 	} else {
1111d3190431SMichael Shamis 		cipher_xform->iv.length = 0;
1112d3190431SMichael Shamis 		cipher_xform->iv.offset = 0;
1113d3190431SMichael Shamis 	}
1114d3190431SMichael Shamis 	cap_idx.algo.cipher = cipher_xform->algo;
1115cd255ccfSMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1116cd255ccfSMarko Kovacevic 
1117cd255ccfSMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1118cd255ccfSMarko Kovacevic 	if (!cap) {
1119cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1120cd255ccfSMarko Kovacevic 				env.dev_id);
1121cd255ccfSMarko Kovacevic 		return -EINVAL;
1122cd255ccfSMarko Kovacevic 	}
1123cd255ccfSMarko Kovacevic 
1124cd255ccfSMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1125cd255ccfSMarko Kovacevic 			cipher_xform->key.length,
1126cd255ccfSMarko Kovacevic 			cipher_xform->iv.length) != 0) {
1127cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1128cd255ccfSMarko Kovacevic 				info.device_name, cipher_xform->key.length,
1129cd255ccfSMarko Kovacevic 				cipher_xform->iv.length);
1130cd255ccfSMarko Kovacevic 		return -EPERM;
1131cd255ccfSMarko Kovacevic 	}
1132cd255ccfSMarko Kovacevic 
1133cd255ccfSMarko Kovacevic 	return 0;
1134cd255ccfSMarko Kovacevic }
1135cd255ccfSMarko Kovacevic 
1136f64adb67SMarko Kovacevic static int
1137527cbf3dSMarko Kovacevic prepare_tdes_xform(struct rte_crypto_sym_xform *xform)
1138527cbf3dSMarko Kovacevic {
1139527cbf3dSMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1140527cbf3dSMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1141527cbf3dSMarko Kovacevic 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1142527cbf3dSMarko Kovacevic 
1143527cbf3dSMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1144527cbf3dSMarko Kovacevic 
1145efe3a8dbSMichael Shamis 	if (info.interim_info.tdes_data.test_mode == TDES_MODE_CBC)
1146527cbf3dSMarko Kovacevic 		cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_CBC;
1147efe3a8dbSMichael Shamis 	else
1148efe3a8dbSMichael Shamis 		cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_ECB;
1149527cbf3dSMarko Kovacevic 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1150527cbf3dSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1151527cbf3dSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1152527cbf3dSMarko Kovacevic 	cipher_xform->key.data = vec.cipher_auth.key.val;
1153527cbf3dSMarko Kovacevic 	cipher_xform->key.length = vec.cipher_auth.key.len;
1154efe3a8dbSMichael Shamis 
1155efe3a8dbSMichael Shamis 	if (cipher_xform->algo == RTE_CRYPTO_CIPHER_3DES_CBC) {
1156527cbf3dSMarko Kovacevic 		cipher_xform->iv.length = vec.iv.len;
1157527cbf3dSMarko Kovacevic 		cipher_xform->iv.offset = IV_OFF;
1158efe3a8dbSMichael Shamis 	} else {
1159efe3a8dbSMichael Shamis 		cipher_xform->iv.length = 0;
1160efe3a8dbSMichael Shamis 		cipher_xform->iv.offset = 0;
1161efe3a8dbSMichael Shamis 	}
1162efe3a8dbSMichael Shamis 	cap_idx.algo.cipher = cipher_xform->algo;
1163527cbf3dSMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1164527cbf3dSMarko Kovacevic 
1165527cbf3dSMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1166527cbf3dSMarko Kovacevic 	if (!cap) {
1167527cbf3dSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1168527cbf3dSMarko Kovacevic 				env.dev_id);
1169527cbf3dSMarko Kovacevic 		return -EINVAL;
1170527cbf3dSMarko Kovacevic 	}
1171527cbf3dSMarko Kovacevic 
1172527cbf3dSMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1173527cbf3dSMarko Kovacevic 			cipher_xform->key.length,
1174527cbf3dSMarko Kovacevic 			cipher_xform->iv.length) != 0) {
1175527cbf3dSMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1176527cbf3dSMarko Kovacevic 				info.device_name, cipher_xform->key.length,
1177527cbf3dSMarko Kovacevic 				cipher_xform->iv.length);
1178527cbf3dSMarko Kovacevic 		return -EPERM;
1179527cbf3dSMarko Kovacevic 	}
1180527cbf3dSMarko Kovacevic 
1181527cbf3dSMarko Kovacevic 	return 0;
1182527cbf3dSMarko Kovacevic }
1183527cbf3dSMarko Kovacevic 
1184527cbf3dSMarko Kovacevic static int
1185f64adb67SMarko Kovacevic prepare_hmac_xform(struct rte_crypto_sym_xform *xform)
1186f64adb67SMarko Kovacevic {
1187f64adb67SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1188f64adb67SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1189f64adb67SMarko Kovacevic 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1190f64adb67SMarko Kovacevic 
1191f64adb67SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1192f64adb67SMarko Kovacevic 
1193f64adb67SMarko Kovacevic 	auth_xform->algo = info.interim_info.hmac_data.algo;
1194f64adb67SMarko Kovacevic 	auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE;
1195f64adb67SMarko Kovacevic 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1196f64adb67SMarko Kovacevic 	auth_xform->key.data = vec.cipher_auth.key.val;
1197f64adb67SMarko Kovacevic 	auth_xform->key.length = vec.cipher_auth.key.len;
1198f64adb67SMarko Kovacevic 
1199f64adb67SMarko Kovacevic 	cap_idx.algo.auth = auth_xform->algo;
1200f64adb67SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1201f64adb67SMarko Kovacevic 
1202f64adb67SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1203f64adb67SMarko Kovacevic 	if (!cap) {
1204f64adb67SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1205f64adb67SMarko Kovacevic 				env.dev_id);
1206f64adb67SMarko Kovacevic 		return -EINVAL;
1207f64adb67SMarko Kovacevic 	}
1208f64adb67SMarko Kovacevic 
1209f64adb67SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_auth(cap,
1210f64adb67SMarko Kovacevic 			auth_xform->key.length,
1211f64adb67SMarko Kovacevic 			auth_xform->digest_length, 0) != 0) {
1212f64adb67SMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1213f64adb67SMarko Kovacevic 				info.device_name, auth_xform->key.length,
1214f64adb67SMarko Kovacevic 				auth_xform->digest_length);
1215f64adb67SMarko Kovacevic 		return -EPERM;
1216f64adb67SMarko Kovacevic 	}
1217f64adb67SMarko Kovacevic 
1218f64adb67SMarko Kovacevic 	return 0;
1219f64adb67SMarko Kovacevic }
1220f64adb67SMarko Kovacevic 
1221d09abf2dSFan Zhang int
12224aaad299SMarko Kovacevic prepare_gcm_xform(struct rte_crypto_sym_xform *xform)
12234aaad299SMarko Kovacevic {
12244aaad299SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
12254aaad299SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
12264aaad299SMarko Kovacevic 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
12274aaad299SMarko Kovacevic 
12284aaad299SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
12294aaad299SMarko Kovacevic 
12304aaad299SMarko Kovacevic 	aead_xform->algo = RTE_CRYPTO_AEAD_AES_GCM;
12314aaad299SMarko Kovacevic 	aead_xform->aad_length = vec.aead.aad.len;
12324aaad299SMarko Kovacevic 	aead_xform->digest_length = vec.aead.digest.len;
12334aaad299SMarko Kovacevic 	aead_xform->iv.offset = IV_OFF;
12344aaad299SMarko Kovacevic 	aead_xform->iv.length = vec.iv.len;
12354aaad299SMarko Kovacevic 	aead_xform->key.data = vec.aead.key.val;
12364aaad299SMarko Kovacevic 	aead_xform->key.length = vec.aead.key.len;
12374aaad299SMarko Kovacevic 	aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
12384aaad299SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
12394aaad299SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_DECRYPT;
12404aaad299SMarko Kovacevic 
12414aaad299SMarko Kovacevic 	cap_idx.algo.aead = aead_xform->algo;
12424aaad299SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12434aaad299SMarko Kovacevic 
12444aaad299SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
12454aaad299SMarko Kovacevic 	if (!cap) {
12464aaad299SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
12474aaad299SMarko Kovacevic 				env.dev_id);
12484aaad299SMarko Kovacevic 		return -EINVAL;
12494aaad299SMarko Kovacevic 	}
12504aaad299SMarko Kovacevic 
12514aaad299SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_aead(cap,
12524aaad299SMarko Kovacevic 			aead_xform->key.length,
12534aaad299SMarko Kovacevic 			aead_xform->digest_length, aead_xform->aad_length,
12544aaad299SMarko Kovacevic 			aead_xform->iv.length) != 0) {
12554aaad299SMarko Kovacevic 		RTE_LOG(ERR, USER1,
12564aaad299SMarko Kovacevic 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
12574aaad299SMarko Kovacevic 				info.device_name, aead_xform->key.length,
12584aaad299SMarko Kovacevic 				aead_xform->digest_length,
12594aaad299SMarko Kovacevic 				aead_xform->aad_length,
12604aaad299SMarko Kovacevic 				aead_xform->iv.length);
12614aaad299SMarko Kovacevic 		return -EPERM;
12624aaad299SMarko Kovacevic 	}
12634aaad299SMarko Kovacevic 
12644aaad299SMarko Kovacevic 	return 0;
12654aaad299SMarko Kovacevic }
12664aaad299SMarko Kovacevic 
1267d09abf2dSFan Zhang int
1268d09abf2dSFan Zhang prepare_gmac_xform(struct rte_crypto_sym_xform *xform)
1269d09abf2dSFan Zhang {
1270d09abf2dSFan Zhang 	const struct rte_cryptodev_symmetric_capability *cap;
1271d09abf2dSFan Zhang 	struct rte_cryptodev_sym_capability_idx cap_idx;
1272d09abf2dSFan Zhang 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1273d09abf2dSFan Zhang 
1274d09abf2dSFan Zhang 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1275d09abf2dSFan Zhang 
1276d09abf2dSFan Zhang 	auth_xform->algo = RTE_CRYPTO_AUTH_AES_GMAC;
1277d09abf2dSFan Zhang 	auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1278d09abf2dSFan Zhang 			RTE_CRYPTO_AUTH_OP_GENERATE :
1279d09abf2dSFan Zhang 			RTE_CRYPTO_AUTH_OP_VERIFY;
1280d09abf2dSFan Zhang 	auth_xform->iv.offset = IV_OFF;
1281d09abf2dSFan Zhang 	auth_xform->iv.length = vec.iv.len;
1282d09abf2dSFan Zhang 	auth_xform->digest_length = vec.aead.digest.len;
1283d09abf2dSFan Zhang 	auth_xform->key.data = vec.aead.key.val;
1284d09abf2dSFan Zhang 	auth_xform->key.length = vec.aead.key.len;
1285d09abf2dSFan Zhang 
1286d09abf2dSFan Zhang 	cap_idx.algo.auth = auth_xform->algo;
1287d09abf2dSFan Zhang 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1288d09abf2dSFan Zhang 
1289d09abf2dSFan Zhang 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1290d09abf2dSFan Zhang 	if (!cap) {
1291d09abf2dSFan Zhang 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1292d09abf2dSFan Zhang 				env.dev_id);
1293d09abf2dSFan Zhang 		return -EINVAL;
1294d09abf2dSFan Zhang 	}
1295d09abf2dSFan Zhang 
1296d09abf2dSFan Zhang 	if (rte_cryptodev_sym_capability_check_auth(cap,
1297d09abf2dSFan Zhang 			auth_xform->key.length,
1298601b8a54SFan Zhang 			auth_xform->digest_length,
1299601b8a54SFan Zhang 			auth_xform->iv.length) != 0) {
1300601b8a54SFan Zhang 
1301601b8a54SFan Zhang 		RTE_LOG(ERR, USER1,
1302601b8a54SFan Zhang 			"PMD %s key length %u Digest length %u IV length %u\n",
1303d09abf2dSFan Zhang 				info.device_name, auth_xform->key.length,
1304601b8a54SFan Zhang 				auth_xform->digest_length,
1305601b8a54SFan Zhang 				auth_xform->iv.length);
1306d09abf2dSFan Zhang 		return -EPERM;
1307d09abf2dSFan Zhang 	}
1308d09abf2dSFan Zhang 
1309d09abf2dSFan Zhang 	return 0;
1310d09abf2dSFan Zhang }
1311d09abf2dSFan Zhang 
1312ac026f46SMarko Kovacevic static int
1313ac026f46SMarko Kovacevic prepare_cmac_xform(struct rte_crypto_sym_xform *xform)
1314ac026f46SMarko Kovacevic {
1315ac026f46SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1316ac026f46SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1317ac026f46SMarko Kovacevic 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1318ac026f46SMarko Kovacevic 
1319ac026f46SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1320ac026f46SMarko Kovacevic 
1321ac026f46SMarko Kovacevic 	auth_xform->algo = RTE_CRYPTO_AUTH_AES_CMAC;
1322ac026f46SMarko Kovacevic 	auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1323ac026f46SMarko Kovacevic 			RTE_CRYPTO_AUTH_OP_GENERATE : RTE_CRYPTO_AUTH_OP_VERIFY;
1324ac026f46SMarko Kovacevic 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1325ac026f46SMarko Kovacevic 	auth_xform->key.data = vec.cipher_auth.key.val;
1326ac026f46SMarko Kovacevic 	auth_xform->key.length = vec.cipher_auth.key.len;
1327ac026f46SMarko Kovacevic 
1328ac026f46SMarko Kovacevic 	cap_idx.algo.auth = auth_xform->algo;
1329ac026f46SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1330ac026f46SMarko Kovacevic 
1331ac026f46SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1332ac026f46SMarko Kovacevic 	if (!cap) {
1333ac026f46SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1334ac026f46SMarko Kovacevic 				env.dev_id);
1335ac026f46SMarko Kovacevic 		return -EINVAL;
1336ac026f46SMarko Kovacevic 	}
1337ac026f46SMarko Kovacevic 
1338ac026f46SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_auth(cap,
1339ac026f46SMarko Kovacevic 			auth_xform->key.length,
1340ac026f46SMarko Kovacevic 			auth_xform->digest_length, 0) != 0) {
1341ac026f46SMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1342ac026f46SMarko Kovacevic 				info.device_name, auth_xform->key.length,
1343ac026f46SMarko Kovacevic 				auth_xform->digest_length);
1344ac026f46SMarko Kovacevic 		return -EPERM;
1345ac026f46SMarko Kovacevic 	}
1346ac026f46SMarko Kovacevic 
1347ac026f46SMarko Kovacevic 	return 0;
1348ac026f46SMarko Kovacevic }
1349ac026f46SMarko Kovacevic 
1350305921f4SMarko Kovacevic static int
1351305921f4SMarko Kovacevic prepare_ccm_xform(struct rte_crypto_sym_xform *xform)
1352305921f4SMarko Kovacevic {
1353305921f4SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1354305921f4SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1355305921f4SMarko Kovacevic 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
1356305921f4SMarko Kovacevic 
1357305921f4SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
1358305921f4SMarko Kovacevic 
1359305921f4SMarko Kovacevic 	aead_xform->algo = RTE_CRYPTO_AEAD_AES_CCM;
1360305921f4SMarko Kovacevic 	aead_xform->aad_length = vec.aead.aad.len;
1361305921f4SMarko Kovacevic 	aead_xform->digest_length = vec.aead.digest.len;
1362305921f4SMarko Kovacevic 	aead_xform->iv.offset = IV_OFF;
1363305921f4SMarko Kovacevic 	aead_xform->iv.length = vec.iv.len;
1364305921f4SMarko Kovacevic 	aead_xform->key.data = vec.aead.key.val;
1365305921f4SMarko Kovacevic 	aead_xform->key.length = vec.aead.key.len;
1366305921f4SMarko Kovacevic 	aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1367305921f4SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
1368305921f4SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_DECRYPT;
1369305921f4SMarko Kovacevic 
1370305921f4SMarko Kovacevic 	cap_idx.algo.aead = aead_xform->algo;
1371305921f4SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
1372305921f4SMarko Kovacevic 
1373305921f4SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1374305921f4SMarko Kovacevic 	if (!cap) {
1375305921f4SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1376305921f4SMarko Kovacevic 				env.dev_id);
1377305921f4SMarko Kovacevic 		return -EINVAL;
1378305921f4SMarko Kovacevic 	}
1379305921f4SMarko Kovacevic 
1380305921f4SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_aead(cap,
1381305921f4SMarko Kovacevic 			aead_xform->key.length,
1382305921f4SMarko Kovacevic 			aead_xform->digest_length, aead_xform->aad_length,
1383305921f4SMarko Kovacevic 			aead_xform->iv.length) != 0) {
1384305921f4SMarko Kovacevic 		RTE_LOG(ERR, USER1,
1385305921f4SMarko Kovacevic 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
1386305921f4SMarko Kovacevic 				info.device_name, aead_xform->key.length,
1387305921f4SMarko Kovacevic 				aead_xform->digest_length,
1388305921f4SMarko Kovacevic 				aead_xform->aad_length,
1389305921f4SMarko Kovacevic 				aead_xform->iv.length);
1390305921f4SMarko Kovacevic 		return -EPERM;
1391305921f4SMarko Kovacevic 	}
1392305921f4SMarko Kovacevic 
1393305921f4SMarko Kovacevic 	return 0;
1394305921f4SMarko Kovacevic }
1395305921f4SMarko Kovacevic 
1396f4797baeSDamian Nowak static int
1397f4797baeSDamian Nowak prepare_sha_xform(struct rte_crypto_sym_xform *xform)
1398f4797baeSDamian Nowak {
1399f4797baeSDamian Nowak 	const struct rte_cryptodev_symmetric_capability *cap;
1400f4797baeSDamian Nowak 	struct rte_cryptodev_sym_capability_idx cap_idx;
1401f4797baeSDamian Nowak 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1402f4797baeSDamian Nowak 
1403f4797baeSDamian Nowak 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1404f4797baeSDamian Nowak 
1405f4797baeSDamian Nowak 	auth_xform->algo = info.interim_info.sha_data.algo;
1406f4797baeSDamian Nowak 	auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE;
1407f4797baeSDamian Nowak 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1408f4797baeSDamian Nowak 
1409f4797baeSDamian Nowak 	cap_idx.algo.auth = auth_xform->algo;
1410f4797baeSDamian Nowak 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1411f4797baeSDamian Nowak 
1412f4797baeSDamian Nowak 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1413f4797baeSDamian Nowak 	if (!cap) {
1414f4797baeSDamian Nowak 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1415f4797baeSDamian Nowak 				env.dev_id);
1416f4797baeSDamian Nowak 		return -EINVAL;
1417f4797baeSDamian Nowak 	}
1418f4797baeSDamian Nowak 
1419f4797baeSDamian Nowak 	if (rte_cryptodev_sym_capability_check_auth(cap,
1420f4797baeSDamian Nowak 			auth_xform->key.length,
1421f4797baeSDamian Nowak 			auth_xform->digest_length, 0) != 0) {
1422f4797baeSDamian Nowak 		RTE_LOG(ERR, USER1, "PMD %s key length %u digest length %u\n",
1423f4797baeSDamian Nowak 				info.device_name, auth_xform->key.length,
1424f4797baeSDamian Nowak 				auth_xform->digest_length);
1425f4797baeSDamian Nowak 		return -EPERM;
1426f4797baeSDamian Nowak 	}
1427f4797baeSDamian Nowak 
1428f4797baeSDamian Nowak 	return 0;
1429f4797baeSDamian Nowak }
1430f4797baeSDamian Nowak 
1431d5a9ea55SSucharitha Sarananaga static int
1432d5a9ea55SSucharitha Sarananaga prepare_xts_xform(struct rte_crypto_sym_xform *xform)
1433d5a9ea55SSucharitha Sarananaga {
1434d5a9ea55SSucharitha Sarananaga 	const struct rte_cryptodev_symmetric_capability *cap;
1435d5a9ea55SSucharitha Sarananaga 	struct rte_cryptodev_sym_capability_idx cap_idx;
1436d5a9ea55SSucharitha Sarananaga 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1437d5a9ea55SSucharitha Sarananaga 
1438d5a9ea55SSucharitha Sarananaga 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1439d5a9ea55SSucharitha Sarananaga 
1440d5a9ea55SSucharitha Sarananaga 	cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_XTS;
1441d5a9ea55SSucharitha Sarananaga 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1442d5a9ea55SSucharitha Sarananaga 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1443d5a9ea55SSucharitha Sarananaga 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1444d5a9ea55SSucharitha Sarananaga 	cipher_xform->key.data = vec.cipher_auth.key.val;
1445d5a9ea55SSucharitha Sarananaga 	cipher_xform->key.length = vec.cipher_auth.key.len;
1446d5a9ea55SSucharitha Sarananaga 	cipher_xform->iv.length = vec.iv.len;
1447d5a9ea55SSucharitha Sarananaga 	cipher_xform->iv.offset = IV_OFF;
1448d5a9ea55SSucharitha Sarananaga 
1449d5a9ea55SSucharitha Sarananaga 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_XTS;
1450d5a9ea55SSucharitha Sarananaga 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1451d5a9ea55SSucharitha Sarananaga 
1452d5a9ea55SSucharitha Sarananaga 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1453d5a9ea55SSucharitha Sarananaga 	if (!cap) {
1454d5a9ea55SSucharitha Sarananaga 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1455d5a9ea55SSucharitha Sarananaga 				env.dev_id);
1456d5a9ea55SSucharitha Sarananaga 		return -EINVAL;
1457d5a9ea55SSucharitha Sarananaga 	}
1458d5a9ea55SSucharitha Sarananaga 
1459d5a9ea55SSucharitha Sarananaga 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1460d5a9ea55SSucharitha Sarananaga 			cipher_xform->key.length,
1461d5a9ea55SSucharitha Sarananaga 			cipher_xform->iv.length) != 0) {
1462d5a9ea55SSucharitha Sarananaga 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1463d5a9ea55SSucharitha Sarananaga 				info.device_name, cipher_xform->key.length,
1464d5a9ea55SSucharitha Sarananaga 				cipher_xform->iv.length);
1465d5a9ea55SSucharitha Sarananaga 		return -EPERM;
1466d5a9ea55SSucharitha Sarananaga 	}
1467d5a9ea55SSucharitha Sarananaga 
1468d5a9ea55SSucharitha Sarananaga 	return 0;
1469d5a9ea55SSucharitha Sarananaga }
1470d5a9ea55SSucharitha Sarananaga 
1471952e10cdSFan Zhang static int
147236128a67SGowrishankar Muthukrishnan prepare_rsa_xform(struct rte_crypto_asym_xform *xform)
147336128a67SGowrishankar Muthukrishnan {
147436128a67SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
147536128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
147636128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_info dev_info;
147736128a67SGowrishankar Muthukrishnan 
147836128a67SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_RSA;
147936128a67SGowrishankar Muthukrishnan 	xform->next = NULL;
148036128a67SGowrishankar Muthukrishnan 
148136128a67SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
148236128a67SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
148336128a67SGowrishankar Muthukrishnan 	if (!cap) {
148436128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
148536128a67SGowrishankar Muthukrishnan 				env.dev_id);
148636128a67SGowrishankar Muthukrishnan 		return -EINVAL;
148736128a67SGowrishankar Muthukrishnan 	}
148836128a67SGowrishankar Muthukrishnan 
148936128a67SGowrishankar Muthukrishnan 	switch (info.op) {
149036128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
149136128a67SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
149236128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
149336128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
149436128a67SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
149536128a67SGowrishankar Muthukrishnan 			return -EPERM;
149636128a67SGowrishankar Muthukrishnan 		}
149736128a67SGowrishankar Muthukrishnan 		break;
149836128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
149936128a67SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
150036128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
150136128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
150236128a67SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
150336128a67SGowrishankar Muthukrishnan 			return -EPERM;
150436128a67SGowrishankar Muthukrishnan 		}
150536128a67SGowrishankar Muthukrishnan 		break;
150636128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_KEYGEN:
150736128a67SGowrishankar Muthukrishnan 		break;
150836128a67SGowrishankar Muthukrishnan 	default:
150936128a67SGowrishankar Muthukrishnan 		break;
151036128a67SGowrishankar Muthukrishnan 	}
151136128a67SGowrishankar Muthukrishnan 
151236128a67SGowrishankar Muthukrishnan 	rte_cryptodev_info_get(env.dev_id, &dev_info);
151336128a67SGowrishankar Muthukrishnan 	xform->rsa.key_type = info.interim_info.rsa_data.privkey;
151436128a67SGowrishankar Muthukrishnan 	switch (xform->rsa.key_type) {
151536128a67SGowrishankar Muthukrishnan 	case RTE_RSA_KEY_TYPE_QT:
151636128a67SGowrishankar Muthukrishnan 		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT)) {
151736128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s does not support QT key type\n",
151836128a67SGowrishankar Muthukrishnan 				info.device_name);
151936128a67SGowrishankar Muthukrishnan 			return -EPERM;
152036128a67SGowrishankar Muthukrishnan 		}
152136128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.p.data = vec.rsa.p.val;
152236128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.p.length = vec.rsa.p.len;
152336128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.q.data = vec.rsa.q.val;
152436128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.q.length = vec.rsa.q.len;
152536128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dP.data = vec.rsa.dp.val;
152636128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dP.length = vec.rsa.dp.len;
152736128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dQ.data = vec.rsa.dq.val;
152836128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dQ.length = vec.rsa.dq.len;
152936128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.qInv.data = vec.rsa.qinv.val;
153036128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.qInv.length = vec.rsa.qinv.len;
153136128a67SGowrishankar Muthukrishnan 		break;
153236128a67SGowrishankar Muthukrishnan 	case RTE_RSA_KEY_TYPE_EXP:
153336128a67SGowrishankar Muthukrishnan 		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_EXP)) {
153436128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s does not support EXP key type\n",
153536128a67SGowrishankar Muthukrishnan 				info.device_name);
153636128a67SGowrishankar Muthukrishnan 			return -EPERM;
153736128a67SGowrishankar Muthukrishnan 		}
153836128a67SGowrishankar Muthukrishnan 		xform->rsa.d.data = vec.rsa.d.val;
153936128a67SGowrishankar Muthukrishnan 		xform->rsa.d.length = vec.rsa.d.len;
154036128a67SGowrishankar Muthukrishnan 		break;
154136128a67SGowrishankar Muthukrishnan 	default:
154236128a67SGowrishankar Muthukrishnan 		break;
154336128a67SGowrishankar Muthukrishnan 	}
154436128a67SGowrishankar Muthukrishnan 
154536128a67SGowrishankar Muthukrishnan 	xform->rsa.e.data = vec.rsa.e.val;
154636128a67SGowrishankar Muthukrishnan 	xform->rsa.e.length = vec.rsa.e.len;
154736128a67SGowrishankar Muthukrishnan 	xform->rsa.n.data = vec.rsa.n.val;
154836128a67SGowrishankar Muthukrishnan 	xform->rsa.n.length = vec.rsa.n.len;
154936128a67SGowrishankar Muthukrishnan 	return 0;
155036128a67SGowrishankar Muthukrishnan }
155136128a67SGowrishankar Muthukrishnan 
155236128a67SGowrishankar Muthukrishnan static int
1553*b455d261SGowrishankar Muthukrishnan prepare_ecdsa_xform(struct rte_crypto_asym_xform *xform)
1554*b455d261SGowrishankar Muthukrishnan {
1555*b455d261SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1556*b455d261SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1557*b455d261SGowrishankar Muthukrishnan 
1558*b455d261SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECDSA;
1559*b455d261SGowrishankar Muthukrishnan 	xform->next = NULL;
1560*b455d261SGowrishankar Muthukrishnan 
1561*b455d261SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1562*b455d261SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1563*b455d261SGowrishankar Muthukrishnan 	if (!cap) {
1564*b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1565*b455d261SGowrishankar Muthukrishnan 				env.dev_id);
1566*b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1567*b455d261SGowrishankar Muthukrishnan 	}
1568*b455d261SGowrishankar Muthukrishnan 
1569*b455d261SGowrishankar Muthukrishnan 	switch (info.op) {
1570*b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
1571*b455d261SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1572*b455d261SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
1573*b455d261SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1574*b455d261SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
1575*b455d261SGowrishankar Muthukrishnan 			return -EPERM;
1576*b455d261SGowrishankar Muthukrishnan 		}
1577*b455d261SGowrishankar Muthukrishnan 		break;
1578*b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
1579*b455d261SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1580*b455d261SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
1581*b455d261SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1582*b455d261SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
1583*b455d261SGowrishankar Muthukrishnan 			return -EPERM;
1584*b455d261SGowrishankar Muthukrishnan 		}
1585*b455d261SGowrishankar Muthukrishnan 		break;
1586*b455d261SGowrishankar Muthukrishnan 	default:
1587*b455d261SGowrishankar Muthukrishnan 		break;
1588*b455d261SGowrishankar Muthukrishnan 	}
1589*b455d261SGowrishankar Muthukrishnan 
1590*b455d261SGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id;
1591*b455d261SGowrishankar Muthukrishnan 	return 0;
1592*b455d261SGowrishankar Muthukrishnan }
1593*b455d261SGowrishankar Muthukrishnan 
1594*b455d261SGowrishankar Muthukrishnan static int
1595*b455d261SGowrishankar Muthukrishnan prepare_ecfpm_xform(struct rte_crypto_asym_xform *xform)
1596*b455d261SGowrishankar Muthukrishnan {
1597*b455d261SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1598*b455d261SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1599*b455d261SGowrishankar Muthukrishnan 
1600*b455d261SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECFPM;
1601*b455d261SGowrishankar Muthukrishnan 	xform->next = NULL;
1602*b455d261SGowrishankar Muthukrishnan 
1603*b455d261SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1604*b455d261SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1605*b455d261SGowrishankar Muthukrishnan 	if (!cap) {
1606*b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1607*b455d261SGowrishankar Muthukrishnan 				env.dev_id);
1608*b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1609*b455d261SGowrishankar Muthukrishnan 	}
1610*b455d261SGowrishankar Muthukrishnan 
1611*b455d261SGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id;
1612*b455d261SGowrishankar Muthukrishnan 	return 0;
1613*b455d261SGowrishankar Muthukrishnan }
1614*b455d261SGowrishankar Muthukrishnan 
1615*b455d261SGowrishankar Muthukrishnan static int
1616cd255ccfSMarko Kovacevic get_writeback_data(struct fips_val *val)
1617cd255ccfSMarko Kovacevic {
1618952e10cdSFan Zhang 	struct rte_mbuf *m = env.mbuf;
1619952e10cdSFan Zhang 	uint16_t data_len = rte_pktmbuf_pkt_len(m);
1620952e10cdSFan Zhang 	uint16_t total_len = data_len + env.digest_len;
1621952e10cdSFan Zhang 	uint8_t *src, *dst, *wb_data;
1622952e10cdSFan Zhang 
1623952e10cdSFan Zhang 	/* in case val is reused for MCT test, try to free the buffer first */
1624952e10cdSFan Zhang 	if (val->val) {
1625952e10cdSFan Zhang 		free(val->val);
1626952e10cdSFan Zhang 		val->val = NULL;
1627952e10cdSFan Zhang 	}
1628952e10cdSFan Zhang 
1629952e10cdSFan Zhang 	wb_data = dst = calloc(1, total_len);
1630952e10cdSFan Zhang 	if (!dst) {
1631952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error %i: Not enough memory\n", -ENOMEM);
1632952e10cdSFan Zhang 		return -ENOMEM;
1633952e10cdSFan Zhang 	}
1634952e10cdSFan Zhang 
1635952e10cdSFan Zhang 	while (m && data_len) {
1636952e10cdSFan Zhang 		uint16_t seg_len = RTE_MIN(rte_pktmbuf_data_len(m), data_len);
1637952e10cdSFan Zhang 
1638952e10cdSFan Zhang 		src = rte_pktmbuf_mtod(m, uint8_t *);
1639952e10cdSFan Zhang 		memcpy(dst, src, seg_len);
1640952e10cdSFan Zhang 		m = m->next;
1641952e10cdSFan Zhang 		data_len -= seg_len;
1642952e10cdSFan Zhang 		dst += seg_len;
1643952e10cdSFan Zhang 	}
1644952e10cdSFan Zhang 
1645952e10cdSFan Zhang 	if (data_len) {
1646952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error -1: write back data\n");
1647bda9ce3cSCiara Power 		free(wb_data);
1648952e10cdSFan Zhang 		return -1;
1649952e10cdSFan Zhang 	}
1650952e10cdSFan Zhang 
1651952e10cdSFan Zhang 	if (env.digest)
1652952e10cdSFan Zhang 		memcpy(dst, env.digest, env.digest_len);
1653952e10cdSFan Zhang 
1654952e10cdSFan Zhang 	val->val = wb_data;
1655952e10cdSFan Zhang 	val->len = total_len;
1656952e10cdSFan Zhang 
1657952e10cdSFan Zhang 	return 0;
1658cd255ccfSMarko Kovacevic }
1659cd255ccfSMarko Kovacevic 
1660cd255ccfSMarko Kovacevic static int
166136128a67SGowrishankar Muthukrishnan fips_run_sym_test(void)
1662cd255ccfSMarko Kovacevic {
1663cd255ccfSMarko Kovacevic 	struct rte_crypto_sym_xform xform = {0};
1664cd255ccfSMarko Kovacevic 	uint16_t n_deqd;
1665cd255ccfSMarko Kovacevic 	int ret;
1666cd255ccfSMarko Kovacevic 
166736128a67SGowrishankar Muthukrishnan 	if (!test_ops.prepare_sym_xform || !test_ops.prepare_sym_op)
166836128a67SGowrishankar Muthukrishnan 		return -EINVAL;
166936128a67SGowrishankar Muthukrishnan 
167036128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_sym_xform(&xform);
1671cd255ccfSMarko Kovacevic 	if (ret < 0)
1672cd255ccfSMarko Kovacevic 		return ret;
1673cd255ccfSMarko Kovacevic 
167436128a67SGowrishankar Muthukrishnan 	env.sym.sess = rte_cryptodev_sym_session_create(env.dev_id, &xform,
167536128a67SGowrishankar Muthukrishnan 						env.sym.sess_mpool);
167636128a67SGowrishankar Muthukrishnan 	if (!env.sym.sess)
167736128a67SGowrishankar Muthukrishnan 		return -ENOMEM;
1678cd255ccfSMarko Kovacevic 
167936128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_sym_op();
1680cd255ccfSMarko Kovacevic 	if (ret < 0) {
1681cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Prepare op\n",
1682cd255ccfSMarko Kovacevic 				ret);
1683083a2777SMarko Kovacevic 		goto exit;
1684cd255ccfSMarko Kovacevic 	}
1685cd255ccfSMarko Kovacevic 
1686cd255ccfSMarko Kovacevic 	if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) {
1687cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error: Failed enqueue\n");
1688083a2777SMarko Kovacevic 		ret = -1;
1689083a2777SMarko Kovacevic 		goto exit;
1690cd255ccfSMarko Kovacevic 	}
1691cd255ccfSMarko Kovacevic 
1692cd255ccfSMarko Kovacevic 	do {
1693cd255ccfSMarko Kovacevic 		struct rte_crypto_op *deqd_op;
1694cd255ccfSMarko Kovacevic 
169536128a67SGowrishankar Muthukrishnan 		n_deqd = rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1);
1696cd255ccfSMarko Kovacevic 	} while (n_deqd == 0);
1697cd255ccfSMarko Kovacevic 
1698cd255ccfSMarko Kovacevic 	vec.status = env.op->status;
1699cd255ccfSMarko Kovacevic 
1700083a2777SMarko Kovacevic exit:
170136128a67SGowrishankar Muthukrishnan 	rte_cryptodev_sym_session_free(env.dev_id, env.sym.sess);
170236128a67SGowrishankar Muthukrishnan 	env.sym.sess = NULL;
170336128a67SGowrishankar Muthukrishnan 	return ret;
1704bdce2564SAkhil Goyal }
1705cd255ccfSMarko Kovacevic 
170636128a67SGowrishankar Muthukrishnan static int
170736128a67SGowrishankar Muthukrishnan fips_run_asym_test(void)
170836128a67SGowrishankar Muthukrishnan {
170936128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_xform xform = {0};
171036128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
171136128a67SGowrishankar Muthukrishnan 	struct rte_crypto_op *deqd_op;
171236128a67SGowrishankar Muthukrishnan 	int ret;
171336128a67SGowrishankar Muthukrishnan 
1714*b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_KEYGEN && info.algo != FIPS_TEST_ALGO_ECDSA) {
171536128a67SGowrishankar Muthukrishnan 		RTE_SET_USED(asym);
171636128a67SGowrishankar Muthukrishnan 		ret = 0;
171736128a67SGowrishankar Muthukrishnan 		goto exit;
171836128a67SGowrishankar Muthukrishnan 	}
171936128a67SGowrishankar Muthukrishnan 
172036128a67SGowrishankar Muthukrishnan 	if (!test_ops.prepare_asym_xform || !test_ops.prepare_asym_op)
172136128a67SGowrishankar Muthukrishnan 		return -EINVAL;
172236128a67SGowrishankar Muthukrishnan 
172336128a67SGowrishankar Muthukrishnan 	asym = env.op->asym;
172436128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_asym_xform(&xform);
172536128a67SGowrishankar Muthukrishnan 	if (ret < 0)
1726cd255ccfSMarko Kovacevic 		return ret;
172736128a67SGowrishankar Muthukrishnan 
172836128a67SGowrishankar Muthukrishnan 	ret = rte_cryptodev_asym_session_create(env.dev_id, &xform, env.asym.sess_mpool,
172936128a67SGowrishankar Muthukrishnan 			(void *)&env.asym.sess);
173036128a67SGowrishankar Muthukrishnan 	if (ret < 0)
173136128a67SGowrishankar Muthukrishnan 		return ret;
173236128a67SGowrishankar Muthukrishnan 
173336128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_asym_op();
173436128a67SGowrishankar Muthukrishnan 	if (ret < 0) {
173536128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Error %i: Prepare op\n", ret);
173636128a67SGowrishankar Muthukrishnan 		goto exit;
173736128a67SGowrishankar Muthukrishnan 	}
173836128a67SGowrishankar Muthukrishnan 
173936128a67SGowrishankar Muthukrishnan 	if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) {
174036128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Error: Failed enqueue\n");
174136128a67SGowrishankar Muthukrishnan 		ret = -1;
174236128a67SGowrishankar Muthukrishnan 		goto exit;
174336128a67SGowrishankar Muthukrishnan 	}
174436128a67SGowrishankar Muthukrishnan 
174536128a67SGowrishankar Muthukrishnan 	while (rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1) == 0)
174636128a67SGowrishankar Muthukrishnan 		rte_pause();
174736128a67SGowrishankar Muthukrishnan 
174836128a67SGowrishankar Muthukrishnan 	vec.status = env.op->status;
174936128a67SGowrishankar Muthukrishnan 
175036128a67SGowrishankar Muthukrishnan  exit:
175136128a67SGowrishankar Muthukrishnan 	if (env.asym.sess)
175236128a67SGowrishankar Muthukrishnan 		rte_cryptodev_asym_session_free(env.dev_id, env.asym.sess);
175336128a67SGowrishankar Muthukrishnan 
175436128a67SGowrishankar Muthukrishnan 	env.asym.sess = NULL;
175536128a67SGowrishankar Muthukrishnan 	return ret;
175636128a67SGowrishankar Muthukrishnan }
175736128a67SGowrishankar Muthukrishnan 
175836128a67SGowrishankar Muthukrishnan static int
175936128a67SGowrishankar Muthukrishnan fips_run_test(void)
176036128a67SGowrishankar Muthukrishnan {
176136128a67SGowrishankar Muthukrishnan 	int ret;
176236128a67SGowrishankar Muthukrishnan 
176336128a67SGowrishankar Muthukrishnan 	env.op = env.sym.op;
176436128a67SGowrishankar Muthukrishnan 	if (env.is_asym_test) {
176536128a67SGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = parse_test_sha_hash_size(
176636128a67SGowrishankar Muthukrishnan 						info.interim_info.rsa_data.auth);
176736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_sha_xform;
176836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
176936128a67SGowrishankar Muthukrishnan 		ret = fips_run_sym_test();
177036128a67SGowrishankar Muthukrishnan 		if (ret < 0)
177136128a67SGowrishankar Muthukrishnan 			return ret;
177236128a67SGowrishankar Muthukrishnan 	} else {
177336128a67SGowrishankar Muthukrishnan 		return fips_run_sym_test();
177436128a67SGowrishankar Muthukrishnan 	}
177536128a67SGowrishankar Muthukrishnan 
177636128a67SGowrishankar Muthukrishnan 	env.op = env.asym.op;
1777*b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN &&
1778*b455d261SGowrishankar Muthukrishnan 		info.algo == FIPS_TEST_ALGO_ECDSA &&
1779*b455d261SGowrishankar Muthukrishnan 		info.interim_info.ecdsa_data.pubkey_gen == 1) {
1780*b455d261SGowrishankar Muthukrishnan 		fips_prepare_asym_xform_t ecdsa_xform;
1781*b455d261SGowrishankar Muthukrishnan 		fips_prepare_op_t ecdsa_op;
1782*b455d261SGowrishankar Muthukrishnan 
1783*b455d261SGowrishankar Muthukrishnan 		ecdsa_xform = test_ops.prepare_asym_xform;
1784*b455d261SGowrishankar Muthukrishnan 		ecdsa_op = test_ops.prepare_asym_op;
1785*b455d261SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_KEYGEN;
1786*b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = prepare_ecfpm_xform;
1787*b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = prepare_ecfpm_op;
1788*b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
1789*b455d261SGowrishankar Muthukrishnan 		if (ret < 0)
1790*b455d261SGowrishankar Muthukrishnan 			return ret;
1791*b455d261SGowrishankar Muthukrishnan 
1792*b455d261SGowrishankar Muthukrishnan 		info.post_interim_writeback(NULL);
1793*b455d261SGowrishankar Muthukrishnan 		info.interim_info.ecdsa_data.pubkey_gen = 0;
1794*b455d261SGowrishankar Muthukrishnan 
1795*b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = ecdsa_xform;
1796*b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = ecdsa_op;
1797*b455d261SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_SIGGEN;
1798*b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
1799*b455d261SGowrishankar Muthukrishnan 	} else {
1800*b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
1801*b455d261SGowrishankar Muthukrishnan 	}
1802*b455d261SGowrishankar Muthukrishnan 
1803*b455d261SGowrishankar Muthukrishnan 	return ret;
1804cd255ccfSMarko Kovacevic }
1805cd255ccfSMarko Kovacevic 
1806cd255ccfSMarko Kovacevic static int
1807cd255ccfSMarko Kovacevic fips_generic_test(void)
1808cd255ccfSMarko Kovacevic {
1809952e10cdSFan Zhang 	struct fips_val val = {NULL, 0};
1810cd255ccfSMarko Kovacevic 	int ret;
1811cd255ccfSMarko Kovacevic 
181289be27e3SBrandon Lo 	if (info.file_type != FIPS_TYPE_JSON)
1813cd255ccfSMarko Kovacevic 		fips_test_write_one_case();
1814cd255ccfSMarko Kovacevic 
1815cd255ccfSMarko Kovacevic 	ret = fips_run_test();
1816cd255ccfSMarko Kovacevic 	if (ret < 0) {
18178a40ff39SArchana Muniganti 		if (ret == -EPERM || ret == -ENOTSUP) {
181889be27e3SBrandon Lo 			if (info.file_type == FIPS_TYPE_JSON)
181989be27e3SBrandon Lo 				return ret;
182089be27e3SBrandon Lo 
1821cd255ccfSMarko Kovacevic 			fprintf(info.fp_wr, "Bypass\n\n");
1822cd255ccfSMarko Kovacevic 			return 0;
1823cd255ccfSMarko Kovacevic 		}
1824cd255ccfSMarko Kovacevic 
1825cd255ccfSMarko Kovacevic 		return ret;
1826cd255ccfSMarko Kovacevic 	}
1827cd255ccfSMarko Kovacevic 
182836128a67SGowrishankar Muthukrishnan 	if (!env.is_asym_test) {
1829952e10cdSFan Zhang 		ret = get_writeback_data(&val);
1830952e10cdSFan Zhang 		if (ret < 0)
1831952e10cdSFan Zhang 			return ret;
183236128a67SGowrishankar Muthukrishnan 	}
1833cd255ccfSMarko Kovacevic 
1834cd255ccfSMarko Kovacevic 	switch (info.file_type) {
1835cd255ccfSMarko Kovacevic 	case FIPS_TYPE_REQ:
1836cd255ccfSMarko Kovacevic 	case FIPS_TYPE_RSP:
183789be27e3SBrandon Lo 	case FIPS_TYPE_JSON:
1838cd255ccfSMarko Kovacevic 		if (info.parse_writeback == NULL)
1839cd255ccfSMarko Kovacevic 			return -EPERM;
1840cd255ccfSMarko Kovacevic 		ret = info.parse_writeback(&val);
1841cd255ccfSMarko Kovacevic 		if (ret < 0)
1842cd255ccfSMarko Kovacevic 			return ret;
1843cd255ccfSMarko Kovacevic 		break;
1844cd255ccfSMarko Kovacevic 	case FIPS_TYPE_FAX:
1845cd255ccfSMarko Kovacevic 		if (info.kat_check == NULL)
1846cd255ccfSMarko Kovacevic 			return -EPERM;
1847cd255ccfSMarko Kovacevic 		ret = info.kat_check(&val);
1848cd255ccfSMarko Kovacevic 		if (ret < 0)
1849cd255ccfSMarko Kovacevic 			return ret;
1850cd255ccfSMarko Kovacevic 		break;
1851f556293fSBrandon Lo 	default:
1852f556293fSBrandon Lo 		break;
1853cd255ccfSMarko Kovacevic 	}
1854cd255ccfSMarko Kovacevic 
185589be27e3SBrandon Lo 	if (info.file_type != FIPS_TYPE_JSON)
1856cd255ccfSMarko Kovacevic 		fprintf(info.fp_wr, "\n");
1857952e10cdSFan Zhang 	free(val.val);
1858cd255ccfSMarko Kovacevic 
1859cd255ccfSMarko Kovacevic 	return 0;
1860cd255ccfSMarko Kovacevic }
1861cd255ccfSMarko Kovacevic 
1862cd255ccfSMarko Kovacevic static int
1863527cbf3dSMarko Kovacevic fips_mct_tdes_test(void)
1864527cbf3dSMarko Kovacevic {
1865527cbf3dSMarko Kovacevic #define TDES_BLOCK_SIZE		8
1866527cbf3dSMarko Kovacevic #define TDES_EXTERN_ITER	400
1867527cbf3dSMarko Kovacevic #define TDES_INTERN_ITER	10000
186864569ffaSGowrishankar Muthukrishnan 	struct fips_val val[3] = {{NULL, 0},}, val_key, pt, ct, iv;
18699252e81aSMarko Kovacevic 	uint8_t prev_out[TDES_BLOCK_SIZE] = {0};
18709252e81aSMarko Kovacevic 	uint8_t prev_prev_out[TDES_BLOCK_SIZE] = {0};
18719252e81aSMarko Kovacevic 	uint8_t prev_in[TDES_BLOCK_SIZE] = {0};
1872527cbf3dSMarko Kovacevic 	uint32_t i, j, k;
1873527cbf3dSMarko Kovacevic 	int ret;
1874ae65004fSMichael Shamis 	int test_mode = info.interim_info.tdes_data.test_mode;
1875527cbf3dSMarko Kovacevic 
187664569ffaSGowrishankar Muthukrishnan 	pt.len = vec.pt.len;
187764569ffaSGowrishankar Muthukrishnan 	pt.val = calloc(1, pt.len);
187864569ffaSGowrishankar Muthukrishnan 	ct.len = vec.ct.len;
187964569ffaSGowrishankar Muthukrishnan 	ct.val = calloc(1, ct.len);
188064569ffaSGowrishankar Muthukrishnan 	iv.len = vec.iv.len;
188164569ffaSGowrishankar Muthukrishnan 	iv.val = calloc(1, iv.len);
188264569ffaSGowrishankar Muthukrishnan 
1883527cbf3dSMarko Kovacevic 	for (i = 0; i < TDES_EXTERN_ITER; i++) {
188464569ffaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON) {
188579365018SArchana Muniganti 			if ((i == 0) && (info.version == 21.4f)) {
18862b84d2bdSArchana Muniganti 				if (!(strstr(info.vec[0], "COUNT")))
18872b84d2bdSArchana Muniganti 					fprintf(info.fp_wr, "%s%u\n", "COUNT = ", 0);
188879365018SArchana Muniganti 			}
188979365018SArchana Muniganti 
189079365018SArchana Muniganti 			if (i != 0)
1891527cbf3dSMarko Kovacevic 				update_info_vec(i);
1892527cbf3dSMarko Kovacevic 
1893527cbf3dSMarko Kovacevic 			fips_test_write_one_case();
189464569ffaSGowrishankar Muthukrishnan 		}
1895527cbf3dSMarko Kovacevic 
1896527cbf3dSMarko Kovacevic 		for (j = 0; j < TDES_INTERN_ITER; j++) {
1897527cbf3dSMarko Kovacevic 			ret = fips_run_test();
1898527cbf3dSMarko Kovacevic 			if (ret < 0) {
1899527cbf3dSMarko Kovacevic 				if (ret == -EPERM) {
190089be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
190189be27e3SBrandon Lo 						return ret;
190289be27e3SBrandon Lo 
1903527cbf3dSMarko Kovacevic 					fprintf(info.fp_wr, "Bypass\n");
1904527cbf3dSMarko Kovacevic 					return 0;
1905527cbf3dSMarko Kovacevic 				}
1906527cbf3dSMarko Kovacevic 				return ret;
1907527cbf3dSMarko Kovacevic 			}
1908527cbf3dSMarko Kovacevic 
190964569ffaSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
1910952e10cdSFan Zhang 			if (ret < 0)
1911952e10cdSFan Zhang 				return ret;
1912527cbf3dSMarko Kovacevic 
1913527cbf3dSMarko Kovacevic 			if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
1914527cbf3dSMarko Kovacevic 				memcpy(prev_in, vec.ct.val, TDES_BLOCK_SIZE);
1915527cbf3dSMarko Kovacevic 
1916527cbf3dSMarko Kovacevic 			if (j == 0) {
191764569ffaSGowrishankar Muthukrishnan 				memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE);
191864569ffaSGowrishankar Muthukrishnan 				memcpy(pt.val, vec.pt.val, pt.len);
191964569ffaSGowrishankar Muthukrishnan 				memcpy(ct.val, vec.ct.val, ct.len);
192064569ffaSGowrishankar Muthukrishnan 				memcpy(iv.val, vec.iv.val, iv.len);
1921527cbf3dSMarko Kovacevic 
1922527cbf3dSMarko Kovacevic 				if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
1923ae65004fSMichael Shamis 					if (test_mode == TDES_MODE_ECB) {
192464569ffaSGowrishankar Muthukrishnan 						memcpy(vec.pt.val, val[0].val,
1925ae65004fSMichael Shamis 							   TDES_BLOCK_SIZE);
1926ae65004fSMichael Shamis 					} else {
1927527cbf3dSMarko Kovacevic 						memcpy(vec.pt.val, vec.iv.val,
1928527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
192964569ffaSGowrishankar Muthukrishnan 						memcpy(vec.iv.val, val[0].val,
1930527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
1931ae65004fSMichael Shamis 					}
193264569ffaSGowrishankar Muthukrishnan 					val[1].val = pt.val;
193364569ffaSGowrishankar Muthukrishnan 					val[1].len = pt.len;
193464569ffaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
193564569ffaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
1936ae65004fSMichael Shamis 				} else {
1937ae65004fSMichael Shamis 					if (test_mode == TDES_MODE_ECB) {
193864569ffaSGowrishankar Muthukrishnan 						memcpy(vec.ct.val, val[0].val,
1939ae65004fSMichael Shamis 							   TDES_BLOCK_SIZE);
1940527cbf3dSMarko Kovacevic 					} else {
1941527cbf3dSMarko Kovacevic 						memcpy(vec.iv.val, vec.ct.val,
1942527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
194364569ffaSGowrishankar Muthukrishnan 						memcpy(vec.ct.val, val[0].val,
1944527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
1945527cbf3dSMarko Kovacevic 					}
194664569ffaSGowrishankar Muthukrishnan 					val[1].val = ct.val;
194764569ffaSGowrishankar Muthukrishnan 					val[1].len = ct.len;
194864569ffaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
194964569ffaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
1950ae65004fSMichael Shamis 				}
1951527cbf3dSMarko Kovacevic 				continue;
1952527cbf3dSMarko Kovacevic 			}
1953527cbf3dSMarko Kovacevic 
1954527cbf3dSMarko Kovacevic 			if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
1955ae65004fSMichael Shamis 				if (test_mode == TDES_MODE_ECB) {
195664569ffaSGowrishankar Muthukrishnan 					memcpy(vec.pt.val, val[0].val,
1957ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1958527cbf3dSMarko Kovacevic 				} else {
195964569ffaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, val[0].val,
1960ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1961ae65004fSMichael Shamis 					memcpy(vec.pt.val, prev_out,
1962ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1963ae65004fSMichael Shamis 				}
1964ae65004fSMichael Shamis 			} else {
1965ae65004fSMichael Shamis 				if (test_mode == TDES_MODE_ECB) {
196664569ffaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, val[0].val,
1967ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1968ae65004fSMichael Shamis 				} else {
1969ae65004fSMichael Shamis 					memcpy(vec.iv.val, vec.ct.val,
1970ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
197164569ffaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, val[0].val,
1972ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1973ae65004fSMichael Shamis 				}
1974527cbf3dSMarko Kovacevic 			}
1975527cbf3dSMarko Kovacevic 
1976527cbf3dSMarko Kovacevic 			if (j == TDES_INTERN_ITER - 1)
1977527cbf3dSMarko Kovacevic 				continue;
1978527cbf3dSMarko Kovacevic 
197964569ffaSGowrishankar Muthukrishnan 			memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE);
1980527cbf3dSMarko Kovacevic 
1981527cbf3dSMarko Kovacevic 			if (j == TDES_INTERN_ITER - 3)
198264569ffaSGowrishankar Muthukrishnan 				memcpy(prev_prev_out, val[0].val, TDES_BLOCK_SIZE);
1983527cbf3dSMarko Kovacevic 		}
1984527cbf3dSMarko Kovacevic 
198564569ffaSGowrishankar Muthukrishnan 		info.parse_writeback(val);
198664569ffaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
1987527cbf3dSMarko Kovacevic 			fprintf(info.fp_wr, "\n");
1988527cbf3dSMarko Kovacevic 
1989527cbf3dSMarko Kovacevic 		if (i == TDES_EXTERN_ITER - 1)
1990527cbf3dSMarko Kovacevic 			continue;
1991527cbf3dSMarko Kovacevic 
1992527cbf3dSMarko Kovacevic 		/** update key */
1993527cbf3dSMarko Kovacevic 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
1994527cbf3dSMarko Kovacevic 
1995527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.nb_keys == 0) {
1996527cbf3dSMarko Kovacevic 			if (memcmp(val_key.val, val_key.val + 8, 8) == 0)
1997527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 1;
1998527cbf3dSMarko Kovacevic 			else if (memcmp(val_key.val, val_key.val + 16, 8) == 0)
1999527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 2;
2000527cbf3dSMarko Kovacevic 			else
2001527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 3;
2002527cbf3dSMarko Kovacevic 
2003527cbf3dSMarko Kovacevic 		}
2004527cbf3dSMarko Kovacevic 
2005527cbf3dSMarko Kovacevic 		for (k = 0; k < TDES_BLOCK_SIZE; k++) {
2006527cbf3dSMarko Kovacevic 
2007527cbf3dSMarko Kovacevic 			switch (info.interim_info.tdes_data.nb_keys) {
2008527cbf3dSMarko Kovacevic 			case 3:
200964569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2010527cbf3dSMarko Kovacevic 				val_key.val[k + 8] ^= prev_out[k];
2011527cbf3dSMarko Kovacevic 				val_key.val[k + 16] ^= prev_prev_out[k];
2012527cbf3dSMarko Kovacevic 				break;
2013527cbf3dSMarko Kovacevic 			case 2:
201464569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2015527cbf3dSMarko Kovacevic 				val_key.val[k + 8] ^= prev_out[k];
201664569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 16] ^= val[0].val[k];
2017527cbf3dSMarko Kovacevic 				break;
2018527cbf3dSMarko Kovacevic 			default: /* case 1 */
201964569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
202064569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 8] ^= val[0].val[k];
202164569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 16] ^= val[0].val[k];
2022527cbf3dSMarko Kovacevic 				break;
2023527cbf3dSMarko Kovacevic 			}
2024527cbf3dSMarko Kovacevic 
2025527cbf3dSMarko Kovacevic 		}
2026527cbf3dSMarko Kovacevic 
2027527cbf3dSMarko Kovacevic 		for (k = 0; k < 24; k++)
2028527cbf3dSMarko Kovacevic 			val_key.val[k] = (__builtin_popcount(val_key.val[k]) &
2029527cbf3dSMarko Kovacevic 					0x1) ?
2030527cbf3dSMarko Kovacevic 					val_key.val[k] : (val_key.val[k] ^ 0x1);
2031527cbf3dSMarko Kovacevic 
2032527cbf3dSMarko Kovacevic 		if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
2033ae65004fSMichael Shamis 			if (test_mode == TDES_MODE_ECB) {
203464569ffaSGowrishankar Muthukrishnan 				memcpy(vec.pt.val, val[0].val, TDES_BLOCK_SIZE);
2035ae65004fSMichael Shamis 			} else {
203664569ffaSGowrishankar Muthukrishnan 				memcpy(vec.iv.val, val[0].val, TDES_BLOCK_SIZE);
2037527cbf3dSMarko Kovacevic 				memcpy(vec.pt.val, prev_out, TDES_BLOCK_SIZE);
2038ae65004fSMichael Shamis 			}
2039ae65004fSMichael Shamis 		} else {
2040ae65004fSMichael Shamis 			if (test_mode == TDES_MODE_ECB) {
204164569ffaSGowrishankar Muthukrishnan 				memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE);
2042527cbf3dSMarko Kovacevic 			} else {
2043527cbf3dSMarko Kovacevic 				memcpy(vec.iv.val, prev_out, TDES_BLOCK_SIZE);
204464569ffaSGowrishankar Muthukrishnan 				memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE);
2045527cbf3dSMarko Kovacevic 			}
2046527cbf3dSMarko Kovacevic 		}
2047ae65004fSMichael Shamis 	}
2048527cbf3dSMarko Kovacevic 
204964569ffaSGowrishankar Muthukrishnan 	free(val[0].val);
205064569ffaSGowrishankar Muthukrishnan 	free(pt.val);
205164569ffaSGowrishankar Muthukrishnan 	free(ct.val);
205264569ffaSGowrishankar Muthukrishnan 	free(iv.val);
2053952e10cdSFan Zhang 
2054527cbf3dSMarko Kovacevic 	return 0;
2055527cbf3dSMarko Kovacevic }
2056527cbf3dSMarko Kovacevic 
2057527cbf3dSMarko Kovacevic static int
2058d3190431SMichael Shamis fips_mct_aes_ecb_test(void)
2059d3190431SMichael Shamis {
2060d3190431SMichael Shamis #define AES_BLOCK_SIZE	16
2061d3190431SMichael Shamis #define AES_EXTERN_ITER	100
2062d3190431SMichael Shamis #define AES_INTERN_ITER	1000
2063952e10cdSFan Zhang 	struct fips_val val = {NULL, 0}, val_key;
2064d3190431SMichael Shamis 	uint8_t prev_out[AES_BLOCK_SIZE] = {0};
2065d3190431SMichael Shamis 	uint32_t i, j, k;
2066d3190431SMichael Shamis 	int ret;
2067d3190431SMichael Shamis 
2068d3190431SMichael Shamis 	for (i = 0; i < AES_EXTERN_ITER; i++) {
2069d3190431SMichael Shamis 		if (i != 0)
2070d3190431SMichael Shamis 			update_info_vec(i);
2071d3190431SMichael Shamis 
2072d3190431SMichael Shamis 		fips_test_write_one_case();
2073d3190431SMichael Shamis 
2074d3190431SMichael Shamis 		for (j = 0; j < AES_INTERN_ITER; j++) {
2075d3190431SMichael Shamis 			ret = fips_run_test();
2076d3190431SMichael Shamis 			if (ret < 0) {
2077d3190431SMichael Shamis 				if (ret == -EPERM) {
207889be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
207989be27e3SBrandon Lo 						return ret;
208089be27e3SBrandon Lo 
2081d3190431SMichael Shamis 					fprintf(info.fp_wr, "Bypass\n");
2082d3190431SMichael Shamis 					return 0;
2083d3190431SMichael Shamis 				}
2084d3190431SMichael Shamis 
2085d3190431SMichael Shamis 				return ret;
2086d3190431SMichael Shamis 			}
2087d3190431SMichael Shamis 
2088952e10cdSFan Zhang 			ret = get_writeback_data(&val);
2089952e10cdSFan Zhang 			if (ret < 0)
2090952e10cdSFan Zhang 				return ret;
2091d3190431SMichael Shamis 
2092d3190431SMichael Shamis 			if (info.op == FIPS_TEST_ENC_AUTH_GEN)
2093d3190431SMichael Shamis 				memcpy(vec.pt.val, val.val, AES_BLOCK_SIZE);
2094d3190431SMichael Shamis 			else
2095d3190431SMichael Shamis 				memcpy(vec.ct.val, val.val, AES_BLOCK_SIZE);
2096d3190431SMichael Shamis 
2097d3190431SMichael Shamis 			if (j == AES_INTERN_ITER - 1)
2098d3190431SMichael Shamis 				continue;
2099d3190431SMichael Shamis 
2100d3190431SMichael Shamis 			memcpy(prev_out, val.val, AES_BLOCK_SIZE);
2101d3190431SMichael Shamis 		}
2102d3190431SMichael Shamis 
2103d3190431SMichael Shamis 		info.parse_writeback(&val);
2104d3190431SMichael Shamis 		fprintf(info.fp_wr, "\n");
2105d3190431SMichael Shamis 
2106d3190431SMichael Shamis 		if (i == AES_EXTERN_ITER - 1)
2107d3190431SMichael Shamis 			continue;
2108d3190431SMichael Shamis 
2109d3190431SMichael Shamis 		/** update key */
2110d3190431SMichael Shamis 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2111d3190431SMichael Shamis 		for (k = 0; k < vec.cipher_auth.key.len; k++) {
2112d3190431SMichael Shamis 			switch (vec.cipher_auth.key.len) {
2113d3190431SMichael Shamis 			case 16:
2114d3190431SMichael Shamis 				val_key.val[k] ^= val.val[k];
2115d3190431SMichael Shamis 				break;
2116d3190431SMichael Shamis 			case 24:
2117d3190431SMichael Shamis 				if (k < 8)
2118d3190431SMichael Shamis 					val_key.val[k] ^= prev_out[k + 8];
2119d3190431SMichael Shamis 				else
2120d3190431SMichael Shamis 					val_key.val[k] ^= val.val[k - 8];
2121d3190431SMichael Shamis 				break;
2122d3190431SMichael Shamis 			case 32:
2123d3190431SMichael Shamis 				if (k < 16)
2124d3190431SMichael Shamis 					val_key.val[k] ^= prev_out[k];
2125d3190431SMichael Shamis 				else
2126d3190431SMichael Shamis 					val_key.val[k] ^= val.val[k - 16];
2127d3190431SMichael Shamis 				break;
2128d3190431SMichael Shamis 			default:
2129d3190431SMichael Shamis 				return -1;
2130d3190431SMichael Shamis 			}
2131d3190431SMichael Shamis 		}
2132d3190431SMichael Shamis 	}
2133d3190431SMichael Shamis 
2134952e10cdSFan Zhang 	free(val.val);
2135952e10cdSFan Zhang 
2136d3190431SMichael Shamis 	return 0;
2137d3190431SMichael Shamis }
2138d3190431SMichael Shamis static int
2139cd255ccfSMarko Kovacevic fips_mct_aes_test(void)
2140cd255ccfSMarko Kovacevic {
2141cd255ccfSMarko Kovacevic #define AES_BLOCK_SIZE	16
2142cd255ccfSMarko Kovacevic #define AES_EXTERN_ITER	100
2143cd255ccfSMarko Kovacevic #define AES_INTERN_ITER	1000
21448b8546aaSGowrishankar Muthukrishnan 	struct fips_val val[3] = {{NULL, 0},}, val_key,  pt, ct, iv;
2145cd255ccfSMarko Kovacevic 	uint8_t prev_out[AES_BLOCK_SIZE] = {0};
2146cd255ccfSMarko Kovacevic 	uint8_t prev_in[AES_BLOCK_SIZE] = {0};
2147cd255ccfSMarko Kovacevic 	uint32_t i, j, k;
2148cd255ccfSMarko Kovacevic 	int ret;
2149cd255ccfSMarko Kovacevic 
2150d3190431SMichael Shamis 	if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_ECB)
2151d3190431SMichael Shamis 		return fips_mct_aes_ecb_test();
2152d3190431SMichael Shamis 
2153e9ec7f61SGowrishankar Muthukrishnan 	pt.len = vec.pt.len;
2154e9ec7f61SGowrishankar Muthukrishnan 	pt.val = calloc(1, pt.len);
2155e9ec7f61SGowrishankar Muthukrishnan 	ct.len = vec.ct.len;
2156e9ec7f61SGowrishankar Muthukrishnan 	ct.val = calloc(1, ct.len);
2157e9ec7f61SGowrishankar Muthukrishnan 	iv.len = vec.iv.len;
2158e9ec7f61SGowrishankar Muthukrishnan 	iv.val = calloc(1, iv.len);
2159cd255ccfSMarko Kovacevic 	for (i = 0; i < AES_EXTERN_ITER; i++) {
21608b8546aaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON) {
2161cd255ccfSMarko Kovacevic 			if (i != 0)
2162cd255ccfSMarko Kovacevic 				update_info_vec(i);
2163cd255ccfSMarko Kovacevic 
2164cd255ccfSMarko Kovacevic 			fips_test_write_one_case();
21658b8546aaSGowrishankar Muthukrishnan 		}
2166cd255ccfSMarko Kovacevic 
2167cd255ccfSMarko Kovacevic 		for (j = 0; j < AES_INTERN_ITER; j++) {
2168cd255ccfSMarko Kovacevic 			ret = fips_run_test();
2169cd255ccfSMarko Kovacevic 			if (ret < 0) {
2170cd255ccfSMarko Kovacevic 				if (ret == -EPERM) {
217189be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
217289be27e3SBrandon Lo 						return ret;
217389be27e3SBrandon Lo 
2174cd255ccfSMarko Kovacevic 					fprintf(info.fp_wr, "Bypass\n");
2175cd255ccfSMarko Kovacevic 					return 0;
2176cd255ccfSMarko Kovacevic 				}
2177cd255ccfSMarko Kovacevic 
2178cd255ccfSMarko Kovacevic 				return ret;
2179cd255ccfSMarko Kovacevic 			}
2180cd255ccfSMarko Kovacevic 
21818b8546aaSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
2182afda6b01SCiara Power 			if (ret < 0)
2183afda6b01SCiara Power 				return ret;
2184cd255ccfSMarko Kovacevic 
2185cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
2186cd255ccfSMarko Kovacevic 				memcpy(prev_in, vec.ct.val, AES_BLOCK_SIZE);
2187cd255ccfSMarko Kovacevic 
2188cd255ccfSMarko Kovacevic 			if (j == 0) {
21898b8546aaSGowrishankar Muthukrishnan 				memcpy(prev_out, val[0].val, AES_BLOCK_SIZE);
21908b8546aaSGowrishankar Muthukrishnan 				memcpy(pt.val, vec.pt.val, pt.len);
21918b8546aaSGowrishankar Muthukrishnan 				memcpy(ct.val, vec.ct.val, ct.len);
21928b8546aaSGowrishankar Muthukrishnan 				memcpy(iv.val, vec.iv.val, iv.len);
2193cd255ccfSMarko Kovacevic 
2194cd255ccfSMarko Kovacevic 				if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
21958b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.pt.val, vec.iv.val, AES_BLOCK_SIZE);
21968b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
21978b8546aaSGowrishankar Muthukrishnan 					val[1].val = pt.val;
21988b8546aaSGowrishankar Muthukrishnan 					val[1].len = pt.len;
21998b8546aaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
22008b8546aaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2201cd255ccfSMarko Kovacevic 				} else {
22028b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, vec.iv.val, AES_BLOCK_SIZE);
22038b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE);
22048b8546aaSGowrishankar Muthukrishnan 					val[1].val = ct.val;
22058b8546aaSGowrishankar Muthukrishnan 					val[1].len = ct.len;
22068b8546aaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
22078b8546aaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2208cd255ccfSMarko Kovacevic 				}
2209cd255ccfSMarko Kovacevic 				continue;
2210cd255ccfSMarko Kovacevic 			}
2211cd255ccfSMarko Kovacevic 
2212cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
22138b8546aaSGowrishankar Muthukrishnan 				memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
2214cd255ccfSMarko Kovacevic 				memcpy(vec.pt.val, prev_out, AES_BLOCK_SIZE);
2215cd255ccfSMarko Kovacevic 			} else {
2216cd255ccfSMarko Kovacevic 				memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE);
2217cd255ccfSMarko Kovacevic 				memcpy(vec.ct.val, prev_out, AES_BLOCK_SIZE);
2218cd255ccfSMarko Kovacevic 			}
2219cd255ccfSMarko Kovacevic 
2220cd255ccfSMarko Kovacevic 			if (j == AES_INTERN_ITER - 1)
2221cd255ccfSMarko Kovacevic 				continue;
2222cd255ccfSMarko Kovacevic 
22238b8546aaSGowrishankar Muthukrishnan 			memcpy(prev_out, val[0].val, AES_BLOCK_SIZE);
2224cd255ccfSMarko Kovacevic 		}
2225cd255ccfSMarko Kovacevic 
22268b8546aaSGowrishankar Muthukrishnan 		info.parse_writeback(val);
22278b8546aaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2228cd255ccfSMarko Kovacevic 			fprintf(info.fp_wr, "\n");
2229cd255ccfSMarko Kovacevic 
2230e9ec7f61SGowrishankar Muthukrishnan 		if (i == AES_EXTERN_ITER - 1)
2231cd255ccfSMarko Kovacevic 			continue;
2232cd255ccfSMarko Kovacevic 
2233cd255ccfSMarko Kovacevic 		/** update key */
2234cd255ccfSMarko Kovacevic 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2235cd255ccfSMarko Kovacevic 		for (k = 0; k < vec.cipher_auth.key.len; k++) {
2236cd255ccfSMarko Kovacevic 			switch (vec.cipher_auth.key.len) {
2237cd255ccfSMarko Kovacevic 			case 16:
22388b8546aaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2239cd255ccfSMarko Kovacevic 				break;
2240cd255ccfSMarko Kovacevic 			case 24:
2241cd255ccfSMarko Kovacevic 				if (k < 8)
2242cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k + 8];
2243cd255ccfSMarko Kovacevic 				else
22448b8546aaSGowrishankar Muthukrishnan 					val_key.val[k] ^= val[0].val[k - 8];
2245cd255ccfSMarko Kovacevic 				break;
2246cd255ccfSMarko Kovacevic 			case 32:
2247cd255ccfSMarko Kovacevic 				if (k < 16)
2248cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k];
2249cd255ccfSMarko Kovacevic 				else
22508b8546aaSGowrishankar Muthukrishnan 					val_key.val[k] ^= val[0].val[k - 16];
2251cd255ccfSMarko Kovacevic 				break;
2252cd255ccfSMarko Kovacevic 			default:
2253cd255ccfSMarko Kovacevic 				return -1;
2254cd255ccfSMarko Kovacevic 			}
2255cd255ccfSMarko Kovacevic 		}
2256cd255ccfSMarko Kovacevic 
2257cd255ccfSMarko Kovacevic 		if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
22588b8546aaSGowrishankar Muthukrishnan 			memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
2259cd255ccfSMarko Kovacevic 	}
2260cd255ccfSMarko Kovacevic 
22618b8546aaSGowrishankar Muthukrishnan 	free(val[0].val);
2262e9ec7f61SGowrishankar Muthukrishnan 	free(pt.val);
2263e9ec7f61SGowrishankar Muthukrishnan 	free(ct.val);
2264e9ec7f61SGowrishankar Muthukrishnan 	free(iv.val);
2265952e10cdSFan Zhang 
2266cd255ccfSMarko Kovacevic 	return 0;
2267cd255ccfSMarko Kovacevic }
2268cd255ccfSMarko Kovacevic 
2269cd255ccfSMarko Kovacevic static int
2270f4797baeSDamian Nowak fips_mct_sha_test(void)
2271f4797baeSDamian Nowak {
2272f4797baeSDamian Nowak #define SHA_EXTERN_ITER	100
2273f4797baeSDamian Nowak #define SHA_INTERN_ITER	1000
2274f4797baeSDamian Nowak #define SHA_MD_BLOCK	3
2275d5c24714SGowrishankar Muthukrishnan 	/* val[0] is op result and other value is for parse_writeback callback */
2276d5c24714SGowrishankar Muthukrishnan 	struct fips_val val[2] = {{NULL, 0},};
2277d5c24714SGowrishankar Muthukrishnan 	struct fips_val  md[SHA_MD_BLOCK], msg;
2278f4797baeSDamian Nowak 	int ret;
2279f4797baeSDamian Nowak 	uint32_t i, j;
2280f4797baeSDamian Nowak 
2281d5c24714SGowrishankar Muthukrishnan 	msg.len = SHA_MD_BLOCK * vec.cipher_auth.digest.len;
2282d5c24714SGowrishankar Muthukrishnan 	msg.val = calloc(1, msg.len);
2283ce7ced4eSGowrishankar Muthukrishnan 	if (vec.pt.val)
2284d5c24714SGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, vec.pt.val, vec.cipher_auth.digest.len);
2285ce7ced4eSGowrishankar Muthukrishnan 
2286f4797baeSDamian Nowak 	for (i = 0; i < SHA_MD_BLOCK; i++)
2287f4797baeSDamian Nowak 		md[i].val = rte_malloc(NULL, (MAX_DIGEST_SIZE*2), 0);
2288f4797baeSDamian Nowak 
2289f4797baeSDamian Nowak 	rte_free(vec.pt.val);
2290f4797baeSDamian Nowak 	vec.pt.val = rte_malloc(NULL, (MAX_DIGEST_SIZE*SHA_MD_BLOCK), 0);
2291f4797baeSDamian Nowak 
2292d5c24714SGowrishankar Muthukrishnan 	if (info.file_type != FIPS_TYPE_JSON) {
2293f4797baeSDamian Nowak 		fips_test_write_one_case();
2294f4797baeSDamian Nowak 		fprintf(info.fp_wr, "\n");
2295d5c24714SGowrishankar Muthukrishnan 	}
2296f4797baeSDamian Nowak 
2297f4797baeSDamian Nowak 	for (j = 0; j < SHA_EXTERN_ITER; j++) {
2298f4797baeSDamian Nowak 
2299f4797baeSDamian Nowak 		memcpy(md[0].val, vec.cipher_auth.digest.val,
2300f4797baeSDamian Nowak 			vec.cipher_auth.digest.len);
2301f4797baeSDamian Nowak 		md[0].len = vec.cipher_auth.digest.len;
2302f4797baeSDamian Nowak 		memcpy(md[1].val, vec.cipher_auth.digest.val,
2303f4797baeSDamian Nowak 			vec.cipher_auth.digest.len);
2304f4797baeSDamian Nowak 		md[1].len = vec.cipher_auth.digest.len;
2305f4797baeSDamian Nowak 		memcpy(md[2].val, vec.cipher_auth.digest.val,
2306f4797baeSDamian Nowak 			vec.cipher_auth.digest.len);
2307f4797baeSDamian Nowak 		md[2].len = vec.cipher_auth.digest.len;
2308f4797baeSDamian Nowak 
2309d5c24714SGowrishankar Muthukrishnan 		for (i = 0; i < SHA_MD_BLOCK; i++)
2310d5c24714SGowrishankar Muthukrishnan 			memcpy(&msg.val[i * md[i].len], md[i].val, md[i].len);
2311d5c24714SGowrishankar Muthukrishnan 
2312f4797baeSDamian Nowak 		for (i = 0; i < (SHA_INTERN_ITER); i++) {
2313f4797baeSDamian Nowak 
2314f4797baeSDamian Nowak 			memcpy(vec.pt.val, md[0].val,
2315f4797baeSDamian Nowak 				(size_t)md[0].len);
2316f4797baeSDamian Nowak 			memcpy((vec.pt.val + md[0].len), md[1].val,
2317f4797baeSDamian Nowak 				(size_t)md[1].len);
2318f4797baeSDamian Nowak 			memcpy((vec.pt.val + md[0].len + md[1].len),
2319f4797baeSDamian Nowak 				md[2].val,
2320f4797baeSDamian Nowak 				(size_t)md[2].len);
2321f4797baeSDamian Nowak 			vec.pt.len = md[0].len + md[1].len + md[2].len;
2322f4797baeSDamian Nowak 
2323f4797baeSDamian Nowak 			ret = fips_run_test();
2324f4797baeSDamian Nowak 			if (ret < 0) {
23258a40ff39SArchana Muniganti 				if (ret == -EPERM || ret == -ENOTSUP) {
232689be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
232789be27e3SBrandon Lo 						return ret;
232889be27e3SBrandon Lo 
2329f4797baeSDamian Nowak 					fprintf(info.fp_wr, "Bypass\n\n");
2330f4797baeSDamian Nowak 					return 0;
2331f4797baeSDamian Nowak 				}
2332f4797baeSDamian Nowak 				return ret;
2333f4797baeSDamian Nowak 			}
2334f4797baeSDamian Nowak 
2335d5c24714SGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
2336afda6b01SCiara Power 			if (ret < 0)
2337afda6b01SCiara Power 				return ret;
2338f4797baeSDamian Nowak 
2339f4797baeSDamian Nowak 			memcpy(md[0].val, md[1].val, md[1].len);
2340f4797baeSDamian Nowak 			md[0].len = md[1].len;
2341f4797baeSDamian Nowak 			memcpy(md[1].val, md[2].val, md[2].len);
2342f4797baeSDamian Nowak 			md[1].len = md[2].len;
2343f4797baeSDamian Nowak 
2344d5c24714SGowrishankar Muthukrishnan 			memcpy(md[2].val, (val[0].val + vec.pt.len),
2345f4797baeSDamian Nowak 				vec.cipher_auth.digest.len);
2346f4797baeSDamian Nowak 			md[2].len = vec.cipher_auth.digest.len;
2347f4797baeSDamian Nowak 		}
2348f4797baeSDamian Nowak 
2349f4797baeSDamian Nowak 		memcpy(vec.cipher_auth.digest.val, md[2].val, md[2].len);
2350f4797baeSDamian Nowak 		vec.cipher_auth.digest.len = md[2].len;
2351f4797baeSDamian Nowak 
2352ce7ced4eSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2353f4797baeSDamian Nowak 			fprintf(info.fp_wr, "COUNT = %u\n", j);
2354ce7ced4eSGowrishankar Muthukrishnan 
2355d5c24714SGowrishankar Muthukrishnan 		val[1].val = msg.val;
2356d5c24714SGowrishankar Muthukrishnan 		val[1].len = msg.len;
2357d5c24714SGowrishankar 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 
2363f4797baeSDamian Nowak 	for (i = 0; i < (SHA_MD_BLOCK); i++)
2364f4797baeSDamian Nowak 		rte_free(md[i].val);
2365f4797baeSDamian Nowak 
2366f4797baeSDamian Nowak 	rte_free(vec.pt.val);
2367f4797baeSDamian Nowak 
2368d5c24714SGowrishankar Muthukrishnan 	free(val[0].val);
2369d5c24714SGowrishankar Muthukrishnan 	free(msg.val);
2370952e10cdSFan Zhang 
2371f4797baeSDamian Nowak 	return 0;
2372f4797baeSDamian Nowak }
2373f4797baeSDamian Nowak 
2374f4797baeSDamian Nowak 
2375f4797baeSDamian Nowak static int
2376cd255ccfSMarko Kovacevic init_test_ops(void)
2377cd255ccfSMarko Kovacevic {
2378cd255ccfSMarko Kovacevic 	switch (info.algo) {
237975777166SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CBC:
2380c8956fd2SBrian Dooley 	case FIPS_TEST_ALGO_AES_CTR:
2381cd255ccfSMarko Kovacevic 	case FIPS_TEST_ALGO_AES:
238236128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
238336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform  = prepare_aes_xform;
2384cd255ccfSMarko Kovacevic 		if (info.interim_info.aes_data.test_type == AESAVS_TYPE_MCT)
2385cd255ccfSMarko Kovacevic 			test_ops.test = fips_mct_aes_test;
2386cd255ccfSMarko Kovacevic 		else
2387cd255ccfSMarko Kovacevic 			test_ops.test = fips_generic_test;
2388cd255ccfSMarko Kovacevic 		break;
2389f64adb67SMarko Kovacevic 	case FIPS_TEST_ALGO_HMAC:
239036128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
239136128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_hmac_xform;
2392f64adb67SMarko Kovacevic 		test_ops.test = fips_generic_test;
2393f64adb67SMarko Kovacevic 		break;
2394527cbf3dSMarko Kovacevic 	case FIPS_TEST_ALGO_TDES:
239536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
239636128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_tdes_xform;
2397527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.test_type == TDES_MCT)
2398527cbf3dSMarko Kovacevic 			test_ops.test = fips_mct_tdes_test;
2399527cbf3dSMarko Kovacevic 		else
2400527cbf3dSMarko Kovacevic 			test_ops.test = fips_generic_test;
2401527cbf3dSMarko Kovacevic 		break;
2402e27268bdSBrian Dooley 	case FIPS_TEST_ALGO_AES_GMAC:
240336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
240436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gmac_xform;
2405e27268bdSBrian Dooley 		test_ops.test = fips_generic_test;
2406e27268bdSBrian Dooley 		break;
24074aaad299SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_GCM:
240836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_aead_op;
240936128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gcm_xform;
24104aaad299SMarko Kovacevic 		test_ops.test = fips_generic_test;
24114aaad299SMarko Kovacevic 		break;
2412ac026f46SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_CMAC:
241336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
241436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_cmac_xform;
2415ac026f46SMarko Kovacevic 		test_ops.test = fips_generic_test;
2416ac026f46SMarko Kovacevic 		break;
2417305921f4SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_CCM:
241836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_aead_op;
241936128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_ccm_xform;
2420305921f4SMarko Kovacevic 		test_ops.test = fips_generic_test;
2421305921f4SMarko Kovacevic 		break;
2422f4797baeSDamian Nowak 	case FIPS_TEST_ALGO_SHA:
242336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
242436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_sha_xform;
2425f4797baeSDamian Nowak 		if (info.interim_info.sha_data.test_type == SHA_MCT)
2426f4797baeSDamian Nowak 			test_ops.test = fips_mct_sha_test;
2427f4797baeSDamian Nowak 		else
2428f4797baeSDamian Nowak 			test_ops.test = fips_generic_test;
2429f4797baeSDamian Nowak 		break;
2430d5a9ea55SSucharitha Sarananaga 	case FIPS_TEST_ALGO_AES_XTS:
243136128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
243236128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_xts_xform;
243336128a67SGowrishankar Muthukrishnan 		test_ops.test = fips_generic_test;
243436128a67SGowrishankar Muthukrishnan 		break;
243536128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_RSA:
243636128a67SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = prepare_rsa_op;
243736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = prepare_rsa_xform;
2438d5a9ea55SSucharitha Sarananaga 		test_ops.test = fips_generic_test;
2439d5a9ea55SSucharitha Sarananaga 		break;
2440*b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_ECDSA:
2441*b455d261SGowrishankar Muthukrishnan 		if (info.op == FIPS_TEST_ASYM_KEYGEN) {
2442*b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecfpm_op;
2443*b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecfpm_xform;
2444*b455d261SGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2445*b455d261SGowrishankar Muthukrishnan 		} else {
2446*b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecdsa_op;
2447*b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecdsa_xform;
2448*b455d261SGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2449*b455d261SGowrishankar Muthukrishnan 		}
2450*b455d261SGowrishankar Muthukrishnan 		break;
2451cd255ccfSMarko Kovacevic 	default:
2452efe3a8dbSMichael Shamis 		if (strstr(info.file_name, "TECB") ||
2453efe3a8dbSMichael Shamis 				strstr(info.file_name, "TCBC")) {
2454efe3a8dbSMichael Shamis 			info.algo = FIPS_TEST_ALGO_TDES;
245536128a67SGowrishankar Muthukrishnan 			test_ops.prepare_sym_op = prepare_cipher_op;
245636128a67SGowrishankar Muthukrishnan 			test_ops.prepare_sym_xform = prepare_tdes_xform;
2457efe3a8dbSMichael Shamis 			if (info.interim_info.tdes_data.test_type == TDES_MCT)
2458efe3a8dbSMichael Shamis 				test_ops.test = fips_mct_tdes_test;
2459efe3a8dbSMichael Shamis 			else
2460efe3a8dbSMichael Shamis 				test_ops.test = fips_generic_test;
2461efe3a8dbSMichael Shamis 			break;
2462efe3a8dbSMichael Shamis 		}
2463cd255ccfSMarko Kovacevic 		return -1;
2464cd255ccfSMarko Kovacevic 	}
2465cd255ccfSMarko Kovacevic 
2466cd255ccfSMarko Kovacevic 	return 0;
2467cd255ccfSMarko Kovacevic }
2468cd255ccfSMarko Kovacevic 
24693d0fad56SMarko Kovacevic static void
24703d0fad56SMarko Kovacevic print_test_block(void)
24713d0fad56SMarko Kovacevic {
24723d0fad56SMarko Kovacevic 	uint32_t i;
24733d0fad56SMarko Kovacevic 
24743d0fad56SMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++)
24753d0fad56SMarko Kovacevic 		printf("%s\n", info.vec[i]);
24763d0fad56SMarko Kovacevic 
24773d0fad56SMarko Kovacevic 	printf("\n");
24783d0fad56SMarko Kovacevic }
24793d0fad56SMarko Kovacevic 
24803d0fad56SMarko Kovacevic static int
24813d0fad56SMarko Kovacevic fips_test_one_file(void)
24823d0fad56SMarko Kovacevic {
24833d0fad56SMarko Kovacevic 	int fetch_ret = 0, ret;
24843d0fad56SMarko Kovacevic 
2485cd255ccfSMarko Kovacevic 	ret = init_test_ops();
2486cd255ccfSMarko Kovacevic 	if (ret < 0) {
2487cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Init test op\n", ret);
2488cd255ccfSMarko Kovacevic 		return ret;
2489cd255ccfSMarko Kovacevic 	}
2490cd255ccfSMarko Kovacevic 
2491cd255ccfSMarko Kovacevic 	while (ret >= 0 && fetch_ret == 0) {
24923d0fad56SMarko Kovacevic 		fetch_ret = fips_test_fetch_one_block();
24933d0fad56SMarko Kovacevic 		if (fetch_ret < 0) {
24943d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Fetch block\n",
24953d0fad56SMarko Kovacevic 					fetch_ret);
24963d0fad56SMarko Kovacevic 			ret = fetch_ret;
24973d0fad56SMarko Kovacevic 			goto error_one_case;
24983d0fad56SMarko Kovacevic 		}
24993d0fad56SMarko Kovacevic 
25003d0fad56SMarko Kovacevic 		if (info.nb_vec_lines == 0) {
25013d0fad56SMarko Kovacevic 			if (fetch_ret == -EOF)
25023d0fad56SMarko Kovacevic 				break;
25033d0fad56SMarko Kovacevic 
25043d0fad56SMarko Kovacevic 			fprintf(info.fp_wr, "\n");
25053d0fad56SMarko Kovacevic 			continue;
25063d0fad56SMarko Kovacevic 		}
25073d0fad56SMarko Kovacevic 
25083d0fad56SMarko Kovacevic 		ret = fips_test_parse_one_case();
25093d0fad56SMarko Kovacevic 		switch (ret) {
25103d0fad56SMarko Kovacevic 		case 0:
2511cd255ccfSMarko Kovacevic 			ret = test_ops.test();
25123d0fad56SMarko Kovacevic 			if (ret == 0)
25133d0fad56SMarko Kovacevic 				break;
25143d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: test block\n",
25153d0fad56SMarko Kovacevic 					ret);
25163d0fad56SMarko Kovacevic 			goto error_one_case;
25173d0fad56SMarko Kovacevic 		case 1:
25183d0fad56SMarko Kovacevic 			break;
25193d0fad56SMarko Kovacevic 		default:
25203d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
25213d0fad56SMarko Kovacevic 					ret);
25223d0fad56SMarko Kovacevic 			goto error_one_case;
25233d0fad56SMarko Kovacevic 		}
25243d0fad56SMarko Kovacevic 
25253d0fad56SMarko Kovacevic 		continue;
25263d0fad56SMarko Kovacevic error_one_case:
25273d0fad56SMarko Kovacevic 		print_test_block();
25283d0fad56SMarko Kovacevic 	}
25293d0fad56SMarko Kovacevic 
25303d0fad56SMarko Kovacevic 	fips_test_clear();
25313d0fad56SMarko Kovacevic 
253215bb59a5SCiara Power 	if (env.digest) {
2533952e10cdSFan Zhang 		rte_free(env.digest);
253415bb59a5SCiara Power 		env.digest = NULL;
253515bb59a5SCiara Power 	}
2536952e10cdSFan Zhang 	rte_pktmbuf_free(env.mbuf);
2537cd255ccfSMarko Kovacevic 
2538952e10cdSFan Zhang 	return ret;
25393d0fad56SMarko Kovacevic }
254089be27e3SBrandon Lo 
25418d70a194SDavid Marchand #ifdef USE_JANSSON
254289be27e3SBrandon Lo static int
254389be27e3SBrandon Lo fips_test_json_init_writeback(void)
254489be27e3SBrandon Lo {
254589be27e3SBrandon Lo 	json_t *session_info, *session_write;
254689be27e3SBrandon Lo 	session_info = json_array_get(json_info.json_root, 0);
254789be27e3SBrandon Lo 	session_write = json_object();
254889be27e3SBrandon Lo 	json_info.json_write_root = json_array();
254989be27e3SBrandon Lo 
255089be27e3SBrandon Lo 	json_object_set(session_write, "jwt",
255189be27e3SBrandon Lo 		json_object_get(session_info, "jwt"));
255289be27e3SBrandon Lo 	json_object_set(session_write, "url",
255389be27e3SBrandon Lo 		json_object_get(session_info, "url"));
255489be27e3SBrandon Lo 	json_object_set(session_write, "isSample",
255589be27e3SBrandon Lo 		json_object_get(session_info, "isSample"));
255689be27e3SBrandon Lo 
255789be27e3SBrandon Lo 	json_info.is_sample = json_boolean_value(
255889be27e3SBrandon Lo 		json_object_get(session_info, "isSample"));
255989be27e3SBrandon Lo 
256089be27e3SBrandon Lo 	json_array_append_new(json_info.json_write_root, session_write);
256189be27e3SBrandon Lo 	return 0;
256289be27e3SBrandon Lo }
256389be27e3SBrandon Lo 
256489be27e3SBrandon Lo static int
256589be27e3SBrandon Lo fips_test_one_test_case(void)
256689be27e3SBrandon Lo {
256789be27e3SBrandon Lo 	int ret;
256889be27e3SBrandon Lo 
256989be27e3SBrandon Lo 	ret = fips_test_parse_one_json_case();
257089be27e3SBrandon Lo 
257189be27e3SBrandon Lo 	switch (ret) {
257289be27e3SBrandon Lo 	case 0:
257389be27e3SBrandon Lo 		ret = test_ops.test();
257489be27e3SBrandon Lo 		if ((ret == 0) || (ret == -EPERM || ret == -ENOTSUP))
257589be27e3SBrandon Lo 			break;
257689be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error %i: test block\n",
257789be27e3SBrandon Lo 				ret);
257889be27e3SBrandon Lo 		break;
257989be27e3SBrandon Lo 	default:
258089be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
258189be27e3SBrandon Lo 				ret);
258289be27e3SBrandon Lo 	}
258389be27e3SBrandon Lo 	return ret;
258489be27e3SBrandon Lo }
258589be27e3SBrandon Lo 
258689be27e3SBrandon Lo static int
258789be27e3SBrandon Lo fips_test_one_test_group(void)
258889be27e3SBrandon Lo {
258989be27e3SBrandon Lo 	int ret;
259089be27e3SBrandon Lo 	json_t *tests, *write_tests;
259189be27e3SBrandon Lo 	size_t test_idx, tests_size;
259289be27e3SBrandon Lo 
259389be27e3SBrandon Lo 	write_tests = json_array();
259489be27e3SBrandon Lo 	json_info.json_write_group = json_object();
259589be27e3SBrandon Lo 	json_object_set(json_info.json_write_group, "tgId",
259689be27e3SBrandon Lo 		json_object_get(json_info.json_test_group, "tgId"));
259789be27e3SBrandon Lo 	json_object_set_new(json_info.json_write_group, "tests", write_tests);
259889be27e3SBrandon Lo 
259989be27e3SBrandon Lo 	switch (info.algo) {
2600e27268bdSBrian Dooley 	case FIPS_TEST_ALGO_AES_GMAC:
260189be27e3SBrandon Lo 	case FIPS_TEST_ALGO_AES_GCM:
2602b09aac2dSBrandon Lo 		ret = parse_test_gcm_json_init();
260389be27e3SBrandon Lo 		break;
2604443c93d8SBrandon Lo 	case FIPS_TEST_ALGO_HMAC:
2605443c93d8SBrandon Lo 		ret = parse_test_hmac_json_init();
2606443c93d8SBrandon Lo 		break;
260707da56a6SBrandon Lo 	case FIPS_TEST_ALGO_AES_CMAC:
260807da56a6SBrandon Lo 		ret = parse_test_cmac_json_init();
260907da56a6SBrandon Lo 		break;
2610f8e431edSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_XTS:
2611f8e431edSGowrishankar Muthukrishnan 		ret = parse_test_xts_json_init();
2612f8e431edSGowrishankar Muthukrishnan 		break;
2613f8e431edSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CBC:
2614c8956fd2SBrian Dooley 	case FIPS_TEST_ALGO_AES_CTR:
26158b8546aaSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES:
26168b8546aaSGowrishankar Muthukrishnan 		ret = parse_test_aes_json_init();
26178b8546aaSGowrishankar Muthukrishnan 		break;
2618d5c24714SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_SHA:
2619d5c24714SGowrishankar Muthukrishnan 		ret = parse_test_sha_json_init();
2620d5c24714SGowrishankar Muthukrishnan 		break;
262164569ffaSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_TDES:
262264569ffaSGowrishankar Muthukrishnan 		ret = parse_test_tdes_json_init();
262364569ffaSGowrishankar Muthukrishnan 		break;
262436128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_RSA:
262536128a67SGowrishankar Muthukrishnan 		ret = parse_test_rsa_json_init();
262636128a67SGowrishankar Muthukrishnan 		break;
2627*b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_ECDSA:
2628*b455d261SGowrishankar Muthukrishnan 		ret = parse_test_ecdsa_json_init();
2629*b455d261SGowrishankar Muthukrishnan 		break;
263089be27e3SBrandon Lo 	default:
263189be27e3SBrandon Lo 		return -EINVAL;
263289be27e3SBrandon Lo 	}
2633b09aac2dSBrandon Lo 
263489be27e3SBrandon Lo 	if (ret < 0)
263589be27e3SBrandon Lo 		return ret;
263689be27e3SBrandon Lo 
263789be27e3SBrandon Lo 	ret = fips_test_parse_one_json_group();
263889be27e3SBrandon Lo 	if (ret < 0)
263989be27e3SBrandon Lo 		return ret;
264089be27e3SBrandon Lo 
264189be27e3SBrandon Lo 	ret = init_test_ops();
264289be27e3SBrandon Lo 	if (ret < 0)
264389be27e3SBrandon Lo 		return ret;
264489be27e3SBrandon Lo 
264589be27e3SBrandon Lo 	tests = json_object_get(json_info.json_test_group, "tests");
264689be27e3SBrandon Lo 	tests_size = json_array_size(tests);
264789be27e3SBrandon Lo 	for (test_idx = 0; test_idx < tests_size; test_idx++) {
264889be27e3SBrandon Lo 		json_info.json_test_case = json_array_get(tests, test_idx);
264989be27e3SBrandon Lo 		if (fips_test_one_test_case() == 0)
265089be27e3SBrandon Lo 			json_array_append_new(write_tests, json_info.json_write_case);
265189be27e3SBrandon Lo 	}
265289be27e3SBrandon Lo 
265389be27e3SBrandon Lo 	return 0;
265489be27e3SBrandon Lo }
265589be27e3SBrandon Lo 
265689be27e3SBrandon Lo static int
265789be27e3SBrandon Lo fips_test_one_vector_set(void)
265889be27e3SBrandon Lo {
265989be27e3SBrandon Lo 	int ret;
2660*b455d261SGowrishankar Muthukrishnan 	json_t *test_groups, *write_groups, *write_version, *write_set, *mode;
266189be27e3SBrandon Lo 	size_t group_idx, num_groups;
266289be27e3SBrandon Lo 
266389be27e3SBrandon Lo 	test_groups = json_object_get(json_info.json_vector_set, "testGroups");
266489be27e3SBrandon Lo 	num_groups = json_array_size(test_groups);
266589be27e3SBrandon Lo 
266689be27e3SBrandon Lo 	json_info.json_write_set = json_array();
266789be27e3SBrandon Lo 	write_version = json_object();
266889be27e3SBrandon Lo 	json_object_set_new(write_version, "acvVersion", json_string(ACVVERSION));
266989be27e3SBrandon Lo 	json_array_append_new(json_info.json_write_set, write_version);
267089be27e3SBrandon Lo 
267189be27e3SBrandon Lo 	write_set = json_object();
267289be27e3SBrandon Lo 	json_array_append(json_info.json_write_set, write_set);
267389be27e3SBrandon Lo 	write_groups = json_array();
267489be27e3SBrandon Lo 
267589be27e3SBrandon Lo 	json_object_set(write_set, "vsId",
267689be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "vsId"));
267789be27e3SBrandon Lo 	json_object_set(write_set, "algorithm",
267889be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "algorithm"));
2679*b455d261SGowrishankar Muthukrishnan 	mode = json_object_get(json_info.json_vector_set, "mode");
2680*b455d261SGowrishankar Muthukrishnan 	if (mode != NULL)
2681*b455d261SGowrishankar Muthukrishnan 		json_object_set_new(write_set, "mode", mode);
2682*b455d261SGowrishankar Muthukrishnan 
268389be27e3SBrandon Lo 	json_object_set(write_set, "revision",
268489be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "revision"));
268589be27e3SBrandon Lo 	json_object_set_new(write_set, "isSample",
268689be27e3SBrandon Lo 		json_boolean(json_info.is_sample));
268789be27e3SBrandon Lo 	json_object_set_new(write_set, "testGroups", write_groups);
268889be27e3SBrandon Lo 
268989be27e3SBrandon Lo 	ret = fips_test_parse_one_json_vector_set();
269089be27e3SBrandon Lo 	if (ret < 0) {
269189be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error: Unsupported or invalid vector set algorithm: %s\n",
269289be27e3SBrandon Lo 			json_string_value(json_object_get(json_info.json_vector_set, "algorithm")));
269389be27e3SBrandon Lo 		return ret;
269489be27e3SBrandon Lo 	}
269589be27e3SBrandon Lo 
269689be27e3SBrandon Lo 	for (group_idx = 0; group_idx < num_groups; group_idx++) {
269789be27e3SBrandon Lo 		json_info.json_test_group = json_array_get(test_groups, group_idx);
269889be27e3SBrandon Lo 		ret = fips_test_one_test_group();
269989be27e3SBrandon Lo 		json_array_append_new(write_groups, json_info.json_write_group);
270089be27e3SBrandon Lo 	}
270189be27e3SBrandon Lo 
270289be27e3SBrandon Lo 	return 0;
270389be27e3SBrandon Lo }
270489be27e3SBrandon Lo 
270589be27e3SBrandon Lo static int
270689be27e3SBrandon Lo fips_test_one_json_file(void)
270789be27e3SBrandon Lo {
270889be27e3SBrandon Lo 	size_t vector_set_idx, root_size;
270989be27e3SBrandon Lo 
271089be27e3SBrandon Lo 	root_size = json_array_size(json_info.json_root);
271189be27e3SBrandon Lo 	fips_test_json_init_writeback();
271289be27e3SBrandon Lo 
271389be27e3SBrandon Lo 	for (vector_set_idx = 1; vector_set_idx < root_size; vector_set_idx++) {
271489be27e3SBrandon Lo 		/* Vector set index starts at 1, the 0th index contains test session
271589be27e3SBrandon Lo 		 * information.
271689be27e3SBrandon Lo 		 */
271789be27e3SBrandon Lo 		json_info.json_vector_set = json_array_get(json_info.json_root, vector_set_idx);
271889be27e3SBrandon Lo 		fips_test_one_vector_set();
271989be27e3SBrandon Lo 		json_array_append_new(json_info.json_write_root, json_info.json_write_set);
2720d5c24714SGowrishankar Muthukrishnan 		json_incref(json_info.json_write_set);
272189be27e3SBrandon Lo 	}
272289be27e3SBrandon Lo 
272389be27e3SBrandon Lo 	json_dumpf(json_info.json_write_root, info.fp_wr, JSON_INDENT(4));
272489be27e3SBrandon Lo 	json_decref(json_info.json_write_root);
272589be27e3SBrandon Lo 
272689be27e3SBrandon Lo 	return 0;
272789be27e3SBrandon Lo }
27288d70a194SDavid Marchand #endif /* USE_JANSSON */
2729