xref: /dpdk/examples/fips_validation/main.c (revision 225f04fb3e4cce954a987923c030a1caed147299)
13d0fad56SMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause
23d0fad56SMarko Kovacevic  * Copyright(c) 2018 Intel Corporation
33d0fad56SMarko Kovacevic  */
43d0fad56SMarko Kovacevic 
53d0fad56SMarko Kovacevic #include <sys/stat.h>
63d0fad56SMarko Kovacevic #include <getopt.h>
73d0fad56SMarko Kovacevic #include <dirent.h>
872b452c5SDmitry Kozlyuk #include <stdlib.h>
93d0fad56SMarko Kovacevic 
103d0fad56SMarko Kovacevic #include <rte_cryptodev.h>
1174645f64SAkhil Goyal #include <rte_malloc.h>
123d0fad56SMarko Kovacevic #include <rte_mempool.h>
133d0fad56SMarko Kovacevic #include <rte_mbuf.h>
143d0fad56SMarko Kovacevic #include <rte_string_fns.h>
15b7ceea22SBrian Dooley #include <rte_random.h>
163d0fad56SMarko Kovacevic 
173d0fad56SMarko Kovacevic #include "fips_validation.h"
1841d561cbSFan Zhang #include "fips_dev_self_test.h"
193d0fad56SMarko Kovacevic 
20fc6e6515SIbtisam Tariq enum {
21fc6e6515SIbtisam Tariq #define OPT_REQ_FILE_PATH           "req-file"
22fc6e6515SIbtisam Tariq 	OPT_REQ_FILE_PATH_NUM = 256,
23fc6e6515SIbtisam Tariq #define OPT_RSP_FILE_PATH           "rsp-file"
24fc6e6515SIbtisam Tariq 	OPT_RSP_FILE_PATH_NUM,
25fc6e6515SIbtisam Tariq #define OPT_MBUF_DATAROOM           "mbuf-dataroom"
26fc6e6515SIbtisam Tariq 	OPT_MBUF_DATAROOM_NUM,
27fc6e6515SIbtisam Tariq #define OPT_FOLDER                  "path-is-folder"
28fc6e6515SIbtisam Tariq 	OPT_FOLDER_NUM,
29fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV               "cryptodev"
30fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_NUM,
31fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_ID            "cryptodev-id"
32fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_ID_NUM,
33fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_ST            "self-test"
34fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_ST_NUM,
35fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_BK_ID         "broken-test-id"
36fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_BK_ID_NUM,
37fc6e6515SIbtisam Tariq #define OPT_CRYPTODEV_BK_DIR_KEY    "broken-test-dir"
38fc6e6515SIbtisam Tariq 	OPT_CRYPTODEV_BK_DIR_KEY_NUM,
3989be27e3SBrandon Lo #define OPT_USE_JSON                "use-json"
4089be27e3SBrandon Lo 	OPT_USE_JSON_NUM,
4136128a67SGowrishankar Muthukrishnan #define OPT_CRYPTODEV_ASYM          "asymmetric"
4236128a67SGowrishankar Muthukrishnan 	OPT_CRYPTODEV_ASYM_NUM,
43fc6e6515SIbtisam Tariq };
443d0fad56SMarko Kovacevic 
453d0fad56SMarko Kovacevic struct fips_test_vector vec;
463d0fad56SMarko Kovacevic struct fips_test_interim_info info;
473d0fad56SMarko Kovacevic 
488d70a194SDavid Marchand #ifdef USE_JANSSON
4958cc9880SBrandon Lo struct fips_test_json_info json_info;
508d70a194SDavid Marchand #endif /* USE_JANSSON */
5158cc9880SBrandon Lo 
523d0fad56SMarko Kovacevic struct cryptodev_fips_validate_env {
533d0fad56SMarko Kovacevic 	const char *req_path;
543d0fad56SMarko Kovacevic 	const char *rsp_path;
553d0fad56SMarko Kovacevic 	uint32_t is_path_folder;
56952e10cdSFan Zhang 	uint8_t dev_id;
573d0fad56SMarko Kovacevic 	struct rte_mempool *mpool;
5836128a67SGowrishankar Muthukrishnan 	struct fips_sym_env {
59261bbff7SFan Zhang 		struct rte_mempool *sess_mpool;
603d0fad56SMarko Kovacevic 		struct rte_mempool *op_pool;
6136128a67SGowrishankar Muthukrishnan 		struct rte_cryptodev_sym_session *sess;
6236128a67SGowrishankar Muthukrishnan 		struct rte_crypto_op *op;
6336128a67SGowrishankar Muthukrishnan 	} sym;
6436128a67SGowrishankar Muthukrishnan 	struct fips_asym_env {
6536128a67SGowrishankar Muthukrishnan 		struct rte_mempool *sess_mpool;
6636128a67SGowrishankar Muthukrishnan 		struct rte_mempool *op_pool;
6736128a67SGowrishankar Muthukrishnan 		struct rte_cryptodev_asym_session *sess;
6836128a67SGowrishankar Muthukrishnan 		struct rte_crypto_op *op;
6936128a67SGowrishankar Muthukrishnan 	} asym;
7036128a67SGowrishankar Muthukrishnan 	struct rte_crypto_op *op;
7136128a67SGowrishankar Muthukrishnan 	uint8_t dev_support_sgl;
7236128a67SGowrishankar Muthukrishnan 	uint16_t mbuf_data_room;
733d0fad56SMarko Kovacevic 	struct rte_mbuf *mbuf;
74952e10cdSFan Zhang 	uint8_t *digest;
75952e10cdSFan Zhang 	uint16_t digest_len;
7636128a67SGowrishankar Muthukrishnan 	bool is_asym_test;
77952e10cdSFan Zhang 	uint16_t self_test;
7841d561cbSFan Zhang 	struct fips_dev_broken_test_config *broken_test_config;
793d0fad56SMarko Kovacevic } env;
803d0fad56SMarko Kovacevic 
813d0fad56SMarko Kovacevic static int
8236128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_sym_init(void)
8336128a67SGowrishankar Muthukrishnan {
8436128a67SGowrishankar Muthukrishnan 	uint32_t sess_sz = rte_cryptodev_sym_get_private_session_size(
8536128a67SGowrishankar Muthukrishnan 							env.dev_id);
8636128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_info dev_info;
8736128a67SGowrishankar Muthukrishnan 	struct fips_sym_env *sym = &env.sym;
8836128a67SGowrishankar Muthukrishnan 	int ret;
8936128a67SGowrishankar Muthukrishnan 
9036128a67SGowrishankar Muthukrishnan 	rte_cryptodev_info_get(env.dev_id, &dev_info);
9136128a67SGowrishankar Muthukrishnan 	if (dev_info.feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)
9236128a67SGowrishankar Muthukrishnan 		env.dev_support_sgl = 1;
9336128a67SGowrishankar Muthukrishnan 	else
9436128a67SGowrishankar Muthukrishnan 		env.dev_support_sgl = 0;
9536128a67SGowrishankar Muthukrishnan 
9636128a67SGowrishankar Muthukrishnan 	ret = -ENOMEM;
9736128a67SGowrishankar Muthukrishnan 	sym->sess_mpool = rte_cryptodev_sym_session_pool_create(
9836128a67SGowrishankar Muthukrishnan 			"FIPS_SYM_SESS_MEMPOOL", 16, sess_sz, 0, 0, rte_socket_id());
9936128a67SGowrishankar Muthukrishnan 	if (!sym->sess_mpool)
10036128a67SGowrishankar Muthukrishnan 		goto error_exit;
10136128a67SGowrishankar Muthukrishnan 
10236128a67SGowrishankar Muthukrishnan 	sym->op_pool = rte_crypto_op_pool_create(
10336128a67SGowrishankar Muthukrishnan 			"FIPS_OP_SYM_POOL",
10436128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
10536128a67SGowrishankar Muthukrishnan 			1, 0,
10636128a67SGowrishankar Muthukrishnan 			16,
10736128a67SGowrishankar Muthukrishnan 			rte_socket_id());
10836128a67SGowrishankar Muthukrishnan 	if (!sym->op_pool)
10936128a67SGowrishankar Muthukrishnan 		goto error_exit;
11036128a67SGowrishankar Muthukrishnan 
11136128a67SGowrishankar Muthukrishnan 	sym->op = rte_crypto_op_alloc(sym->op_pool, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11236128a67SGowrishankar Muthukrishnan 	if (!sym->op)
11336128a67SGowrishankar Muthukrishnan 		goto error_exit;
11436128a67SGowrishankar Muthukrishnan 
11536128a67SGowrishankar Muthukrishnan 	return 0;
11636128a67SGowrishankar Muthukrishnan 
11736128a67SGowrishankar Muthukrishnan error_exit:
11836128a67SGowrishankar Muthukrishnan 	rte_mempool_free(sym->sess_mpool);
11936128a67SGowrishankar Muthukrishnan 	rte_mempool_free(sym->op_pool);
12036128a67SGowrishankar Muthukrishnan 	return ret;
12136128a67SGowrishankar Muthukrishnan }
12236128a67SGowrishankar Muthukrishnan 
12336128a67SGowrishankar Muthukrishnan static void
12436128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_sym_uninit(void)
12536128a67SGowrishankar Muthukrishnan {
12636128a67SGowrishankar Muthukrishnan 	struct fips_sym_env *sym = &env.sym;
12736128a67SGowrishankar Muthukrishnan 
12836128a67SGowrishankar Muthukrishnan 	rte_pktmbuf_free(env.mbuf);
12936128a67SGowrishankar Muthukrishnan 	rte_crypto_op_free(sym->op);
13036128a67SGowrishankar Muthukrishnan 	rte_cryptodev_sym_session_free(env.dev_id, sym->sess);
13136128a67SGowrishankar Muthukrishnan 	rte_mempool_free(sym->sess_mpool);
13236128a67SGowrishankar Muthukrishnan 	rte_mempool_free(sym->op_pool);
13336128a67SGowrishankar Muthukrishnan }
13436128a67SGowrishankar Muthukrishnan 
13536128a67SGowrishankar Muthukrishnan static int
13636128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_asym_init(void)
13736128a67SGowrishankar Muthukrishnan {
13836128a67SGowrishankar Muthukrishnan 	struct fips_asym_env *asym = &env.asym;
13936128a67SGowrishankar Muthukrishnan 	int ret;
14036128a67SGowrishankar Muthukrishnan 
14136128a67SGowrishankar Muthukrishnan 	ret = -ENOMEM;
14236128a67SGowrishankar Muthukrishnan 	asym->sess_mpool = rte_cryptodev_asym_session_pool_create(
14336128a67SGowrishankar Muthukrishnan 			"FIPS_ASYM_SESS_MEMPOOL", 16, 0, 0, rte_socket_id());
14436128a67SGowrishankar Muthukrishnan 	if (!asym->sess_mpool)
14536128a67SGowrishankar Muthukrishnan 		goto error_exit;
14636128a67SGowrishankar Muthukrishnan 
14736128a67SGowrishankar Muthukrishnan 	asym->op_pool = rte_crypto_op_pool_create(
14836128a67SGowrishankar Muthukrishnan 			"FIPS_OP_ASYM_POOL",
14936128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
15036128a67SGowrishankar Muthukrishnan 			1, 0,
15136128a67SGowrishankar Muthukrishnan 			16,
15236128a67SGowrishankar Muthukrishnan 			rte_socket_id());
15336128a67SGowrishankar Muthukrishnan 	if (!asym->op_pool)
15436128a67SGowrishankar Muthukrishnan 		goto error_exit;
15536128a67SGowrishankar Muthukrishnan 
15636128a67SGowrishankar Muthukrishnan 	asym->op = rte_crypto_op_alloc(asym->op_pool, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
15736128a67SGowrishankar Muthukrishnan 	if (!asym->op)
15836128a67SGowrishankar Muthukrishnan 		goto error_exit;
15936128a67SGowrishankar Muthukrishnan 
16036128a67SGowrishankar Muthukrishnan 	return 0;
16136128a67SGowrishankar Muthukrishnan 
16236128a67SGowrishankar Muthukrishnan error_exit:
16336128a67SGowrishankar Muthukrishnan 	rte_mempool_free(asym->sess_mpool);
16436128a67SGowrishankar Muthukrishnan 	rte_mempool_free(asym->op_pool);
16536128a67SGowrishankar Muthukrishnan 	return ret;
16636128a67SGowrishankar Muthukrishnan }
16736128a67SGowrishankar Muthukrishnan 
16836128a67SGowrishankar Muthukrishnan static void
16936128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_asym_uninit(void)
17036128a67SGowrishankar Muthukrishnan {
17136128a67SGowrishankar Muthukrishnan 	struct fips_asym_env *asym = &env.asym;
17236128a67SGowrishankar Muthukrishnan 
17336128a67SGowrishankar Muthukrishnan 	rte_crypto_op_free(asym->op);
17436128a67SGowrishankar Muthukrishnan 	rte_cryptodev_asym_session_free(env.dev_id, asym->sess);
17536128a67SGowrishankar Muthukrishnan 	rte_mempool_free(asym->sess_mpool);
17636128a67SGowrishankar Muthukrishnan 	rte_mempool_free(asym->op_pool);
17736128a67SGowrishankar Muthukrishnan }
17836128a67SGowrishankar Muthukrishnan 
17936128a67SGowrishankar Muthukrishnan static int
18036128a67SGowrishankar Muthukrishnan cryptodev_fips_validate_app_init(void)
1813d0fad56SMarko Kovacevic {
182c9030ae3SAnoob Joseph 	struct rte_cryptodev_config conf = {rte_socket_id(), 1, 0};
183bdce2564SAkhil Goyal 	struct rte_cryptodev_qp_conf qp_conf = {128, NULL};
184952e10cdSFan Zhang 	uint32_t nb_mbufs = UINT16_MAX / env.mbuf_data_room + 1;
1853d0fad56SMarko Kovacevic 	int ret;
1863d0fad56SMarko Kovacevic 
18741d561cbSFan Zhang 	if (env.self_test) {
18841d561cbSFan Zhang 		ret = fips_dev_self_test(env.dev_id, env.broken_test_config);
18941d561cbSFan Zhang 		if (ret < 0) {
19036128a67SGowrishankar Muthukrishnan 			rte_cryptodev_stop(env.dev_id);
19174645f64SAkhil Goyal 			rte_cryptodev_close(env.dev_id);
19241d561cbSFan Zhang 
19341d561cbSFan Zhang 			return ret;
19441d561cbSFan Zhang 		}
19541d561cbSFan Zhang 	}
19641d561cbSFan Zhang 
1973d0fad56SMarko Kovacevic 	ret = rte_cryptodev_configure(env.dev_id, &conf);
1983d0fad56SMarko Kovacevic 	if (ret < 0)
1993d0fad56SMarko Kovacevic 		return ret;
2003d0fad56SMarko Kovacevic 
20136128a67SGowrishankar Muthukrishnan 	ret = -ENOMEM;
202952e10cdSFan Zhang 	env.mpool = rte_pktmbuf_pool_create("FIPS_MEMPOOL", nb_mbufs,
203952e10cdSFan Zhang 			0, 0, sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM +
204952e10cdSFan Zhang 			env.mbuf_data_room, rte_socket_id());
2053d0fad56SMarko Kovacevic 	if (!env.mpool)
2063d0fad56SMarko Kovacevic 		return ret;
2073d0fad56SMarko Kovacevic 
20836128a67SGowrishankar Muthukrishnan 	ret = cryptodev_fips_validate_app_sym_init();
2093d0fad56SMarko Kovacevic 	if (ret < 0)
210261bbff7SFan Zhang 		goto error_exit;
211261bbff7SFan Zhang 
21236128a67SGowrishankar Muthukrishnan 	if (env.is_asym_test) {
21336128a67SGowrishankar Muthukrishnan 		ret = cryptodev_fips_validate_app_asym_init();
21436128a67SGowrishankar Muthukrishnan 		if (ret < 0)
2153d0fad56SMarko Kovacevic 			goto error_exit;
21636128a67SGowrishankar Muthukrishnan 	}
2173d0fad56SMarko Kovacevic 
21836128a67SGowrishankar Muthukrishnan 	qp_conf.mp_session = env.sym.sess_mpool;
219261bbff7SFan Zhang 
220261bbff7SFan Zhang 	ret = rte_cryptodev_queue_pair_setup(env.dev_id, 0, &qp_conf,
221261bbff7SFan Zhang 			rte_socket_id());
222261bbff7SFan Zhang 	if (ret < 0)
223261bbff7SFan Zhang 		goto error_exit;
224261bbff7SFan Zhang 
2253b2311ccSFan Zhang 	ret = rte_cryptodev_start(env.dev_id);
2263b2311ccSFan Zhang 	if (ret < 0)
2273b2311ccSFan Zhang 		goto error_exit;
2283b2311ccSFan Zhang 
2293d0fad56SMarko Kovacevic 	return 0;
2303d0fad56SMarko Kovacevic 
2313d0fad56SMarko Kovacevic error_exit:
2323d0fad56SMarko Kovacevic 	rte_mempool_free(env.mpool);
2333d0fad56SMarko Kovacevic 	return ret;
2343d0fad56SMarko Kovacevic }
2353d0fad56SMarko Kovacevic 
2363d0fad56SMarko Kovacevic static void
2373d0fad56SMarko Kovacevic cryptodev_fips_validate_app_uninit(void)
2383d0fad56SMarko Kovacevic {
23936128a67SGowrishankar Muthukrishnan 	cryptodev_fips_validate_app_sym_uninit();
24036128a67SGowrishankar Muthukrishnan 
24136128a67SGowrishankar Muthukrishnan 	if (env.is_asym_test)
24236128a67SGowrishankar Muthukrishnan 		cryptodev_fips_validate_app_asym_uninit();
24336128a67SGowrishankar Muthukrishnan 
2443d0fad56SMarko Kovacevic 	rte_mempool_free(env.mpool);
24536128a67SGowrishankar Muthukrishnan 	rte_cryptodev_stop(env.dev_id);
24636128a67SGowrishankar Muthukrishnan 	rte_cryptodev_close(env.dev_id);
2473d0fad56SMarko Kovacevic }
2483d0fad56SMarko Kovacevic 
2493d0fad56SMarko Kovacevic static int
2503d0fad56SMarko Kovacevic fips_test_one_file(void);
2513d0fad56SMarko Kovacevic 
2528d70a194SDavid Marchand #ifdef USE_JANSSON
25389be27e3SBrandon Lo static int
25489be27e3SBrandon Lo fips_test_one_json_file(void);
2558d70a194SDavid Marchand #endif /* USE_JANSSON */
25689be27e3SBrandon Lo 
2573d0fad56SMarko Kovacevic static int
2583d0fad56SMarko Kovacevic parse_cryptodev_arg(char *arg)
2593d0fad56SMarko Kovacevic {
2603d0fad56SMarko Kovacevic 	int id = rte_cryptodev_get_dev_id(arg);
2613d0fad56SMarko Kovacevic 
2623d0fad56SMarko Kovacevic 	if (id < 0) {
2633d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev name %s\n",
2643d0fad56SMarko Kovacevic 				id, arg);
2653d0fad56SMarko Kovacevic 		return id;
2663d0fad56SMarko Kovacevic 	}
2673d0fad56SMarko Kovacevic 
268952e10cdSFan Zhang 	env.dev_id = (uint8_t)id;
2693d0fad56SMarko Kovacevic 
2703d0fad56SMarko Kovacevic 	return 0;
2713d0fad56SMarko Kovacevic }
2723d0fad56SMarko Kovacevic 
2733d0fad56SMarko Kovacevic static int
2743d0fad56SMarko Kovacevic parse_cryptodev_id_arg(char *arg)
2753d0fad56SMarko Kovacevic {
2763d0fad56SMarko Kovacevic 	uint32_t cryptodev_id;
2773d0fad56SMarko Kovacevic 
2783d0fad56SMarko Kovacevic 	if (parser_read_uint32(&cryptodev_id, arg) < 0) {
2793d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
2803d0fad56SMarko Kovacevic 				-EINVAL, arg);
2813d0fad56SMarko Kovacevic 		return -1;
2823d0fad56SMarko Kovacevic 	}
2833d0fad56SMarko Kovacevic 
2843d0fad56SMarko Kovacevic 
285e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(cryptodev_id)) {
2863d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
2873d0fad56SMarko Kovacevic 				cryptodev_id, arg);
2883d0fad56SMarko Kovacevic 		return -1;
2893d0fad56SMarko Kovacevic 	}
2903d0fad56SMarko Kovacevic 
291952e10cdSFan Zhang 	env.dev_id = (uint8_t)cryptodev_id;
2923d0fad56SMarko Kovacevic 
2933d0fad56SMarko Kovacevic 	return 0;
2943d0fad56SMarko Kovacevic }
2953d0fad56SMarko Kovacevic 
2963d0fad56SMarko Kovacevic static void
2973d0fad56SMarko Kovacevic cryptodev_fips_validate_usage(const char *prgname)
2983d0fad56SMarko Kovacevic {
299952e10cdSFan Zhang 	uint32_t def_mbuf_seg_size = DEF_MBUF_SEG_SIZE;
3003d0fad56SMarko Kovacevic 	printf("%s [EAL options] --\n"
3013d0fad56SMarko Kovacevic 		"  --%s: REQUEST-FILE-PATH\n"
3023d0fad56SMarko Kovacevic 		"  --%s: RESPONSE-FILE-PATH\n"
3033d0fad56SMarko Kovacevic 		"  --%s: indicating both paths are folders\n"
304952e10cdSFan Zhang 		"  --%s: mbuf dataroom size (default %u bytes)\n"
3053d0fad56SMarko Kovacevic 		"  --%s: CRYPTODEV-NAME\n"
30641d561cbSFan Zhang 		"  --%s: CRYPTODEV-ID-NAME\n"
30741d561cbSFan Zhang 		"  --%s: self test indicator\n"
30841d561cbSFan Zhang 		"  --%s: self broken test ID\n"
30941d561cbSFan Zhang 		"  --%s: self broken test direction\n",
310fc6e6515SIbtisam Tariq 		prgname, OPT_REQ_FILE_PATH, OPT_RSP_FILE_PATH,
311fc6e6515SIbtisam Tariq 		OPT_FOLDER, OPT_MBUF_DATAROOM, def_mbuf_seg_size,
312fc6e6515SIbtisam Tariq 		OPT_CRYPTODEV, OPT_CRYPTODEV_ID, OPT_CRYPTODEV_ST,
313fc6e6515SIbtisam Tariq 		OPT_CRYPTODEV_BK_ID, OPT_CRYPTODEV_BK_DIR_KEY);
3143d0fad56SMarko Kovacevic }
3153d0fad56SMarko Kovacevic 
3163d0fad56SMarko Kovacevic static int
3173d0fad56SMarko Kovacevic cryptodev_fips_validate_parse_args(int argc, char **argv)
3183d0fad56SMarko Kovacevic {
3193d0fad56SMarko Kovacevic 	int opt, ret;
3203d0fad56SMarko Kovacevic 	char *prgname = argv[0];
3213d0fad56SMarko Kovacevic 	char **argvopt;
3223d0fad56SMarko Kovacevic 	int option_index;
3233d0fad56SMarko Kovacevic 	struct option lgopts[] = {
324fc6e6515SIbtisam Tariq 		{OPT_REQ_FILE_PATH, required_argument,
325fc6e6515SIbtisam Tariq 				NULL, OPT_REQ_FILE_PATH_NUM},
326fc6e6515SIbtisam Tariq 		{OPT_RSP_FILE_PATH, required_argument,
327fc6e6515SIbtisam Tariq 				NULL, OPT_RSP_FILE_PATH_NUM},
328fc6e6515SIbtisam Tariq 		{OPT_FOLDER, no_argument,
329fc6e6515SIbtisam Tariq 				NULL, OPT_FOLDER_NUM},
330fc6e6515SIbtisam Tariq 		{OPT_MBUF_DATAROOM, required_argument,
331fc6e6515SIbtisam Tariq 				NULL, OPT_MBUF_DATAROOM_NUM},
332fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV, required_argument,
333fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_NUM},
334fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV_ID, required_argument,
335fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_ID_NUM},
336fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV_ST, no_argument,
337fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_ST_NUM},
338fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV_BK_ID, required_argument,
339fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_BK_ID_NUM},
340fc6e6515SIbtisam Tariq 		{OPT_CRYPTODEV_BK_DIR_KEY, required_argument,
341fc6e6515SIbtisam Tariq 				NULL, OPT_CRYPTODEV_BK_DIR_KEY_NUM},
34236128a67SGowrishankar Muthukrishnan 		{OPT_CRYPTODEV_ASYM, no_argument,
34336128a67SGowrishankar Muthukrishnan 				NULL, OPT_CRYPTODEV_ASYM_NUM},
3443d0fad56SMarko Kovacevic 		{NULL, 0, 0, 0}
3453d0fad56SMarko Kovacevic 	};
3463d0fad56SMarko Kovacevic 
3473d0fad56SMarko Kovacevic 	argvopt = argv;
3483d0fad56SMarko Kovacevic 
349952e10cdSFan Zhang 	env.mbuf_data_room = DEF_MBUF_SEG_SIZE;
350952e10cdSFan Zhang 	if (rte_cryptodev_count())
351952e10cdSFan Zhang 		env.dev_id = 0;
352952e10cdSFan Zhang 	else {
353952e10cdSFan Zhang 		cryptodev_fips_validate_usage(prgname);
354952e10cdSFan Zhang 		return -EINVAL;
355952e10cdSFan Zhang 	}
356952e10cdSFan Zhang 
3573d0fad56SMarko Kovacevic 	while ((opt = getopt_long(argc, argvopt, "s:",
3583d0fad56SMarko Kovacevic 				  lgopts, &option_index)) != EOF) {
3593d0fad56SMarko Kovacevic 
3603d0fad56SMarko Kovacevic 		switch (opt) {
361fc6e6515SIbtisam Tariq 		case OPT_REQ_FILE_PATH_NUM:
3623d0fad56SMarko Kovacevic 			env.req_path = optarg;
363fc6e6515SIbtisam Tariq 			break;
364fc6e6515SIbtisam Tariq 
365fc6e6515SIbtisam Tariq 		case OPT_RSP_FILE_PATH_NUM:
3663d0fad56SMarko Kovacevic 			env.rsp_path = optarg;
367fc6e6515SIbtisam Tariq 			break;
368fc6e6515SIbtisam Tariq 
369fc6e6515SIbtisam Tariq 		case OPT_FOLDER_NUM:
3703d0fad56SMarko Kovacevic 			env.is_path_folder = 1;
371fc6e6515SIbtisam Tariq 			break;
372fc6e6515SIbtisam Tariq 
373fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_NUM:
3743d0fad56SMarko Kovacevic 			ret = parse_cryptodev_arg(optarg);
3753d0fad56SMarko Kovacevic 			if (ret < 0) {
3763d0fad56SMarko Kovacevic 				cryptodev_fips_validate_usage(prgname);
3773d0fad56SMarko Kovacevic 				return -EINVAL;
3783d0fad56SMarko Kovacevic 			}
379fc6e6515SIbtisam Tariq 			break;
380fc6e6515SIbtisam Tariq 
381fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_ID_NUM:
3823d0fad56SMarko Kovacevic 			ret = parse_cryptodev_id_arg(optarg);
3833d0fad56SMarko Kovacevic 			if (ret < 0) {
3843d0fad56SMarko Kovacevic 				cryptodev_fips_validate_usage(prgname);
3853d0fad56SMarko Kovacevic 				return -EINVAL;
3863d0fad56SMarko Kovacevic 			}
387fc6e6515SIbtisam Tariq 			break;
388fc6e6515SIbtisam Tariq 
389fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_ST_NUM:
39041d561cbSFan Zhang 			env.self_test = 1;
391fc6e6515SIbtisam Tariq 			break;
392fc6e6515SIbtisam Tariq 
393fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_BK_ID_NUM:
39441d561cbSFan Zhang 			if (!env.broken_test_config) {
39541d561cbSFan Zhang 				env.broken_test_config = rte_malloc(
39641d561cbSFan Zhang 					NULL,
39741d561cbSFan Zhang 					sizeof(*env.broken_test_config),
39841d561cbSFan Zhang 					0);
39941d561cbSFan Zhang 				if (!env.broken_test_config)
40041d561cbSFan Zhang 					return -ENOMEM;
40141d561cbSFan Zhang 
40241d561cbSFan Zhang 				env.broken_test_config->expect_fail_dir =
40341d561cbSFan Zhang 					self_test_dir_enc_auth_gen;
40441d561cbSFan Zhang 			}
40541d561cbSFan Zhang 
40641d561cbSFan Zhang 			if (parser_read_uint32(
40741d561cbSFan Zhang 				&env.broken_test_config->expect_fail_test_idx,
40841d561cbSFan Zhang 					optarg) < 0) {
40941d561cbSFan Zhang 				rte_free(env.broken_test_config);
41041d561cbSFan Zhang 				cryptodev_fips_validate_usage(prgname);
41141d561cbSFan Zhang 				return -EINVAL;
41241d561cbSFan Zhang 			}
413fc6e6515SIbtisam Tariq 			break;
414fc6e6515SIbtisam Tariq 
415fc6e6515SIbtisam Tariq 		case OPT_CRYPTODEV_BK_DIR_KEY_NUM:
41641d561cbSFan Zhang 			if (!env.broken_test_config) {
41741d561cbSFan Zhang 				env.broken_test_config = rte_malloc(
41841d561cbSFan Zhang 					NULL,
41941d561cbSFan Zhang 					sizeof(*env.broken_test_config),
42041d561cbSFan Zhang 					0);
42141d561cbSFan Zhang 				if (!env.broken_test_config)
42241d561cbSFan Zhang 					return -ENOMEM;
42341d561cbSFan Zhang 
424fc6e6515SIbtisam Tariq 				env.broken_test_config->expect_fail_test_idx =
425fc6e6515SIbtisam Tariq 					0;
42641d561cbSFan Zhang 			}
42741d561cbSFan Zhang 
428fc6e6515SIbtisam Tariq 			if (strcmp(optarg, "enc") == 0)
42941d561cbSFan Zhang 				env.broken_test_config->expect_fail_dir =
43041d561cbSFan Zhang 					self_test_dir_enc_auth_gen;
431fc6e6515SIbtisam Tariq 			else if (strcmp(optarg, "dec")
43241d561cbSFan Zhang 					== 0)
43341d561cbSFan Zhang 				env.broken_test_config->expect_fail_dir =
43441d561cbSFan Zhang 					self_test_dir_dec_auth_verify;
43541d561cbSFan Zhang 			else {
43641d561cbSFan Zhang 				rte_free(env.broken_test_config);
43741d561cbSFan Zhang 				cryptodev_fips_validate_usage(prgname);
43841d561cbSFan Zhang 				return -EINVAL;
43941d561cbSFan Zhang 			}
440fc6e6515SIbtisam Tariq 			break;
441952e10cdSFan Zhang 
442fc6e6515SIbtisam Tariq 
443fc6e6515SIbtisam Tariq 		case OPT_MBUF_DATAROOM_NUM:
444fc6e6515SIbtisam Tariq 			if (parser_read_uint16(&env.mbuf_data_room,
445952e10cdSFan Zhang 					optarg) < 0) {
446952e10cdSFan Zhang 				cryptodev_fips_validate_usage(prgname);
447952e10cdSFan Zhang 				return -EINVAL;
448952e10cdSFan Zhang 			}
449952e10cdSFan Zhang 
450fc6e6515SIbtisam Tariq 			if (env.mbuf_data_room == 0) {
4513d0fad56SMarko Kovacevic 				cryptodev_fips_validate_usage(prgname);
4523d0fad56SMarko Kovacevic 				return -EINVAL;
4533d0fad56SMarko Kovacevic 			}
4543d0fad56SMarko Kovacevic 			break;
455fc6e6515SIbtisam Tariq 
45636128a67SGowrishankar Muthukrishnan 		case OPT_CRYPTODEV_ASYM_NUM:
45736128a67SGowrishankar Muthukrishnan 			env.is_asym_test = true;
45836128a67SGowrishankar Muthukrishnan 			break;
45936128a67SGowrishankar Muthukrishnan 
4603d0fad56SMarko Kovacevic 		default:
461fc6e6515SIbtisam Tariq 			cryptodev_fips_validate_usage(prgname);
462fc6e6515SIbtisam Tariq 			return -EINVAL;
4633d0fad56SMarko Kovacevic 		}
4643d0fad56SMarko Kovacevic 	}
4653d0fad56SMarko Kovacevic 
4661442ab1aSOlivier Matz 	if ((env.req_path == NULL && env.rsp_path != NULL) ||
4671442ab1aSOlivier Matz 			(env.req_path != NULL && env.rsp_path == NULL)) {
4681442ab1aSOlivier Matz 		RTE_LOG(ERR, USER1, "Missing req path or rsp path\n");
4691442ab1aSOlivier Matz 		cryptodev_fips_validate_usage(prgname);
4701442ab1aSOlivier Matz 		return -EINVAL;
4711442ab1aSOlivier Matz 	}
4721442ab1aSOlivier Matz 
4731442ab1aSOlivier Matz 	if (env.req_path == NULL && env.self_test == 0) {
4741442ab1aSOlivier Matz 		RTE_LOG(ERR, USER1, "--self-test must be set if req path is missing\n");
4753d0fad56SMarko Kovacevic 		cryptodev_fips_validate_usage(prgname);
4763d0fad56SMarko Kovacevic 		return -EINVAL;
4773d0fad56SMarko Kovacevic 	}
4783d0fad56SMarko Kovacevic 
4793d0fad56SMarko Kovacevic 	return 0;
4803d0fad56SMarko Kovacevic }
4813d0fad56SMarko Kovacevic 
4823d0fad56SMarko Kovacevic int
4833d0fad56SMarko Kovacevic main(int argc, char *argv[])
4843d0fad56SMarko Kovacevic {
4853d0fad56SMarko Kovacevic 	int ret;
4863d0fad56SMarko Kovacevic 
4873d0fad56SMarko Kovacevic 	ret = rte_eal_init(argc, argv);
4883d0fad56SMarko Kovacevic 	if (ret < 0) {
4893d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
4903d0fad56SMarko Kovacevic 		return -1;
4913d0fad56SMarko Kovacevic 	}
4923d0fad56SMarko Kovacevic 
4933d0fad56SMarko Kovacevic 	argc -= ret;
4943d0fad56SMarko Kovacevic 	argv += ret;
4953d0fad56SMarko Kovacevic 
4963d0fad56SMarko Kovacevic 	ret = cryptodev_fips_validate_parse_args(argc, argv);
4973d0fad56SMarko Kovacevic 	if (ret < 0)
4983d0fad56SMarko Kovacevic 		rte_exit(EXIT_FAILURE, "Failed to parse arguments!\n");
4993d0fad56SMarko Kovacevic 
50036128a67SGowrishankar Muthukrishnan 	ret = cryptodev_fips_validate_app_init();
5013d0fad56SMarko Kovacevic 	if (ret < 0) {
5023d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
5033d0fad56SMarko Kovacevic 		return -1;
5043d0fad56SMarko Kovacevic 	}
5053d0fad56SMarko Kovacevic 
5061442ab1aSOlivier Matz 	if (env.req_path == NULL || env.rsp_path == NULL) {
5071442ab1aSOlivier Matz 		printf("No request, exit.\n");
5081442ab1aSOlivier Matz 		goto exit;
5091442ab1aSOlivier Matz 	}
5101442ab1aSOlivier Matz 
5113d0fad56SMarko Kovacevic 	if (!env.is_path_folder) {
5123d0fad56SMarko Kovacevic 		printf("Processing file %s... ", env.req_path);
5133d0fad56SMarko Kovacevic 
5143d0fad56SMarko Kovacevic 		ret = fips_test_init(env.req_path, env.rsp_path,
5153d0fad56SMarko Kovacevic 			rte_cryptodev_name_get(env.dev_id));
5163d0fad56SMarko Kovacevic 		if (ret < 0) {
5173d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
5183d0fad56SMarko Kovacevic 					ret, env.req_path);
5193d0fad56SMarko Kovacevic 			goto exit;
5203d0fad56SMarko Kovacevic 		}
5213d0fad56SMarko Kovacevic 
5228d70a194SDavid Marchand #ifdef USE_JANSSON
52389be27e3SBrandon Lo 		if (info.file_type == FIPS_TYPE_JSON) {
52489be27e3SBrandon Lo 			ret = fips_test_one_json_file();
52589be27e3SBrandon Lo 			json_decref(json_info.json_root);
52689be27e3SBrandon Lo 		}  else {
5273d0fad56SMarko Kovacevic 			ret = fips_test_one_file();
52889be27e3SBrandon Lo 		}
5298d70a194SDavid Marchand #else /* USE_JANSSON */
53089be27e3SBrandon Lo 		ret = fips_test_one_file();
5318d70a194SDavid Marchand #endif /* USE_JANSSON */
53289be27e3SBrandon Lo 
5333d0fad56SMarko Kovacevic 		if (ret < 0) {
5343d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
5353d0fad56SMarko Kovacevic 					ret, env.req_path);
5363d0fad56SMarko Kovacevic 			goto exit;
5373d0fad56SMarko Kovacevic 		}
5383d0fad56SMarko Kovacevic 
5393d0fad56SMarko Kovacevic 		printf("Done\n");
5403d0fad56SMarko Kovacevic 
5413d0fad56SMarko Kovacevic 	} else {
5423d0fad56SMarko Kovacevic 		struct dirent *dir;
5433d0fad56SMarko Kovacevic 		DIR *d_req, *d_rsp;
5443d0fad56SMarko Kovacevic 		char req_path[1024];
5453d0fad56SMarko Kovacevic 		char rsp_path[1024];
5463d0fad56SMarko Kovacevic 
5473d0fad56SMarko Kovacevic 		d_req = opendir(env.req_path);
5483d0fad56SMarko Kovacevic 		if (!d_req) {
5493d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Path %s not exist\n",
5503d0fad56SMarko Kovacevic 					-EINVAL, env.req_path);
5513d0fad56SMarko Kovacevic 			goto exit;
5523d0fad56SMarko Kovacevic 		}
5533d0fad56SMarko Kovacevic 
5543d0fad56SMarko Kovacevic 		d_rsp = opendir(env.rsp_path);
5553d0fad56SMarko Kovacevic 		if (!d_rsp) {
5563d0fad56SMarko Kovacevic 			ret = mkdir(env.rsp_path, 0700);
5573d0fad56SMarko Kovacevic 			if (ret == 0)
5583d0fad56SMarko Kovacevic 				d_rsp = opendir(env.rsp_path);
5593d0fad56SMarko Kovacevic 			else {
5603d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Invalid %s\n",
5613d0fad56SMarko Kovacevic 						-EINVAL, env.rsp_path);
5623d0fad56SMarko Kovacevic 				goto exit;
5633d0fad56SMarko Kovacevic 			}
5643d0fad56SMarko Kovacevic 		}
5653d0fad56SMarko Kovacevic 		closedir(d_rsp);
5663d0fad56SMarko Kovacevic 
5673d0fad56SMarko Kovacevic 		while ((dir = readdir(d_req)) != NULL) {
5683d0fad56SMarko Kovacevic 			if (strstr(dir->d_name, "req") == NULL)
5693d0fad56SMarko Kovacevic 				continue;
5703d0fad56SMarko Kovacevic 
5713d0fad56SMarko Kovacevic 			snprintf(req_path, 1023, "%s/%s", env.req_path,
5723d0fad56SMarko Kovacevic 					dir->d_name);
5733d0fad56SMarko Kovacevic 			snprintf(rsp_path, 1023, "%s/%s", env.rsp_path,
5743d0fad56SMarko Kovacevic 					dir->d_name);
5753d0fad56SMarko Kovacevic 			strlcpy(strstr(rsp_path, "req"), "rsp", 4);
5763d0fad56SMarko Kovacevic 
5773d0fad56SMarko Kovacevic 			printf("Processing file %s... ", req_path);
5783d0fad56SMarko Kovacevic 
5793d0fad56SMarko Kovacevic 			ret = fips_test_init(req_path, rsp_path,
5803d0fad56SMarko Kovacevic 			rte_cryptodev_name_get(env.dev_id));
5813d0fad56SMarko Kovacevic 			if (ret < 0) {
5823d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
5833d0fad56SMarko Kovacevic 						ret, req_path);
5843d0fad56SMarko Kovacevic 				break;
5853d0fad56SMarko Kovacevic 			}
5863d0fad56SMarko Kovacevic 
5878d70a194SDavid Marchand #ifdef USE_JANSSON
58889be27e3SBrandon Lo 			if (info.file_type == FIPS_TYPE_JSON) {
58989be27e3SBrandon Lo 				ret = fips_test_one_json_file();
59089be27e3SBrandon Lo 				json_decref(json_info.json_root);
59189be27e3SBrandon Lo 			} else {
5923d0fad56SMarko Kovacevic 				ret = fips_test_one_file();
59389be27e3SBrandon Lo 			}
5948d70a194SDavid Marchand #else /* USE_JANSSON */
59589be27e3SBrandon Lo 			ret = fips_test_one_file();
5968d70a194SDavid Marchand #endif /* USE_JANSSON */
59789be27e3SBrandon Lo 
5983d0fad56SMarko Kovacevic 			if (ret < 0) {
5993d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
6003d0fad56SMarko Kovacevic 						ret, req_path);
6013d0fad56SMarko Kovacevic 				break;
6023d0fad56SMarko Kovacevic 			}
6033d0fad56SMarko Kovacevic 
6043d0fad56SMarko Kovacevic 			printf("Done\n");
6053d0fad56SMarko Kovacevic 		}
6063d0fad56SMarko Kovacevic 
6073d0fad56SMarko Kovacevic 		closedir(d_req);
6083d0fad56SMarko Kovacevic 	}
6093d0fad56SMarko Kovacevic 
6103d0fad56SMarko Kovacevic 
6113d0fad56SMarko Kovacevic exit:
6123d0fad56SMarko Kovacevic 	fips_test_clear();
6133d0fad56SMarko Kovacevic 	cryptodev_fips_validate_app_uninit();
6143d0fad56SMarko Kovacevic 
61510aa3757SChengchang Tang 	/* clean up the EAL */
61610aa3757SChengchang Tang 	rte_eal_cleanup();
61710aa3757SChengchang Tang 
6183d0fad56SMarko Kovacevic 	return ret;
6193d0fad56SMarko Kovacevic 
6203d0fad56SMarko Kovacevic }
6213d0fad56SMarko Kovacevic 
622cd255ccfSMarko Kovacevic #define IV_OFF (sizeof(struct rte_crypto_op) + sizeof(struct rte_crypto_sym_op))
623cd255ccfSMarko Kovacevic #define CRYPTODEV_FIPS_MAX_RETRIES	16
624cd255ccfSMarko Kovacevic 
625d09abf2dSFan Zhang struct fips_test_ops test_ops;
626cd255ccfSMarko Kovacevic 
627cd255ccfSMarko Kovacevic static int
628952e10cdSFan Zhang prepare_data_mbufs(struct fips_val *val)
629952e10cdSFan Zhang {
630952e10cdSFan Zhang 	struct rte_mbuf *m, *head = 0;
631952e10cdSFan Zhang 	uint8_t *src = val->val;
632952e10cdSFan Zhang 	uint32_t total_len = val->len;
633952e10cdSFan Zhang 	uint16_t nb_seg;
634952e10cdSFan Zhang 	int ret = 0;
635952e10cdSFan Zhang 
636952e10cdSFan Zhang 	rte_pktmbuf_free(env.mbuf);
637952e10cdSFan Zhang 
638952e10cdSFan Zhang 	if (total_len > RTE_MBUF_MAX_NB_SEGS) {
639952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Data len %u too big\n", total_len);
640952e10cdSFan Zhang 		return -EPERM;
641952e10cdSFan Zhang 	}
642952e10cdSFan Zhang 
643952e10cdSFan Zhang 	nb_seg = total_len / env.mbuf_data_room;
644952e10cdSFan Zhang 	if (total_len % env.mbuf_data_room)
645952e10cdSFan Zhang 		nb_seg++;
646952e10cdSFan Zhang 
647952e10cdSFan Zhang 	m = rte_pktmbuf_alloc(env.mpool);
648952e10cdSFan Zhang 	if (!m) {
649952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error %i: Not enough mbuf\n",
650952e10cdSFan Zhang 				-ENOMEM);
651952e10cdSFan Zhang 		return -ENOMEM;
652952e10cdSFan Zhang 	}
653952e10cdSFan Zhang 	head = m;
654952e10cdSFan Zhang 
655952e10cdSFan Zhang 	while (nb_seg) {
656952e10cdSFan Zhang 		uint16_t len = RTE_MIN(total_len, env.mbuf_data_room);
657952e10cdSFan Zhang 		uint8_t *dst = (uint8_t *)rte_pktmbuf_append(m, len);
658952e10cdSFan Zhang 
659952e10cdSFan Zhang 		if (!dst) {
660952e10cdSFan Zhang 			RTE_LOG(ERR, USER1, "Error %i: MBUF too small\n",
661952e10cdSFan Zhang 					-ENOMEM);
662952e10cdSFan Zhang 			ret = -ENOMEM;
663952e10cdSFan Zhang 			goto error_exit;
664952e10cdSFan Zhang 		}
665952e10cdSFan Zhang 
666952e10cdSFan Zhang 		memcpy(dst, src, len);
667952e10cdSFan Zhang 
668952e10cdSFan Zhang 		if (head != m) {
669952e10cdSFan Zhang 			ret = rte_pktmbuf_chain(head, m);
670952e10cdSFan Zhang 			if (ret) {
671952e10cdSFan Zhang 				rte_pktmbuf_free(m);
672952e10cdSFan Zhang 				RTE_LOG(ERR, USER1, "Error %i: SGL build\n",
673952e10cdSFan Zhang 						ret);
674952e10cdSFan Zhang 				goto error_exit;
675952e10cdSFan Zhang 			}
676952e10cdSFan Zhang 		}
677952e10cdSFan Zhang 		total_len -= len;
678952e10cdSFan Zhang 
679952e10cdSFan Zhang 		if (total_len) {
680952e10cdSFan Zhang 			if (!env.dev_support_sgl) {
681952e10cdSFan Zhang 				RTE_LOG(ERR, USER1, "SGL not supported\n");
682952e10cdSFan Zhang 				ret = -EPERM;
683952e10cdSFan Zhang 				goto error_exit;
684952e10cdSFan Zhang 			}
685952e10cdSFan Zhang 
686952e10cdSFan Zhang 			m = rte_pktmbuf_alloc(env.mpool);
687952e10cdSFan Zhang 			if (!m) {
688952e10cdSFan Zhang 				RTE_LOG(ERR, USER1, "Error %i: No memory\n",
689952e10cdSFan Zhang 						-ENOMEM);
690952e10cdSFan Zhang 				goto error_exit;
691952e10cdSFan Zhang 			}
692952e10cdSFan Zhang 		} else
693952e10cdSFan Zhang 			break;
694952e10cdSFan Zhang 
695952e10cdSFan Zhang 		src += len;
696952e10cdSFan Zhang 		nb_seg--;
697952e10cdSFan Zhang 	}
698952e10cdSFan Zhang 
699952e10cdSFan Zhang 	if (total_len) {
700952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error %i: Failed to store all data\n",
701952e10cdSFan Zhang 				-ENOMEM);
702952e10cdSFan Zhang 		goto error_exit;
703952e10cdSFan Zhang 	}
704952e10cdSFan Zhang 
705952e10cdSFan Zhang 	env.mbuf = head;
706952e10cdSFan Zhang 
707952e10cdSFan Zhang 	return 0;
708952e10cdSFan Zhang 
709952e10cdSFan Zhang error_exit:
710952e10cdSFan Zhang 	rte_pktmbuf_free(head);
711952e10cdSFan Zhang 	return ret;
712952e10cdSFan Zhang }
713952e10cdSFan Zhang 
714952e10cdSFan Zhang static int
715cd255ccfSMarko Kovacevic prepare_cipher_op(void)
716cd255ccfSMarko Kovacevic {
717cd255ccfSMarko Kovacevic 	struct rte_crypto_sym_op *sym = env.op->sym;
718cd255ccfSMarko Kovacevic 	uint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *, IV_OFF);
719952e10cdSFan Zhang 	int ret;
720cd255ccfSMarko Kovacevic 
721cd255ccfSMarko Kovacevic 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
722cd255ccfSMarko Kovacevic 
723cd255ccfSMarko Kovacevic 	memcpy(iv, vec.iv.val, vec.iv.len);
724cd255ccfSMarko Kovacevic 
725cd255ccfSMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
726952e10cdSFan Zhang 		ret = prepare_data_mbufs(&vec.pt);
727952e10cdSFan Zhang 		if (ret < 0)
728952e10cdSFan Zhang 			return ret;
729cd255ccfSMarko Kovacevic 
730cd255ccfSMarko Kovacevic 		sym->cipher.data.length = vec.pt.len;
731cd255ccfSMarko Kovacevic 	} else {
732952e10cdSFan Zhang 		ret = prepare_data_mbufs(&vec.ct);
733952e10cdSFan Zhang 		if (ret < 0)
734952e10cdSFan Zhang 			return ret;
735cd255ccfSMarko Kovacevic 
736cd255ccfSMarko Kovacevic 		sym->cipher.data.length = vec.ct.len;
737cd255ccfSMarko Kovacevic 	}
738cd255ccfSMarko Kovacevic 
73936128a67SGowrishankar Muthukrishnan 	rte_crypto_op_attach_sym_session(env.op, env.sym.sess);
740cd255ccfSMarko Kovacevic 
741952e10cdSFan Zhang 	sym->m_src = env.mbuf;
742952e10cdSFan Zhang 	sym->cipher.data.offset = 0;
743952e10cdSFan Zhang 
744cd255ccfSMarko Kovacevic 	return 0;
745cd255ccfSMarko Kovacevic }
746cd255ccfSMarko Kovacevic 
747d09abf2dSFan Zhang int
748f64adb67SMarko Kovacevic prepare_auth_op(void)
749f64adb67SMarko Kovacevic {
750f64adb67SMarko Kovacevic 	struct rte_crypto_sym_op *sym = env.op->sym;
751952e10cdSFan Zhang 	int ret;
752f64adb67SMarko Kovacevic 
753f64adb67SMarko Kovacevic 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
754952e10cdSFan Zhang 
755e27268bdSBrian Dooley 	if (info.interim_info.gcm_data.gen_iv == 1) {
756e27268bdSBrian Dooley 		uint32_t i;
757e27268bdSBrian Dooley 
758e27268bdSBrian Dooley 		if (!vec.iv.val) {
759e27268bdSBrian Dooley 			vec.iv.val = rte_malloc(0, vec.iv.len, 0);
760e27268bdSBrian Dooley 			if (!vec.iv.val)
761e27268bdSBrian Dooley 				return -ENOMEM;
762e27268bdSBrian Dooley 		}
763e27268bdSBrian Dooley 
764e27268bdSBrian Dooley 		for (i = 0; i < vec.iv.len; i++) {
765b7ceea22SBrian Dooley 			int random = rte_rand();
766e27268bdSBrian Dooley 			vec.iv.val[i] = (uint8_t)random;
767e27268bdSBrian Dooley 		}
768e27268bdSBrian Dooley 	}
769e27268bdSBrian Dooley 
770d09abf2dSFan Zhang 	if (vec.iv.len) {
771d09abf2dSFan Zhang 		uint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *,
772d09abf2dSFan Zhang 				IV_OFF);
773d09abf2dSFan Zhang 		memset(iv, 0, vec.iv.len);
774d09abf2dSFan Zhang 		if (vec.iv.val)
775d09abf2dSFan Zhang 			memcpy(iv, vec.iv.val, vec.iv.len);
776d09abf2dSFan Zhang 	}
777d09abf2dSFan Zhang 
778952e10cdSFan Zhang 	ret = prepare_data_mbufs(&vec.pt);
779952e10cdSFan Zhang 	if (ret < 0)
780952e10cdSFan Zhang 		return ret;
781952e10cdSFan Zhang 
782952e10cdSFan Zhang 	rte_free(env.digest);
783952e10cdSFan Zhang 
784952e10cdSFan Zhang 	env.digest = rte_zmalloc(NULL, vec.cipher_auth.digest.len,
785952e10cdSFan Zhang 			RTE_CACHE_LINE_SIZE);
786952e10cdSFan Zhang 	if (!env.digest) {
787952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Not enough memory\n");
788952e10cdSFan Zhang 		return -ENOMEM;
789952e10cdSFan Zhang 	}
790952e10cdSFan Zhang 	env.digest_len = vec.cipher_auth.digest.len;
791f64adb67SMarko Kovacevic 
792f64adb67SMarko Kovacevic 	sym->m_src = env.mbuf;
793f64adb67SMarko Kovacevic 	sym->auth.data.offset = 0;
794f64adb67SMarko Kovacevic 	sym->auth.data.length = vec.pt.len;
795952e10cdSFan Zhang 	sym->auth.digest.data = env.digest;
796952e10cdSFan Zhang 	sym->auth.digest.phys_addr = rte_malloc_virt2iova(env.digest);
797f64adb67SMarko Kovacevic 
79882cfb9c2SFan Zhang 	if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
799952e10cdSFan Zhang 		memcpy(env.digest, vec.cipher_auth.digest.val,
80082cfb9c2SFan Zhang 				vec.cipher_auth.digest.len);
801f64adb67SMarko Kovacevic 
80236128a67SGowrishankar Muthukrishnan 	rte_crypto_op_attach_sym_session(env.op, env.sym.sess);
803c05e4ab7SThomas Monjalon 
804c05e4ab7SThomas Monjalon 	return 0;
805f64adb67SMarko Kovacevic }
806f64adb67SMarko Kovacevic 
807d09abf2dSFan Zhang int
8084aaad299SMarko Kovacevic prepare_aead_op(void)
8094aaad299SMarko Kovacevic {
8104aaad299SMarko Kovacevic 	struct rte_crypto_sym_op *sym = env.op->sym;
8114aaad299SMarko Kovacevic 	uint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *, IV_OFF);
812952e10cdSFan Zhang 	int ret;
8134aaad299SMarko Kovacevic 
8144aaad299SMarko Kovacevic 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8154aaad299SMarko Kovacevic 
816305921f4SMarko Kovacevic 	if (info.algo == FIPS_TEST_ALGO_AES_CCM)
817952e10cdSFan Zhang 		iv++;
8184aaad299SMarko Kovacevic 
819952e10cdSFan Zhang 	if (vec.iv.val)
820952e10cdSFan Zhang 		memcpy(iv, vec.iv.val, vec.iv.len);
821952e10cdSFan Zhang 	else
822952e10cdSFan Zhang 		/* if REQ file has iv length but not data, default as all 0 */
823952e10cdSFan Zhang 		memset(iv, 0, vec.iv.len);
8244aaad299SMarko Kovacevic 
8254aaad299SMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
826952e10cdSFan Zhang 		ret = prepare_data_mbufs(&vec.pt);
827952e10cdSFan Zhang 		if (ret < 0)
828952e10cdSFan Zhang 			return ret;
8294aaad299SMarko Kovacevic 
830952e10cdSFan Zhang 		rte_free(env.digest);
831952e10cdSFan Zhang 		env.digest = rte_zmalloc(NULL, vec.aead.digest.len,
832952e10cdSFan Zhang 				RTE_CACHE_LINE_SIZE);
833952e10cdSFan Zhang 		if (!env.digest) {
834952e10cdSFan Zhang 			RTE_LOG(ERR, USER1, "Not enough memory\n");
8354aaad299SMarko Kovacevic 			return -ENOMEM;
8364aaad299SMarko Kovacevic 		}
837952e10cdSFan Zhang 		env.digest_len = vec.cipher_auth.digest.len;
8384aaad299SMarko Kovacevic 
8394aaad299SMarko Kovacevic 		sym->aead.data.length = vec.pt.len;
840952e10cdSFan Zhang 		sym->aead.digest.data = env.digest;
841952e10cdSFan Zhang 		sym->aead.digest.phys_addr = rte_malloc_virt2iova(env.digest);
8424aaad299SMarko Kovacevic 	} else {
843952e10cdSFan Zhang 		ret = prepare_data_mbufs(&vec.ct);
844952e10cdSFan Zhang 		if (ret < 0)
845952e10cdSFan Zhang 			return ret;
8464aaad299SMarko Kovacevic 
8474aaad299SMarko Kovacevic 		sym->aead.data.length = vec.ct.len;
8484aaad299SMarko Kovacevic 		sym->aead.digest.data = vec.aead.digest.val;
8494aaad299SMarko Kovacevic 		sym->aead.digest.phys_addr = rte_malloc_virt2iova(
8504aaad299SMarko Kovacevic 				sym->aead.digest.data);
8514aaad299SMarko Kovacevic 	}
8524aaad299SMarko Kovacevic 
853952e10cdSFan Zhang 	sym->m_src = env.mbuf;
854952e10cdSFan Zhang 	sym->aead.data.offset = 0;
855952e10cdSFan Zhang 	sym->aead.aad.data = vec.aead.aad.val;
856952e10cdSFan Zhang 	sym->aead.aad.phys_addr = rte_malloc_virt2iova(sym->aead.aad.data);
857952e10cdSFan Zhang 
85836128a67SGowrishankar Muthukrishnan 	rte_crypto_op_attach_sym_session(env.op, env.sym.sess);
85936128a67SGowrishankar Muthukrishnan 
86036128a67SGowrishankar Muthukrishnan 	return 0;
86136128a67SGowrishankar Muthukrishnan }
86236128a67SGowrishankar Muthukrishnan 
86336128a67SGowrishankar Muthukrishnan static int
864ae5ae3bfSGowrishankar Muthukrishnan get_hash_oid(enum rte_crypto_auth_algorithm hash, uint8_t *buf)
865ae5ae3bfSGowrishankar Muthukrishnan {
866ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha512[] = {0x30, 0x51, 0x30, 0x0d, 0x06, 0x09,
867ae5ae3bfSGowrishankar Muthukrishnan 				  0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
868ae5ae3bfSGowrishankar Muthukrishnan 				  0x04, 0x02, 0x03, 0x05, 0x00, 0x04,
869ae5ae3bfSGowrishankar Muthukrishnan 				  0x40};
870ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha384[] = {0x30, 0x41, 0x30, 0x0d, 0x06, 0x09,
871ae5ae3bfSGowrishankar Muthukrishnan 				  0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
872ae5ae3bfSGowrishankar Muthukrishnan 				  0x04, 0x02, 0x02, 0x05, 0x00, 0x04,
873ae5ae3bfSGowrishankar Muthukrishnan 				  0x30};
874ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha256[] = {0x30, 0x31, 0x30, 0x0d, 0x06, 0x09,
875ae5ae3bfSGowrishankar Muthukrishnan 				  0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
876ae5ae3bfSGowrishankar Muthukrishnan 				  0x04, 0x02, 0x01, 0x05, 0x00, 0x04,
877ae5ae3bfSGowrishankar Muthukrishnan 				  0x20};
878ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha224[] = {0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09,
879ae5ae3bfSGowrishankar Muthukrishnan 				  0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
880ae5ae3bfSGowrishankar Muthukrishnan 				  0x04, 0x02, 0x04, 0x05, 0x00, 0x04,
881ae5ae3bfSGowrishankar Muthukrishnan 				  0x1c};
882ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t id_sha1[] = {0x30, 0x21, 0x30, 0x09, 0x06, 0x05,
883ae5ae3bfSGowrishankar Muthukrishnan 				0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05,
884ae5ae3bfSGowrishankar Muthukrishnan 				0x00, 0x04, 0x14};
885ae5ae3bfSGowrishankar Muthukrishnan 	uint8_t *id = NULL;
886ae5ae3bfSGowrishankar Muthukrishnan 	int id_len = 0;
887ae5ae3bfSGowrishankar Muthukrishnan 
888ae5ae3bfSGowrishankar Muthukrishnan 	switch (hash) {
889ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA1:
890ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha1;
891ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha1);
892ae5ae3bfSGowrishankar Muthukrishnan 		break;
893ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA224:
894ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha224;
895ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha224);
896ae5ae3bfSGowrishankar Muthukrishnan 		break;
897ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA256:
898ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha256;
899ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha256);
900ae5ae3bfSGowrishankar Muthukrishnan 		break;
901ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA384:
902ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha384;
903ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha384);
904ae5ae3bfSGowrishankar Muthukrishnan 		break;
905ae5ae3bfSGowrishankar Muthukrishnan 	case RTE_CRYPTO_AUTH_SHA512:
906ae5ae3bfSGowrishankar Muthukrishnan 		id = id_sha512;
907ae5ae3bfSGowrishankar Muthukrishnan 		id_len = sizeof(id_sha512);
908ae5ae3bfSGowrishankar Muthukrishnan 		break;
909ae5ae3bfSGowrishankar Muthukrishnan 	default:
910ae5ae3bfSGowrishankar Muthukrishnan 		id_len = -1;
911ae5ae3bfSGowrishankar Muthukrishnan 		break;
912ae5ae3bfSGowrishankar Muthukrishnan 	}
913ae5ae3bfSGowrishankar Muthukrishnan 
914ae5ae3bfSGowrishankar Muthukrishnan 	if (id != NULL)
915ae5ae3bfSGowrishankar Muthukrishnan 		rte_memcpy(buf, id, id_len);
916ae5ae3bfSGowrishankar Muthukrishnan 
917ae5ae3bfSGowrishankar Muthukrishnan 	return id_len;
918ae5ae3bfSGowrishankar Muthukrishnan }
919ae5ae3bfSGowrishankar Muthukrishnan 
920ae5ae3bfSGowrishankar Muthukrishnan static int
92136128a67SGowrishankar Muthukrishnan prepare_rsa_op(void)
92236128a67SGowrishankar Muthukrishnan {
92336128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
92436128a67SGowrishankar Muthukrishnan 	struct fips_val msg;
92536128a67SGowrishankar Muthukrishnan 
92636128a67SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
92736128a67SGowrishankar Muthukrishnan 
92836128a67SGowrishankar Muthukrishnan 	asym = env.op->asym;
92936128a67SGowrishankar Muthukrishnan 	asym->rsa.padding.type = info.interim_info.rsa_data.padding;
93036128a67SGowrishankar Muthukrishnan 	asym->rsa.padding.hash = info.interim_info.rsa_data.auth;
93136128a67SGowrishankar Muthukrishnan 
93236128a67SGowrishankar Muthukrishnan 	if (env.digest) {
933ae5ae3bfSGowrishankar Muthukrishnan 		if (asym->rsa.padding.type == RTE_CRYPTO_RSA_PADDING_PKCS1_5) {
934ae5ae3bfSGowrishankar Muthukrishnan 			int b_len = 0;
935ae5ae3bfSGowrishankar Muthukrishnan 			uint8_t b[32];
936ae5ae3bfSGowrishankar Muthukrishnan 
937ae5ae3bfSGowrishankar Muthukrishnan 			b_len = get_hash_oid(asym->rsa.padding.hash, b);
938ae5ae3bfSGowrishankar Muthukrishnan 			if (b_len < 0) {
939ae5ae3bfSGowrishankar Muthukrishnan 				RTE_LOG(ERR, USER1, "Failed to get digest info for hash %d\n",
940ae5ae3bfSGowrishankar Muthukrishnan 					asym->rsa.padding.hash);
941ae5ae3bfSGowrishankar Muthukrishnan 				return -EINVAL;
942ae5ae3bfSGowrishankar Muthukrishnan 			}
943ae5ae3bfSGowrishankar Muthukrishnan 
944ae5ae3bfSGowrishankar Muthukrishnan 			if (b_len) {
945ae5ae3bfSGowrishankar Muthukrishnan 				msg.len = env.digest_len + b_len;
946ae5ae3bfSGowrishankar Muthukrishnan 				msg.val = rte_zmalloc(NULL, msg.len, 0);
947ae5ae3bfSGowrishankar Muthukrishnan 				rte_memcpy(msg.val, b, b_len);
948ae5ae3bfSGowrishankar Muthukrishnan 				rte_memcpy(msg.val + b_len, env.digest, env.digest_len);
949ae5ae3bfSGowrishankar Muthukrishnan 				rte_free(env.digest);
950ae5ae3bfSGowrishankar Muthukrishnan 				env.digest = msg.val;
951ae5ae3bfSGowrishankar Muthukrishnan 				env.digest_len = msg.len;
952ae5ae3bfSGowrishankar Muthukrishnan 			}
953ae5ae3bfSGowrishankar Muthukrishnan 		}
95436128a67SGowrishankar Muthukrishnan 		msg.val = env.digest;
95536128a67SGowrishankar Muthukrishnan 		msg.len = env.digest_len;
95636128a67SGowrishankar Muthukrishnan 	} else {
95736128a67SGowrishankar Muthukrishnan 		msg.val = vec.pt.val;
95836128a67SGowrishankar Muthukrishnan 		msg.len = vec.pt.len;
95936128a67SGowrishankar Muthukrishnan 	}
96036128a67SGowrishankar Muthukrishnan 
96136128a67SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
96236128a67SGowrishankar Muthukrishnan 		asym->rsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
96336128a67SGowrishankar Muthukrishnan 		asym->rsa.message.data = msg.val;
96436128a67SGowrishankar Muthukrishnan 		asym->rsa.message.length = msg.len;
96536128a67SGowrishankar Muthukrishnan 
96636128a67SGowrishankar Muthukrishnan 		rte_free(vec.rsa.signature.val);
96736128a67SGowrishankar Muthukrishnan 
96836128a67SGowrishankar Muthukrishnan 		vec.rsa.signature.val = rte_zmalloc(NULL, vec.rsa.n.len, 0);
96936128a67SGowrishankar Muthukrishnan 		vec.rsa.signature.len = vec.rsa.n.len;
97036128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.data = vec.rsa.signature.val;
97136128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.length = 0;
97236128a67SGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGVER) {
97336128a67SGowrishankar Muthukrishnan 		asym->rsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
97436128a67SGowrishankar Muthukrishnan 		asym->rsa.message.data = msg.val;
97536128a67SGowrishankar Muthukrishnan 		asym->rsa.message.length = msg.len;
97636128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.data = vec.rsa.signature.val;
97736128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.length = vec.rsa.signature.len;
97836128a67SGowrishankar Muthukrishnan 	} else {
97936128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op);
98036128a67SGowrishankar Muthukrishnan 		return -EINVAL;
98136128a67SGowrishankar Muthukrishnan 	}
98236128a67SGowrishankar Muthukrishnan 
98336128a67SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
984c05e4ab7SThomas Monjalon 
985c05e4ab7SThomas Monjalon 	return 0;
9864aaad299SMarko Kovacevic }
9874aaad299SMarko Kovacevic 
9884aaad299SMarko Kovacevic static int
989b455d261SGowrishankar Muthukrishnan prepare_ecdsa_op(void)
990b455d261SGowrishankar Muthukrishnan {
991b455d261SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
992b455d261SGowrishankar Muthukrishnan 	struct fips_val msg;
993b455d261SGowrishankar Muthukrishnan 
994b455d261SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
995b455d261SGowrishankar Muthukrishnan 
996b455d261SGowrishankar Muthukrishnan 	asym = env.op->asym;
997b455d261SGowrishankar Muthukrishnan 	if (env.digest) {
998b455d261SGowrishankar Muthukrishnan 		msg.val = env.digest;
999b455d261SGowrishankar Muthukrishnan 		msg.len = env.digest_len;
1000b455d261SGowrishankar Muthukrishnan 	} else {
1001b455d261SGowrishankar Muthukrishnan 		msg.val = vec.pt.val;
1002b455d261SGowrishankar Muthukrishnan 		msg.len = vec.pt.len;
1003b455d261SGowrishankar Muthukrishnan 	}
1004b455d261SGowrishankar Muthukrishnan 
1005b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
1006b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
1007b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.data = msg.val;
1008b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.length = msg.len;
1009b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.pkey.data = vec.ecdsa.pkey.val;
1010b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.pkey.length = vec.ecdsa.pkey.len;
1011b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.k.data = vec.ecdsa.k.val;
1012b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.k.length = vec.ecdsa.k.len;
1013b455d261SGowrishankar Muthukrishnan 
1014b455d261SGowrishankar Muthukrishnan 		rte_free(vec.ecdsa.r.val);
1015b455d261SGowrishankar Muthukrishnan 
1016b455d261SGowrishankar Muthukrishnan 		rte_free(vec.ecdsa.s.val);
1017b455d261SGowrishankar Muthukrishnan 
1018b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.r.len = info.interim_info.ecdsa_data.curve_len;
1019b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.r.val = rte_zmalloc(NULL, vec.ecdsa.r.len, 0);
1020b455d261SGowrishankar Muthukrishnan 
1021b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.s.len = vec.ecdsa.r.len;
1022b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.s.val = rte_zmalloc(NULL, vec.ecdsa.s.len, 0);
1023b455d261SGowrishankar Muthukrishnan 
1024b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.data = vec.ecdsa.r.val;
1025b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.length = 0;
1026b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.data = vec.ecdsa.s.val;
1027b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.length = 0;
1028b455d261SGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGVER) {
1029b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
1030b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.data = msg.val;
1031b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.length = msg.len;
1032b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.q.x.data = vec.ecdsa.qx.val;
1033b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.q.x.length = vec.ecdsa.qx.len;
1034b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.q.y.data = vec.ecdsa.qy.val;
1035b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.q.y.length = vec.ecdsa.qy.len;
1036b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.data = vec.ecdsa.r.val;
1037b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.length = vec.ecdsa.r.len;
1038b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.data = vec.ecdsa.s.val;
1039b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.length = vec.ecdsa.s.len;
1040b455d261SGowrishankar Muthukrishnan 	} else {
1041b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op);
1042b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1043b455d261SGowrishankar Muthukrishnan 	}
1044b455d261SGowrishankar Muthukrishnan 
1045b455d261SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
1046b455d261SGowrishankar Muthukrishnan 
1047b455d261SGowrishankar Muthukrishnan 	return 0;
1048b455d261SGowrishankar Muthukrishnan }
1049b455d261SGowrishankar Muthukrishnan 
1050b455d261SGowrishankar Muthukrishnan static int
1051b455d261SGowrishankar Muthukrishnan prepare_ecfpm_op(void)
1052b455d261SGowrishankar Muthukrishnan {
1053b455d261SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
1054b455d261SGowrishankar Muthukrishnan 
1055b455d261SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1056b455d261SGowrishankar Muthukrishnan 
1057b455d261SGowrishankar Muthukrishnan 	asym = env.op->asym;
1058b455d261SGowrishankar Muthukrishnan 	asym->ecpm.scalar.data = vec.ecdsa.pkey.val;
1059b455d261SGowrishankar Muthukrishnan 	asym->ecpm.scalar.length = vec.ecdsa.pkey.len;
1060b455d261SGowrishankar Muthukrishnan 
1061b455d261SGowrishankar Muthukrishnan 	rte_free(vec.ecdsa.qx.val);
1062b455d261SGowrishankar Muthukrishnan 
1063b455d261SGowrishankar Muthukrishnan 	rte_free(vec.ecdsa.qy.val);
1064b455d261SGowrishankar Muthukrishnan 
1065b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qx.len = info.interim_info.ecdsa_data.curve_len;
1066b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qx.val = rte_zmalloc(NULL, vec.ecdsa.qx.len, 0);
1067b455d261SGowrishankar Muthukrishnan 
1068b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qy.len = vec.ecdsa.qx.len;
1069b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qy.val = rte_zmalloc(NULL, vec.ecdsa.qy.len, 0);
1070b455d261SGowrishankar Muthukrishnan 
1071b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.x.data = vec.ecdsa.qx.val;
1072b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.x.length = 0;
1073b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.y.data = vec.ecdsa.qy.val;
1074b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.y.length = 0;
1075b455d261SGowrishankar Muthukrishnan 
1076b455d261SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
1077b455d261SGowrishankar Muthukrishnan 
1078b455d261SGowrishankar Muthukrishnan 	return 0;
1079b455d261SGowrishankar Muthukrishnan }
1080b455d261SGowrishankar Muthukrishnan 
1081b455d261SGowrishankar Muthukrishnan static int
1082cd255ccfSMarko Kovacevic prepare_aes_xform(struct rte_crypto_sym_xform *xform)
1083cd255ccfSMarko Kovacevic {
1084cd255ccfSMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1085cd255ccfSMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1086cd255ccfSMarko Kovacevic 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1087cd255ccfSMarko Kovacevic 
1088cd255ccfSMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1089d3190431SMichael Shamis 	if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_CBC)
1090cd255ccfSMarko Kovacevic 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CBC;
1091c8956fd2SBrian Dooley 	else if (info.interim_info.aes_data.cipher_algo ==
1092c8956fd2SBrian Dooley 			RTE_CRYPTO_CIPHER_AES_CTR)
1093c8956fd2SBrian Dooley 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CTR;
1094d3190431SMichael Shamis 	else
1095d3190431SMichael Shamis 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_ECB;
1096d3190431SMichael Shamis 
1097cd255ccfSMarko Kovacevic 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1098cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1099cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1100cd255ccfSMarko Kovacevic 	cipher_xform->key.data = vec.cipher_auth.key.val;
1101cd255ccfSMarko Kovacevic 	cipher_xform->key.length = vec.cipher_auth.key.len;
1102c8956fd2SBrian Dooley 	if (cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CBC ||
1103c8956fd2SBrian Dooley 			cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CTR) {
1104cd255ccfSMarko Kovacevic 		cipher_xform->iv.length = vec.iv.len;
1105cd255ccfSMarko Kovacevic 		cipher_xform->iv.offset = IV_OFF;
1106d3190431SMichael Shamis 	} else {
1107d3190431SMichael Shamis 		cipher_xform->iv.length = 0;
1108d3190431SMichael Shamis 		cipher_xform->iv.offset = 0;
1109d3190431SMichael Shamis 	}
1110d3190431SMichael Shamis 	cap_idx.algo.cipher = cipher_xform->algo;
1111cd255ccfSMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1112cd255ccfSMarko Kovacevic 
1113cd255ccfSMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1114cd255ccfSMarko Kovacevic 	if (!cap) {
1115cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1116cd255ccfSMarko Kovacevic 				env.dev_id);
1117cd255ccfSMarko Kovacevic 		return -EINVAL;
1118cd255ccfSMarko Kovacevic 	}
1119cd255ccfSMarko Kovacevic 
1120cd255ccfSMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1121cd255ccfSMarko Kovacevic 			cipher_xform->key.length,
1122cd255ccfSMarko Kovacevic 			cipher_xform->iv.length) != 0) {
1123cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1124cd255ccfSMarko Kovacevic 				info.device_name, cipher_xform->key.length,
1125cd255ccfSMarko Kovacevic 				cipher_xform->iv.length);
1126cd255ccfSMarko Kovacevic 		return -EPERM;
1127cd255ccfSMarko Kovacevic 	}
1128cd255ccfSMarko Kovacevic 
1129cd255ccfSMarko Kovacevic 	return 0;
1130cd255ccfSMarko Kovacevic }
1131cd255ccfSMarko Kovacevic 
1132f64adb67SMarko Kovacevic static int
1133527cbf3dSMarko Kovacevic prepare_tdes_xform(struct rte_crypto_sym_xform *xform)
1134527cbf3dSMarko Kovacevic {
1135527cbf3dSMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1136527cbf3dSMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1137527cbf3dSMarko Kovacevic 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1138527cbf3dSMarko Kovacevic 
1139527cbf3dSMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1140527cbf3dSMarko Kovacevic 
1141efe3a8dbSMichael Shamis 	if (info.interim_info.tdes_data.test_mode == TDES_MODE_CBC)
1142527cbf3dSMarko Kovacevic 		cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_CBC;
1143efe3a8dbSMichael Shamis 	else
1144efe3a8dbSMichael Shamis 		cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_ECB;
1145527cbf3dSMarko Kovacevic 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1146527cbf3dSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1147527cbf3dSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1148527cbf3dSMarko Kovacevic 	cipher_xform->key.data = vec.cipher_auth.key.val;
1149527cbf3dSMarko Kovacevic 	cipher_xform->key.length = vec.cipher_auth.key.len;
1150efe3a8dbSMichael Shamis 
1151efe3a8dbSMichael Shamis 	if (cipher_xform->algo == RTE_CRYPTO_CIPHER_3DES_CBC) {
1152527cbf3dSMarko Kovacevic 		cipher_xform->iv.length = vec.iv.len;
1153527cbf3dSMarko Kovacevic 		cipher_xform->iv.offset = IV_OFF;
1154efe3a8dbSMichael Shamis 	} else {
1155efe3a8dbSMichael Shamis 		cipher_xform->iv.length = 0;
1156efe3a8dbSMichael Shamis 		cipher_xform->iv.offset = 0;
1157efe3a8dbSMichael Shamis 	}
1158efe3a8dbSMichael Shamis 	cap_idx.algo.cipher = cipher_xform->algo;
1159527cbf3dSMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1160527cbf3dSMarko Kovacevic 
1161527cbf3dSMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1162527cbf3dSMarko Kovacevic 	if (!cap) {
1163527cbf3dSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1164527cbf3dSMarko Kovacevic 				env.dev_id);
1165527cbf3dSMarko Kovacevic 		return -EINVAL;
1166527cbf3dSMarko Kovacevic 	}
1167527cbf3dSMarko Kovacevic 
1168527cbf3dSMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1169527cbf3dSMarko Kovacevic 			cipher_xform->key.length,
1170527cbf3dSMarko Kovacevic 			cipher_xform->iv.length) != 0) {
1171527cbf3dSMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1172527cbf3dSMarko Kovacevic 				info.device_name, cipher_xform->key.length,
1173527cbf3dSMarko Kovacevic 				cipher_xform->iv.length);
1174527cbf3dSMarko Kovacevic 		return -EPERM;
1175527cbf3dSMarko Kovacevic 	}
1176527cbf3dSMarko Kovacevic 
1177527cbf3dSMarko Kovacevic 	return 0;
1178527cbf3dSMarko Kovacevic }
1179527cbf3dSMarko Kovacevic 
1180527cbf3dSMarko Kovacevic static int
1181f64adb67SMarko Kovacevic prepare_hmac_xform(struct rte_crypto_sym_xform *xform)
1182f64adb67SMarko Kovacevic {
1183f64adb67SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1184f64adb67SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1185f64adb67SMarko Kovacevic 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1186f64adb67SMarko Kovacevic 
1187f64adb67SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1188f64adb67SMarko Kovacevic 
1189f64adb67SMarko Kovacevic 	auth_xform->algo = info.interim_info.hmac_data.algo;
1190f64adb67SMarko Kovacevic 	auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE;
1191f64adb67SMarko Kovacevic 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1192f64adb67SMarko Kovacevic 	auth_xform->key.data = vec.cipher_auth.key.val;
1193f64adb67SMarko Kovacevic 	auth_xform->key.length = vec.cipher_auth.key.len;
1194f64adb67SMarko Kovacevic 
1195f64adb67SMarko Kovacevic 	cap_idx.algo.auth = auth_xform->algo;
1196f64adb67SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1197f64adb67SMarko Kovacevic 
1198f64adb67SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1199f64adb67SMarko Kovacevic 	if (!cap) {
1200f64adb67SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1201f64adb67SMarko Kovacevic 				env.dev_id);
1202f64adb67SMarko Kovacevic 		return -EINVAL;
1203f64adb67SMarko Kovacevic 	}
1204f64adb67SMarko Kovacevic 
1205f64adb67SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_auth(cap,
1206f64adb67SMarko Kovacevic 			auth_xform->key.length,
1207f64adb67SMarko Kovacevic 			auth_xform->digest_length, 0) != 0) {
12088782b3b6SPablo de Lara 		RTE_LOG(ERR, USER1, "PMD %s key length %u Digest length %u\n",
1209f64adb67SMarko Kovacevic 				info.device_name, auth_xform->key.length,
1210f64adb67SMarko Kovacevic 				auth_xform->digest_length);
1211f64adb67SMarko Kovacevic 		return -EPERM;
1212f64adb67SMarko Kovacevic 	}
1213f64adb67SMarko Kovacevic 
1214f64adb67SMarko Kovacevic 	return 0;
1215f64adb67SMarko Kovacevic }
1216f64adb67SMarko Kovacevic 
1217d09abf2dSFan Zhang int
12184aaad299SMarko Kovacevic prepare_gcm_xform(struct rte_crypto_sym_xform *xform)
12194aaad299SMarko Kovacevic {
12204aaad299SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
12214aaad299SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
12224aaad299SMarko Kovacevic 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
12234aaad299SMarko Kovacevic 
12244aaad299SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
12254aaad299SMarko Kovacevic 
12264aaad299SMarko Kovacevic 	aead_xform->algo = RTE_CRYPTO_AEAD_AES_GCM;
12274aaad299SMarko Kovacevic 	aead_xform->aad_length = vec.aead.aad.len;
12284aaad299SMarko Kovacevic 	aead_xform->digest_length = vec.aead.digest.len;
12294aaad299SMarko Kovacevic 	aead_xform->iv.offset = IV_OFF;
12304aaad299SMarko Kovacevic 	aead_xform->iv.length = vec.iv.len;
12314aaad299SMarko Kovacevic 	aead_xform->key.data = vec.aead.key.val;
12324aaad299SMarko Kovacevic 	aead_xform->key.length = vec.aead.key.len;
12334aaad299SMarko Kovacevic 	aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
12344aaad299SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
12354aaad299SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_DECRYPT;
12364aaad299SMarko Kovacevic 
12374aaad299SMarko Kovacevic 	cap_idx.algo.aead = aead_xform->algo;
12384aaad299SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12394aaad299SMarko Kovacevic 
12404aaad299SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
12414aaad299SMarko Kovacevic 	if (!cap) {
12424aaad299SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
12434aaad299SMarko Kovacevic 				env.dev_id);
12444aaad299SMarko Kovacevic 		return -EINVAL;
12454aaad299SMarko Kovacevic 	}
12464aaad299SMarko Kovacevic 
12474aaad299SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_aead(cap,
12484aaad299SMarko Kovacevic 			aead_xform->key.length,
12494aaad299SMarko Kovacevic 			aead_xform->digest_length, aead_xform->aad_length,
12504aaad299SMarko Kovacevic 			aead_xform->iv.length) != 0) {
12514aaad299SMarko Kovacevic 		RTE_LOG(ERR, USER1,
12524aaad299SMarko Kovacevic 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
12534aaad299SMarko Kovacevic 				info.device_name, aead_xform->key.length,
12544aaad299SMarko Kovacevic 				aead_xform->digest_length,
12554aaad299SMarko Kovacevic 				aead_xform->aad_length,
12564aaad299SMarko Kovacevic 				aead_xform->iv.length);
12574aaad299SMarko Kovacevic 		return -EPERM;
12584aaad299SMarko Kovacevic 	}
12594aaad299SMarko Kovacevic 
12604aaad299SMarko Kovacevic 	return 0;
12614aaad299SMarko Kovacevic }
12624aaad299SMarko Kovacevic 
1263d09abf2dSFan Zhang int
1264d09abf2dSFan Zhang prepare_gmac_xform(struct rte_crypto_sym_xform *xform)
1265d09abf2dSFan Zhang {
1266d09abf2dSFan Zhang 	const struct rte_cryptodev_symmetric_capability *cap;
1267d09abf2dSFan Zhang 	struct rte_cryptodev_sym_capability_idx cap_idx;
1268d09abf2dSFan Zhang 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1269d09abf2dSFan Zhang 
1270d09abf2dSFan Zhang 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1271d09abf2dSFan Zhang 
1272d09abf2dSFan Zhang 	auth_xform->algo = RTE_CRYPTO_AUTH_AES_GMAC;
1273d09abf2dSFan Zhang 	auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1274d09abf2dSFan Zhang 			RTE_CRYPTO_AUTH_OP_GENERATE :
1275d09abf2dSFan Zhang 			RTE_CRYPTO_AUTH_OP_VERIFY;
1276d09abf2dSFan Zhang 	auth_xform->iv.offset = IV_OFF;
1277d09abf2dSFan Zhang 	auth_xform->iv.length = vec.iv.len;
1278d09abf2dSFan Zhang 	auth_xform->digest_length = vec.aead.digest.len;
1279d09abf2dSFan Zhang 	auth_xform->key.data = vec.aead.key.val;
1280d09abf2dSFan Zhang 	auth_xform->key.length = vec.aead.key.len;
1281d09abf2dSFan Zhang 
1282d09abf2dSFan Zhang 	cap_idx.algo.auth = auth_xform->algo;
1283d09abf2dSFan Zhang 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1284d09abf2dSFan Zhang 
1285d09abf2dSFan Zhang 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1286d09abf2dSFan Zhang 	if (!cap) {
1287d09abf2dSFan Zhang 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1288d09abf2dSFan Zhang 				env.dev_id);
1289d09abf2dSFan Zhang 		return -EINVAL;
1290d09abf2dSFan Zhang 	}
1291d09abf2dSFan Zhang 
1292d09abf2dSFan Zhang 	if (rte_cryptodev_sym_capability_check_auth(cap,
1293d09abf2dSFan Zhang 			auth_xform->key.length,
1294601b8a54SFan Zhang 			auth_xform->digest_length,
1295601b8a54SFan Zhang 			auth_xform->iv.length) != 0) {
1296601b8a54SFan Zhang 
1297601b8a54SFan Zhang 		RTE_LOG(ERR, USER1,
1298601b8a54SFan Zhang 			"PMD %s key length %u Digest length %u IV length %u\n",
1299d09abf2dSFan Zhang 				info.device_name, auth_xform->key.length,
1300601b8a54SFan Zhang 				auth_xform->digest_length,
1301601b8a54SFan Zhang 				auth_xform->iv.length);
1302d09abf2dSFan Zhang 		return -EPERM;
1303d09abf2dSFan Zhang 	}
1304d09abf2dSFan Zhang 
1305d09abf2dSFan Zhang 	return 0;
1306d09abf2dSFan Zhang }
1307d09abf2dSFan Zhang 
1308ac026f46SMarko Kovacevic static int
1309ac026f46SMarko Kovacevic prepare_cmac_xform(struct rte_crypto_sym_xform *xform)
1310ac026f46SMarko Kovacevic {
1311ac026f46SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1312ac026f46SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1313ac026f46SMarko Kovacevic 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1314ac026f46SMarko Kovacevic 
1315ac026f46SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1316ac026f46SMarko Kovacevic 
1317ac026f46SMarko Kovacevic 	auth_xform->algo = RTE_CRYPTO_AUTH_AES_CMAC;
1318ac026f46SMarko Kovacevic 	auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1319ac026f46SMarko Kovacevic 			RTE_CRYPTO_AUTH_OP_GENERATE : RTE_CRYPTO_AUTH_OP_VERIFY;
1320ac026f46SMarko Kovacevic 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1321ac026f46SMarko Kovacevic 	auth_xform->key.data = vec.cipher_auth.key.val;
1322ac026f46SMarko Kovacevic 	auth_xform->key.length = vec.cipher_auth.key.len;
1323ac026f46SMarko Kovacevic 
1324ac026f46SMarko Kovacevic 	cap_idx.algo.auth = auth_xform->algo;
1325ac026f46SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1326ac026f46SMarko Kovacevic 
1327ac026f46SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1328ac026f46SMarko Kovacevic 	if (!cap) {
1329ac026f46SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1330ac026f46SMarko Kovacevic 				env.dev_id);
1331ac026f46SMarko Kovacevic 		return -EINVAL;
1332ac026f46SMarko Kovacevic 	}
1333ac026f46SMarko Kovacevic 
1334ac026f46SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_auth(cap,
1335ac026f46SMarko Kovacevic 			auth_xform->key.length,
1336ac026f46SMarko Kovacevic 			auth_xform->digest_length, 0) != 0) {
13378782b3b6SPablo de Lara 		RTE_LOG(ERR, USER1, "PMD %s key length %u Digest length %u\n",
1338ac026f46SMarko Kovacevic 				info.device_name, auth_xform->key.length,
1339ac026f46SMarko Kovacevic 				auth_xform->digest_length);
1340ac026f46SMarko Kovacevic 		return -EPERM;
1341ac026f46SMarko Kovacevic 	}
1342ac026f46SMarko Kovacevic 
1343ac026f46SMarko Kovacevic 	return 0;
1344ac026f46SMarko Kovacevic }
1345ac026f46SMarko Kovacevic 
1346305921f4SMarko Kovacevic static int
1347305921f4SMarko Kovacevic prepare_ccm_xform(struct rte_crypto_sym_xform *xform)
1348305921f4SMarko Kovacevic {
1349305921f4SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1350305921f4SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1351305921f4SMarko Kovacevic 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
1352305921f4SMarko Kovacevic 
1353305921f4SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
1354305921f4SMarko Kovacevic 
1355305921f4SMarko Kovacevic 	aead_xform->algo = RTE_CRYPTO_AEAD_AES_CCM;
1356305921f4SMarko Kovacevic 	aead_xform->aad_length = vec.aead.aad.len;
1357305921f4SMarko Kovacevic 	aead_xform->digest_length = vec.aead.digest.len;
1358305921f4SMarko Kovacevic 	aead_xform->iv.offset = IV_OFF;
1359305921f4SMarko Kovacevic 	aead_xform->iv.length = vec.iv.len;
1360305921f4SMarko Kovacevic 	aead_xform->key.data = vec.aead.key.val;
1361305921f4SMarko Kovacevic 	aead_xform->key.length = vec.aead.key.len;
1362305921f4SMarko Kovacevic 	aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1363305921f4SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
1364305921f4SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_DECRYPT;
1365305921f4SMarko Kovacevic 
1366305921f4SMarko Kovacevic 	cap_idx.algo.aead = aead_xform->algo;
1367305921f4SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
1368305921f4SMarko Kovacevic 
1369305921f4SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1370305921f4SMarko Kovacevic 	if (!cap) {
1371305921f4SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1372305921f4SMarko Kovacevic 				env.dev_id);
1373305921f4SMarko Kovacevic 		return -EINVAL;
1374305921f4SMarko Kovacevic 	}
1375305921f4SMarko Kovacevic 
1376305921f4SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_aead(cap,
1377305921f4SMarko Kovacevic 			aead_xform->key.length,
1378305921f4SMarko Kovacevic 			aead_xform->digest_length, aead_xform->aad_length,
1379305921f4SMarko Kovacevic 			aead_xform->iv.length) != 0) {
1380305921f4SMarko Kovacevic 		RTE_LOG(ERR, USER1,
1381305921f4SMarko Kovacevic 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
1382305921f4SMarko Kovacevic 				info.device_name, aead_xform->key.length,
1383305921f4SMarko Kovacevic 				aead_xform->digest_length,
1384305921f4SMarko Kovacevic 				aead_xform->aad_length,
1385305921f4SMarko Kovacevic 				aead_xform->iv.length);
1386305921f4SMarko Kovacevic 		return -EPERM;
1387305921f4SMarko Kovacevic 	}
1388305921f4SMarko Kovacevic 
1389305921f4SMarko Kovacevic 	return 0;
1390305921f4SMarko Kovacevic }
1391305921f4SMarko Kovacevic 
1392f4797baeSDamian Nowak static int
1393f4797baeSDamian Nowak prepare_sha_xform(struct rte_crypto_sym_xform *xform)
1394f4797baeSDamian Nowak {
1395f4797baeSDamian Nowak 	const struct rte_cryptodev_symmetric_capability *cap;
1396f4797baeSDamian Nowak 	struct rte_cryptodev_sym_capability_idx cap_idx;
1397f4797baeSDamian Nowak 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1398f4797baeSDamian Nowak 
1399f4797baeSDamian Nowak 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1400f4797baeSDamian Nowak 
1401f4797baeSDamian Nowak 	auth_xform->algo = info.interim_info.sha_data.algo;
1402f4797baeSDamian Nowak 	auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE;
1403f4797baeSDamian Nowak 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1404f4797baeSDamian Nowak 
1405f4797baeSDamian Nowak 	cap_idx.algo.auth = auth_xform->algo;
1406f4797baeSDamian Nowak 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1407f4797baeSDamian Nowak 
1408f4797baeSDamian Nowak 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1409f4797baeSDamian Nowak 	if (!cap) {
1410f4797baeSDamian Nowak 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1411f4797baeSDamian Nowak 				env.dev_id);
1412f4797baeSDamian Nowak 		return -EINVAL;
1413f4797baeSDamian Nowak 	}
1414f4797baeSDamian Nowak 
1415f4797baeSDamian Nowak 	if (rte_cryptodev_sym_capability_check_auth(cap,
1416f4797baeSDamian Nowak 			auth_xform->key.length,
1417f4797baeSDamian Nowak 			auth_xform->digest_length, 0) != 0) {
1418f4797baeSDamian Nowak 		RTE_LOG(ERR, USER1, "PMD %s key length %u digest length %u\n",
1419f4797baeSDamian Nowak 				info.device_name, auth_xform->key.length,
1420f4797baeSDamian Nowak 				auth_xform->digest_length);
1421f4797baeSDamian Nowak 		return -EPERM;
1422f4797baeSDamian Nowak 	}
1423f4797baeSDamian Nowak 
1424f4797baeSDamian Nowak 	return 0;
1425f4797baeSDamian Nowak }
1426f4797baeSDamian Nowak 
1427d5a9ea55SSucharitha Sarananaga static int
1428d5a9ea55SSucharitha Sarananaga prepare_xts_xform(struct rte_crypto_sym_xform *xform)
1429d5a9ea55SSucharitha Sarananaga {
1430d5a9ea55SSucharitha Sarananaga 	const struct rte_cryptodev_symmetric_capability *cap;
1431d5a9ea55SSucharitha Sarananaga 	struct rte_cryptodev_sym_capability_idx cap_idx;
1432d5a9ea55SSucharitha Sarananaga 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1433d5a9ea55SSucharitha Sarananaga 
1434d5a9ea55SSucharitha Sarananaga 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1435d5a9ea55SSucharitha Sarananaga 
1436d5a9ea55SSucharitha Sarananaga 	cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_XTS;
1437d5a9ea55SSucharitha Sarananaga 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1438d5a9ea55SSucharitha Sarananaga 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1439d5a9ea55SSucharitha Sarananaga 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1440d5a9ea55SSucharitha Sarananaga 	cipher_xform->key.data = vec.cipher_auth.key.val;
1441d5a9ea55SSucharitha Sarananaga 	cipher_xform->key.length = vec.cipher_auth.key.len;
1442d5a9ea55SSucharitha Sarananaga 	cipher_xform->iv.length = vec.iv.len;
1443d5a9ea55SSucharitha Sarananaga 	cipher_xform->iv.offset = IV_OFF;
1444d5a9ea55SSucharitha Sarananaga 
1445d5a9ea55SSucharitha Sarananaga 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_XTS;
1446d5a9ea55SSucharitha Sarananaga 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1447d5a9ea55SSucharitha Sarananaga 
1448d5a9ea55SSucharitha Sarananaga 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1449d5a9ea55SSucharitha Sarananaga 	if (!cap) {
1450d5a9ea55SSucharitha Sarananaga 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1451d5a9ea55SSucharitha Sarananaga 				env.dev_id);
1452d5a9ea55SSucharitha Sarananaga 		return -EINVAL;
1453d5a9ea55SSucharitha Sarananaga 	}
1454d5a9ea55SSucharitha Sarananaga 
1455d5a9ea55SSucharitha Sarananaga 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1456d5a9ea55SSucharitha Sarananaga 			cipher_xform->key.length,
1457d5a9ea55SSucharitha Sarananaga 			cipher_xform->iv.length) != 0) {
1458d5a9ea55SSucharitha Sarananaga 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1459d5a9ea55SSucharitha Sarananaga 				info.device_name, cipher_xform->key.length,
1460d5a9ea55SSucharitha Sarananaga 				cipher_xform->iv.length);
1461d5a9ea55SSucharitha Sarananaga 		return -EPERM;
1462d5a9ea55SSucharitha Sarananaga 	}
1463d5a9ea55SSucharitha Sarananaga 
1464d5a9ea55SSucharitha Sarananaga 	return 0;
1465d5a9ea55SSucharitha Sarananaga }
1466d5a9ea55SSucharitha Sarananaga 
1467952e10cdSFan Zhang static int
146836128a67SGowrishankar Muthukrishnan prepare_rsa_xform(struct rte_crypto_asym_xform *xform)
146936128a67SGowrishankar Muthukrishnan {
147036128a67SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
147136128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
147236128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_info dev_info;
147336128a67SGowrishankar Muthukrishnan 
147436128a67SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_RSA;
147536128a67SGowrishankar Muthukrishnan 	xform->next = NULL;
147636128a67SGowrishankar Muthukrishnan 
147736128a67SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
147836128a67SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
147936128a67SGowrishankar Muthukrishnan 	if (!cap) {
148036128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
148136128a67SGowrishankar Muthukrishnan 				env.dev_id);
148236128a67SGowrishankar Muthukrishnan 		return -EINVAL;
148336128a67SGowrishankar Muthukrishnan 	}
148436128a67SGowrishankar Muthukrishnan 
148536128a67SGowrishankar Muthukrishnan 	switch (info.op) {
148636128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
148736128a67SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
148836128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
148936128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
149036128a67SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
149136128a67SGowrishankar Muthukrishnan 			return -EPERM;
149236128a67SGowrishankar Muthukrishnan 		}
149336128a67SGowrishankar Muthukrishnan 		break;
149436128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
149536128a67SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
149636128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
149736128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
149836128a67SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
149936128a67SGowrishankar Muthukrishnan 			return -EPERM;
150036128a67SGowrishankar Muthukrishnan 		}
150136128a67SGowrishankar Muthukrishnan 		break;
150236128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_KEYGEN:
150336128a67SGowrishankar Muthukrishnan 		break;
150436128a67SGowrishankar Muthukrishnan 	default:
150536128a67SGowrishankar Muthukrishnan 		break;
150636128a67SGowrishankar Muthukrishnan 	}
150736128a67SGowrishankar Muthukrishnan 
150836128a67SGowrishankar Muthukrishnan 	rte_cryptodev_info_get(env.dev_id, &dev_info);
150936128a67SGowrishankar Muthukrishnan 	xform->rsa.key_type = info.interim_info.rsa_data.privkey;
151036128a67SGowrishankar Muthukrishnan 	switch (xform->rsa.key_type) {
151136128a67SGowrishankar Muthukrishnan 	case RTE_RSA_KEY_TYPE_QT:
151236128a67SGowrishankar Muthukrishnan 		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT)) {
151336128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s does not support QT key type\n",
151436128a67SGowrishankar Muthukrishnan 				info.device_name);
151536128a67SGowrishankar Muthukrishnan 			return -EPERM;
151636128a67SGowrishankar Muthukrishnan 		}
151736128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.p.data = vec.rsa.p.val;
151836128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.p.length = vec.rsa.p.len;
151936128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.q.data = vec.rsa.q.val;
152036128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.q.length = vec.rsa.q.len;
152136128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dP.data = vec.rsa.dp.val;
152236128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dP.length = vec.rsa.dp.len;
152336128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dQ.data = vec.rsa.dq.val;
152436128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dQ.length = vec.rsa.dq.len;
152536128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.qInv.data = vec.rsa.qinv.val;
152636128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.qInv.length = vec.rsa.qinv.len;
152736128a67SGowrishankar Muthukrishnan 		break;
152836128a67SGowrishankar Muthukrishnan 	case RTE_RSA_KEY_TYPE_EXP:
152936128a67SGowrishankar Muthukrishnan 		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_EXP)) {
153036128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s does not support EXP key type\n",
153136128a67SGowrishankar Muthukrishnan 				info.device_name);
153236128a67SGowrishankar Muthukrishnan 			return -EPERM;
153336128a67SGowrishankar Muthukrishnan 		}
153436128a67SGowrishankar Muthukrishnan 		xform->rsa.d.data = vec.rsa.d.val;
153536128a67SGowrishankar Muthukrishnan 		xform->rsa.d.length = vec.rsa.d.len;
153636128a67SGowrishankar Muthukrishnan 		break;
153736128a67SGowrishankar Muthukrishnan 	default:
153836128a67SGowrishankar Muthukrishnan 		break;
153936128a67SGowrishankar Muthukrishnan 	}
154036128a67SGowrishankar Muthukrishnan 
154136128a67SGowrishankar Muthukrishnan 	xform->rsa.e.data = vec.rsa.e.val;
154236128a67SGowrishankar Muthukrishnan 	xform->rsa.e.length = vec.rsa.e.len;
154336128a67SGowrishankar Muthukrishnan 	xform->rsa.n.data = vec.rsa.n.val;
154436128a67SGowrishankar Muthukrishnan 	xform->rsa.n.length = vec.rsa.n.len;
154536128a67SGowrishankar Muthukrishnan 	return 0;
154636128a67SGowrishankar Muthukrishnan }
154736128a67SGowrishankar Muthukrishnan 
154836128a67SGowrishankar Muthukrishnan static int
1549b455d261SGowrishankar Muthukrishnan prepare_ecdsa_xform(struct rte_crypto_asym_xform *xform)
1550b455d261SGowrishankar Muthukrishnan {
1551b455d261SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1552b455d261SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1553b455d261SGowrishankar Muthukrishnan 
1554b455d261SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECDSA;
1555b455d261SGowrishankar Muthukrishnan 	xform->next = NULL;
1556b455d261SGowrishankar Muthukrishnan 
1557b455d261SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1558b455d261SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1559b455d261SGowrishankar Muthukrishnan 	if (!cap) {
1560b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1561b455d261SGowrishankar Muthukrishnan 				env.dev_id);
1562b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1563b455d261SGowrishankar Muthukrishnan 	}
1564b455d261SGowrishankar Muthukrishnan 
1565b455d261SGowrishankar Muthukrishnan 	switch (info.op) {
1566b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
1567b455d261SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1568b455d261SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
1569b455d261SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1570b455d261SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
1571b455d261SGowrishankar Muthukrishnan 			return -EPERM;
1572b455d261SGowrishankar Muthukrishnan 		}
1573b455d261SGowrishankar Muthukrishnan 		break;
1574b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
1575b455d261SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1576b455d261SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
1577b455d261SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1578b455d261SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
1579b455d261SGowrishankar Muthukrishnan 			return -EPERM;
1580b455d261SGowrishankar Muthukrishnan 		}
1581b455d261SGowrishankar Muthukrishnan 		break;
1582b455d261SGowrishankar Muthukrishnan 	default:
1583b455d261SGowrishankar Muthukrishnan 		break;
1584b455d261SGowrishankar Muthukrishnan 	}
1585b455d261SGowrishankar Muthukrishnan 
1586b455d261SGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id;
1587b455d261SGowrishankar Muthukrishnan 	return 0;
1588b455d261SGowrishankar Muthukrishnan }
1589b455d261SGowrishankar Muthukrishnan 
1590b455d261SGowrishankar Muthukrishnan static int
1591b455d261SGowrishankar Muthukrishnan prepare_ecfpm_xform(struct rte_crypto_asym_xform *xform)
1592b455d261SGowrishankar Muthukrishnan {
1593b455d261SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1594b455d261SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1595b455d261SGowrishankar Muthukrishnan 
1596b455d261SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECFPM;
1597b455d261SGowrishankar Muthukrishnan 	xform->next = NULL;
1598b455d261SGowrishankar Muthukrishnan 
1599b455d261SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1600b455d261SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1601b455d261SGowrishankar Muthukrishnan 	if (!cap) {
1602b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1603b455d261SGowrishankar Muthukrishnan 				env.dev_id);
1604b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1605b455d261SGowrishankar Muthukrishnan 	}
1606b455d261SGowrishankar Muthukrishnan 
1607b455d261SGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id;
1608b455d261SGowrishankar Muthukrishnan 	return 0;
1609b455d261SGowrishankar Muthukrishnan }
1610b455d261SGowrishankar Muthukrishnan 
1611b455d261SGowrishankar Muthukrishnan static int
1612cd255ccfSMarko Kovacevic get_writeback_data(struct fips_val *val)
1613cd255ccfSMarko Kovacevic {
1614952e10cdSFan Zhang 	struct rte_mbuf *m = env.mbuf;
1615952e10cdSFan Zhang 	uint16_t data_len = rte_pktmbuf_pkt_len(m);
1616952e10cdSFan Zhang 	uint16_t total_len = data_len + env.digest_len;
1617952e10cdSFan Zhang 	uint8_t *src, *dst, *wb_data;
1618952e10cdSFan Zhang 
1619952e10cdSFan Zhang 	/* in case val is reused for MCT test, try to free the buffer first */
1620952e10cdSFan Zhang 	if (val->val) {
1621952e10cdSFan Zhang 		free(val->val);
1622952e10cdSFan Zhang 		val->val = NULL;
1623952e10cdSFan Zhang 	}
1624952e10cdSFan Zhang 
1625952e10cdSFan Zhang 	wb_data = dst = calloc(1, total_len);
1626952e10cdSFan Zhang 	if (!dst) {
1627952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error %i: Not enough memory\n", -ENOMEM);
1628952e10cdSFan Zhang 		return -ENOMEM;
1629952e10cdSFan Zhang 	}
1630952e10cdSFan Zhang 
1631952e10cdSFan Zhang 	while (m && data_len) {
1632952e10cdSFan Zhang 		uint16_t seg_len = RTE_MIN(rte_pktmbuf_data_len(m), data_len);
1633952e10cdSFan Zhang 
1634952e10cdSFan Zhang 		src = rte_pktmbuf_mtod(m, uint8_t *);
1635952e10cdSFan Zhang 		memcpy(dst, src, seg_len);
1636952e10cdSFan Zhang 		m = m->next;
1637952e10cdSFan Zhang 		data_len -= seg_len;
1638952e10cdSFan Zhang 		dst += seg_len;
1639952e10cdSFan Zhang 	}
1640952e10cdSFan Zhang 
1641952e10cdSFan Zhang 	if (data_len) {
1642952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error -1: write back data\n");
1643bda9ce3cSCiara Power 		free(wb_data);
1644952e10cdSFan Zhang 		return -1;
1645952e10cdSFan Zhang 	}
1646952e10cdSFan Zhang 
1647952e10cdSFan Zhang 	if (env.digest)
1648952e10cdSFan Zhang 		memcpy(dst, env.digest, env.digest_len);
1649952e10cdSFan Zhang 
1650952e10cdSFan Zhang 	val->val = wb_data;
1651952e10cdSFan Zhang 	val->len = total_len;
1652952e10cdSFan Zhang 
1653952e10cdSFan Zhang 	return 0;
1654cd255ccfSMarko Kovacevic }
1655cd255ccfSMarko Kovacevic 
1656cd255ccfSMarko Kovacevic static int
165736128a67SGowrishankar Muthukrishnan fips_run_sym_test(void)
1658cd255ccfSMarko Kovacevic {
1659cd255ccfSMarko Kovacevic 	struct rte_crypto_sym_xform xform = {0};
1660cd255ccfSMarko Kovacevic 	uint16_t n_deqd;
1661cd255ccfSMarko Kovacevic 	int ret;
1662cd255ccfSMarko Kovacevic 
166336128a67SGowrishankar Muthukrishnan 	if (!test_ops.prepare_sym_xform || !test_ops.prepare_sym_op)
166436128a67SGowrishankar Muthukrishnan 		return -EINVAL;
166536128a67SGowrishankar Muthukrishnan 
166636128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_sym_xform(&xform);
1667cd255ccfSMarko Kovacevic 	if (ret < 0)
1668cd255ccfSMarko Kovacevic 		return ret;
1669cd255ccfSMarko Kovacevic 
167036128a67SGowrishankar Muthukrishnan 	env.sym.sess = rte_cryptodev_sym_session_create(env.dev_id, &xform,
167136128a67SGowrishankar Muthukrishnan 						env.sym.sess_mpool);
167236128a67SGowrishankar Muthukrishnan 	if (!env.sym.sess)
167336128a67SGowrishankar Muthukrishnan 		return -ENOMEM;
1674cd255ccfSMarko Kovacevic 
167536128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_sym_op();
1676cd255ccfSMarko Kovacevic 	if (ret < 0) {
1677cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Prepare op\n",
1678cd255ccfSMarko Kovacevic 				ret);
1679083a2777SMarko Kovacevic 		goto exit;
1680cd255ccfSMarko Kovacevic 	}
1681cd255ccfSMarko Kovacevic 
1682cd255ccfSMarko Kovacevic 	if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) {
1683cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error: Failed enqueue\n");
1684083a2777SMarko Kovacevic 		ret = -1;
1685083a2777SMarko Kovacevic 		goto exit;
1686cd255ccfSMarko Kovacevic 	}
1687cd255ccfSMarko Kovacevic 
1688cd255ccfSMarko Kovacevic 	do {
1689cd255ccfSMarko Kovacevic 		struct rte_crypto_op *deqd_op;
1690cd255ccfSMarko Kovacevic 
169136128a67SGowrishankar Muthukrishnan 		n_deqd = rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1);
1692cd255ccfSMarko Kovacevic 	} while (n_deqd == 0);
1693cd255ccfSMarko Kovacevic 
1694cd255ccfSMarko Kovacevic 	vec.status = env.op->status;
1695cd255ccfSMarko Kovacevic 
1696083a2777SMarko Kovacevic exit:
169736128a67SGowrishankar Muthukrishnan 	rte_cryptodev_sym_session_free(env.dev_id, env.sym.sess);
169836128a67SGowrishankar Muthukrishnan 	env.sym.sess = NULL;
169936128a67SGowrishankar Muthukrishnan 	return ret;
1700bdce2564SAkhil Goyal }
1701cd255ccfSMarko Kovacevic 
170236128a67SGowrishankar Muthukrishnan static int
170336128a67SGowrishankar Muthukrishnan fips_run_asym_test(void)
170436128a67SGowrishankar Muthukrishnan {
170536128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_xform xform = {0};
170636128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
170736128a67SGowrishankar Muthukrishnan 	struct rte_crypto_op *deqd_op;
170836128a67SGowrishankar Muthukrishnan 	int ret;
170936128a67SGowrishankar Muthukrishnan 
1710b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_KEYGEN && info.algo != FIPS_TEST_ALGO_ECDSA) {
171136128a67SGowrishankar Muthukrishnan 		RTE_SET_USED(asym);
171236128a67SGowrishankar Muthukrishnan 		ret = 0;
171336128a67SGowrishankar Muthukrishnan 		goto exit;
171436128a67SGowrishankar Muthukrishnan 	}
171536128a67SGowrishankar Muthukrishnan 
171636128a67SGowrishankar Muthukrishnan 	if (!test_ops.prepare_asym_xform || !test_ops.prepare_asym_op)
171736128a67SGowrishankar Muthukrishnan 		return -EINVAL;
171836128a67SGowrishankar Muthukrishnan 
171936128a67SGowrishankar Muthukrishnan 	asym = env.op->asym;
172036128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_asym_xform(&xform);
172136128a67SGowrishankar Muthukrishnan 	if (ret < 0)
1722cd255ccfSMarko Kovacevic 		return ret;
172336128a67SGowrishankar Muthukrishnan 
172436128a67SGowrishankar Muthukrishnan 	ret = rte_cryptodev_asym_session_create(env.dev_id, &xform, env.asym.sess_mpool,
172536128a67SGowrishankar Muthukrishnan 			(void *)&env.asym.sess);
172636128a67SGowrishankar Muthukrishnan 	if (ret < 0)
172736128a67SGowrishankar Muthukrishnan 		return ret;
172836128a67SGowrishankar Muthukrishnan 
172936128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_asym_op();
173036128a67SGowrishankar Muthukrishnan 	if (ret < 0) {
173136128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Error %i: Prepare op\n", ret);
173236128a67SGowrishankar Muthukrishnan 		goto exit;
173336128a67SGowrishankar Muthukrishnan 	}
173436128a67SGowrishankar Muthukrishnan 
173536128a67SGowrishankar Muthukrishnan 	if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) {
173636128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Error: Failed enqueue\n");
173736128a67SGowrishankar Muthukrishnan 		ret = -1;
173836128a67SGowrishankar Muthukrishnan 		goto exit;
173936128a67SGowrishankar Muthukrishnan 	}
174036128a67SGowrishankar Muthukrishnan 
174136128a67SGowrishankar Muthukrishnan 	while (rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1) == 0)
174236128a67SGowrishankar Muthukrishnan 		rte_pause();
174336128a67SGowrishankar Muthukrishnan 
174436128a67SGowrishankar Muthukrishnan 	vec.status = env.op->status;
174536128a67SGowrishankar Muthukrishnan 
174636128a67SGowrishankar Muthukrishnan  exit:
174736128a67SGowrishankar Muthukrishnan 	if (env.asym.sess)
174836128a67SGowrishankar Muthukrishnan 		rte_cryptodev_asym_session_free(env.dev_id, env.asym.sess);
174936128a67SGowrishankar Muthukrishnan 
175036128a67SGowrishankar Muthukrishnan 	env.asym.sess = NULL;
175136128a67SGowrishankar Muthukrishnan 	return ret;
175236128a67SGowrishankar Muthukrishnan }
175336128a67SGowrishankar Muthukrishnan 
175436128a67SGowrishankar Muthukrishnan static int
175536128a67SGowrishankar Muthukrishnan fips_run_test(void)
175636128a67SGowrishankar Muthukrishnan {
175736128a67SGowrishankar Muthukrishnan 	int ret;
175836128a67SGowrishankar Muthukrishnan 
175936128a67SGowrishankar Muthukrishnan 	env.op = env.sym.op;
176036128a67SGowrishankar Muthukrishnan 	if (env.is_asym_test) {
176136128a67SGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = parse_test_sha_hash_size(
176236128a67SGowrishankar Muthukrishnan 						info.interim_info.rsa_data.auth);
176336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_sha_xform;
176436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
176536128a67SGowrishankar Muthukrishnan 		ret = fips_run_sym_test();
176636128a67SGowrishankar Muthukrishnan 		if (ret < 0)
176736128a67SGowrishankar Muthukrishnan 			return ret;
176836128a67SGowrishankar Muthukrishnan 	} else {
176936128a67SGowrishankar Muthukrishnan 		return fips_run_sym_test();
177036128a67SGowrishankar Muthukrishnan 	}
177136128a67SGowrishankar Muthukrishnan 
177236128a67SGowrishankar Muthukrishnan 	env.op = env.asym.op;
1773b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN &&
1774b455d261SGowrishankar Muthukrishnan 		info.algo == FIPS_TEST_ALGO_ECDSA &&
1775b455d261SGowrishankar Muthukrishnan 		info.interim_info.ecdsa_data.pubkey_gen == 1) {
1776b455d261SGowrishankar Muthukrishnan 		fips_prepare_asym_xform_t ecdsa_xform;
1777b455d261SGowrishankar Muthukrishnan 		fips_prepare_op_t ecdsa_op;
1778b455d261SGowrishankar Muthukrishnan 
1779b455d261SGowrishankar Muthukrishnan 		ecdsa_xform = test_ops.prepare_asym_xform;
1780b455d261SGowrishankar Muthukrishnan 		ecdsa_op = test_ops.prepare_asym_op;
1781b455d261SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_KEYGEN;
1782b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = prepare_ecfpm_xform;
1783b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = prepare_ecfpm_op;
1784b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
1785b455d261SGowrishankar Muthukrishnan 		if (ret < 0)
1786b455d261SGowrishankar Muthukrishnan 			return ret;
1787b455d261SGowrishankar Muthukrishnan 
1788b455d261SGowrishankar Muthukrishnan 		info.post_interim_writeback(NULL);
1789b455d261SGowrishankar Muthukrishnan 		info.interim_info.ecdsa_data.pubkey_gen = 0;
1790b455d261SGowrishankar Muthukrishnan 
1791b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = ecdsa_xform;
1792b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = ecdsa_op;
1793b455d261SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_SIGGEN;
1794b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
1795b455d261SGowrishankar Muthukrishnan 	} else {
1796b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
1797b455d261SGowrishankar Muthukrishnan 	}
1798b455d261SGowrishankar Muthukrishnan 
1799b455d261SGowrishankar Muthukrishnan 	return ret;
1800cd255ccfSMarko Kovacevic }
1801cd255ccfSMarko Kovacevic 
1802cd255ccfSMarko Kovacevic static int
1803cd255ccfSMarko Kovacevic fips_generic_test(void)
1804cd255ccfSMarko Kovacevic {
1805952e10cdSFan Zhang 	struct fips_val val = {NULL, 0};
1806cd255ccfSMarko Kovacevic 	int ret;
1807cd255ccfSMarko Kovacevic 
180889be27e3SBrandon Lo 	if (info.file_type != FIPS_TYPE_JSON)
1809cd255ccfSMarko Kovacevic 		fips_test_write_one_case();
1810cd255ccfSMarko Kovacevic 
1811cd255ccfSMarko Kovacevic 	ret = fips_run_test();
1812cd255ccfSMarko Kovacevic 	if (ret < 0) {
18138a40ff39SArchana Muniganti 		if (ret == -EPERM || ret == -ENOTSUP) {
181489be27e3SBrandon Lo 			if (info.file_type == FIPS_TYPE_JSON)
181589be27e3SBrandon Lo 				return ret;
181689be27e3SBrandon Lo 
1817cd255ccfSMarko Kovacevic 			fprintf(info.fp_wr, "Bypass\n\n");
1818cd255ccfSMarko Kovacevic 			return 0;
1819cd255ccfSMarko Kovacevic 		}
1820cd255ccfSMarko Kovacevic 
1821cd255ccfSMarko Kovacevic 		return ret;
1822cd255ccfSMarko Kovacevic 	}
1823cd255ccfSMarko Kovacevic 
182436128a67SGowrishankar Muthukrishnan 	if (!env.is_asym_test) {
1825952e10cdSFan Zhang 		ret = get_writeback_data(&val);
1826952e10cdSFan Zhang 		if (ret < 0)
1827952e10cdSFan Zhang 			return ret;
182836128a67SGowrishankar Muthukrishnan 	}
1829cd255ccfSMarko Kovacevic 
1830cd255ccfSMarko Kovacevic 	switch (info.file_type) {
1831cd255ccfSMarko Kovacevic 	case FIPS_TYPE_REQ:
1832cd255ccfSMarko Kovacevic 	case FIPS_TYPE_RSP:
183389be27e3SBrandon Lo 	case FIPS_TYPE_JSON:
1834cd255ccfSMarko Kovacevic 		if (info.parse_writeback == NULL)
1835cd255ccfSMarko Kovacevic 			return -EPERM;
1836cd255ccfSMarko Kovacevic 		ret = info.parse_writeback(&val);
1837cd255ccfSMarko Kovacevic 		if (ret < 0)
1838cd255ccfSMarko Kovacevic 			return ret;
1839cd255ccfSMarko Kovacevic 		break;
1840cd255ccfSMarko Kovacevic 	case FIPS_TYPE_FAX:
1841cd255ccfSMarko Kovacevic 		if (info.kat_check == NULL)
1842cd255ccfSMarko Kovacevic 			return -EPERM;
1843cd255ccfSMarko Kovacevic 		ret = info.kat_check(&val);
1844cd255ccfSMarko Kovacevic 		if (ret < 0)
1845cd255ccfSMarko Kovacevic 			return ret;
1846cd255ccfSMarko Kovacevic 		break;
1847f556293fSBrandon Lo 	default:
1848f556293fSBrandon Lo 		break;
1849cd255ccfSMarko Kovacevic 	}
1850cd255ccfSMarko Kovacevic 
185189be27e3SBrandon Lo 	if (info.file_type != FIPS_TYPE_JSON)
1852cd255ccfSMarko Kovacevic 		fprintf(info.fp_wr, "\n");
1853952e10cdSFan Zhang 	free(val.val);
1854cd255ccfSMarko Kovacevic 
1855cd255ccfSMarko Kovacevic 	return 0;
1856cd255ccfSMarko Kovacevic }
1857cd255ccfSMarko Kovacevic 
1858cd255ccfSMarko Kovacevic static int
1859527cbf3dSMarko Kovacevic fips_mct_tdes_test(void)
1860527cbf3dSMarko Kovacevic {
1861527cbf3dSMarko Kovacevic #define TDES_BLOCK_SIZE		8
1862527cbf3dSMarko Kovacevic #define TDES_EXTERN_ITER	400
1863527cbf3dSMarko Kovacevic #define TDES_INTERN_ITER	10000
186464569ffaSGowrishankar Muthukrishnan 	struct fips_val val[3] = {{NULL, 0},}, val_key, pt, ct, iv;
18659252e81aSMarko Kovacevic 	uint8_t prev_out[TDES_BLOCK_SIZE] = {0};
18669252e81aSMarko Kovacevic 	uint8_t prev_prev_out[TDES_BLOCK_SIZE] = {0};
18679252e81aSMarko Kovacevic 	uint8_t prev_in[TDES_BLOCK_SIZE] = {0};
1868527cbf3dSMarko Kovacevic 	uint32_t i, j, k;
1869527cbf3dSMarko Kovacevic 	int ret;
1870ae65004fSMichael Shamis 	int test_mode = info.interim_info.tdes_data.test_mode;
1871527cbf3dSMarko Kovacevic 
187264569ffaSGowrishankar Muthukrishnan 	pt.len = vec.pt.len;
187364569ffaSGowrishankar Muthukrishnan 	pt.val = calloc(1, pt.len);
187464569ffaSGowrishankar Muthukrishnan 	ct.len = vec.ct.len;
187564569ffaSGowrishankar Muthukrishnan 	ct.val = calloc(1, ct.len);
187664569ffaSGowrishankar Muthukrishnan 	iv.len = vec.iv.len;
187764569ffaSGowrishankar Muthukrishnan 	iv.val = calloc(1, iv.len);
187864569ffaSGowrishankar Muthukrishnan 
1879527cbf3dSMarko Kovacevic 	for (i = 0; i < TDES_EXTERN_ITER; i++) {
188064569ffaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON) {
188179365018SArchana Muniganti 			if ((i == 0) && (info.version == 21.4f)) {
18822b84d2bdSArchana Muniganti 				if (!(strstr(info.vec[0], "COUNT")))
18832b84d2bdSArchana Muniganti 					fprintf(info.fp_wr, "%s%u\n", "COUNT = ", 0);
188479365018SArchana Muniganti 			}
188579365018SArchana Muniganti 
188679365018SArchana Muniganti 			if (i != 0)
1887527cbf3dSMarko Kovacevic 				update_info_vec(i);
1888527cbf3dSMarko Kovacevic 
1889527cbf3dSMarko Kovacevic 			fips_test_write_one_case();
189064569ffaSGowrishankar Muthukrishnan 		}
1891527cbf3dSMarko Kovacevic 
1892527cbf3dSMarko Kovacevic 		for (j = 0; j < TDES_INTERN_ITER; j++) {
1893527cbf3dSMarko Kovacevic 			ret = fips_run_test();
1894527cbf3dSMarko Kovacevic 			if (ret < 0) {
1895527cbf3dSMarko Kovacevic 				if (ret == -EPERM) {
189689be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
189789be27e3SBrandon Lo 						return ret;
189889be27e3SBrandon Lo 
1899527cbf3dSMarko Kovacevic 					fprintf(info.fp_wr, "Bypass\n");
1900527cbf3dSMarko Kovacevic 					return 0;
1901527cbf3dSMarko Kovacevic 				}
1902527cbf3dSMarko Kovacevic 				return ret;
1903527cbf3dSMarko Kovacevic 			}
1904527cbf3dSMarko Kovacevic 
190564569ffaSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
1906952e10cdSFan Zhang 			if (ret < 0)
1907952e10cdSFan Zhang 				return ret;
1908527cbf3dSMarko Kovacevic 
1909527cbf3dSMarko Kovacevic 			if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
1910527cbf3dSMarko Kovacevic 				memcpy(prev_in, vec.ct.val, TDES_BLOCK_SIZE);
1911527cbf3dSMarko Kovacevic 
1912527cbf3dSMarko Kovacevic 			if (j == 0) {
191364569ffaSGowrishankar Muthukrishnan 				memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE);
191464569ffaSGowrishankar Muthukrishnan 				memcpy(pt.val, vec.pt.val, pt.len);
191564569ffaSGowrishankar Muthukrishnan 				memcpy(ct.val, vec.ct.val, ct.len);
191664569ffaSGowrishankar Muthukrishnan 				memcpy(iv.val, vec.iv.val, iv.len);
1917527cbf3dSMarko Kovacevic 
1918527cbf3dSMarko Kovacevic 				if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
1919ae65004fSMichael Shamis 					if (test_mode == TDES_MODE_ECB) {
192064569ffaSGowrishankar Muthukrishnan 						memcpy(vec.pt.val, val[0].val,
1921ae65004fSMichael Shamis 							   TDES_BLOCK_SIZE);
1922ae65004fSMichael Shamis 					} else {
1923527cbf3dSMarko Kovacevic 						memcpy(vec.pt.val, vec.iv.val,
1924527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
192564569ffaSGowrishankar Muthukrishnan 						memcpy(vec.iv.val, val[0].val,
1926527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
1927ae65004fSMichael Shamis 					}
192864569ffaSGowrishankar Muthukrishnan 					val[1].val = pt.val;
192964569ffaSGowrishankar Muthukrishnan 					val[1].len = pt.len;
193064569ffaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
193164569ffaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
1932ae65004fSMichael Shamis 				} else {
1933ae65004fSMichael Shamis 					if (test_mode == TDES_MODE_ECB) {
193464569ffaSGowrishankar Muthukrishnan 						memcpy(vec.ct.val, val[0].val,
1935ae65004fSMichael Shamis 							   TDES_BLOCK_SIZE);
1936527cbf3dSMarko Kovacevic 					} else {
1937527cbf3dSMarko Kovacevic 						memcpy(vec.iv.val, vec.ct.val,
1938527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
193964569ffaSGowrishankar Muthukrishnan 						memcpy(vec.ct.val, val[0].val,
1940527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
1941527cbf3dSMarko Kovacevic 					}
194264569ffaSGowrishankar Muthukrishnan 					val[1].val = ct.val;
194364569ffaSGowrishankar Muthukrishnan 					val[1].len = ct.len;
194464569ffaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
194564569ffaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
1946ae65004fSMichael Shamis 				}
1947527cbf3dSMarko Kovacevic 				continue;
1948527cbf3dSMarko Kovacevic 			}
1949527cbf3dSMarko Kovacevic 
1950527cbf3dSMarko Kovacevic 			if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
1951ae65004fSMichael Shamis 				if (test_mode == TDES_MODE_ECB) {
195264569ffaSGowrishankar Muthukrishnan 					memcpy(vec.pt.val, val[0].val,
1953ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1954527cbf3dSMarko Kovacevic 				} else {
195564569ffaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, val[0].val,
1956ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1957ae65004fSMichael Shamis 					memcpy(vec.pt.val, prev_out,
1958ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1959ae65004fSMichael Shamis 				}
1960ae65004fSMichael Shamis 			} else {
1961ae65004fSMichael Shamis 				if (test_mode == TDES_MODE_ECB) {
196264569ffaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, val[0].val,
1963ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1964ae65004fSMichael Shamis 				} else {
1965ae65004fSMichael Shamis 					memcpy(vec.iv.val, vec.ct.val,
1966ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
196764569ffaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, val[0].val,
1968ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1969ae65004fSMichael Shamis 				}
1970527cbf3dSMarko Kovacevic 			}
1971527cbf3dSMarko Kovacevic 
1972527cbf3dSMarko Kovacevic 			if (j == TDES_INTERN_ITER - 1)
1973527cbf3dSMarko Kovacevic 				continue;
1974527cbf3dSMarko Kovacevic 
197564569ffaSGowrishankar Muthukrishnan 			memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE);
1976527cbf3dSMarko Kovacevic 
1977527cbf3dSMarko Kovacevic 			if (j == TDES_INTERN_ITER - 3)
197864569ffaSGowrishankar Muthukrishnan 				memcpy(prev_prev_out, val[0].val, TDES_BLOCK_SIZE);
1979527cbf3dSMarko Kovacevic 		}
1980527cbf3dSMarko Kovacevic 
198164569ffaSGowrishankar Muthukrishnan 		info.parse_writeback(val);
198264569ffaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
1983527cbf3dSMarko Kovacevic 			fprintf(info.fp_wr, "\n");
1984527cbf3dSMarko Kovacevic 
1985527cbf3dSMarko Kovacevic 		if (i == TDES_EXTERN_ITER - 1)
1986527cbf3dSMarko Kovacevic 			continue;
1987527cbf3dSMarko Kovacevic 
1988527cbf3dSMarko Kovacevic 		/** update key */
1989527cbf3dSMarko Kovacevic 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
1990527cbf3dSMarko Kovacevic 
1991527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.nb_keys == 0) {
1992527cbf3dSMarko Kovacevic 			if (memcmp(val_key.val, val_key.val + 8, 8) == 0)
1993527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 1;
1994527cbf3dSMarko Kovacevic 			else if (memcmp(val_key.val, val_key.val + 16, 8) == 0)
1995527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 2;
1996527cbf3dSMarko Kovacevic 			else
1997527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 3;
1998527cbf3dSMarko Kovacevic 
1999527cbf3dSMarko Kovacevic 		}
2000527cbf3dSMarko Kovacevic 
2001527cbf3dSMarko Kovacevic 		for (k = 0; k < TDES_BLOCK_SIZE; k++) {
2002527cbf3dSMarko Kovacevic 
2003527cbf3dSMarko Kovacevic 			switch (info.interim_info.tdes_data.nb_keys) {
2004527cbf3dSMarko Kovacevic 			case 3:
200564569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2006527cbf3dSMarko Kovacevic 				val_key.val[k + 8] ^= prev_out[k];
2007527cbf3dSMarko Kovacevic 				val_key.val[k + 16] ^= prev_prev_out[k];
2008527cbf3dSMarko Kovacevic 				break;
2009527cbf3dSMarko Kovacevic 			case 2:
201064569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2011527cbf3dSMarko Kovacevic 				val_key.val[k + 8] ^= prev_out[k];
201264569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 16] ^= val[0].val[k];
2013527cbf3dSMarko Kovacevic 				break;
2014527cbf3dSMarko Kovacevic 			default: /* case 1 */
201564569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
201664569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 8] ^= val[0].val[k];
201764569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 16] ^= val[0].val[k];
2018527cbf3dSMarko Kovacevic 				break;
2019527cbf3dSMarko Kovacevic 			}
2020527cbf3dSMarko Kovacevic 
2021527cbf3dSMarko Kovacevic 		}
2022527cbf3dSMarko Kovacevic 
2023527cbf3dSMarko Kovacevic 		for (k = 0; k < 24; k++)
2024527cbf3dSMarko Kovacevic 			val_key.val[k] = (__builtin_popcount(val_key.val[k]) &
2025527cbf3dSMarko Kovacevic 					0x1) ?
2026527cbf3dSMarko Kovacevic 					val_key.val[k] : (val_key.val[k] ^ 0x1);
2027527cbf3dSMarko Kovacevic 
2028527cbf3dSMarko Kovacevic 		if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
2029ae65004fSMichael Shamis 			if (test_mode == TDES_MODE_ECB) {
203064569ffaSGowrishankar Muthukrishnan 				memcpy(vec.pt.val, val[0].val, TDES_BLOCK_SIZE);
2031ae65004fSMichael Shamis 			} else {
203264569ffaSGowrishankar Muthukrishnan 				memcpy(vec.iv.val, val[0].val, TDES_BLOCK_SIZE);
2033527cbf3dSMarko Kovacevic 				memcpy(vec.pt.val, prev_out, TDES_BLOCK_SIZE);
2034ae65004fSMichael Shamis 			}
2035ae65004fSMichael Shamis 		} else {
2036ae65004fSMichael Shamis 			if (test_mode == TDES_MODE_ECB) {
203764569ffaSGowrishankar Muthukrishnan 				memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE);
2038527cbf3dSMarko Kovacevic 			} else {
2039527cbf3dSMarko Kovacevic 				memcpy(vec.iv.val, prev_out, TDES_BLOCK_SIZE);
204064569ffaSGowrishankar Muthukrishnan 				memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE);
2041527cbf3dSMarko Kovacevic 			}
2042527cbf3dSMarko Kovacevic 		}
2043ae65004fSMichael Shamis 	}
2044527cbf3dSMarko Kovacevic 
204564569ffaSGowrishankar Muthukrishnan 	free(val[0].val);
204664569ffaSGowrishankar Muthukrishnan 	free(pt.val);
204764569ffaSGowrishankar Muthukrishnan 	free(ct.val);
204864569ffaSGowrishankar Muthukrishnan 	free(iv.val);
2049952e10cdSFan Zhang 
2050527cbf3dSMarko Kovacevic 	return 0;
2051527cbf3dSMarko Kovacevic }
2052527cbf3dSMarko Kovacevic 
2053527cbf3dSMarko Kovacevic static int
2054d3190431SMichael Shamis fips_mct_aes_ecb_test(void)
2055d3190431SMichael Shamis {
2056d3190431SMichael Shamis #define AES_BLOCK_SIZE	16
2057d3190431SMichael Shamis #define AES_EXTERN_ITER	100
2058d3190431SMichael Shamis #define AES_INTERN_ITER	1000
2059952e10cdSFan Zhang 	struct fips_val val = {NULL, 0}, val_key;
2060d3190431SMichael Shamis 	uint8_t prev_out[AES_BLOCK_SIZE] = {0};
2061d3190431SMichael Shamis 	uint32_t i, j, k;
2062d3190431SMichael Shamis 	int ret;
2063d3190431SMichael Shamis 
2064d3190431SMichael Shamis 	for (i = 0; i < AES_EXTERN_ITER; i++) {
2065d3190431SMichael Shamis 		if (i != 0)
2066d3190431SMichael Shamis 			update_info_vec(i);
2067d3190431SMichael Shamis 
2068d3190431SMichael Shamis 		fips_test_write_one_case();
2069d3190431SMichael Shamis 
2070d3190431SMichael Shamis 		for (j = 0; j < AES_INTERN_ITER; j++) {
2071d3190431SMichael Shamis 			ret = fips_run_test();
2072d3190431SMichael Shamis 			if (ret < 0) {
2073d3190431SMichael Shamis 				if (ret == -EPERM) {
207489be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
207589be27e3SBrandon Lo 						return ret;
207689be27e3SBrandon Lo 
2077d3190431SMichael Shamis 					fprintf(info.fp_wr, "Bypass\n");
2078d3190431SMichael Shamis 					return 0;
2079d3190431SMichael Shamis 				}
2080d3190431SMichael Shamis 
2081d3190431SMichael Shamis 				return ret;
2082d3190431SMichael Shamis 			}
2083d3190431SMichael Shamis 
2084952e10cdSFan Zhang 			ret = get_writeback_data(&val);
2085952e10cdSFan Zhang 			if (ret < 0)
2086952e10cdSFan Zhang 				return ret;
2087d3190431SMichael Shamis 
2088d3190431SMichael Shamis 			if (info.op == FIPS_TEST_ENC_AUTH_GEN)
2089d3190431SMichael Shamis 				memcpy(vec.pt.val, val.val, AES_BLOCK_SIZE);
2090d3190431SMichael Shamis 			else
2091d3190431SMichael Shamis 				memcpy(vec.ct.val, val.val, AES_BLOCK_SIZE);
2092d3190431SMichael Shamis 
2093d3190431SMichael Shamis 			if (j == AES_INTERN_ITER - 1)
2094d3190431SMichael Shamis 				continue;
2095d3190431SMichael Shamis 
2096d3190431SMichael Shamis 			memcpy(prev_out, val.val, AES_BLOCK_SIZE);
2097d3190431SMichael Shamis 		}
2098d3190431SMichael Shamis 
2099d3190431SMichael Shamis 		info.parse_writeback(&val);
2100d3190431SMichael Shamis 		fprintf(info.fp_wr, "\n");
2101d3190431SMichael Shamis 
2102d3190431SMichael Shamis 		if (i == AES_EXTERN_ITER - 1)
2103d3190431SMichael Shamis 			continue;
2104d3190431SMichael Shamis 
2105d3190431SMichael Shamis 		/** update key */
2106d3190431SMichael Shamis 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2107d3190431SMichael Shamis 		for (k = 0; k < vec.cipher_auth.key.len; k++) {
2108d3190431SMichael Shamis 			switch (vec.cipher_auth.key.len) {
2109d3190431SMichael Shamis 			case 16:
2110d3190431SMichael Shamis 				val_key.val[k] ^= val.val[k];
2111d3190431SMichael Shamis 				break;
2112d3190431SMichael Shamis 			case 24:
2113d3190431SMichael Shamis 				if (k < 8)
2114d3190431SMichael Shamis 					val_key.val[k] ^= prev_out[k + 8];
2115d3190431SMichael Shamis 				else
2116d3190431SMichael Shamis 					val_key.val[k] ^= val.val[k - 8];
2117d3190431SMichael Shamis 				break;
2118d3190431SMichael Shamis 			case 32:
2119d3190431SMichael Shamis 				if (k < 16)
2120d3190431SMichael Shamis 					val_key.val[k] ^= prev_out[k];
2121d3190431SMichael Shamis 				else
2122d3190431SMichael Shamis 					val_key.val[k] ^= val.val[k - 16];
2123d3190431SMichael Shamis 				break;
2124d3190431SMichael Shamis 			default:
2125d3190431SMichael Shamis 				return -1;
2126d3190431SMichael Shamis 			}
2127d3190431SMichael Shamis 		}
2128d3190431SMichael Shamis 	}
2129d3190431SMichael Shamis 
2130952e10cdSFan Zhang 	free(val.val);
2131952e10cdSFan Zhang 
2132d3190431SMichael Shamis 	return 0;
2133d3190431SMichael Shamis }
2134d3190431SMichael Shamis static int
2135cd255ccfSMarko Kovacevic fips_mct_aes_test(void)
2136cd255ccfSMarko Kovacevic {
2137cd255ccfSMarko Kovacevic #define AES_BLOCK_SIZE	16
2138cd255ccfSMarko Kovacevic #define AES_EXTERN_ITER	100
2139cd255ccfSMarko Kovacevic #define AES_INTERN_ITER	1000
21408b8546aaSGowrishankar Muthukrishnan 	struct fips_val val[3] = {{NULL, 0},}, val_key,  pt, ct, iv;
2141cd255ccfSMarko Kovacevic 	uint8_t prev_out[AES_BLOCK_SIZE] = {0};
2142cd255ccfSMarko Kovacevic 	uint8_t prev_in[AES_BLOCK_SIZE] = {0};
2143cd255ccfSMarko Kovacevic 	uint32_t i, j, k;
2144cd255ccfSMarko Kovacevic 	int ret;
2145cd255ccfSMarko Kovacevic 
2146d3190431SMichael Shamis 	if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_ECB)
2147d3190431SMichael Shamis 		return fips_mct_aes_ecb_test();
2148d3190431SMichael Shamis 
2149e9ec7f61SGowrishankar Muthukrishnan 	pt.len = vec.pt.len;
2150e9ec7f61SGowrishankar Muthukrishnan 	pt.val = calloc(1, pt.len);
2151e9ec7f61SGowrishankar Muthukrishnan 	ct.len = vec.ct.len;
2152e9ec7f61SGowrishankar Muthukrishnan 	ct.val = calloc(1, ct.len);
2153e9ec7f61SGowrishankar Muthukrishnan 	iv.len = vec.iv.len;
2154e9ec7f61SGowrishankar Muthukrishnan 	iv.val = calloc(1, iv.len);
2155cd255ccfSMarko Kovacevic 	for (i = 0; i < AES_EXTERN_ITER; i++) {
21568b8546aaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON) {
2157cd255ccfSMarko Kovacevic 			if (i != 0)
2158cd255ccfSMarko Kovacevic 				update_info_vec(i);
2159cd255ccfSMarko Kovacevic 
2160cd255ccfSMarko Kovacevic 			fips_test_write_one_case();
21618b8546aaSGowrishankar Muthukrishnan 		}
2162cd255ccfSMarko Kovacevic 
2163cd255ccfSMarko Kovacevic 		for (j = 0; j < AES_INTERN_ITER; j++) {
2164cd255ccfSMarko Kovacevic 			ret = fips_run_test();
2165cd255ccfSMarko Kovacevic 			if (ret < 0) {
2166cd255ccfSMarko Kovacevic 				if (ret == -EPERM) {
216789be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
216889be27e3SBrandon Lo 						return ret;
216989be27e3SBrandon Lo 
2170cd255ccfSMarko Kovacevic 					fprintf(info.fp_wr, "Bypass\n");
2171cd255ccfSMarko Kovacevic 					return 0;
2172cd255ccfSMarko Kovacevic 				}
2173cd255ccfSMarko Kovacevic 
2174cd255ccfSMarko Kovacevic 				return ret;
2175cd255ccfSMarko Kovacevic 			}
2176cd255ccfSMarko Kovacevic 
21778b8546aaSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
2178afda6b01SCiara Power 			if (ret < 0)
2179afda6b01SCiara Power 				return ret;
2180cd255ccfSMarko Kovacevic 
2181cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
2182cd255ccfSMarko Kovacevic 				memcpy(prev_in, vec.ct.val, AES_BLOCK_SIZE);
2183cd255ccfSMarko Kovacevic 
2184cd255ccfSMarko Kovacevic 			if (j == 0) {
21858b8546aaSGowrishankar Muthukrishnan 				memcpy(prev_out, val[0].val, AES_BLOCK_SIZE);
21868b8546aaSGowrishankar Muthukrishnan 				memcpy(pt.val, vec.pt.val, pt.len);
21878b8546aaSGowrishankar Muthukrishnan 				memcpy(ct.val, vec.ct.val, ct.len);
21888b8546aaSGowrishankar Muthukrishnan 				memcpy(iv.val, vec.iv.val, iv.len);
2189cd255ccfSMarko Kovacevic 
2190cd255ccfSMarko Kovacevic 				if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
21918b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.pt.val, vec.iv.val, AES_BLOCK_SIZE);
21928b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
21938b8546aaSGowrishankar Muthukrishnan 					val[1].val = pt.val;
21948b8546aaSGowrishankar Muthukrishnan 					val[1].len = pt.len;
21958b8546aaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
21968b8546aaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2197cd255ccfSMarko Kovacevic 				} else {
21988b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, vec.iv.val, AES_BLOCK_SIZE);
21998b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE);
22008b8546aaSGowrishankar Muthukrishnan 					val[1].val = ct.val;
22018b8546aaSGowrishankar Muthukrishnan 					val[1].len = ct.len;
22028b8546aaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
22038b8546aaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2204cd255ccfSMarko Kovacevic 				}
2205cd255ccfSMarko Kovacevic 				continue;
2206cd255ccfSMarko Kovacevic 			}
2207cd255ccfSMarko Kovacevic 
2208cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
22098b8546aaSGowrishankar Muthukrishnan 				memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
2210cd255ccfSMarko Kovacevic 				memcpy(vec.pt.val, prev_out, AES_BLOCK_SIZE);
2211cd255ccfSMarko Kovacevic 			} else {
2212cd255ccfSMarko Kovacevic 				memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE);
2213cd255ccfSMarko Kovacevic 				memcpy(vec.ct.val, prev_out, AES_BLOCK_SIZE);
2214cd255ccfSMarko Kovacevic 			}
2215cd255ccfSMarko Kovacevic 
2216cd255ccfSMarko Kovacevic 			if (j == AES_INTERN_ITER - 1)
2217cd255ccfSMarko Kovacevic 				continue;
2218cd255ccfSMarko Kovacevic 
22198b8546aaSGowrishankar Muthukrishnan 			memcpy(prev_out, val[0].val, AES_BLOCK_SIZE);
2220cd255ccfSMarko Kovacevic 		}
2221cd255ccfSMarko Kovacevic 
22228b8546aaSGowrishankar Muthukrishnan 		info.parse_writeback(val);
22238b8546aaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2224cd255ccfSMarko Kovacevic 			fprintf(info.fp_wr, "\n");
2225cd255ccfSMarko Kovacevic 
2226e9ec7f61SGowrishankar Muthukrishnan 		if (i == AES_EXTERN_ITER - 1)
2227cd255ccfSMarko Kovacevic 			continue;
2228cd255ccfSMarko Kovacevic 
2229cd255ccfSMarko Kovacevic 		/** update key */
2230cd255ccfSMarko Kovacevic 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2231cd255ccfSMarko Kovacevic 		for (k = 0; k < vec.cipher_auth.key.len; k++) {
2232cd255ccfSMarko Kovacevic 			switch (vec.cipher_auth.key.len) {
2233cd255ccfSMarko Kovacevic 			case 16:
22348b8546aaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2235cd255ccfSMarko Kovacevic 				break;
2236cd255ccfSMarko Kovacevic 			case 24:
2237cd255ccfSMarko Kovacevic 				if (k < 8)
2238cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k + 8];
2239cd255ccfSMarko Kovacevic 				else
22408b8546aaSGowrishankar Muthukrishnan 					val_key.val[k] ^= val[0].val[k - 8];
2241cd255ccfSMarko Kovacevic 				break;
2242cd255ccfSMarko Kovacevic 			case 32:
2243cd255ccfSMarko Kovacevic 				if (k < 16)
2244cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k];
2245cd255ccfSMarko Kovacevic 				else
22468b8546aaSGowrishankar Muthukrishnan 					val_key.val[k] ^= val[0].val[k - 16];
2247cd255ccfSMarko Kovacevic 				break;
2248cd255ccfSMarko Kovacevic 			default:
2249cd255ccfSMarko Kovacevic 				return -1;
2250cd255ccfSMarko Kovacevic 			}
2251cd255ccfSMarko Kovacevic 		}
2252cd255ccfSMarko Kovacevic 
2253cd255ccfSMarko Kovacevic 		if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
22548b8546aaSGowrishankar Muthukrishnan 			memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
2255cd255ccfSMarko Kovacevic 	}
2256cd255ccfSMarko Kovacevic 
22578b8546aaSGowrishankar Muthukrishnan 	free(val[0].val);
2258e9ec7f61SGowrishankar Muthukrishnan 	free(pt.val);
2259e9ec7f61SGowrishankar Muthukrishnan 	free(ct.val);
2260e9ec7f61SGowrishankar Muthukrishnan 	free(iv.val);
2261952e10cdSFan Zhang 
2262cd255ccfSMarko Kovacevic 	return 0;
2263cd255ccfSMarko Kovacevic }
2264cd255ccfSMarko Kovacevic 
2265cd255ccfSMarko Kovacevic static int
2266f4797baeSDamian Nowak fips_mct_sha_test(void)
2267f4797baeSDamian Nowak {
2268f4797baeSDamian Nowak #define SHA_EXTERN_ITER	100
2269f4797baeSDamian Nowak #define SHA_INTERN_ITER	1000
22701ea7940eSGowrishankar Muthukrishnan 	uint8_t md_blocks = info.interim_info.sha_data.md_blocks;
2271fc78f69dSGowrishankar Muthukrishnan 	struct fips_val val = {NULL, 0};
22721ea7940eSGowrishankar Muthukrishnan 	struct fips_val  md[md_blocks];
2273f4797baeSDamian Nowak 	int ret;
22741ea7940eSGowrishankar Muthukrishnan 	uint32_t i, j, k, offset, max_outlen;
2275f4797baeSDamian Nowak 
22761ea7940eSGowrishankar Muthukrishnan 	max_outlen = md_blocks * vec.cipher_auth.digest.len;
22771ea7940eSGowrishankar Muthukrishnan 
22781ea7940eSGowrishankar Muthukrishnan 	if (vec.cipher_auth.digest.val)
22791ea7940eSGowrishankar Muthukrishnan 		free(vec.cipher_auth.digest.val);
22801ea7940eSGowrishankar Muthukrishnan 
22811ea7940eSGowrishankar Muthukrishnan 	vec.cipher_auth.digest.val = calloc(1, max_outlen);
22821ea7940eSGowrishankar Muthukrishnan 
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 	rte_free(vec.pt.val);
22871ea7940eSGowrishankar Muthukrishnan 	vec.pt.val = rte_malloc(NULL, (MAX_DIGEST_SIZE*md_blocks), 0);
22881ea7940eSGowrishankar Muthukrishnan 
22891ea7940eSGowrishankar Muthukrishnan 	for (i = 0; i < md_blocks; i++)
22901ea7940eSGowrishankar Muthukrishnan 		md[i].val = rte_malloc(NULL, (MAX_DIGEST_SIZE*2), 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++) {
22981ea7940eSGowrishankar Muthukrishnan 		for (i = 0; i < md_blocks; i++) {
22991ea7940eSGowrishankar Muthukrishnan 			memcpy(md[i].val, vec.cipher_auth.digest.val,
2300f4797baeSDamian Nowak 				vec.cipher_auth.digest.len);
23011ea7940eSGowrishankar Muthukrishnan 			md[i].len = vec.cipher_auth.digest.len;
23021ea7940eSGowrishankar Muthukrishnan 		}
2303d5c24714SGowrishankar Muthukrishnan 
2304f4797baeSDamian Nowak 		for (i = 0; i < (SHA_INTERN_ITER); i++) {
23051ea7940eSGowrishankar Muthukrishnan 			offset = 0;
23061ea7940eSGowrishankar Muthukrishnan 			for (k = 0; k < md_blocks; k++) {
23071ea7940eSGowrishankar Muthukrishnan 				memcpy(vec.pt.val + offset, md[k].val, (size_t)md[k].len);
23081ea7940eSGowrishankar Muthukrishnan 				offset += md[k].len;
23091ea7940eSGowrishankar Muthukrishnan 			}
23101ea7940eSGowrishankar Muthukrishnan 			vec.pt.len = offset;
2311f4797baeSDamian Nowak 
2312f4797baeSDamian Nowak 			ret = fips_run_test();
2313f4797baeSDamian Nowak 			if (ret < 0) {
23148a40ff39SArchana Muniganti 				if (ret == -EPERM || ret == -ENOTSUP) {
231589be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
231689be27e3SBrandon Lo 						return ret;
231789be27e3SBrandon Lo 
2318f4797baeSDamian Nowak 					fprintf(info.fp_wr, "Bypass\n\n");
2319f4797baeSDamian Nowak 					return 0;
2320f4797baeSDamian Nowak 				}
2321f4797baeSDamian Nowak 				return ret;
2322f4797baeSDamian Nowak 			}
2323f4797baeSDamian Nowak 
2324fc78f69dSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val);
2325afda6b01SCiara Power 			if (ret < 0)
2326afda6b01SCiara Power 				return ret;
2327f4797baeSDamian Nowak 
23281ea7940eSGowrishankar Muthukrishnan 			for (k = 1; k < md_blocks; k++) {
23291ea7940eSGowrishankar Muthukrishnan 				memcpy(md[k-1].val, md[k].val, md[k].len);
23301ea7940eSGowrishankar Muthukrishnan 				md[k-1].len = md[k].len;
2331f4797baeSDamian Nowak 			}
2332f4797baeSDamian Nowak 
23331ea7940eSGowrishankar Muthukrishnan 			memcpy(md[md_blocks-1].val, (val.val + vec.pt.len),
23341ea7940eSGowrishankar Muthukrishnan 				vec.cipher_auth.digest.len);
23351ea7940eSGowrishankar Muthukrishnan 			md[md_blocks-1].len = vec.cipher_auth.digest.len;
23361ea7940eSGowrishankar Muthukrishnan 		}
23371ea7940eSGowrishankar Muthukrishnan 
23381ea7940eSGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, md[md_blocks-1].val, md[md_blocks-1].len);
23391ea7940eSGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = md[md_blocks-1].len;
2340f4797baeSDamian Nowak 
2341ce7ced4eSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2342f4797baeSDamian Nowak 			fprintf(info.fp_wr, "COUNT = %u\n", j);
2343ce7ced4eSGowrishankar Muthukrishnan 
2344fc78f69dSGowrishankar Muthukrishnan 		info.parse_writeback(&val);
2345ce7ced4eSGowrishankar Muthukrishnan 
2346ce7ced4eSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2347ce7ced4eSGowrishankar Muthukrishnan 			fprintf(info.fp_wr, "\n");
2348d5c24714SGowrishankar Muthukrishnan 	}
2349f4797baeSDamian Nowak 
23501ea7940eSGowrishankar Muthukrishnan 	for (i = 0; i < (md_blocks); i++)
2351f4797baeSDamian Nowak 		rte_free(md[i].val);
2352f4797baeSDamian Nowak 
2353f4797baeSDamian Nowak 	rte_free(vec.pt.val);
2354f4797baeSDamian Nowak 
2355fc78f69dSGowrishankar Muthukrishnan 	free(val.val);
2356f4797baeSDamian Nowak 	return 0;
2357f4797baeSDamian Nowak }
2358f4797baeSDamian Nowak 
2359*225f04fbSGowrishankar Muthukrishnan static int
2360*225f04fbSGowrishankar Muthukrishnan fips_mct_shake_test(void)
2361*225f04fbSGowrishankar Muthukrishnan {
2362*225f04fbSGowrishankar Muthukrishnan #define SHAKE_EXTERN_ITER	100
2363*225f04fbSGowrishankar Muthukrishnan #define SHAKE_INTERN_ITER	1000
2364*225f04fbSGowrishankar Muthukrishnan 	uint32_t i, j, range, outlen, max_outlen;
2365*225f04fbSGowrishankar Muthukrishnan 	struct fips_val val = {NULL, 0}, md;
2366*225f04fbSGowrishankar Muthukrishnan 	uint8_t rightmost[2];
2367*225f04fbSGowrishankar Muthukrishnan 	uint16_t *rightptr;
2368*225f04fbSGowrishankar Muthukrishnan 	int ret;
2369*225f04fbSGowrishankar Muthukrishnan 
2370*225f04fbSGowrishankar Muthukrishnan 	max_outlen = vec.cipher_auth.digest.len;
2371*225f04fbSGowrishankar Muthukrishnan 
2372*225f04fbSGowrishankar Muthukrishnan 	if (vec.cipher_auth.digest.val)
2373*225f04fbSGowrishankar Muthukrishnan 		free(vec.cipher_auth.digest.val);
2374*225f04fbSGowrishankar Muthukrishnan 
2375*225f04fbSGowrishankar Muthukrishnan 	vec.cipher_auth.digest.val = calloc(1, max_outlen);
2376*225f04fbSGowrishankar Muthukrishnan 
2377*225f04fbSGowrishankar Muthukrishnan 	if (vec.pt.val)
2378*225f04fbSGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, vec.pt.val, vec.pt.len);
2379*225f04fbSGowrishankar Muthukrishnan 
2380*225f04fbSGowrishankar Muthukrishnan 	rte_free(vec.pt.val);
2381*225f04fbSGowrishankar Muthukrishnan 	vec.pt.val = rte_malloc(NULL, 16, 0);
2382*225f04fbSGowrishankar Muthukrishnan 	vec.pt.len = 16;
2383*225f04fbSGowrishankar Muthukrishnan 
2384*225f04fbSGowrishankar Muthukrishnan 	md.val = rte_malloc(NULL, max_outlen, 0);
2385*225f04fbSGowrishankar Muthukrishnan 	md.len = max_outlen;
2386*225f04fbSGowrishankar Muthukrishnan 
2387*225f04fbSGowrishankar Muthukrishnan 	if (info.file_type != FIPS_TYPE_JSON) {
2388*225f04fbSGowrishankar Muthukrishnan 		fips_test_write_one_case();
2389*225f04fbSGowrishankar Muthukrishnan 		fprintf(info.fp_wr, "\n");
2390*225f04fbSGowrishankar Muthukrishnan 	}
2391*225f04fbSGowrishankar Muthukrishnan 
2392*225f04fbSGowrishankar Muthukrishnan 	range = max_outlen - info.interim_info.sha_data.min_outlen + 1;
2393*225f04fbSGowrishankar Muthukrishnan 	outlen = max_outlen;
2394*225f04fbSGowrishankar Muthukrishnan 	for (j = 0; j < SHAKE_EXTERN_ITER; j++) {
2395*225f04fbSGowrishankar Muthukrishnan 		memset(md.val, 0, max_outlen);
2396*225f04fbSGowrishankar Muthukrishnan 		memcpy(md.val, vec.cipher_auth.digest.val,
2397*225f04fbSGowrishankar Muthukrishnan 			vec.cipher_auth.digest.len);
2398*225f04fbSGowrishankar Muthukrishnan 
2399*225f04fbSGowrishankar Muthukrishnan 		for (i = 0; i < (SHAKE_INTERN_ITER); i++) {
2400*225f04fbSGowrishankar Muthukrishnan 			memset(vec.pt.val, 0, vec.pt.len);
2401*225f04fbSGowrishankar Muthukrishnan 			memcpy(vec.pt.val, md.val, vec.pt.len);
2402*225f04fbSGowrishankar Muthukrishnan 			vec.cipher_auth.digest.len = outlen;
2403*225f04fbSGowrishankar Muthukrishnan 			ret = fips_run_test();
2404*225f04fbSGowrishankar Muthukrishnan 			if (ret < 0) {
2405*225f04fbSGowrishankar Muthukrishnan 				if (ret == -EPERM || ret == -ENOTSUP) {
2406*225f04fbSGowrishankar Muthukrishnan 					if (info.file_type == FIPS_TYPE_JSON)
2407*225f04fbSGowrishankar Muthukrishnan 						return ret;
2408*225f04fbSGowrishankar Muthukrishnan 
2409*225f04fbSGowrishankar Muthukrishnan 					fprintf(info.fp_wr, "Bypass\n\n");
2410*225f04fbSGowrishankar Muthukrishnan 					return 0;
2411*225f04fbSGowrishankar Muthukrishnan 				}
2412*225f04fbSGowrishankar Muthukrishnan 				return ret;
2413*225f04fbSGowrishankar Muthukrishnan 			}
2414*225f04fbSGowrishankar Muthukrishnan 
2415*225f04fbSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val);
2416*225f04fbSGowrishankar Muthukrishnan 			if (ret < 0)
2417*225f04fbSGowrishankar Muthukrishnan 				return ret;
2418*225f04fbSGowrishankar Muthukrishnan 
2419*225f04fbSGowrishankar Muthukrishnan 			memset(md.val, 0, max_outlen);
2420*225f04fbSGowrishankar Muthukrishnan 			memcpy(md.val, (val.val + vec.pt.len),
2421*225f04fbSGowrishankar Muthukrishnan 				vec.cipher_auth.digest.len);
2422*225f04fbSGowrishankar Muthukrishnan 			md.len = outlen;
2423*225f04fbSGowrishankar Muthukrishnan 			rightmost[0] = md.val[md.len-1];
2424*225f04fbSGowrishankar Muthukrishnan 			rightmost[1] = md.val[md.len-2];
2425*225f04fbSGowrishankar Muthukrishnan 			rightptr = (uint16_t *)rightmost;
2426*225f04fbSGowrishankar Muthukrishnan 			outlen = info.interim_info.sha_data.min_outlen +
2427*225f04fbSGowrishankar Muthukrishnan 				(*rightptr % range);
2428*225f04fbSGowrishankar Muthukrishnan 		}
2429*225f04fbSGowrishankar Muthukrishnan 
2430*225f04fbSGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, md.val, md.len);
2431*225f04fbSGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = md.len;
2432*225f04fbSGowrishankar Muthukrishnan 
2433*225f04fbSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2434*225f04fbSGowrishankar Muthukrishnan 			fprintf(info.fp_wr, "COUNT = %u\n", j);
2435*225f04fbSGowrishankar Muthukrishnan 
2436*225f04fbSGowrishankar Muthukrishnan 		info.parse_writeback(&val);
2437*225f04fbSGowrishankar Muthukrishnan 
2438*225f04fbSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2439*225f04fbSGowrishankar Muthukrishnan 			fprintf(info.fp_wr, "\n");
2440*225f04fbSGowrishankar Muthukrishnan 	}
2441*225f04fbSGowrishankar Muthukrishnan 
2442*225f04fbSGowrishankar Muthukrishnan 	rte_free(md.val);
2443*225f04fbSGowrishankar Muthukrishnan 	rte_free(vec.pt.val);
2444*225f04fbSGowrishankar Muthukrishnan 
2445*225f04fbSGowrishankar Muthukrishnan 	free(val.val);
2446*225f04fbSGowrishankar Muthukrishnan 	return 0;
2447*225f04fbSGowrishankar Muthukrishnan }
2448f4797baeSDamian Nowak 
2449f4797baeSDamian Nowak static int
2450cd255ccfSMarko Kovacevic init_test_ops(void)
2451cd255ccfSMarko Kovacevic {
2452cd255ccfSMarko Kovacevic 	switch (info.algo) {
245375777166SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CBC:
2454c8956fd2SBrian Dooley 	case FIPS_TEST_ALGO_AES_CTR:
2455cd255ccfSMarko Kovacevic 	case FIPS_TEST_ALGO_AES:
245636128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
245736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform  = prepare_aes_xform;
2458cd255ccfSMarko Kovacevic 		if (info.interim_info.aes_data.test_type == AESAVS_TYPE_MCT)
2459cd255ccfSMarko Kovacevic 			test_ops.test = fips_mct_aes_test;
2460cd255ccfSMarko Kovacevic 		else
2461cd255ccfSMarko Kovacevic 			test_ops.test = fips_generic_test;
2462cd255ccfSMarko Kovacevic 		break;
2463f64adb67SMarko Kovacevic 	case FIPS_TEST_ALGO_HMAC:
246436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
246536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_hmac_xform;
2466f64adb67SMarko Kovacevic 		test_ops.test = fips_generic_test;
2467f64adb67SMarko Kovacevic 		break;
2468527cbf3dSMarko Kovacevic 	case FIPS_TEST_ALGO_TDES:
246936128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
247036128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_tdes_xform;
2471527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.test_type == TDES_MCT)
2472527cbf3dSMarko Kovacevic 			test_ops.test = fips_mct_tdes_test;
2473527cbf3dSMarko Kovacevic 		else
2474527cbf3dSMarko Kovacevic 			test_ops.test = fips_generic_test;
2475527cbf3dSMarko Kovacevic 		break;
2476e27268bdSBrian Dooley 	case FIPS_TEST_ALGO_AES_GMAC:
247736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
247836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gmac_xform;
2479e27268bdSBrian Dooley 		test_ops.test = fips_generic_test;
2480e27268bdSBrian Dooley 		break;
24814aaad299SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_GCM:
248236128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_aead_op;
248336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gcm_xform;
24844aaad299SMarko Kovacevic 		test_ops.test = fips_generic_test;
24854aaad299SMarko Kovacevic 		break;
2486ac026f46SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_CMAC:
248736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
248836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_cmac_xform;
2489ac026f46SMarko Kovacevic 		test_ops.test = fips_generic_test;
2490ac026f46SMarko Kovacevic 		break;
2491305921f4SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_CCM:
249236128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_aead_op;
249336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_ccm_xform;
2494305921f4SMarko Kovacevic 		test_ops.test = fips_generic_test;
2495305921f4SMarko Kovacevic 		break;
2496f4797baeSDamian Nowak 	case FIPS_TEST_ALGO_SHA:
249736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
249836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_sha_xform;
2499f4797baeSDamian Nowak 		if (info.interim_info.sha_data.test_type == SHA_MCT)
2500*225f04fbSGowrishankar Muthukrishnan 			if (info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_128 ||
2501*225f04fbSGowrishankar Muthukrishnan 				info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_256)
2502*225f04fbSGowrishankar Muthukrishnan 				test_ops.test = fips_mct_shake_test;
2503*225f04fbSGowrishankar Muthukrishnan 			else
2504f4797baeSDamian Nowak 				test_ops.test = fips_mct_sha_test;
2505f4797baeSDamian Nowak 		else
2506f4797baeSDamian Nowak 			test_ops.test = fips_generic_test;
2507f4797baeSDamian Nowak 		break;
2508d5a9ea55SSucharitha Sarananaga 	case FIPS_TEST_ALGO_AES_XTS:
250936128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
251036128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_xts_xform;
251136128a67SGowrishankar Muthukrishnan 		test_ops.test = fips_generic_test;
251236128a67SGowrishankar Muthukrishnan 		break;
251336128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_RSA:
251436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = prepare_rsa_op;
251536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = prepare_rsa_xform;
2516d5a9ea55SSucharitha Sarananaga 		test_ops.test = fips_generic_test;
2517d5a9ea55SSucharitha Sarananaga 		break;
2518b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_ECDSA:
2519b455d261SGowrishankar Muthukrishnan 		if (info.op == FIPS_TEST_ASYM_KEYGEN) {
2520b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecfpm_op;
2521b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecfpm_xform;
2522b455d261SGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2523b455d261SGowrishankar Muthukrishnan 		} else {
2524b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecdsa_op;
2525b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecdsa_xform;
2526b455d261SGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2527b455d261SGowrishankar Muthukrishnan 		}
2528b455d261SGowrishankar Muthukrishnan 		break;
2529cd255ccfSMarko Kovacevic 	default:
2530efe3a8dbSMichael Shamis 		if (strstr(info.file_name, "TECB") ||
2531efe3a8dbSMichael Shamis 				strstr(info.file_name, "TCBC")) {
2532efe3a8dbSMichael Shamis 			info.algo = FIPS_TEST_ALGO_TDES;
253336128a67SGowrishankar Muthukrishnan 			test_ops.prepare_sym_op = prepare_cipher_op;
253436128a67SGowrishankar Muthukrishnan 			test_ops.prepare_sym_xform = prepare_tdes_xform;
2535efe3a8dbSMichael Shamis 			if (info.interim_info.tdes_data.test_type == TDES_MCT)
2536efe3a8dbSMichael Shamis 				test_ops.test = fips_mct_tdes_test;
2537efe3a8dbSMichael Shamis 			else
2538efe3a8dbSMichael Shamis 				test_ops.test = fips_generic_test;
2539efe3a8dbSMichael Shamis 			break;
2540efe3a8dbSMichael Shamis 		}
2541cd255ccfSMarko Kovacevic 		return -1;
2542cd255ccfSMarko Kovacevic 	}
2543cd255ccfSMarko Kovacevic 
2544cd255ccfSMarko Kovacevic 	return 0;
2545cd255ccfSMarko Kovacevic }
2546cd255ccfSMarko Kovacevic 
25473d0fad56SMarko Kovacevic static void
25483d0fad56SMarko Kovacevic print_test_block(void)
25493d0fad56SMarko Kovacevic {
25503d0fad56SMarko Kovacevic 	uint32_t i;
25513d0fad56SMarko Kovacevic 
25523d0fad56SMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++)
25533d0fad56SMarko Kovacevic 		printf("%s\n", info.vec[i]);
25543d0fad56SMarko Kovacevic 
25553d0fad56SMarko Kovacevic 	printf("\n");
25563d0fad56SMarko Kovacevic }
25573d0fad56SMarko Kovacevic 
25583d0fad56SMarko Kovacevic static int
25593d0fad56SMarko Kovacevic fips_test_one_file(void)
25603d0fad56SMarko Kovacevic {
25613d0fad56SMarko Kovacevic 	int fetch_ret = 0, ret;
25623d0fad56SMarko Kovacevic 
2563cd255ccfSMarko Kovacevic 	ret = init_test_ops();
2564cd255ccfSMarko Kovacevic 	if (ret < 0) {
2565cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Init test op\n", ret);
2566cd255ccfSMarko Kovacevic 		return ret;
2567cd255ccfSMarko Kovacevic 	}
2568cd255ccfSMarko Kovacevic 
2569cd255ccfSMarko Kovacevic 	while (ret >= 0 && fetch_ret == 0) {
25703d0fad56SMarko Kovacevic 		fetch_ret = fips_test_fetch_one_block();
25713d0fad56SMarko Kovacevic 		if (fetch_ret < 0) {
25723d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Fetch block\n",
25733d0fad56SMarko Kovacevic 					fetch_ret);
25743d0fad56SMarko Kovacevic 			ret = fetch_ret;
25753d0fad56SMarko Kovacevic 			goto error_one_case;
25763d0fad56SMarko Kovacevic 		}
25773d0fad56SMarko Kovacevic 
25783d0fad56SMarko Kovacevic 		if (info.nb_vec_lines == 0) {
25793d0fad56SMarko Kovacevic 			if (fetch_ret == -EOF)
25803d0fad56SMarko Kovacevic 				break;
25813d0fad56SMarko Kovacevic 
25823d0fad56SMarko Kovacevic 			fprintf(info.fp_wr, "\n");
25833d0fad56SMarko Kovacevic 			continue;
25843d0fad56SMarko Kovacevic 		}
25853d0fad56SMarko Kovacevic 
25863d0fad56SMarko Kovacevic 		ret = fips_test_parse_one_case();
25873d0fad56SMarko Kovacevic 		switch (ret) {
25883d0fad56SMarko Kovacevic 		case 0:
2589cd255ccfSMarko Kovacevic 			ret = test_ops.test();
25903d0fad56SMarko Kovacevic 			if (ret == 0)
25913d0fad56SMarko Kovacevic 				break;
25923d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: test block\n",
25933d0fad56SMarko Kovacevic 					ret);
25943d0fad56SMarko Kovacevic 			goto error_one_case;
25953d0fad56SMarko Kovacevic 		case 1:
25963d0fad56SMarko Kovacevic 			break;
25973d0fad56SMarko Kovacevic 		default:
25983d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
25993d0fad56SMarko Kovacevic 					ret);
26003d0fad56SMarko Kovacevic 			goto error_one_case;
26013d0fad56SMarko Kovacevic 		}
26023d0fad56SMarko Kovacevic 
26033d0fad56SMarko Kovacevic 		continue;
26043d0fad56SMarko Kovacevic error_one_case:
26053d0fad56SMarko Kovacevic 		print_test_block();
26063d0fad56SMarko Kovacevic 	}
26073d0fad56SMarko Kovacevic 
26083d0fad56SMarko Kovacevic 	fips_test_clear();
26093d0fad56SMarko Kovacevic 
261015bb59a5SCiara Power 	if (env.digest) {
2611952e10cdSFan Zhang 		rte_free(env.digest);
261215bb59a5SCiara Power 		env.digest = NULL;
261315bb59a5SCiara Power 	}
2614952e10cdSFan Zhang 	rte_pktmbuf_free(env.mbuf);
2615cd255ccfSMarko Kovacevic 
2616952e10cdSFan Zhang 	return ret;
26173d0fad56SMarko Kovacevic }
261889be27e3SBrandon Lo 
26198d70a194SDavid Marchand #ifdef USE_JANSSON
262089be27e3SBrandon Lo static int
262189be27e3SBrandon Lo fips_test_json_init_writeback(void)
262289be27e3SBrandon Lo {
262389be27e3SBrandon Lo 	json_t *session_info, *session_write;
262489be27e3SBrandon Lo 	session_info = json_array_get(json_info.json_root, 0);
262589be27e3SBrandon Lo 	session_write = json_object();
262689be27e3SBrandon Lo 	json_info.json_write_root = json_array();
262789be27e3SBrandon Lo 
262889be27e3SBrandon Lo 	json_object_set(session_write, "jwt",
262989be27e3SBrandon Lo 		json_object_get(session_info, "jwt"));
263089be27e3SBrandon Lo 	json_object_set(session_write, "url",
263189be27e3SBrandon Lo 		json_object_get(session_info, "url"));
263289be27e3SBrandon Lo 	json_object_set(session_write, "isSample",
263389be27e3SBrandon Lo 		json_object_get(session_info, "isSample"));
263489be27e3SBrandon Lo 
263589be27e3SBrandon Lo 	json_info.is_sample = json_boolean_value(
263689be27e3SBrandon Lo 		json_object_get(session_info, "isSample"));
263789be27e3SBrandon Lo 
263889be27e3SBrandon Lo 	json_array_append_new(json_info.json_write_root, session_write);
263989be27e3SBrandon Lo 	return 0;
264089be27e3SBrandon Lo }
264189be27e3SBrandon Lo 
264289be27e3SBrandon Lo static int
264389be27e3SBrandon Lo fips_test_one_test_case(void)
264489be27e3SBrandon Lo {
264589be27e3SBrandon Lo 	int ret;
264689be27e3SBrandon Lo 
264789be27e3SBrandon Lo 	ret = fips_test_parse_one_json_case();
264889be27e3SBrandon Lo 
264989be27e3SBrandon Lo 	switch (ret) {
265089be27e3SBrandon Lo 	case 0:
265189be27e3SBrandon Lo 		ret = test_ops.test();
265289be27e3SBrandon Lo 		if ((ret == 0) || (ret == -EPERM || ret == -ENOTSUP))
265389be27e3SBrandon Lo 			break;
265489be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error %i: test block\n",
265589be27e3SBrandon Lo 				ret);
265689be27e3SBrandon Lo 		break;
265789be27e3SBrandon Lo 	default:
265889be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
265989be27e3SBrandon Lo 				ret);
266089be27e3SBrandon Lo 	}
266189be27e3SBrandon Lo 	return ret;
266289be27e3SBrandon Lo }
266389be27e3SBrandon Lo 
266489be27e3SBrandon Lo static int
266589be27e3SBrandon Lo fips_test_one_test_group(void)
266689be27e3SBrandon Lo {
266789be27e3SBrandon Lo 	int ret;
266889be27e3SBrandon Lo 	json_t *tests, *write_tests;
266989be27e3SBrandon Lo 	size_t test_idx, tests_size;
267089be27e3SBrandon Lo 
267189be27e3SBrandon Lo 	write_tests = json_array();
267289be27e3SBrandon Lo 	json_info.json_write_group = json_object();
267389be27e3SBrandon Lo 	json_object_set(json_info.json_write_group, "tgId",
267489be27e3SBrandon Lo 		json_object_get(json_info.json_test_group, "tgId"));
267589be27e3SBrandon Lo 	json_object_set_new(json_info.json_write_group, "tests", write_tests);
267689be27e3SBrandon Lo 
267789be27e3SBrandon Lo 	switch (info.algo) {
2678e27268bdSBrian Dooley 	case FIPS_TEST_ALGO_AES_GMAC:
267989be27e3SBrandon Lo 	case FIPS_TEST_ALGO_AES_GCM:
2680b09aac2dSBrandon Lo 		ret = parse_test_gcm_json_init();
268189be27e3SBrandon Lo 		break;
2682443c93d8SBrandon Lo 	case FIPS_TEST_ALGO_HMAC:
2683443c93d8SBrandon Lo 		ret = parse_test_hmac_json_init();
2684443c93d8SBrandon Lo 		break;
268507da56a6SBrandon Lo 	case FIPS_TEST_ALGO_AES_CMAC:
268607da56a6SBrandon Lo 		ret = parse_test_cmac_json_init();
268707da56a6SBrandon Lo 		break;
2688f8e431edSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_XTS:
2689f8e431edSGowrishankar Muthukrishnan 		ret = parse_test_xts_json_init();
2690f8e431edSGowrishankar Muthukrishnan 		break;
2691f8e431edSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CBC:
2692c8956fd2SBrian Dooley 	case FIPS_TEST_ALGO_AES_CTR:
26938b8546aaSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES:
26948b8546aaSGowrishankar Muthukrishnan 		ret = parse_test_aes_json_init();
26958b8546aaSGowrishankar Muthukrishnan 		break;
2696d5c24714SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_SHA:
2697d5c24714SGowrishankar Muthukrishnan 		ret = parse_test_sha_json_init();
2698d5c24714SGowrishankar Muthukrishnan 		break;
269964569ffaSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_TDES:
270064569ffaSGowrishankar Muthukrishnan 		ret = parse_test_tdes_json_init();
270164569ffaSGowrishankar Muthukrishnan 		break;
270236128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_RSA:
270336128a67SGowrishankar Muthukrishnan 		ret = parse_test_rsa_json_init();
270436128a67SGowrishankar Muthukrishnan 		break;
2705b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_ECDSA:
2706b455d261SGowrishankar Muthukrishnan 		ret = parse_test_ecdsa_json_init();
2707b455d261SGowrishankar Muthukrishnan 		break;
270889be27e3SBrandon Lo 	default:
270989be27e3SBrandon Lo 		return -EINVAL;
271089be27e3SBrandon Lo 	}
2711b09aac2dSBrandon Lo 
271289be27e3SBrandon Lo 	if (ret < 0)
271389be27e3SBrandon Lo 		return ret;
271489be27e3SBrandon Lo 
271589be27e3SBrandon Lo 	ret = fips_test_parse_one_json_group();
271689be27e3SBrandon Lo 	if (ret < 0)
271789be27e3SBrandon Lo 		return ret;
271889be27e3SBrandon Lo 
271989be27e3SBrandon Lo 	ret = init_test_ops();
272089be27e3SBrandon Lo 	if (ret < 0)
272189be27e3SBrandon Lo 		return ret;
272289be27e3SBrandon Lo 
272389be27e3SBrandon Lo 	tests = json_object_get(json_info.json_test_group, "tests");
272489be27e3SBrandon Lo 	tests_size = json_array_size(tests);
272589be27e3SBrandon Lo 	for (test_idx = 0; test_idx < tests_size; test_idx++) {
272689be27e3SBrandon Lo 		json_info.json_test_case = json_array_get(tests, test_idx);
272789be27e3SBrandon Lo 		if (fips_test_one_test_case() == 0)
272889be27e3SBrandon Lo 			json_array_append_new(write_tests, json_info.json_write_case);
272989be27e3SBrandon Lo 	}
273089be27e3SBrandon Lo 
273189be27e3SBrandon Lo 	return 0;
273289be27e3SBrandon Lo }
273389be27e3SBrandon Lo 
273489be27e3SBrandon Lo static int
273589be27e3SBrandon Lo fips_test_one_vector_set(void)
273689be27e3SBrandon Lo {
273789be27e3SBrandon Lo 	int ret;
2738b455d261SGowrishankar Muthukrishnan 	json_t *test_groups, *write_groups, *write_version, *write_set, *mode;
273989be27e3SBrandon Lo 	size_t group_idx, num_groups;
274089be27e3SBrandon Lo 
274189be27e3SBrandon Lo 	test_groups = json_object_get(json_info.json_vector_set, "testGroups");
274289be27e3SBrandon Lo 	num_groups = json_array_size(test_groups);
274389be27e3SBrandon Lo 
274489be27e3SBrandon Lo 	json_info.json_write_set = json_array();
274589be27e3SBrandon Lo 	write_version = json_object();
274689be27e3SBrandon Lo 	json_object_set_new(write_version, "acvVersion", json_string(ACVVERSION));
274789be27e3SBrandon Lo 	json_array_append_new(json_info.json_write_set, write_version);
274889be27e3SBrandon Lo 
274989be27e3SBrandon Lo 	write_set = json_object();
275089be27e3SBrandon Lo 	json_array_append(json_info.json_write_set, write_set);
275189be27e3SBrandon Lo 	write_groups = json_array();
275289be27e3SBrandon Lo 
275389be27e3SBrandon Lo 	json_object_set(write_set, "vsId",
275489be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "vsId"));
275589be27e3SBrandon Lo 	json_object_set(write_set, "algorithm",
275689be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "algorithm"));
2757b455d261SGowrishankar Muthukrishnan 	mode = json_object_get(json_info.json_vector_set, "mode");
2758b455d261SGowrishankar Muthukrishnan 	if (mode != NULL)
2759b455d261SGowrishankar Muthukrishnan 		json_object_set_new(write_set, "mode", mode);
2760b455d261SGowrishankar Muthukrishnan 
276189be27e3SBrandon Lo 	json_object_set(write_set, "revision",
276289be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "revision"));
276389be27e3SBrandon Lo 	json_object_set_new(write_set, "isSample",
276489be27e3SBrandon Lo 		json_boolean(json_info.is_sample));
276589be27e3SBrandon Lo 	json_object_set_new(write_set, "testGroups", write_groups);
276689be27e3SBrandon Lo 
276789be27e3SBrandon Lo 	ret = fips_test_parse_one_json_vector_set();
276889be27e3SBrandon Lo 	if (ret < 0) {
276989be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error: Unsupported or invalid vector set algorithm: %s\n",
277089be27e3SBrandon Lo 			json_string_value(json_object_get(json_info.json_vector_set, "algorithm")));
277189be27e3SBrandon Lo 		return ret;
277289be27e3SBrandon Lo 	}
277389be27e3SBrandon Lo 
277489be27e3SBrandon Lo 	for (group_idx = 0; group_idx < num_groups; group_idx++) {
277589be27e3SBrandon Lo 		json_info.json_test_group = json_array_get(test_groups, group_idx);
277689be27e3SBrandon Lo 		ret = fips_test_one_test_group();
277789be27e3SBrandon Lo 		json_array_append_new(write_groups, json_info.json_write_group);
277889be27e3SBrandon Lo 	}
277989be27e3SBrandon Lo 
278089be27e3SBrandon Lo 	return 0;
278189be27e3SBrandon Lo }
278289be27e3SBrandon Lo 
278389be27e3SBrandon Lo static int
278489be27e3SBrandon Lo fips_test_one_json_file(void)
278589be27e3SBrandon Lo {
278689be27e3SBrandon Lo 	size_t vector_set_idx, root_size;
278789be27e3SBrandon Lo 
278889be27e3SBrandon Lo 	root_size = json_array_size(json_info.json_root);
278989be27e3SBrandon Lo 	fips_test_json_init_writeback();
279089be27e3SBrandon Lo 
279189be27e3SBrandon Lo 	for (vector_set_idx = 1; vector_set_idx < root_size; vector_set_idx++) {
279289be27e3SBrandon Lo 		/* Vector set index starts at 1, the 0th index contains test session
279389be27e3SBrandon Lo 		 * information.
279489be27e3SBrandon Lo 		 */
279589be27e3SBrandon Lo 		json_info.json_vector_set = json_array_get(json_info.json_root, vector_set_idx);
279689be27e3SBrandon Lo 		fips_test_one_vector_set();
279789be27e3SBrandon Lo 		json_array_append_new(json_info.json_write_root, json_info.json_write_set);
2798d5c24714SGowrishankar Muthukrishnan 		json_incref(json_info.json_write_set);
279989be27e3SBrandon Lo 	}
280089be27e3SBrandon Lo 
280189be27e3SBrandon Lo 	json_dumpf(json_info.json_write_root, info.fp_wr, JSON_INDENT(4));
280289be27e3SBrandon Lo 	json_decref(json_info.json_write_root);
280389be27e3SBrandon Lo 
280489be27e3SBrandon Lo 	return 0;
280589be27e3SBrandon Lo }
28068d70a194SDavid Marchand #endif /* USE_JANSSON */
2807