xref: /dpdk/examples/fips_validation/main.c (revision 8782b3b64b4c38c0e2d4cf5bda2795ddd268cf41)
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 		if (vec.rsa.signature.val)
96736128a67SGowrishankar Muthukrishnan 			rte_free(vec.rsa.signature.val);
96836128a67SGowrishankar Muthukrishnan 
96936128a67SGowrishankar Muthukrishnan 		vec.rsa.signature.val = rte_zmalloc(NULL, vec.rsa.n.len, 0);
97036128a67SGowrishankar Muthukrishnan 		vec.rsa.signature.len = vec.rsa.n.len;
97136128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.data = vec.rsa.signature.val;
97236128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.length = 0;
97336128a67SGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGVER) {
97436128a67SGowrishankar Muthukrishnan 		asym->rsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
97536128a67SGowrishankar Muthukrishnan 		asym->rsa.message.data = msg.val;
97636128a67SGowrishankar Muthukrishnan 		asym->rsa.message.length = msg.len;
97736128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.data = vec.rsa.signature.val;
97836128a67SGowrishankar Muthukrishnan 		asym->rsa.sign.length = vec.rsa.signature.len;
97936128a67SGowrishankar Muthukrishnan 	} else {
98036128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op);
98136128a67SGowrishankar Muthukrishnan 		return -EINVAL;
98236128a67SGowrishankar Muthukrishnan 	}
98336128a67SGowrishankar Muthukrishnan 
98436128a67SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
985c05e4ab7SThomas Monjalon 
986c05e4ab7SThomas Monjalon 	return 0;
9874aaad299SMarko Kovacevic }
9884aaad299SMarko Kovacevic 
9894aaad299SMarko Kovacevic static int
990b455d261SGowrishankar Muthukrishnan prepare_ecdsa_op(void)
991b455d261SGowrishankar Muthukrishnan {
992b455d261SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
993b455d261SGowrishankar Muthukrishnan 	struct fips_val msg;
994b455d261SGowrishankar Muthukrishnan 
995b455d261SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
996b455d261SGowrishankar Muthukrishnan 
997b455d261SGowrishankar Muthukrishnan 	asym = env.op->asym;
998b455d261SGowrishankar Muthukrishnan 	if (env.digest) {
999b455d261SGowrishankar Muthukrishnan 		msg.val = env.digest;
1000b455d261SGowrishankar Muthukrishnan 		msg.len = env.digest_len;
1001b455d261SGowrishankar Muthukrishnan 	} else {
1002b455d261SGowrishankar Muthukrishnan 		msg.val = vec.pt.val;
1003b455d261SGowrishankar Muthukrishnan 		msg.len = vec.pt.len;
1004b455d261SGowrishankar Muthukrishnan 	}
1005b455d261SGowrishankar Muthukrishnan 
1006b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
1007b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_SIGN;
1008b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.data = msg.val;
1009b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.length = msg.len;
1010b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.pkey.data = vec.ecdsa.pkey.val;
1011b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.pkey.length = vec.ecdsa.pkey.len;
1012b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.k.data = vec.ecdsa.k.val;
1013b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.k.length = vec.ecdsa.k.len;
1014b455d261SGowrishankar Muthukrishnan 
1015b455d261SGowrishankar Muthukrishnan 		if (vec.ecdsa.r.val)
1016b455d261SGowrishankar Muthukrishnan 			rte_free(vec.ecdsa.r.val);
1017b455d261SGowrishankar Muthukrishnan 
1018b455d261SGowrishankar Muthukrishnan 		if (vec.ecdsa.s.val)
1019b455d261SGowrishankar Muthukrishnan 			rte_free(vec.ecdsa.s.val);
1020b455d261SGowrishankar Muthukrishnan 
1021b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.r.len = info.interim_info.ecdsa_data.curve_len;
1022b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.r.val = rte_zmalloc(NULL, vec.ecdsa.r.len, 0);
1023b455d261SGowrishankar Muthukrishnan 
1024b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.s.len = vec.ecdsa.r.len;
1025b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.s.val = rte_zmalloc(NULL, vec.ecdsa.s.len, 0);
1026b455d261SGowrishankar Muthukrishnan 
1027b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.data = vec.ecdsa.r.val;
1028b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.length = 0;
1029b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.data = vec.ecdsa.s.val;
1030b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.length = 0;
1031b455d261SGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGVER) {
1032b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.op_type = RTE_CRYPTO_ASYM_OP_VERIFY;
1033b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.data = msg.val;
1034b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.message.length = msg.len;
1035b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.q.x.data = vec.ecdsa.qx.val;
1036b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.q.x.length = vec.ecdsa.qx.len;
1037b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.q.y.data = vec.ecdsa.qy.val;
1038b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.q.y.length = vec.ecdsa.qy.len;
1039b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.data = vec.ecdsa.r.val;
1040b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.r.length = vec.ecdsa.r.len;
1041b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.data = vec.ecdsa.s.val;
1042b455d261SGowrishankar Muthukrishnan 		asym->ecdsa.s.length = vec.ecdsa.s.len;
1043b455d261SGowrishankar Muthukrishnan 	} else {
1044b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Invalid op %d\n", info.op);
1045b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1046b455d261SGowrishankar Muthukrishnan 	}
1047b455d261SGowrishankar Muthukrishnan 
1048b455d261SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
1049b455d261SGowrishankar Muthukrishnan 
1050b455d261SGowrishankar Muthukrishnan 	return 0;
1051b455d261SGowrishankar Muthukrishnan }
1052b455d261SGowrishankar Muthukrishnan 
1053b455d261SGowrishankar Muthukrishnan static int
1054b455d261SGowrishankar Muthukrishnan prepare_ecfpm_op(void)
1055b455d261SGowrishankar Muthukrishnan {
1056b455d261SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
1057b455d261SGowrishankar Muthukrishnan 
1058b455d261SGowrishankar Muthukrishnan 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
1059b455d261SGowrishankar Muthukrishnan 
1060b455d261SGowrishankar Muthukrishnan 	asym = env.op->asym;
1061b455d261SGowrishankar Muthukrishnan 	asym->ecpm.scalar.data = vec.ecdsa.pkey.val;
1062b455d261SGowrishankar Muthukrishnan 	asym->ecpm.scalar.length = vec.ecdsa.pkey.len;
1063b455d261SGowrishankar Muthukrishnan 
1064b455d261SGowrishankar Muthukrishnan 	if (vec.ecdsa.qx.val)
1065b455d261SGowrishankar Muthukrishnan 		rte_free(vec.ecdsa.qx.val);
1066b455d261SGowrishankar Muthukrishnan 
1067b455d261SGowrishankar Muthukrishnan 	if (vec.ecdsa.qy.val)
1068b455d261SGowrishankar Muthukrishnan 		rte_free(vec.ecdsa.qy.val);
1069b455d261SGowrishankar Muthukrishnan 
1070b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qx.len = info.interim_info.ecdsa_data.curve_len;
1071b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qx.val = rte_zmalloc(NULL, vec.ecdsa.qx.len, 0);
1072b455d261SGowrishankar Muthukrishnan 
1073b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qy.len = vec.ecdsa.qx.len;
1074b455d261SGowrishankar Muthukrishnan 	vec.ecdsa.qy.val = rte_zmalloc(NULL, vec.ecdsa.qy.len, 0);
1075b455d261SGowrishankar Muthukrishnan 
1076b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.x.data = vec.ecdsa.qx.val;
1077b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.x.length = 0;
1078b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.y.data = vec.ecdsa.qy.val;
1079b455d261SGowrishankar Muthukrishnan 	asym->ecpm.r.y.length = 0;
1080b455d261SGowrishankar Muthukrishnan 
1081b455d261SGowrishankar Muthukrishnan 	rte_crypto_op_attach_asym_session(env.op, env.asym.sess);
1082b455d261SGowrishankar Muthukrishnan 
1083b455d261SGowrishankar Muthukrishnan 	return 0;
1084b455d261SGowrishankar Muthukrishnan }
1085b455d261SGowrishankar Muthukrishnan 
1086b455d261SGowrishankar Muthukrishnan static int
1087cd255ccfSMarko Kovacevic prepare_aes_xform(struct rte_crypto_sym_xform *xform)
1088cd255ccfSMarko Kovacevic {
1089cd255ccfSMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1090cd255ccfSMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1091cd255ccfSMarko Kovacevic 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1092cd255ccfSMarko Kovacevic 
1093cd255ccfSMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1094d3190431SMichael Shamis 	if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_CBC)
1095cd255ccfSMarko Kovacevic 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CBC;
1096c8956fd2SBrian Dooley 	else if (info.interim_info.aes_data.cipher_algo ==
1097c8956fd2SBrian Dooley 			RTE_CRYPTO_CIPHER_AES_CTR)
1098c8956fd2SBrian Dooley 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CTR;
1099d3190431SMichael Shamis 	else
1100d3190431SMichael Shamis 		cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_ECB;
1101d3190431SMichael Shamis 
1102cd255ccfSMarko Kovacevic 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1103cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1104cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1105cd255ccfSMarko Kovacevic 	cipher_xform->key.data = vec.cipher_auth.key.val;
1106cd255ccfSMarko Kovacevic 	cipher_xform->key.length = vec.cipher_auth.key.len;
1107c8956fd2SBrian Dooley 	if (cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CBC ||
1108c8956fd2SBrian Dooley 			cipher_xform->algo == RTE_CRYPTO_CIPHER_AES_CTR) {
1109cd255ccfSMarko Kovacevic 		cipher_xform->iv.length = vec.iv.len;
1110cd255ccfSMarko Kovacevic 		cipher_xform->iv.offset = IV_OFF;
1111d3190431SMichael Shamis 	} else {
1112d3190431SMichael Shamis 		cipher_xform->iv.length = 0;
1113d3190431SMichael Shamis 		cipher_xform->iv.offset = 0;
1114d3190431SMichael Shamis 	}
1115d3190431SMichael Shamis 	cap_idx.algo.cipher = cipher_xform->algo;
1116cd255ccfSMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1117cd255ccfSMarko Kovacevic 
1118cd255ccfSMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1119cd255ccfSMarko Kovacevic 	if (!cap) {
1120cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1121cd255ccfSMarko Kovacevic 				env.dev_id);
1122cd255ccfSMarko Kovacevic 		return -EINVAL;
1123cd255ccfSMarko Kovacevic 	}
1124cd255ccfSMarko Kovacevic 
1125cd255ccfSMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1126cd255ccfSMarko Kovacevic 			cipher_xform->key.length,
1127cd255ccfSMarko Kovacevic 			cipher_xform->iv.length) != 0) {
1128cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1129cd255ccfSMarko Kovacevic 				info.device_name, cipher_xform->key.length,
1130cd255ccfSMarko Kovacevic 				cipher_xform->iv.length);
1131cd255ccfSMarko Kovacevic 		return -EPERM;
1132cd255ccfSMarko Kovacevic 	}
1133cd255ccfSMarko Kovacevic 
1134cd255ccfSMarko Kovacevic 	return 0;
1135cd255ccfSMarko Kovacevic }
1136cd255ccfSMarko Kovacevic 
1137f64adb67SMarko Kovacevic static int
1138527cbf3dSMarko Kovacevic prepare_tdes_xform(struct rte_crypto_sym_xform *xform)
1139527cbf3dSMarko Kovacevic {
1140527cbf3dSMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1141527cbf3dSMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1142527cbf3dSMarko Kovacevic 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1143527cbf3dSMarko Kovacevic 
1144527cbf3dSMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1145527cbf3dSMarko Kovacevic 
1146efe3a8dbSMichael Shamis 	if (info.interim_info.tdes_data.test_mode == TDES_MODE_CBC)
1147527cbf3dSMarko Kovacevic 		cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_CBC;
1148efe3a8dbSMichael Shamis 	else
1149efe3a8dbSMichael Shamis 		cipher_xform->algo = RTE_CRYPTO_CIPHER_3DES_ECB;
1150527cbf3dSMarko Kovacevic 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1151527cbf3dSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1152527cbf3dSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1153527cbf3dSMarko Kovacevic 	cipher_xform->key.data = vec.cipher_auth.key.val;
1154527cbf3dSMarko Kovacevic 	cipher_xform->key.length = vec.cipher_auth.key.len;
1155efe3a8dbSMichael Shamis 
1156efe3a8dbSMichael Shamis 	if (cipher_xform->algo == RTE_CRYPTO_CIPHER_3DES_CBC) {
1157527cbf3dSMarko Kovacevic 		cipher_xform->iv.length = vec.iv.len;
1158527cbf3dSMarko Kovacevic 		cipher_xform->iv.offset = IV_OFF;
1159efe3a8dbSMichael Shamis 	} else {
1160efe3a8dbSMichael Shamis 		cipher_xform->iv.length = 0;
1161efe3a8dbSMichael Shamis 		cipher_xform->iv.offset = 0;
1162efe3a8dbSMichael Shamis 	}
1163efe3a8dbSMichael Shamis 	cap_idx.algo.cipher = cipher_xform->algo;
1164527cbf3dSMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1165527cbf3dSMarko Kovacevic 
1166527cbf3dSMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1167527cbf3dSMarko Kovacevic 	if (!cap) {
1168527cbf3dSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1169527cbf3dSMarko Kovacevic 				env.dev_id);
1170527cbf3dSMarko Kovacevic 		return -EINVAL;
1171527cbf3dSMarko Kovacevic 	}
1172527cbf3dSMarko Kovacevic 
1173527cbf3dSMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1174527cbf3dSMarko Kovacevic 			cipher_xform->key.length,
1175527cbf3dSMarko Kovacevic 			cipher_xform->iv.length) != 0) {
1176527cbf3dSMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1177527cbf3dSMarko Kovacevic 				info.device_name, cipher_xform->key.length,
1178527cbf3dSMarko Kovacevic 				cipher_xform->iv.length);
1179527cbf3dSMarko Kovacevic 		return -EPERM;
1180527cbf3dSMarko Kovacevic 	}
1181527cbf3dSMarko Kovacevic 
1182527cbf3dSMarko Kovacevic 	return 0;
1183527cbf3dSMarko Kovacevic }
1184527cbf3dSMarko Kovacevic 
1185527cbf3dSMarko Kovacevic static int
1186f64adb67SMarko Kovacevic prepare_hmac_xform(struct rte_crypto_sym_xform *xform)
1187f64adb67SMarko Kovacevic {
1188f64adb67SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1189f64adb67SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1190f64adb67SMarko Kovacevic 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1191f64adb67SMarko Kovacevic 
1192f64adb67SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1193f64adb67SMarko Kovacevic 
1194f64adb67SMarko Kovacevic 	auth_xform->algo = info.interim_info.hmac_data.algo;
1195f64adb67SMarko Kovacevic 	auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE;
1196f64adb67SMarko Kovacevic 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1197f64adb67SMarko Kovacevic 	auth_xform->key.data = vec.cipher_auth.key.val;
1198f64adb67SMarko Kovacevic 	auth_xform->key.length = vec.cipher_auth.key.len;
1199f64adb67SMarko Kovacevic 
1200f64adb67SMarko Kovacevic 	cap_idx.algo.auth = auth_xform->algo;
1201f64adb67SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1202f64adb67SMarko Kovacevic 
1203f64adb67SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1204f64adb67SMarko Kovacevic 	if (!cap) {
1205f64adb67SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1206f64adb67SMarko Kovacevic 				env.dev_id);
1207f64adb67SMarko Kovacevic 		return -EINVAL;
1208f64adb67SMarko Kovacevic 	}
1209f64adb67SMarko Kovacevic 
1210f64adb67SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_auth(cap,
1211f64adb67SMarko Kovacevic 			auth_xform->key.length,
1212f64adb67SMarko Kovacevic 			auth_xform->digest_length, 0) != 0) {
1213*8782b3b6SPablo de Lara 		RTE_LOG(ERR, USER1, "PMD %s key length %u Digest length %u\n",
1214f64adb67SMarko Kovacevic 				info.device_name, auth_xform->key.length,
1215f64adb67SMarko Kovacevic 				auth_xform->digest_length);
1216f64adb67SMarko Kovacevic 		return -EPERM;
1217f64adb67SMarko Kovacevic 	}
1218f64adb67SMarko Kovacevic 
1219f64adb67SMarko Kovacevic 	return 0;
1220f64adb67SMarko Kovacevic }
1221f64adb67SMarko Kovacevic 
1222d09abf2dSFan Zhang int
12234aaad299SMarko Kovacevic prepare_gcm_xform(struct rte_crypto_sym_xform *xform)
12244aaad299SMarko Kovacevic {
12254aaad299SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
12264aaad299SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
12274aaad299SMarko Kovacevic 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
12284aaad299SMarko Kovacevic 
12294aaad299SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
12304aaad299SMarko Kovacevic 
12314aaad299SMarko Kovacevic 	aead_xform->algo = RTE_CRYPTO_AEAD_AES_GCM;
12324aaad299SMarko Kovacevic 	aead_xform->aad_length = vec.aead.aad.len;
12334aaad299SMarko Kovacevic 	aead_xform->digest_length = vec.aead.digest.len;
12344aaad299SMarko Kovacevic 	aead_xform->iv.offset = IV_OFF;
12354aaad299SMarko Kovacevic 	aead_xform->iv.length = vec.iv.len;
12364aaad299SMarko Kovacevic 	aead_xform->key.data = vec.aead.key.val;
12374aaad299SMarko Kovacevic 	aead_xform->key.length = vec.aead.key.len;
12384aaad299SMarko Kovacevic 	aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
12394aaad299SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
12404aaad299SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_DECRYPT;
12414aaad299SMarko Kovacevic 
12424aaad299SMarko Kovacevic 	cap_idx.algo.aead = aead_xform->algo;
12434aaad299SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12444aaad299SMarko Kovacevic 
12454aaad299SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
12464aaad299SMarko Kovacevic 	if (!cap) {
12474aaad299SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
12484aaad299SMarko Kovacevic 				env.dev_id);
12494aaad299SMarko Kovacevic 		return -EINVAL;
12504aaad299SMarko Kovacevic 	}
12514aaad299SMarko Kovacevic 
12524aaad299SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_aead(cap,
12534aaad299SMarko Kovacevic 			aead_xform->key.length,
12544aaad299SMarko Kovacevic 			aead_xform->digest_length, aead_xform->aad_length,
12554aaad299SMarko Kovacevic 			aead_xform->iv.length) != 0) {
12564aaad299SMarko Kovacevic 		RTE_LOG(ERR, USER1,
12574aaad299SMarko Kovacevic 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
12584aaad299SMarko Kovacevic 				info.device_name, aead_xform->key.length,
12594aaad299SMarko Kovacevic 				aead_xform->digest_length,
12604aaad299SMarko Kovacevic 				aead_xform->aad_length,
12614aaad299SMarko Kovacevic 				aead_xform->iv.length);
12624aaad299SMarko Kovacevic 		return -EPERM;
12634aaad299SMarko Kovacevic 	}
12644aaad299SMarko Kovacevic 
12654aaad299SMarko Kovacevic 	return 0;
12664aaad299SMarko Kovacevic }
12674aaad299SMarko Kovacevic 
1268d09abf2dSFan Zhang int
1269d09abf2dSFan Zhang prepare_gmac_xform(struct rte_crypto_sym_xform *xform)
1270d09abf2dSFan Zhang {
1271d09abf2dSFan Zhang 	const struct rte_cryptodev_symmetric_capability *cap;
1272d09abf2dSFan Zhang 	struct rte_cryptodev_sym_capability_idx cap_idx;
1273d09abf2dSFan Zhang 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1274d09abf2dSFan Zhang 
1275d09abf2dSFan Zhang 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1276d09abf2dSFan Zhang 
1277d09abf2dSFan Zhang 	auth_xform->algo = RTE_CRYPTO_AUTH_AES_GMAC;
1278d09abf2dSFan Zhang 	auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1279d09abf2dSFan Zhang 			RTE_CRYPTO_AUTH_OP_GENERATE :
1280d09abf2dSFan Zhang 			RTE_CRYPTO_AUTH_OP_VERIFY;
1281d09abf2dSFan Zhang 	auth_xform->iv.offset = IV_OFF;
1282d09abf2dSFan Zhang 	auth_xform->iv.length = vec.iv.len;
1283d09abf2dSFan Zhang 	auth_xform->digest_length = vec.aead.digest.len;
1284d09abf2dSFan Zhang 	auth_xform->key.data = vec.aead.key.val;
1285d09abf2dSFan Zhang 	auth_xform->key.length = vec.aead.key.len;
1286d09abf2dSFan Zhang 
1287d09abf2dSFan Zhang 	cap_idx.algo.auth = auth_xform->algo;
1288d09abf2dSFan Zhang 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1289d09abf2dSFan Zhang 
1290d09abf2dSFan Zhang 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1291d09abf2dSFan Zhang 	if (!cap) {
1292d09abf2dSFan Zhang 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1293d09abf2dSFan Zhang 				env.dev_id);
1294d09abf2dSFan Zhang 		return -EINVAL;
1295d09abf2dSFan Zhang 	}
1296d09abf2dSFan Zhang 
1297d09abf2dSFan Zhang 	if (rte_cryptodev_sym_capability_check_auth(cap,
1298d09abf2dSFan Zhang 			auth_xform->key.length,
1299601b8a54SFan Zhang 			auth_xform->digest_length,
1300601b8a54SFan Zhang 			auth_xform->iv.length) != 0) {
1301601b8a54SFan Zhang 
1302601b8a54SFan Zhang 		RTE_LOG(ERR, USER1,
1303601b8a54SFan Zhang 			"PMD %s key length %u Digest length %u IV length %u\n",
1304d09abf2dSFan Zhang 				info.device_name, auth_xform->key.length,
1305601b8a54SFan Zhang 				auth_xform->digest_length,
1306601b8a54SFan Zhang 				auth_xform->iv.length);
1307d09abf2dSFan Zhang 		return -EPERM;
1308d09abf2dSFan Zhang 	}
1309d09abf2dSFan Zhang 
1310d09abf2dSFan Zhang 	return 0;
1311d09abf2dSFan Zhang }
1312d09abf2dSFan Zhang 
1313ac026f46SMarko Kovacevic static int
1314ac026f46SMarko Kovacevic prepare_cmac_xform(struct rte_crypto_sym_xform *xform)
1315ac026f46SMarko Kovacevic {
1316ac026f46SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1317ac026f46SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1318ac026f46SMarko Kovacevic 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1319ac026f46SMarko Kovacevic 
1320ac026f46SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1321ac026f46SMarko Kovacevic 
1322ac026f46SMarko Kovacevic 	auth_xform->algo = RTE_CRYPTO_AUTH_AES_CMAC;
1323ac026f46SMarko Kovacevic 	auth_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1324ac026f46SMarko Kovacevic 			RTE_CRYPTO_AUTH_OP_GENERATE : RTE_CRYPTO_AUTH_OP_VERIFY;
1325ac026f46SMarko Kovacevic 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1326ac026f46SMarko Kovacevic 	auth_xform->key.data = vec.cipher_auth.key.val;
1327ac026f46SMarko Kovacevic 	auth_xform->key.length = vec.cipher_auth.key.len;
1328ac026f46SMarko Kovacevic 
1329ac026f46SMarko Kovacevic 	cap_idx.algo.auth = auth_xform->algo;
1330ac026f46SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1331ac026f46SMarko Kovacevic 
1332ac026f46SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1333ac026f46SMarko Kovacevic 	if (!cap) {
1334ac026f46SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1335ac026f46SMarko Kovacevic 				env.dev_id);
1336ac026f46SMarko Kovacevic 		return -EINVAL;
1337ac026f46SMarko Kovacevic 	}
1338ac026f46SMarko Kovacevic 
1339ac026f46SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_auth(cap,
1340ac026f46SMarko Kovacevic 			auth_xform->key.length,
1341ac026f46SMarko Kovacevic 			auth_xform->digest_length, 0) != 0) {
1342*8782b3b6SPablo de Lara 		RTE_LOG(ERR, USER1, "PMD %s key length %u Digest length %u\n",
1343ac026f46SMarko Kovacevic 				info.device_name, auth_xform->key.length,
1344ac026f46SMarko Kovacevic 				auth_xform->digest_length);
1345ac026f46SMarko Kovacevic 		return -EPERM;
1346ac026f46SMarko Kovacevic 	}
1347ac026f46SMarko Kovacevic 
1348ac026f46SMarko Kovacevic 	return 0;
1349ac026f46SMarko Kovacevic }
1350ac026f46SMarko Kovacevic 
1351305921f4SMarko Kovacevic static int
1352305921f4SMarko Kovacevic prepare_ccm_xform(struct rte_crypto_sym_xform *xform)
1353305921f4SMarko Kovacevic {
1354305921f4SMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
1355305921f4SMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
1356305921f4SMarko Kovacevic 	struct rte_crypto_aead_xform *aead_xform = &xform->aead;
1357305921f4SMarko Kovacevic 
1358305921f4SMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
1359305921f4SMarko Kovacevic 
1360305921f4SMarko Kovacevic 	aead_xform->algo = RTE_CRYPTO_AEAD_AES_CCM;
1361305921f4SMarko Kovacevic 	aead_xform->aad_length = vec.aead.aad.len;
1362305921f4SMarko Kovacevic 	aead_xform->digest_length = vec.aead.digest.len;
1363305921f4SMarko Kovacevic 	aead_xform->iv.offset = IV_OFF;
1364305921f4SMarko Kovacevic 	aead_xform->iv.length = vec.iv.len;
1365305921f4SMarko Kovacevic 	aead_xform->key.data = vec.aead.key.val;
1366305921f4SMarko Kovacevic 	aead_xform->key.length = vec.aead.key.len;
1367305921f4SMarko Kovacevic 	aead_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1368305921f4SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_ENCRYPT :
1369305921f4SMarko Kovacevic 			RTE_CRYPTO_AEAD_OP_DECRYPT;
1370305921f4SMarko Kovacevic 
1371305921f4SMarko Kovacevic 	cap_idx.algo.aead = aead_xform->algo;
1372305921f4SMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
1373305921f4SMarko Kovacevic 
1374305921f4SMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1375305921f4SMarko Kovacevic 	if (!cap) {
1376305921f4SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1377305921f4SMarko Kovacevic 				env.dev_id);
1378305921f4SMarko Kovacevic 		return -EINVAL;
1379305921f4SMarko Kovacevic 	}
1380305921f4SMarko Kovacevic 
1381305921f4SMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_aead(cap,
1382305921f4SMarko Kovacevic 			aead_xform->key.length,
1383305921f4SMarko Kovacevic 			aead_xform->digest_length, aead_xform->aad_length,
1384305921f4SMarko Kovacevic 			aead_xform->iv.length) != 0) {
1385305921f4SMarko Kovacevic 		RTE_LOG(ERR, USER1,
1386305921f4SMarko Kovacevic 			"PMD %s key_len %u tag_len %u aad_len %u iv_len %u\n",
1387305921f4SMarko Kovacevic 				info.device_name, aead_xform->key.length,
1388305921f4SMarko Kovacevic 				aead_xform->digest_length,
1389305921f4SMarko Kovacevic 				aead_xform->aad_length,
1390305921f4SMarko Kovacevic 				aead_xform->iv.length);
1391305921f4SMarko Kovacevic 		return -EPERM;
1392305921f4SMarko Kovacevic 	}
1393305921f4SMarko Kovacevic 
1394305921f4SMarko Kovacevic 	return 0;
1395305921f4SMarko Kovacevic }
1396305921f4SMarko Kovacevic 
1397f4797baeSDamian Nowak static int
1398f4797baeSDamian Nowak prepare_sha_xform(struct rte_crypto_sym_xform *xform)
1399f4797baeSDamian Nowak {
1400f4797baeSDamian Nowak 	const struct rte_cryptodev_symmetric_capability *cap;
1401f4797baeSDamian Nowak 	struct rte_cryptodev_sym_capability_idx cap_idx;
1402f4797baeSDamian Nowak 	struct rte_crypto_auth_xform *auth_xform = &xform->auth;
1403f4797baeSDamian Nowak 
1404f4797baeSDamian Nowak 	xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
1405f4797baeSDamian Nowak 
1406f4797baeSDamian Nowak 	auth_xform->algo = info.interim_info.sha_data.algo;
1407f4797baeSDamian Nowak 	auth_xform->op = RTE_CRYPTO_AUTH_OP_GENERATE;
1408f4797baeSDamian Nowak 	auth_xform->digest_length = vec.cipher_auth.digest.len;
1409f4797baeSDamian Nowak 
1410f4797baeSDamian Nowak 	cap_idx.algo.auth = auth_xform->algo;
1411f4797baeSDamian Nowak 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1412f4797baeSDamian Nowak 
1413f4797baeSDamian Nowak 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1414f4797baeSDamian Nowak 	if (!cap) {
1415f4797baeSDamian Nowak 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1416f4797baeSDamian Nowak 				env.dev_id);
1417f4797baeSDamian Nowak 		return -EINVAL;
1418f4797baeSDamian Nowak 	}
1419f4797baeSDamian Nowak 
1420f4797baeSDamian Nowak 	if (rte_cryptodev_sym_capability_check_auth(cap,
1421f4797baeSDamian Nowak 			auth_xform->key.length,
1422f4797baeSDamian Nowak 			auth_xform->digest_length, 0) != 0) {
1423f4797baeSDamian Nowak 		RTE_LOG(ERR, USER1, "PMD %s key length %u digest length %u\n",
1424f4797baeSDamian Nowak 				info.device_name, auth_xform->key.length,
1425f4797baeSDamian Nowak 				auth_xform->digest_length);
1426f4797baeSDamian Nowak 		return -EPERM;
1427f4797baeSDamian Nowak 	}
1428f4797baeSDamian Nowak 
1429f4797baeSDamian Nowak 	return 0;
1430f4797baeSDamian Nowak }
1431f4797baeSDamian Nowak 
1432d5a9ea55SSucharitha Sarananaga static int
1433d5a9ea55SSucharitha Sarananaga prepare_xts_xform(struct rte_crypto_sym_xform *xform)
1434d5a9ea55SSucharitha Sarananaga {
1435d5a9ea55SSucharitha Sarananaga 	const struct rte_cryptodev_symmetric_capability *cap;
1436d5a9ea55SSucharitha Sarananaga 	struct rte_cryptodev_sym_capability_idx cap_idx;
1437d5a9ea55SSucharitha Sarananaga 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
1438d5a9ea55SSucharitha Sarananaga 
1439d5a9ea55SSucharitha Sarananaga 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1440d5a9ea55SSucharitha Sarananaga 
1441d5a9ea55SSucharitha Sarananaga 	cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_XTS;
1442d5a9ea55SSucharitha Sarananaga 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
1443d5a9ea55SSucharitha Sarananaga 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
1444d5a9ea55SSucharitha Sarananaga 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
1445d5a9ea55SSucharitha Sarananaga 	cipher_xform->key.data = vec.cipher_auth.key.val;
1446d5a9ea55SSucharitha Sarananaga 	cipher_xform->key.length = vec.cipher_auth.key.len;
1447d5a9ea55SSucharitha Sarananaga 	cipher_xform->iv.length = vec.iv.len;
1448d5a9ea55SSucharitha Sarananaga 	cipher_xform->iv.offset = IV_OFF;
1449d5a9ea55SSucharitha Sarananaga 
1450d5a9ea55SSucharitha Sarananaga 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_XTS;
1451d5a9ea55SSucharitha Sarananaga 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1452d5a9ea55SSucharitha Sarananaga 
1453d5a9ea55SSucharitha Sarananaga 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
1454d5a9ea55SSucharitha Sarananaga 	if (!cap) {
1455d5a9ea55SSucharitha Sarananaga 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1456d5a9ea55SSucharitha Sarananaga 				env.dev_id);
1457d5a9ea55SSucharitha Sarananaga 		return -EINVAL;
1458d5a9ea55SSucharitha Sarananaga 	}
1459d5a9ea55SSucharitha Sarananaga 
1460d5a9ea55SSucharitha Sarananaga 	if (rte_cryptodev_sym_capability_check_cipher(cap,
1461d5a9ea55SSucharitha Sarananaga 			cipher_xform->key.length,
1462d5a9ea55SSucharitha Sarananaga 			cipher_xform->iv.length) != 0) {
1463d5a9ea55SSucharitha Sarananaga 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
1464d5a9ea55SSucharitha Sarananaga 				info.device_name, cipher_xform->key.length,
1465d5a9ea55SSucharitha Sarananaga 				cipher_xform->iv.length);
1466d5a9ea55SSucharitha Sarananaga 		return -EPERM;
1467d5a9ea55SSucharitha Sarananaga 	}
1468d5a9ea55SSucharitha Sarananaga 
1469d5a9ea55SSucharitha Sarananaga 	return 0;
1470d5a9ea55SSucharitha Sarananaga }
1471d5a9ea55SSucharitha Sarananaga 
1472952e10cdSFan Zhang static int
147336128a67SGowrishankar Muthukrishnan prepare_rsa_xform(struct rte_crypto_asym_xform *xform)
147436128a67SGowrishankar Muthukrishnan {
147536128a67SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
147636128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
147736128a67SGowrishankar Muthukrishnan 	struct rte_cryptodev_info dev_info;
147836128a67SGowrishankar Muthukrishnan 
147936128a67SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_RSA;
148036128a67SGowrishankar Muthukrishnan 	xform->next = NULL;
148136128a67SGowrishankar Muthukrishnan 
148236128a67SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
148336128a67SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
148436128a67SGowrishankar Muthukrishnan 	if (!cap) {
148536128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
148636128a67SGowrishankar Muthukrishnan 				env.dev_id);
148736128a67SGowrishankar Muthukrishnan 		return -EINVAL;
148836128a67SGowrishankar Muthukrishnan 	}
148936128a67SGowrishankar Muthukrishnan 
149036128a67SGowrishankar Muthukrishnan 	switch (info.op) {
149136128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
149236128a67SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
149336128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
149436128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
149536128a67SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
149636128a67SGowrishankar Muthukrishnan 			return -EPERM;
149736128a67SGowrishankar Muthukrishnan 		}
149836128a67SGowrishankar Muthukrishnan 		break;
149936128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
150036128a67SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
150136128a67SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
150236128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
150336128a67SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
150436128a67SGowrishankar Muthukrishnan 			return -EPERM;
150536128a67SGowrishankar Muthukrishnan 		}
150636128a67SGowrishankar Muthukrishnan 		break;
150736128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_KEYGEN:
150836128a67SGowrishankar Muthukrishnan 		break;
150936128a67SGowrishankar Muthukrishnan 	default:
151036128a67SGowrishankar Muthukrishnan 		break;
151136128a67SGowrishankar Muthukrishnan 	}
151236128a67SGowrishankar Muthukrishnan 
151336128a67SGowrishankar Muthukrishnan 	rte_cryptodev_info_get(env.dev_id, &dev_info);
151436128a67SGowrishankar Muthukrishnan 	xform->rsa.key_type = info.interim_info.rsa_data.privkey;
151536128a67SGowrishankar Muthukrishnan 	switch (xform->rsa.key_type) {
151636128a67SGowrishankar Muthukrishnan 	case RTE_RSA_KEY_TYPE_QT:
151736128a67SGowrishankar Muthukrishnan 		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT)) {
151836128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s does not support QT key type\n",
151936128a67SGowrishankar Muthukrishnan 				info.device_name);
152036128a67SGowrishankar Muthukrishnan 			return -EPERM;
152136128a67SGowrishankar Muthukrishnan 		}
152236128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.p.data = vec.rsa.p.val;
152336128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.p.length = vec.rsa.p.len;
152436128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.q.data = vec.rsa.q.val;
152536128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.q.length = vec.rsa.q.len;
152636128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dP.data = vec.rsa.dp.val;
152736128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dP.length = vec.rsa.dp.len;
152836128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dQ.data = vec.rsa.dq.val;
152936128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.dQ.length = vec.rsa.dq.len;
153036128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.qInv.data = vec.rsa.qinv.val;
153136128a67SGowrishankar Muthukrishnan 		xform->rsa.qt.qInv.length = vec.rsa.qinv.len;
153236128a67SGowrishankar Muthukrishnan 		break;
153336128a67SGowrishankar Muthukrishnan 	case RTE_RSA_KEY_TYPE_EXP:
153436128a67SGowrishankar Muthukrishnan 		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_EXP)) {
153536128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s does not support EXP key type\n",
153636128a67SGowrishankar Muthukrishnan 				info.device_name);
153736128a67SGowrishankar Muthukrishnan 			return -EPERM;
153836128a67SGowrishankar Muthukrishnan 		}
153936128a67SGowrishankar Muthukrishnan 		xform->rsa.d.data = vec.rsa.d.val;
154036128a67SGowrishankar Muthukrishnan 		xform->rsa.d.length = vec.rsa.d.len;
154136128a67SGowrishankar Muthukrishnan 		break;
154236128a67SGowrishankar Muthukrishnan 	default:
154336128a67SGowrishankar Muthukrishnan 		break;
154436128a67SGowrishankar Muthukrishnan 	}
154536128a67SGowrishankar Muthukrishnan 
154636128a67SGowrishankar Muthukrishnan 	xform->rsa.e.data = vec.rsa.e.val;
154736128a67SGowrishankar Muthukrishnan 	xform->rsa.e.length = vec.rsa.e.len;
154836128a67SGowrishankar Muthukrishnan 	xform->rsa.n.data = vec.rsa.n.val;
154936128a67SGowrishankar Muthukrishnan 	xform->rsa.n.length = vec.rsa.n.len;
155036128a67SGowrishankar Muthukrishnan 	return 0;
155136128a67SGowrishankar Muthukrishnan }
155236128a67SGowrishankar Muthukrishnan 
155336128a67SGowrishankar Muthukrishnan static int
1554b455d261SGowrishankar Muthukrishnan prepare_ecdsa_xform(struct rte_crypto_asym_xform *xform)
1555b455d261SGowrishankar Muthukrishnan {
1556b455d261SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1557b455d261SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1558b455d261SGowrishankar Muthukrishnan 
1559b455d261SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECDSA;
1560b455d261SGowrishankar Muthukrishnan 	xform->next = NULL;
1561b455d261SGowrishankar Muthukrishnan 
1562b455d261SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1563b455d261SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1564b455d261SGowrishankar Muthukrishnan 	if (!cap) {
1565b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1566b455d261SGowrishankar Muthukrishnan 				env.dev_id);
1567b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1568b455d261SGowrishankar Muthukrishnan 	}
1569b455d261SGowrishankar Muthukrishnan 
1570b455d261SGowrishankar Muthukrishnan 	switch (info.op) {
1571b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGGEN:
1572b455d261SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1573b455d261SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_SIGN)) {
1574b455d261SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1575b455d261SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_SIGN);
1576b455d261SGowrishankar Muthukrishnan 			return -EPERM;
1577b455d261SGowrishankar Muthukrishnan 		}
1578b455d261SGowrishankar Muthukrishnan 		break;
1579b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ASYM_SIGVER:
1580b455d261SGowrishankar Muthukrishnan 		if (!rte_cryptodev_asym_xform_capability_check_optype(cap,
1581b455d261SGowrishankar Muthukrishnan 			RTE_CRYPTO_ASYM_OP_VERIFY)) {
1582b455d261SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "PMD %s xform_op %u\n",
1583b455d261SGowrishankar Muthukrishnan 				info.device_name, RTE_CRYPTO_ASYM_OP_VERIFY);
1584b455d261SGowrishankar Muthukrishnan 			return -EPERM;
1585b455d261SGowrishankar Muthukrishnan 		}
1586b455d261SGowrishankar Muthukrishnan 		break;
1587b455d261SGowrishankar Muthukrishnan 	default:
1588b455d261SGowrishankar Muthukrishnan 		break;
1589b455d261SGowrishankar Muthukrishnan 	}
1590b455d261SGowrishankar Muthukrishnan 
1591b455d261SGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id;
1592b455d261SGowrishankar Muthukrishnan 	return 0;
1593b455d261SGowrishankar Muthukrishnan }
1594b455d261SGowrishankar Muthukrishnan 
1595b455d261SGowrishankar Muthukrishnan static int
1596b455d261SGowrishankar Muthukrishnan prepare_ecfpm_xform(struct rte_crypto_asym_xform *xform)
1597b455d261SGowrishankar Muthukrishnan {
1598b455d261SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *cap;
1599b455d261SGowrishankar Muthukrishnan 	struct rte_cryptodev_asym_capability_idx cap_idx;
1600b455d261SGowrishankar Muthukrishnan 
1601b455d261SGowrishankar Muthukrishnan 	xform->xform_type = RTE_CRYPTO_ASYM_XFORM_ECFPM;
1602b455d261SGowrishankar Muthukrishnan 	xform->next = NULL;
1603b455d261SGowrishankar Muthukrishnan 
1604b455d261SGowrishankar Muthukrishnan 	cap_idx.type = xform->xform_type;
1605b455d261SGowrishankar Muthukrishnan 	cap = rte_cryptodev_asym_capability_get(env.dev_id, &cap_idx);
1606b455d261SGowrishankar Muthukrishnan 	if (!cap) {
1607b455d261SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
1608b455d261SGowrishankar Muthukrishnan 				env.dev_id);
1609b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
1610b455d261SGowrishankar Muthukrishnan 	}
1611b455d261SGowrishankar Muthukrishnan 
1612b455d261SGowrishankar Muthukrishnan 	xform->ec.curve_id = info.interim_info.ecdsa_data.curve_id;
1613b455d261SGowrishankar Muthukrishnan 	return 0;
1614b455d261SGowrishankar Muthukrishnan }
1615b455d261SGowrishankar Muthukrishnan 
1616b455d261SGowrishankar Muthukrishnan static int
1617cd255ccfSMarko Kovacevic get_writeback_data(struct fips_val *val)
1618cd255ccfSMarko Kovacevic {
1619952e10cdSFan Zhang 	struct rte_mbuf *m = env.mbuf;
1620952e10cdSFan Zhang 	uint16_t data_len = rte_pktmbuf_pkt_len(m);
1621952e10cdSFan Zhang 	uint16_t total_len = data_len + env.digest_len;
1622952e10cdSFan Zhang 	uint8_t *src, *dst, *wb_data;
1623952e10cdSFan Zhang 
1624952e10cdSFan Zhang 	/* in case val is reused for MCT test, try to free the buffer first */
1625952e10cdSFan Zhang 	if (val->val) {
1626952e10cdSFan Zhang 		free(val->val);
1627952e10cdSFan Zhang 		val->val = NULL;
1628952e10cdSFan Zhang 	}
1629952e10cdSFan Zhang 
1630952e10cdSFan Zhang 	wb_data = dst = calloc(1, total_len);
1631952e10cdSFan Zhang 	if (!dst) {
1632952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error %i: Not enough memory\n", -ENOMEM);
1633952e10cdSFan Zhang 		return -ENOMEM;
1634952e10cdSFan Zhang 	}
1635952e10cdSFan Zhang 
1636952e10cdSFan Zhang 	while (m && data_len) {
1637952e10cdSFan Zhang 		uint16_t seg_len = RTE_MIN(rte_pktmbuf_data_len(m), data_len);
1638952e10cdSFan Zhang 
1639952e10cdSFan Zhang 		src = rte_pktmbuf_mtod(m, uint8_t *);
1640952e10cdSFan Zhang 		memcpy(dst, src, seg_len);
1641952e10cdSFan Zhang 		m = m->next;
1642952e10cdSFan Zhang 		data_len -= seg_len;
1643952e10cdSFan Zhang 		dst += seg_len;
1644952e10cdSFan Zhang 	}
1645952e10cdSFan Zhang 
1646952e10cdSFan Zhang 	if (data_len) {
1647952e10cdSFan Zhang 		RTE_LOG(ERR, USER1, "Error -1: write back data\n");
1648bda9ce3cSCiara Power 		free(wb_data);
1649952e10cdSFan Zhang 		return -1;
1650952e10cdSFan Zhang 	}
1651952e10cdSFan Zhang 
1652952e10cdSFan Zhang 	if (env.digest)
1653952e10cdSFan Zhang 		memcpy(dst, env.digest, env.digest_len);
1654952e10cdSFan Zhang 
1655952e10cdSFan Zhang 	val->val = wb_data;
1656952e10cdSFan Zhang 	val->len = total_len;
1657952e10cdSFan Zhang 
1658952e10cdSFan Zhang 	return 0;
1659cd255ccfSMarko Kovacevic }
1660cd255ccfSMarko Kovacevic 
1661cd255ccfSMarko Kovacevic static int
166236128a67SGowrishankar Muthukrishnan fips_run_sym_test(void)
1663cd255ccfSMarko Kovacevic {
1664cd255ccfSMarko Kovacevic 	struct rte_crypto_sym_xform xform = {0};
1665cd255ccfSMarko Kovacevic 	uint16_t n_deqd;
1666cd255ccfSMarko Kovacevic 	int ret;
1667cd255ccfSMarko Kovacevic 
166836128a67SGowrishankar Muthukrishnan 	if (!test_ops.prepare_sym_xform || !test_ops.prepare_sym_op)
166936128a67SGowrishankar Muthukrishnan 		return -EINVAL;
167036128a67SGowrishankar Muthukrishnan 
167136128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_sym_xform(&xform);
1672cd255ccfSMarko Kovacevic 	if (ret < 0)
1673cd255ccfSMarko Kovacevic 		return ret;
1674cd255ccfSMarko Kovacevic 
167536128a67SGowrishankar Muthukrishnan 	env.sym.sess = rte_cryptodev_sym_session_create(env.dev_id, &xform,
167636128a67SGowrishankar Muthukrishnan 						env.sym.sess_mpool);
167736128a67SGowrishankar Muthukrishnan 	if (!env.sym.sess)
167836128a67SGowrishankar Muthukrishnan 		return -ENOMEM;
1679cd255ccfSMarko Kovacevic 
168036128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_sym_op();
1681cd255ccfSMarko Kovacevic 	if (ret < 0) {
1682cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Prepare op\n",
1683cd255ccfSMarko Kovacevic 				ret);
1684083a2777SMarko Kovacevic 		goto exit;
1685cd255ccfSMarko Kovacevic 	}
1686cd255ccfSMarko Kovacevic 
1687cd255ccfSMarko Kovacevic 	if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) {
1688cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error: Failed enqueue\n");
1689083a2777SMarko Kovacevic 		ret = -1;
1690083a2777SMarko Kovacevic 		goto exit;
1691cd255ccfSMarko Kovacevic 	}
1692cd255ccfSMarko Kovacevic 
1693cd255ccfSMarko Kovacevic 	do {
1694cd255ccfSMarko Kovacevic 		struct rte_crypto_op *deqd_op;
1695cd255ccfSMarko Kovacevic 
169636128a67SGowrishankar Muthukrishnan 		n_deqd = rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1);
1697cd255ccfSMarko Kovacevic 	} while (n_deqd == 0);
1698cd255ccfSMarko Kovacevic 
1699cd255ccfSMarko Kovacevic 	vec.status = env.op->status;
1700cd255ccfSMarko Kovacevic 
1701083a2777SMarko Kovacevic exit:
170236128a67SGowrishankar Muthukrishnan 	rte_cryptodev_sym_session_free(env.dev_id, env.sym.sess);
170336128a67SGowrishankar Muthukrishnan 	env.sym.sess = NULL;
170436128a67SGowrishankar Muthukrishnan 	return ret;
1705bdce2564SAkhil Goyal }
1706cd255ccfSMarko Kovacevic 
170736128a67SGowrishankar Muthukrishnan static int
170836128a67SGowrishankar Muthukrishnan fips_run_asym_test(void)
170936128a67SGowrishankar Muthukrishnan {
171036128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_xform xform = {0};
171136128a67SGowrishankar Muthukrishnan 	struct rte_crypto_asym_op *asym;
171236128a67SGowrishankar Muthukrishnan 	struct rte_crypto_op *deqd_op;
171336128a67SGowrishankar Muthukrishnan 	int ret;
171436128a67SGowrishankar Muthukrishnan 
1715b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_KEYGEN && info.algo != FIPS_TEST_ALGO_ECDSA) {
171636128a67SGowrishankar Muthukrishnan 		RTE_SET_USED(asym);
171736128a67SGowrishankar Muthukrishnan 		ret = 0;
171836128a67SGowrishankar Muthukrishnan 		goto exit;
171936128a67SGowrishankar Muthukrishnan 	}
172036128a67SGowrishankar Muthukrishnan 
172136128a67SGowrishankar Muthukrishnan 	if (!test_ops.prepare_asym_xform || !test_ops.prepare_asym_op)
172236128a67SGowrishankar Muthukrishnan 		return -EINVAL;
172336128a67SGowrishankar Muthukrishnan 
172436128a67SGowrishankar Muthukrishnan 	asym = env.op->asym;
172536128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_asym_xform(&xform);
172636128a67SGowrishankar Muthukrishnan 	if (ret < 0)
1727cd255ccfSMarko Kovacevic 		return ret;
172836128a67SGowrishankar Muthukrishnan 
172936128a67SGowrishankar Muthukrishnan 	ret = rte_cryptodev_asym_session_create(env.dev_id, &xform, env.asym.sess_mpool,
173036128a67SGowrishankar Muthukrishnan 			(void *)&env.asym.sess);
173136128a67SGowrishankar Muthukrishnan 	if (ret < 0)
173236128a67SGowrishankar Muthukrishnan 		return ret;
173336128a67SGowrishankar Muthukrishnan 
173436128a67SGowrishankar Muthukrishnan 	ret = test_ops.prepare_asym_op();
173536128a67SGowrishankar Muthukrishnan 	if (ret < 0) {
173636128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Error %i: Prepare op\n", ret);
173736128a67SGowrishankar Muthukrishnan 		goto exit;
173836128a67SGowrishankar Muthukrishnan 	}
173936128a67SGowrishankar Muthukrishnan 
174036128a67SGowrishankar Muthukrishnan 	if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) {
174136128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Error: Failed enqueue\n");
174236128a67SGowrishankar Muthukrishnan 		ret = -1;
174336128a67SGowrishankar Muthukrishnan 		goto exit;
174436128a67SGowrishankar Muthukrishnan 	}
174536128a67SGowrishankar Muthukrishnan 
174636128a67SGowrishankar Muthukrishnan 	while (rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op, 1) == 0)
174736128a67SGowrishankar Muthukrishnan 		rte_pause();
174836128a67SGowrishankar Muthukrishnan 
174936128a67SGowrishankar Muthukrishnan 	vec.status = env.op->status;
175036128a67SGowrishankar Muthukrishnan 
175136128a67SGowrishankar Muthukrishnan  exit:
175236128a67SGowrishankar Muthukrishnan 	if (env.asym.sess)
175336128a67SGowrishankar Muthukrishnan 		rte_cryptodev_asym_session_free(env.dev_id, env.asym.sess);
175436128a67SGowrishankar Muthukrishnan 
175536128a67SGowrishankar Muthukrishnan 	env.asym.sess = NULL;
175636128a67SGowrishankar Muthukrishnan 	return ret;
175736128a67SGowrishankar Muthukrishnan }
175836128a67SGowrishankar Muthukrishnan 
175936128a67SGowrishankar Muthukrishnan static int
176036128a67SGowrishankar Muthukrishnan fips_run_test(void)
176136128a67SGowrishankar Muthukrishnan {
176236128a67SGowrishankar Muthukrishnan 	int ret;
176336128a67SGowrishankar Muthukrishnan 
176436128a67SGowrishankar Muthukrishnan 	env.op = env.sym.op;
176536128a67SGowrishankar Muthukrishnan 	if (env.is_asym_test) {
176636128a67SGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = parse_test_sha_hash_size(
176736128a67SGowrishankar Muthukrishnan 						info.interim_info.rsa_data.auth);
176836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_sha_xform;
176936128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
177036128a67SGowrishankar Muthukrishnan 		ret = fips_run_sym_test();
177136128a67SGowrishankar Muthukrishnan 		if (ret < 0)
177236128a67SGowrishankar Muthukrishnan 			return ret;
177336128a67SGowrishankar Muthukrishnan 	} else {
177436128a67SGowrishankar Muthukrishnan 		return fips_run_sym_test();
177536128a67SGowrishankar Muthukrishnan 	}
177636128a67SGowrishankar Muthukrishnan 
177736128a67SGowrishankar Muthukrishnan 	env.op = env.asym.op;
1778b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN &&
1779b455d261SGowrishankar Muthukrishnan 		info.algo == FIPS_TEST_ALGO_ECDSA &&
1780b455d261SGowrishankar Muthukrishnan 		info.interim_info.ecdsa_data.pubkey_gen == 1) {
1781b455d261SGowrishankar Muthukrishnan 		fips_prepare_asym_xform_t ecdsa_xform;
1782b455d261SGowrishankar Muthukrishnan 		fips_prepare_op_t ecdsa_op;
1783b455d261SGowrishankar Muthukrishnan 
1784b455d261SGowrishankar Muthukrishnan 		ecdsa_xform = test_ops.prepare_asym_xform;
1785b455d261SGowrishankar Muthukrishnan 		ecdsa_op = test_ops.prepare_asym_op;
1786b455d261SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_KEYGEN;
1787b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = prepare_ecfpm_xform;
1788b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = prepare_ecfpm_op;
1789b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
1790b455d261SGowrishankar Muthukrishnan 		if (ret < 0)
1791b455d261SGowrishankar Muthukrishnan 			return ret;
1792b455d261SGowrishankar Muthukrishnan 
1793b455d261SGowrishankar Muthukrishnan 		info.post_interim_writeback(NULL);
1794b455d261SGowrishankar Muthukrishnan 		info.interim_info.ecdsa_data.pubkey_gen = 0;
1795b455d261SGowrishankar Muthukrishnan 
1796b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = ecdsa_xform;
1797b455d261SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = ecdsa_op;
1798b455d261SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_SIGGEN;
1799b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
1800b455d261SGowrishankar Muthukrishnan 	} else {
1801b455d261SGowrishankar Muthukrishnan 		ret = fips_run_asym_test();
1802b455d261SGowrishankar Muthukrishnan 	}
1803b455d261SGowrishankar Muthukrishnan 
1804b455d261SGowrishankar Muthukrishnan 	return ret;
1805cd255ccfSMarko Kovacevic }
1806cd255ccfSMarko Kovacevic 
1807cd255ccfSMarko Kovacevic static int
1808cd255ccfSMarko Kovacevic fips_generic_test(void)
1809cd255ccfSMarko Kovacevic {
1810952e10cdSFan Zhang 	struct fips_val val = {NULL, 0};
1811cd255ccfSMarko Kovacevic 	int ret;
1812cd255ccfSMarko Kovacevic 
181389be27e3SBrandon Lo 	if (info.file_type != FIPS_TYPE_JSON)
1814cd255ccfSMarko Kovacevic 		fips_test_write_one_case();
1815cd255ccfSMarko Kovacevic 
1816cd255ccfSMarko Kovacevic 	ret = fips_run_test();
1817cd255ccfSMarko Kovacevic 	if (ret < 0) {
18188a40ff39SArchana Muniganti 		if (ret == -EPERM || ret == -ENOTSUP) {
181989be27e3SBrandon Lo 			if (info.file_type == FIPS_TYPE_JSON)
182089be27e3SBrandon Lo 				return ret;
182189be27e3SBrandon Lo 
1822cd255ccfSMarko Kovacevic 			fprintf(info.fp_wr, "Bypass\n\n");
1823cd255ccfSMarko Kovacevic 			return 0;
1824cd255ccfSMarko Kovacevic 		}
1825cd255ccfSMarko Kovacevic 
1826cd255ccfSMarko Kovacevic 		return ret;
1827cd255ccfSMarko Kovacevic 	}
1828cd255ccfSMarko Kovacevic 
182936128a67SGowrishankar Muthukrishnan 	if (!env.is_asym_test) {
1830952e10cdSFan Zhang 		ret = get_writeback_data(&val);
1831952e10cdSFan Zhang 		if (ret < 0)
1832952e10cdSFan Zhang 			return ret;
183336128a67SGowrishankar Muthukrishnan 	}
1834cd255ccfSMarko Kovacevic 
1835cd255ccfSMarko Kovacevic 	switch (info.file_type) {
1836cd255ccfSMarko Kovacevic 	case FIPS_TYPE_REQ:
1837cd255ccfSMarko Kovacevic 	case FIPS_TYPE_RSP:
183889be27e3SBrandon Lo 	case FIPS_TYPE_JSON:
1839cd255ccfSMarko Kovacevic 		if (info.parse_writeback == NULL)
1840cd255ccfSMarko Kovacevic 			return -EPERM;
1841cd255ccfSMarko Kovacevic 		ret = info.parse_writeback(&val);
1842cd255ccfSMarko Kovacevic 		if (ret < 0)
1843cd255ccfSMarko Kovacevic 			return ret;
1844cd255ccfSMarko Kovacevic 		break;
1845cd255ccfSMarko Kovacevic 	case FIPS_TYPE_FAX:
1846cd255ccfSMarko Kovacevic 		if (info.kat_check == NULL)
1847cd255ccfSMarko Kovacevic 			return -EPERM;
1848cd255ccfSMarko Kovacevic 		ret = info.kat_check(&val);
1849cd255ccfSMarko Kovacevic 		if (ret < 0)
1850cd255ccfSMarko Kovacevic 			return ret;
1851cd255ccfSMarko Kovacevic 		break;
1852f556293fSBrandon Lo 	default:
1853f556293fSBrandon Lo 		break;
1854cd255ccfSMarko Kovacevic 	}
1855cd255ccfSMarko Kovacevic 
185689be27e3SBrandon Lo 	if (info.file_type != FIPS_TYPE_JSON)
1857cd255ccfSMarko Kovacevic 		fprintf(info.fp_wr, "\n");
1858952e10cdSFan Zhang 	free(val.val);
1859cd255ccfSMarko Kovacevic 
1860cd255ccfSMarko Kovacevic 	return 0;
1861cd255ccfSMarko Kovacevic }
1862cd255ccfSMarko Kovacevic 
1863cd255ccfSMarko Kovacevic static int
1864527cbf3dSMarko Kovacevic fips_mct_tdes_test(void)
1865527cbf3dSMarko Kovacevic {
1866527cbf3dSMarko Kovacevic #define TDES_BLOCK_SIZE		8
1867527cbf3dSMarko Kovacevic #define TDES_EXTERN_ITER	400
1868527cbf3dSMarko Kovacevic #define TDES_INTERN_ITER	10000
186964569ffaSGowrishankar Muthukrishnan 	struct fips_val val[3] = {{NULL, 0},}, val_key, pt, ct, iv;
18709252e81aSMarko Kovacevic 	uint8_t prev_out[TDES_BLOCK_SIZE] = {0};
18719252e81aSMarko Kovacevic 	uint8_t prev_prev_out[TDES_BLOCK_SIZE] = {0};
18729252e81aSMarko Kovacevic 	uint8_t prev_in[TDES_BLOCK_SIZE] = {0};
1873527cbf3dSMarko Kovacevic 	uint32_t i, j, k;
1874527cbf3dSMarko Kovacevic 	int ret;
1875ae65004fSMichael Shamis 	int test_mode = info.interim_info.tdes_data.test_mode;
1876527cbf3dSMarko Kovacevic 
187764569ffaSGowrishankar Muthukrishnan 	pt.len = vec.pt.len;
187864569ffaSGowrishankar Muthukrishnan 	pt.val = calloc(1, pt.len);
187964569ffaSGowrishankar Muthukrishnan 	ct.len = vec.ct.len;
188064569ffaSGowrishankar Muthukrishnan 	ct.val = calloc(1, ct.len);
188164569ffaSGowrishankar Muthukrishnan 	iv.len = vec.iv.len;
188264569ffaSGowrishankar Muthukrishnan 	iv.val = calloc(1, iv.len);
188364569ffaSGowrishankar Muthukrishnan 
1884527cbf3dSMarko Kovacevic 	for (i = 0; i < TDES_EXTERN_ITER; i++) {
188564569ffaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON) {
188679365018SArchana Muniganti 			if ((i == 0) && (info.version == 21.4f)) {
18872b84d2bdSArchana Muniganti 				if (!(strstr(info.vec[0], "COUNT")))
18882b84d2bdSArchana Muniganti 					fprintf(info.fp_wr, "%s%u\n", "COUNT = ", 0);
188979365018SArchana Muniganti 			}
189079365018SArchana Muniganti 
189179365018SArchana Muniganti 			if (i != 0)
1892527cbf3dSMarko Kovacevic 				update_info_vec(i);
1893527cbf3dSMarko Kovacevic 
1894527cbf3dSMarko Kovacevic 			fips_test_write_one_case();
189564569ffaSGowrishankar Muthukrishnan 		}
1896527cbf3dSMarko Kovacevic 
1897527cbf3dSMarko Kovacevic 		for (j = 0; j < TDES_INTERN_ITER; j++) {
1898527cbf3dSMarko Kovacevic 			ret = fips_run_test();
1899527cbf3dSMarko Kovacevic 			if (ret < 0) {
1900527cbf3dSMarko Kovacevic 				if (ret == -EPERM) {
190189be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
190289be27e3SBrandon Lo 						return ret;
190389be27e3SBrandon Lo 
1904527cbf3dSMarko Kovacevic 					fprintf(info.fp_wr, "Bypass\n");
1905527cbf3dSMarko Kovacevic 					return 0;
1906527cbf3dSMarko Kovacevic 				}
1907527cbf3dSMarko Kovacevic 				return ret;
1908527cbf3dSMarko Kovacevic 			}
1909527cbf3dSMarko Kovacevic 
191064569ffaSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
1911952e10cdSFan Zhang 			if (ret < 0)
1912952e10cdSFan Zhang 				return ret;
1913527cbf3dSMarko Kovacevic 
1914527cbf3dSMarko Kovacevic 			if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
1915527cbf3dSMarko Kovacevic 				memcpy(prev_in, vec.ct.val, TDES_BLOCK_SIZE);
1916527cbf3dSMarko Kovacevic 
1917527cbf3dSMarko Kovacevic 			if (j == 0) {
191864569ffaSGowrishankar Muthukrishnan 				memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE);
191964569ffaSGowrishankar Muthukrishnan 				memcpy(pt.val, vec.pt.val, pt.len);
192064569ffaSGowrishankar Muthukrishnan 				memcpy(ct.val, vec.ct.val, ct.len);
192164569ffaSGowrishankar Muthukrishnan 				memcpy(iv.val, vec.iv.val, iv.len);
1922527cbf3dSMarko Kovacevic 
1923527cbf3dSMarko Kovacevic 				if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
1924ae65004fSMichael Shamis 					if (test_mode == TDES_MODE_ECB) {
192564569ffaSGowrishankar Muthukrishnan 						memcpy(vec.pt.val, val[0].val,
1926ae65004fSMichael Shamis 							   TDES_BLOCK_SIZE);
1927ae65004fSMichael Shamis 					} else {
1928527cbf3dSMarko Kovacevic 						memcpy(vec.pt.val, vec.iv.val,
1929527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
193064569ffaSGowrishankar Muthukrishnan 						memcpy(vec.iv.val, val[0].val,
1931527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
1932ae65004fSMichael Shamis 					}
193364569ffaSGowrishankar Muthukrishnan 					val[1].val = pt.val;
193464569ffaSGowrishankar Muthukrishnan 					val[1].len = pt.len;
193564569ffaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
193664569ffaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
1937ae65004fSMichael Shamis 				} else {
1938ae65004fSMichael Shamis 					if (test_mode == TDES_MODE_ECB) {
193964569ffaSGowrishankar Muthukrishnan 						memcpy(vec.ct.val, val[0].val,
1940ae65004fSMichael Shamis 							   TDES_BLOCK_SIZE);
1941527cbf3dSMarko Kovacevic 					} else {
1942527cbf3dSMarko Kovacevic 						memcpy(vec.iv.val, vec.ct.val,
1943527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
194464569ffaSGowrishankar Muthukrishnan 						memcpy(vec.ct.val, val[0].val,
1945527cbf3dSMarko Kovacevic 							   TDES_BLOCK_SIZE);
1946527cbf3dSMarko Kovacevic 					}
194764569ffaSGowrishankar Muthukrishnan 					val[1].val = ct.val;
194864569ffaSGowrishankar Muthukrishnan 					val[1].len = ct.len;
194964569ffaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
195064569ffaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
1951ae65004fSMichael Shamis 				}
1952527cbf3dSMarko Kovacevic 				continue;
1953527cbf3dSMarko Kovacevic 			}
1954527cbf3dSMarko Kovacevic 
1955527cbf3dSMarko Kovacevic 			if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
1956ae65004fSMichael Shamis 				if (test_mode == TDES_MODE_ECB) {
195764569ffaSGowrishankar Muthukrishnan 					memcpy(vec.pt.val, val[0].val,
1958ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1959527cbf3dSMarko Kovacevic 				} else {
196064569ffaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, val[0].val,
1961ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1962ae65004fSMichael Shamis 					memcpy(vec.pt.val, prev_out,
1963ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1964ae65004fSMichael Shamis 				}
1965ae65004fSMichael Shamis 			} else {
1966ae65004fSMichael Shamis 				if (test_mode == TDES_MODE_ECB) {
196764569ffaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, val[0].val,
1968ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1969ae65004fSMichael Shamis 				} else {
1970ae65004fSMichael Shamis 					memcpy(vec.iv.val, vec.ct.val,
1971ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
197264569ffaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, val[0].val,
1973ae65004fSMichael Shamis 						   TDES_BLOCK_SIZE);
1974ae65004fSMichael Shamis 				}
1975527cbf3dSMarko Kovacevic 			}
1976527cbf3dSMarko Kovacevic 
1977527cbf3dSMarko Kovacevic 			if (j == TDES_INTERN_ITER - 1)
1978527cbf3dSMarko Kovacevic 				continue;
1979527cbf3dSMarko Kovacevic 
198064569ffaSGowrishankar Muthukrishnan 			memcpy(prev_out, val[0].val, TDES_BLOCK_SIZE);
1981527cbf3dSMarko Kovacevic 
1982527cbf3dSMarko Kovacevic 			if (j == TDES_INTERN_ITER - 3)
198364569ffaSGowrishankar Muthukrishnan 				memcpy(prev_prev_out, val[0].val, TDES_BLOCK_SIZE);
1984527cbf3dSMarko Kovacevic 		}
1985527cbf3dSMarko Kovacevic 
198664569ffaSGowrishankar Muthukrishnan 		info.parse_writeback(val);
198764569ffaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
1988527cbf3dSMarko Kovacevic 			fprintf(info.fp_wr, "\n");
1989527cbf3dSMarko Kovacevic 
1990527cbf3dSMarko Kovacevic 		if (i == TDES_EXTERN_ITER - 1)
1991527cbf3dSMarko Kovacevic 			continue;
1992527cbf3dSMarko Kovacevic 
1993527cbf3dSMarko Kovacevic 		/** update key */
1994527cbf3dSMarko Kovacevic 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
1995527cbf3dSMarko Kovacevic 
1996527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.nb_keys == 0) {
1997527cbf3dSMarko Kovacevic 			if (memcmp(val_key.val, val_key.val + 8, 8) == 0)
1998527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 1;
1999527cbf3dSMarko Kovacevic 			else if (memcmp(val_key.val, val_key.val + 16, 8) == 0)
2000527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 2;
2001527cbf3dSMarko Kovacevic 			else
2002527cbf3dSMarko Kovacevic 				info.interim_info.tdes_data.nb_keys = 3;
2003527cbf3dSMarko Kovacevic 
2004527cbf3dSMarko Kovacevic 		}
2005527cbf3dSMarko Kovacevic 
2006527cbf3dSMarko Kovacevic 		for (k = 0; k < TDES_BLOCK_SIZE; k++) {
2007527cbf3dSMarko Kovacevic 
2008527cbf3dSMarko Kovacevic 			switch (info.interim_info.tdes_data.nb_keys) {
2009527cbf3dSMarko Kovacevic 			case 3:
201064569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2011527cbf3dSMarko Kovacevic 				val_key.val[k + 8] ^= prev_out[k];
2012527cbf3dSMarko Kovacevic 				val_key.val[k + 16] ^= prev_prev_out[k];
2013527cbf3dSMarko Kovacevic 				break;
2014527cbf3dSMarko Kovacevic 			case 2:
201564569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2016527cbf3dSMarko Kovacevic 				val_key.val[k + 8] ^= prev_out[k];
201764569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 16] ^= val[0].val[k];
2018527cbf3dSMarko Kovacevic 				break;
2019527cbf3dSMarko Kovacevic 			default: /* case 1 */
202064569ffaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
202164569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 8] ^= val[0].val[k];
202264569ffaSGowrishankar Muthukrishnan 				val_key.val[k + 16] ^= val[0].val[k];
2023527cbf3dSMarko Kovacevic 				break;
2024527cbf3dSMarko Kovacevic 			}
2025527cbf3dSMarko Kovacevic 
2026527cbf3dSMarko Kovacevic 		}
2027527cbf3dSMarko Kovacevic 
2028527cbf3dSMarko Kovacevic 		for (k = 0; k < 24; k++)
2029527cbf3dSMarko Kovacevic 			val_key.val[k] = (__builtin_popcount(val_key.val[k]) &
2030527cbf3dSMarko Kovacevic 					0x1) ?
2031527cbf3dSMarko Kovacevic 					val_key.val[k] : (val_key.val[k] ^ 0x1);
2032527cbf3dSMarko Kovacevic 
2033527cbf3dSMarko Kovacevic 		if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
2034ae65004fSMichael Shamis 			if (test_mode == TDES_MODE_ECB) {
203564569ffaSGowrishankar Muthukrishnan 				memcpy(vec.pt.val, val[0].val, TDES_BLOCK_SIZE);
2036ae65004fSMichael Shamis 			} else {
203764569ffaSGowrishankar Muthukrishnan 				memcpy(vec.iv.val, val[0].val, TDES_BLOCK_SIZE);
2038527cbf3dSMarko Kovacevic 				memcpy(vec.pt.val, prev_out, TDES_BLOCK_SIZE);
2039ae65004fSMichael Shamis 			}
2040ae65004fSMichael Shamis 		} else {
2041ae65004fSMichael Shamis 			if (test_mode == TDES_MODE_ECB) {
204264569ffaSGowrishankar Muthukrishnan 				memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE);
2043527cbf3dSMarko Kovacevic 			} else {
2044527cbf3dSMarko Kovacevic 				memcpy(vec.iv.val, prev_out, TDES_BLOCK_SIZE);
204564569ffaSGowrishankar Muthukrishnan 				memcpy(vec.ct.val, val[0].val, TDES_BLOCK_SIZE);
2046527cbf3dSMarko Kovacevic 			}
2047527cbf3dSMarko Kovacevic 		}
2048ae65004fSMichael Shamis 	}
2049527cbf3dSMarko Kovacevic 
205064569ffaSGowrishankar Muthukrishnan 	free(val[0].val);
205164569ffaSGowrishankar Muthukrishnan 	free(pt.val);
205264569ffaSGowrishankar Muthukrishnan 	free(ct.val);
205364569ffaSGowrishankar Muthukrishnan 	free(iv.val);
2054952e10cdSFan Zhang 
2055527cbf3dSMarko Kovacevic 	return 0;
2056527cbf3dSMarko Kovacevic }
2057527cbf3dSMarko Kovacevic 
2058527cbf3dSMarko Kovacevic static int
2059d3190431SMichael Shamis fips_mct_aes_ecb_test(void)
2060d3190431SMichael Shamis {
2061d3190431SMichael Shamis #define AES_BLOCK_SIZE	16
2062d3190431SMichael Shamis #define AES_EXTERN_ITER	100
2063d3190431SMichael Shamis #define AES_INTERN_ITER	1000
2064952e10cdSFan Zhang 	struct fips_val val = {NULL, 0}, val_key;
2065d3190431SMichael Shamis 	uint8_t prev_out[AES_BLOCK_SIZE] = {0};
2066d3190431SMichael Shamis 	uint32_t i, j, k;
2067d3190431SMichael Shamis 	int ret;
2068d3190431SMichael Shamis 
2069d3190431SMichael Shamis 	for (i = 0; i < AES_EXTERN_ITER; i++) {
2070d3190431SMichael Shamis 		if (i != 0)
2071d3190431SMichael Shamis 			update_info_vec(i);
2072d3190431SMichael Shamis 
2073d3190431SMichael Shamis 		fips_test_write_one_case();
2074d3190431SMichael Shamis 
2075d3190431SMichael Shamis 		for (j = 0; j < AES_INTERN_ITER; j++) {
2076d3190431SMichael Shamis 			ret = fips_run_test();
2077d3190431SMichael Shamis 			if (ret < 0) {
2078d3190431SMichael Shamis 				if (ret == -EPERM) {
207989be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
208089be27e3SBrandon Lo 						return ret;
208189be27e3SBrandon Lo 
2082d3190431SMichael Shamis 					fprintf(info.fp_wr, "Bypass\n");
2083d3190431SMichael Shamis 					return 0;
2084d3190431SMichael Shamis 				}
2085d3190431SMichael Shamis 
2086d3190431SMichael Shamis 				return ret;
2087d3190431SMichael Shamis 			}
2088d3190431SMichael Shamis 
2089952e10cdSFan Zhang 			ret = get_writeback_data(&val);
2090952e10cdSFan Zhang 			if (ret < 0)
2091952e10cdSFan Zhang 				return ret;
2092d3190431SMichael Shamis 
2093d3190431SMichael Shamis 			if (info.op == FIPS_TEST_ENC_AUTH_GEN)
2094d3190431SMichael Shamis 				memcpy(vec.pt.val, val.val, AES_BLOCK_SIZE);
2095d3190431SMichael Shamis 			else
2096d3190431SMichael Shamis 				memcpy(vec.ct.val, val.val, AES_BLOCK_SIZE);
2097d3190431SMichael Shamis 
2098d3190431SMichael Shamis 			if (j == AES_INTERN_ITER - 1)
2099d3190431SMichael Shamis 				continue;
2100d3190431SMichael Shamis 
2101d3190431SMichael Shamis 			memcpy(prev_out, val.val, AES_BLOCK_SIZE);
2102d3190431SMichael Shamis 		}
2103d3190431SMichael Shamis 
2104d3190431SMichael Shamis 		info.parse_writeback(&val);
2105d3190431SMichael Shamis 		fprintf(info.fp_wr, "\n");
2106d3190431SMichael Shamis 
2107d3190431SMichael Shamis 		if (i == AES_EXTERN_ITER - 1)
2108d3190431SMichael Shamis 			continue;
2109d3190431SMichael Shamis 
2110d3190431SMichael Shamis 		/** update key */
2111d3190431SMichael Shamis 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2112d3190431SMichael Shamis 		for (k = 0; k < vec.cipher_auth.key.len; k++) {
2113d3190431SMichael Shamis 			switch (vec.cipher_auth.key.len) {
2114d3190431SMichael Shamis 			case 16:
2115d3190431SMichael Shamis 				val_key.val[k] ^= val.val[k];
2116d3190431SMichael Shamis 				break;
2117d3190431SMichael Shamis 			case 24:
2118d3190431SMichael Shamis 				if (k < 8)
2119d3190431SMichael Shamis 					val_key.val[k] ^= prev_out[k + 8];
2120d3190431SMichael Shamis 				else
2121d3190431SMichael Shamis 					val_key.val[k] ^= val.val[k - 8];
2122d3190431SMichael Shamis 				break;
2123d3190431SMichael Shamis 			case 32:
2124d3190431SMichael Shamis 				if (k < 16)
2125d3190431SMichael Shamis 					val_key.val[k] ^= prev_out[k];
2126d3190431SMichael Shamis 				else
2127d3190431SMichael Shamis 					val_key.val[k] ^= val.val[k - 16];
2128d3190431SMichael Shamis 				break;
2129d3190431SMichael Shamis 			default:
2130d3190431SMichael Shamis 				return -1;
2131d3190431SMichael Shamis 			}
2132d3190431SMichael Shamis 		}
2133d3190431SMichael Shamis 	}
2134d3190431SMichael Shamis 
2135952e10cdSFan Zhang 	free(val.val);
2136952e10cdSFan Zhang 
2137d3190431SMichael Shamis 	return 0;
2138d3190431SMichael Shamis }
2139d3190431SMichael Shamis static int
2140cd255ccfSMarko Kovacevic fips_mct_aes_test(void)
2141cd255ccfSMarko Kovacevic {
2142cd255ccfSMarko Kovacevic #define AES_BLOCK_SIZE	16
2143cd255ccfSMarko Kovacevic #define AES_EXTERN_ITER	100
2144cd255ccfSMarko Kovacevic #define AES_INTERN_ITER	1000
21458b8546aaSGowrishankar Muthukrishnan 	struct fips_val val[3] = {{NULL, 0},}, val_key,  pt, ct, iv;
2146cd255ccfSMarko Kovacevic 	uint8_t prev_out[AES_BLOCK_SIZE] = {0};
2147cd255ccfSMarko Kovacevic 	uint8_t prev_in[AES_BLOCK_SIZE] = {0};
2148cd255ccfSMarko Kovacevic 	uint32_t i, j, k;
2149cd255ccfSMarko Kovacevic 	int ret;
2150cd255ccfSMarko Kovacevic 
2151d3190431SMichael Shamis 	if (info.interim_info.aes_data.cipher_algo == RTE_CRYPTO_CIPHER_AES_ECB)
2152d3190431SMichael Shamis 		return fips_mct_aes_ecb_test();
2153d3190431SMichael Shamis 
2154e9ec7f61SGowrishankar Muthukrishnan 	pt.len = vec.pt.len;
2155e9ec7f61SGowrishankar Muthukrishnan 	pt.val = calloc(1, pt.len);
2156e9ec7f61SGowrishankar Muthukrishnan 	ct.len = vec.ct.len;
2157e9ec7f61SGowrishankar Muthukrishnan 	ct.val = calloc(1, ct.len);
2158e9ec7f61SGowrishankar Muthukrishnan 	iv.len = vec.iv.len;
2159e9ec7f61SGowrishankar Muthukrishnan 	iv.val = calloc(1, iv.len);
2160cd255ccfSMarko Kovacevic 	for (i = 0; i < AES_EXTERN_ITER; i++) {
21618b8546aaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON) {
2162cd255ccfSMarko Kovacevic 			if (i != 0)
2163cd255ccfSMarko Kovacevic 				update_info_vec(i);
2164cd255ccfSMarko Kovacevic 
2165cd255ccfSMarko Kovacevic 			fips_test_write_one_case();
21668b8546aaSGowrishankar Muthukrishnan 		}
2167cd255ccfSMarko Kovacevic 
2168cd255ccfSMarko Kovacevic 		for (j = 0; j < AES_INTERN_ITER; j++) {
2169cd255ccfSMarko Kovacevic 			ret = fips_run_test();
2170cd255ccfSMarko Kovacevic 			if (ret < 0) {
2171cd255ccfSMarko Kovacevic 				if (ret == -EPERM) {
217289be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
217389be27e3SBrandon Lo 						return ret;
217489be27e3SBrandon Lo 
2175cd255ccfSMarko Kovacevic 					fprintf(info.fp_wr, "Bypass\n");
2176cd255ccfSMarko Kovacevic 					return 0;
2177cd255ccfSMarko Kovacevic 				}
2178cd255ccfSMarko Kovacevic 
2179cd255ccfSMarko Kovacevic 				return ret;
2180cd255ccfSMarko Kovacevic 			}
2181cd255ccfSMarko Kovacevic 
21828b8546aaSGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
2183afda6b01SCiara Power 			if (ret < 0)
2184afda6b01SCiara Power 				return ret;
2185cd255ccfSMarko Kovacevic 
2186cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
2187cd255ccfSMarko Kovacevic 				memcpy(prev_in, vec.ct.val, AES_BLOCK_SIZE);
2188cd255ccfSMarko Kovacevic 
2189cd255ccfSMarko Kovacevic 			if (j == 0) {
21908b8546aaSGowrishankar Muthukrishnan 				memcpy(prev_out, val[0].val, AES_BLOCK_SIZE);
21918b8546aaSGowrishankar Muthukrishnan 				memcpy(pt.val, vec.pt.val, pt.len);
21928b8546aaSGowrishankar Muthukrishnan 				memcpy(ct.val, vec.ct.val, ct.len);
21938b8546aaSGowrishankar Muthukrishnan 				memcpy(iv.val, vec.iv.val, iv.len);
2194cd255ccfSMarko Kovacevic 
2195cd255ccfSMarko Kovacevic 				if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
21968b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.pt.val, vec.iv.val, AES_BLOCK_SIZE);
21978b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
21988b8546aaSGowrishankar Muthukrishnan 					val[1].val = pt.val;
21998b8546aaSGowrishankar Muthukrishnan 					val[1].len = pt.len;
22008b8546aaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
22018b8546aaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2202cd255ccfSMarko Kovacevic 				} else {
22038b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.ct.val, vec.iv.val, AES_BLOCK_SIZE);
22048b8546aaSGowrishankar Muthukrishnan 					memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE);
22058b8546aaSGowrishankar Muthukrishnan 					val[1].val = ct.val;
22068b8546aaSGowrishankar Muthukrishnan 					val[1].len = ct.len;
22078b8546aaSGowrishankar Muthukrishnan 					val[2].val = iv.val;
22088b8546aaSGowrishankar Muthukrishnan 					val[2].len = iv.len;
2209cd255ccfSMarko Kovacevic 				}
2210cd255ccfSMarko Kovacevic 				continue;
2211cd255ccfSMarko Kovacevic 			}
2212cd255ccfSMarko Kovacevic 
2213cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
22148b8546aaSGowrishankar Muthukrishnan 				memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
2215cd255ccfSMarko Kovacevic 				memcpy(vec.pt.val, prev_out, AES_BLOCK_SIZE);
2216cd255ccfSMarko Kovacevic 			} else {
2217cd255ccfSMarko Kovacevic 				memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE);
2218cd255ccfSMarko Kovacevic 				memcpy(vec.ct.val, prev_out, AES_BLOCK_SIZE);
2219cd255ccfSMarko Kovacevic 			}
2220cd255ccfSMarko Kovacevic 
2221cd255ccfSMarko Kovacevic 			if (j == AES_INTERN_ITER - 1)
2222cd255ccfSMarko Kovacevic 				continue;
2223cd255ccfSMarko Kovacevic 
22248b8546aaSGowrishankar Muthukrishnan 			memcpy(prev_out, val[0].val, AES_BLOCK_SIZE);
2225cd255ccfSMarko Kovacevic 		}
2226cd255ccfSMarko Kovacevic 
22278b8546aaSGowrishankar Muthukrishnan 		info.parse_writeback(val);
22288b8546aaSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2229cd255ccfSMarko Kovacevic 			fprintf(info.fp_wr, "\n");
2230cd255ccfSMarko Kovacevic 
2231e9ec7f61SGowrishankar Muthukrishnan 		if (i == AES_EXTERN_ITER - 1)
2232cd255ccfSMarko Kovacevic 			continue;
2233cd255ccfSMarko Kovacevic 
2234cd255ccfSMarko Kovacevic 		/** update key */
2235cd255ccfSMarko Kovacevic 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
2236cd255ccfSMarko Kovacevic 		for (k = 0; k < vec.cipher_auth.key.len; k++) {
2237cd255ccfSMarko Kovacevic 			switch (vec.cipher_auth.key.len) {
2238cd255ccfSMarko Kovacevic 			case 16:
22398b8546aaSGowrishankar Muthukrishnan 				val_key.val[k] ^= val[0].val[k];
2240cd255ccfSMarko Kovacevic 				break;
2241cd255ccfSMarko Kovacevic 			case 24:
2242cd255ccfSMarko Kovacevic 				if (k < 8)
2243cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k + 8];
2244cd255ccfSMarko Kovacevic 				else
22458b8546aaSGowrishankar Muthukrishnan 					val_key.val[k] ^= val[0].val[k - 8];
2246cd255ccfSMarko Kovacevic 				break;
2247cd255ccfSMarko Kovacevic 			case 32:
2248cd255ccfSMarko Kovacevic 				if (k < 16)
2249cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k];
2250cd255ccfSMarko Kovacevic 				else
22518b8546aaSGowrishankar Muthukrishnan 					val_key.val[k] ^= val[0].val[k - 16];
2252cd255ccfSMarko Kovacevic 				break;
2253cd255ccfSMarko Kovacevic 			default:
2254cd255ccfSMarko Kovacevic 				return -1;
2255cd255ccfSMarko Kovacevic 			}
2256cd255ccfSMarko Kovacevic 		}
2257cd255ccfSMarko Kovacevic 
2258cd255ccfSMarko Kovacevic 		if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
22598b8546aaSGowrishankar Muthukrishnan 			memcpy(vec.iv.val, val[0].val, AES_BLOCK_SIZE);
2260cd255ccfSMarko Kovacevic 	}
2261cd255ccfSMarko Kovacevic 
22628b8546aaSGowrishankar Muthukrishnan 	free(val[0].val);
2263e9ec7f61SGowrishankar Muthukrishnan 	free(pt.val);
2264e9ec7f61SGowrishankar Muthukrishnan 	free(ct.val);
2265e9ec7f61SGowrishankar Muthukrishnan 	free(iv.val);
2266952e10cdSFan Zhang 
2267cd255ccfSMarko Kovacevic 	return 0;
2268cd255ccfSMarko Kovacevic }
2269cd255ccfSMarko Kovacevic 
2270cd255ccfSMarko Kovacevic static int
2271f4797baeSDamian Nowak fips_mct_sha_test(void)
2272f4797baeSDamian Nowak {
2273f4797baeSDamian Nowak #define SHA_EXTERN_ITER	100
2274f4797baeSDamian Nowak #define SHA_INTERN_ITER	1000
2275f4797baeSDamian Nowak #define SHA_MD_BLOCK	3
2276d5c24714SGowrishankar Muthukrishnan 	/* val[0] is op result and other value is for parse_writeback callback */
2277d5c24714SGowrishankar Muthukrishnan 	struct fips_val val[2] = {{NULL, 0},};
2278d5c24714SGowrishankar Muthukrishnan 	struct fips_val  md[SHA_MD_BLOCK], msg;
2279f4797baeSDamian Nowak 	int ret;
2280f4797baeSDamian Nowak 	uint32_t i, j;
2281f4797baeSDamian Nowak 
2282d5c24714SGowrishankar Muthukrishnan 	msg.len = SHA_MD_BLOCK * vec.cipher_auth.digest.len;
2283d5c24714SGowrishankar Muthukrishnan 	msg.val = calloc(1, msg.len);
2284ce7ced4eSGowrishankar Muthukrishnan 	if (vec.pt.val)
2285d5c24714SGowrishankar Muthukrishnan 		memcpy(vec.cipher_auth.digest.val, vec.pt.val, vec.cipher_auth.digest.len);
2286ce7ced4eSGowrishankar Muthukrishnan 
2287f4797baeSDamian Nowak 	for (i = 0; i < SHA_MD_BLOCK; i++)
2288f4797baeSDamian Nowak 		md[i].val = rte_malloc(NULL, (MAX_DIGEST_SIZE*2), 0);
2289f4797baeSDamian Nowak 
2290f4797baeSDamian Nowak 	rte_free(vec.pt.val);
2291f4797baeSDamian Nowak 	vec.pt.val = rte_malloc(NULL, (MAX_DIGEST_SIZE*SHA_MD_BLOCK), 0);
2292f4797baeSDamian Nowak 
2293d5c24714SGowrishankar Muthukrishnan 	if (info.file_type != FIPS_TYPE_JSON) {
2294f4797baeSDamian Nowak 		fips_test_write_one_case();
2295f4797baeSDamian Nowak 		fprintf(info.fp_wr, "\n");
2296d5c24714SGowrishankar Muthukrishnan 	}
2297f4797baeSDamian Nowak 
2298f4797baeSDamian Nowak 	for (j = 0; j < SHA_EXTERN_ITER; j++) {
2299f4797baeSDamian Nowak 
2300f4797baeSDamian Nowak 		memcpy(md[0].val, vec.cipher_auth.digest.val,
2301f4797baeSDamian Nowak 			vec.cipher_auth.digest.len);
2302f4797baeSDamian Nowak 		md[0].len = vec.cipher_auth.digest.len;
2303f4797baeSDamian Nowak 		memcpy(md[1].val, vec.cipher_auth.digest.val,
2304f4797baeSDamian Nowak 			vec.cipher_auth.digest.len);
2305f4797baeSDamian Nowak 		md[1].len = vec.cipher_auth.digest.len;
2306f4797baeSDamian Nowak 		memcpy(md[2].val, vec.cipher_auth.digest.val,
2307f4797baeSDamian Nowak 			vec.cipher_auth.digest.len);
2308f4797baeSDamian Nowak 		md[2].len = vec.cipher_auth.digest.len;
2309f4797baeSDamian Nowak 
2310d5c24714SGowrishankar Muthukrishnan 		for (i = 0; i < SHA_MD_BLOCK; i++)
2311d5c24714SGowrishankar Muthukrishnan 			memcpy(&msg.val[i * md[i].len], md[i].val, md[i].len);
2312d5c24714SGowrishankar Muthukrishnan 
2313f4797baeSDamian Nowak 		for (i = 0; i < (SHA_INTERN_ITER); i++) {
2314f4797baeSDamian Nowak 
2315f4797baeSDamian Nowak 			memcpy(vec.pt.val, md[0].val,
2316f4797baeSDamian Nowak 				(size_t)md[0].len);
2317f4797baeSDamian Nowak 			memcpy((vec.pt.val + md[0].len), md[1].val,
2318f4797baeSDamian Nowak 				(size_t)md[1].len);
2319f4797baeSDamian Nowak 			memcpy((vec.pt.val + md[0].len + md[1].len),
2320f4797baeSDamian Nowak 				md[2].val,
2321f4797baeSDamian Nowak 				(size_t)md[2].len);
2322f4797baeSDamian Nowak 			vec.pt.len = md[0].len + md[1].len + md[2].len;
2323f4797baeSDamian Nowak 
2324f4797baeSDamian Nowak 			ret = fips_run_test();
2325f4797baeSDamian Nowak 			if (ret < 0) {
23268a40ff39SArchana Muniganti 				if (ret == -EPERM || ret == -ENOTSUP) {
232789be27e3SBrandon Lo 					if (info.file_type == FIPS_TYPE_JSON)
232889be27e3SBrandon Lo 						return ret;
232989be27e3SBrandon Lo 
2330f4797baeSDamian Nowak 					fprintf(info.fp_wr, "Bypass\n\n");
2331f4797baeSDamian Nowak 					return 0;
2332f4797baeSDamian Nowak 				}
2333f4797baeSDamian Nowak 				return ret;
2334f4797baeSDamian Nowak 			}
2335f4797baeSDamian Nowak 
2336d5c24714SGowrishankar Muthukrishnan 			ret = get_writeback_data(&val[0]);
2337afda6b01SCiara Power 			if (ret < 0)
2338afda6b01SCiara Power 				return ret;
2339f4797baeSDamian Nowak 
2340f4797baeSDamian Nowak 			memcpy(md[0].val, md[1].val, md[1].len);
2341f4797baeSDamian Nowak 			md[0].len = md[1].len;
2342f4797baeSDamian Nowak 			memcpy(md[1].val, md[2].val, md[2].len);
2343f4797baeSDamian Nowak 			md[1].len = md[2].len;
2344f4797baeSDamian Nowak 
2345d5c24714SGowrishankar Muthukrishnan 			memcpy(md[2].val, (val[0].val + vec.pt.len),
2346f4797baeSDamian Nowak 				vec.cipher_auth.digest.len);
2347f4797baeSDamian Nowak 			md[2].len = vec.cipher_auth.digest.len;
2348f4797baeSDamian Nowak 		}
2349f4797baeSDamian Nowak 
2350f4797baeSDamian Nowak 		memcpy(vec.cipher_auth.digest.val, md[2].val, md[2].len);
2351f4797baeSDamian Nowak 		vec.cipher_auth.digest.len = md[2].len;
2352f4797baeSDamian Nowak 
2353ce7ced4eSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2354f4797baeSDamian Nowak 			fprintf(info.fp_wr, "COUNT = %u\n", j);
2355ce7ced4eSGowrishankar Muthukrishnan 
2356d5c24714SGowrishankar Muthukrishnan 		val[1].val = msg.val;
2357d5c24714SGowrishankar Muthukrishnan 		val[1].len = msg.len;
2358d5c24714SGowrishankar Muthukrishnan 		info.parse_writeback(val);
2359ce7ced4eSGowrishankar Muthukrishnan 
2360ce7ced4eSGowrishankar Muthukrishnan 		if (info.file_type != FIPS_TYPE_JSON)
2361ce7ced4eSGowrishankar Muthukrishnan 			fprintf(info.fp_wr, "\n");
2362d5c24714SGowrishankar Muthukrishnan 	}
2363f4797baeSDamian Nowak 
2364f4797baeSDamian Nowak 	for (i = 0; i < (SHA_MD_BLOCK); i++)
2365f4797baeSDamian Nowak 		rte_free(md[i].val);
2366f4797baeSDamian Nowak 
2367f4797baeSDamian Nowak 	rte_free(vec.pt.val);
2368f4797baeSDamian Nowak 
2369d5c24714SGowrishankar Muthukrishnan 	free(val[0].val);
2370d5c24714SGowrishankar Muthukrishnan 	free(msg.val);
2371952e10cdSFan Zhang 
2372f4797baeSDamian Nowak 	return 0;
2373f4797baeSDamian Nowak }
2374f4797baeSDamian Nowak 
2375f4797baeSDamian Nowak 
2376f4797baeSDamian Nowak static int
2377cd255ccfSMarko Kovacevic init_test_ops(void)
2378cd255ccfSMarko Kovacevic {
2379cd255ccfSMarko Kovacevic 	switch (info.algo) {
238075777166SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CBC:
2381c8956fd2SBrian Dooley 	case FIPS_TEST_ALGO_AES_CTR:
2382cd255ccfSMarko Kovacevic 	case FIPS_TEST_ALGO_AES:
238336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
238436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform  = prepare_aes_xform;
2385cd255ccfSMarko Kovacevic 		if (info.interim_info.aes_data.test_type == AESAVS_TYPE_MCT)
2386cd255ccfSMarko Kovacevic 			test_ops.test = fips_mct_aes_test;
2387cd255ccfSMarko Kovacevic 		else
2388cd255ccfSMarko Kovacevic 			test_ops.test = fips_generic_test;
2389cd255ccfSMarko Kovacevic 		break;
2390f64adb67SMarko Kovacevic 	case FIPS_TEST_ALGO_HMAC:
239136128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
239236128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_hmac_xform;
2393f64adb67SMarko Kovacevic 		test_ops.test = fips_generic_test;
2394f64adb67SMarko Kovacevic 		break;
2395527cbf3dSMarko Kovacevic 	case FIPS_TEST_ALGO_TDES:
239636128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
239736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_tdes_xform;
2398527cbf3dSMarko Kovacevic 		if (info.interim_info.tdes_data.test_type == TDES_MCT)
2399527cbf3dSMarko Kovacevic 			test_ops.test = fips_mct_tdes_test;
2400527cbf3dSMarko Kovacevic 		else
2401527cbf3dSMarko Kovacevic 			test_ops.test = fips_generic_test;
2402527cbf3dSMarko Kovacevic 		break;
2403e27268bdSBrian Dooley 	case FIPS_TEST_ALGO_AES_GMAC:
240436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
240536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gmac_xform;
2406e27268bdSBrian Dooley 		test_ops.test = fips_generic_test;
2407e27268bdSBrian Dooley 		break;
24084aaad299SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_GCM:
240936128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_aead_op;
241036128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_gcm_xform;
24114aaad299SMarko Kovacevic 		test_ops.test = fips_generic_test;
24124aaad299SMarko Kovacevic 		break;
2413ac026f46SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_CMAC:
241436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
241536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_cmac_xform;
2416ac026f46SMarko Kovacevic 		test_ops.test = fips_generic_test;
2417ac026f46SMarko Kovacevic 		break;
2418305921f4SMarko Kovacevic 	case FIPS_TEST_ALGO_AES_CCM:
241936128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_aead_op;
242036128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_ccm_xform;
2421305921f4SMarko Kovacevic 		test_ops.test = fips_generic_test;
2422305921f4SMarko Kovacevic 		break;
2423f4797baeSDamian Nowak 	case FIPS_TEST_ALGO_SHA:
242436128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_auth_op;
242536128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_sha_xform;
2426f4797baeSDamian Nowak 		if (info.interim_info.sha_data.test_type == SHA_MCT)
2427f4797baeSDamian Nowak 			test_ops.test = fips_mct_sha_test;
2428f4797baeSDamian Nowak 		else
2429f4797baeSDamian Nowak 			test_ops.test = fips_generic_test;
2430f4797baeSDamian Nowak 		break;
2431d5a9ea55SSucharitha Sarananaga 	case FIPS_TEST_ALGO_AES_XTS:
243236128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_op = prepare_cipher_op;
243336128a67SGowrishankar Muthukrishnan 		test_ops.prepare_sym_xform = prepare_xts_xform;
243436128a67SGowrishankar Muthukrishnan 		test_ops.test = fips_generic_test;
243536128a67SGowrishankar Muthukrishnan 		break;
243636128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_RSA:
243736128a67SGowrishankar Muthukrishnan 		test_ops.prepare_asym_op = prepare_rsa_op;
243836128a67SGowrishankar Muthukrishnan 		test_ops.prepare_asym_xform = prepare_rsa_xform;
2439d5a9ea55SSucharitha Sarananaga 		test_ops.test = fips_generic_test;
2440d5a9ea55SSucharitha Sarananaga 		break;
2441b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_ECDSA:
2442b455d261SGowrishankar Muthukrishnan 		if (info.op == FIPS_TEST_ASYM_KEYGEN) {
2443b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecfpm_op;
2444b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecfpm_xform;
2445b455d261SGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2446b455d261SGowrishankar Muthukrishnan 		} else {
2447b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_op = prepare_ecdsa_op;
2448b455d261SGowrishankar Muthukrishnan 			test_ops.prepare_asym_xform = prepare_ecdsa_xform;
2449b455d261SGowrishankar Muthukrishnan 			test_ops.test = fips_generic_test;
2450b455d261SGowrishankar Muthukrishnan 		}
2451b455d261SGowrishankar Muthukrishnan 		break;
2452cd255ccfSMarko Kovacevic 	default:
2453efe3a8dbSMichael Shamis 		if (strstr(info.file_name, "TECB") ||
2454efe3a8dbSMichael Shamis 				strstr(info.file_name, "TCBC")) {
2455efe3a8dbSMichael Shamis 			info.algo = FIPS_TEST_ALGO_TDES;
245636128a67SGowrishankar Muthukrishnan 			test_ops.prepare_sym_op = prepare_cipher_op;
245736128a67SGowrishankar Muthukrishnan 			test_ops.prepare_sym_xform = prepare_tdes_xform;
2458efe3a8dbSMichael Shamis 			if (info.interim_info.tdes_data.test_type == TDES_MCT)
2459efe3a8dbSMichael Shamis 				test_ops.test = fips_mct_tdes_test;
2460efe3a8dbSMichael Shamis 			else
2461efe3a8dbSMichael Shamis 				test_ops.test = fips_generic_test;
2462efe3a8dbSMichael Shamis 			break;
2463efe3a8dbSMichael Shamis 		}
2464cd255ccfSMarko Kovacevic 		return -1;
2465cd255ccfSMarko Kovacevic 	}
2466cd255ccfSMarko Kovacevic 
2467cd255ccfSMarko Kovacevic 	return 0;
2468cd255ccfSMarko Kovacevic }
2469cd255ccfSMarko Kovacevic 
24703d0fad56SMarko Kovacevic static void
24713d0fad56SMarko Kovacevic print_test_block(void)
24723d0fad56SMarko Kovacevic {
24733d0fad56SMarko Kovacevic 	uint32_t i;
24743d0fad56SMarko Kovacevic 
24753d0fad56SMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++)
24763d0fad56SMarko Kovacevic 		printf("%s\n", info.vec[i]);
24773d0fad56SMarko Kovacevic 
24783d0fad56SMarko Kovacevic 	printf("\n");
24793d0fad56SMarko Kovacevic }
24803d0fad56SMarko Kovacevic 
24813d0fad56SMarko Kovacevic static int
24823d0fad56SMarko Kovacevic fips_test_one_file(void)
24833d0fad56SMarko Kovacevic {
24843d0fad56SMarko Kovacevic 	int fetch_ret = 0, ret;
24853d0fad56SMarko Kovacevic 
2486cd255ccfSMarko Kovacevic 	ret = init_test_ops();
2487cd255ccfSMarko Kovacevic 	if (ret < 0) {
2488cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Init test op\n", ret);
2489cd255ccfSMarko Kovacevic 		return ret;
2490cd255ccfSMarko Kovacevic 	}
2491cd255ccfSMarko Kovacevic 
2492cd255ccfSMarko Kovacevic 	while (ret >= 0 && fetch_ret == 0) {
24933d0fad56SMarko Kovacevic 		fetch_ret = fips_test_fetch_one_block();
24943d0fad56SMarko Kovacevic 		if (fetch_ret < 0) {
24953d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Fetch block\n",
24963d0fad56SMarko Kovacevic 					fetch_ret);
24973d0fad56SMarko Kovacevic 			ret = fetch_ret;
24983d0fad56SMarko Kovacevic 			goto error_one_case;
24993d0fad56SMarko Kovacevic 		}
25003d0fad56SMarko Kovacevic 
25013d0fad56SMarko Kovacevic 		if (info.nb_vec_lines == 0) {
25023d0fad56SMarko Kovacevic 			if (fetch_ret == -EOF)
25033d0fad56SMarko Kovacevic 				break;
25043d0fad56SMarko Kovacevic 
25053d0fad56SMarko Kovacevic 			fprintf(info.fp_wr, "\n");
25063d0fad56SMarko Kovacevic 			continue;
25073d0fad56SMarko Kovacevic 		}
25083d0fad56SMarko Kovacevic 
25093d0fad56SMarko Kovacevic 		ret = fips_test_parse_one_case();
25103d0fad56SMarko Kovacevic 		switch (ret) {
25113d0fad56SMarko Kovacevic 		case 0:
2512cd255ccfSMarko Kovacevic 			ret = test_ops.test();
25133d0fad56SMarko Kovacevic 			if (ret == 0)
25143d0fad56SMarko Kovacevic 				break;
25153d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: test block\n",
25163d0fad56SMarko Kovacevic 					ret);
25173d0fad56SMarko Kovacevic 			goto error_one_case;
25183d0fad56SMarko Kovacevic 		case 1:
25193d0fad56SMarko Kovacevic 			break;
25203d0fad56SMarko Kovacevic 		default:
25213d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
25223d0fad56SMarko Kovacevic 					ret);
25233d0fad56SMarko Kovacevic 			goto error_one_case;
25243d0fad56SMarko Kovacevic 		}
25253d0fad56SMarko Kovacevic 
25263d0fad56SMarko Kovacevic 		continue;
25273d0fad56SMarko Kovacevic error_one_case:
25283d0fad56SMarko Kovacevic 		print_test_block();
25293d0fad56SMarko Kovacevic 	}
25303d0fad56SMarko Kovacevic 
25313d0fad56SMarko Kovacevic 	fips_test_clear();
25323d0fad56SMarko Kovacevic 
253315bb59a5SCiara Power 	if (env.digest) {
2534952e10cdSFan Zhang 		rte_free(env.digest);
253515bb59a5SCiara Power 		env.digest = NULL;
253615bb59a5SCiara Power 	}
2537952e10cdSFan Zhang 	rte_pktmbuf_free(env.mbuf);
2538cd255ccfSMarko Kovacevic 
2539952e10cdSFan Zhang 	return ret;
25403d0fad56SMarko Kovacevic }
254189be27e3SBrandon Lo 
25428d70a194SDavid Marchand #ifdef USE_JANSSON
254389be27e3SBrandon Lo static int
254489be27e3SBrandon Lo fips_test_json_init_writeback(void)
254589be27e3SBrandon Lo {
254689be27e3SBrandon Lo 	json_t *session_info, *session_write;
254789be27e3SBrandon Lo 	session_info = json_array_get(json_info.json_root, 0);
254889be27e3SBrandon Lo 	session_write = json_object();
254989be27e3SBrandon Lo 	json_info.json_write_root = json_array();
255089be27e3SBrandon Lo 
255189be27e3SBrandon Lo 	json_object_set(session_write, "jwt",
255289be27e3SBrandon Lo 		json_object_get(session_info, "jwt"));
255389be27e3SBrandon Lo 	json_object_set(session_write, "url",
255489be27e3SBrandon Lo 		json_object_get(session_info, "url"));
255589be27e3SBrandon Lo 	json_object_set(session_write, "isSample",
255689be27e3SBrandon Lo 		json_object_get(session_info, "isSample"));
255789be27e3SBrandon Lo 
255889be27e3SBrandon Lo 	json_info.is_sample = json_boolean_value(
255989be27e3SBrandon Lo 		json_object_get(session_info, "isSample"));
256089be27e3SBrandon Lo 
256189be27e3SBrandon Lo 	json_array_append_new(json_info.json_write_root, session_write);
256289be27e3SBrandon Lo 	return 0;
256389be27e3SBrandon Lo }
256489be27e3SBrandon Lo 
256589be27e3SBrandon Lo static int
256689be27e3SBrandon Lo fips_test_one_test_case(void)
256789be27e3SBrandon Lo {
256889be27e3SBrandon Lo 	int ret;
256989be27e3SBrandon Lo 
257089be27e3SBrandon Lo 	ret = fips_test_parse_one_json_case();
257189be27e3SBrandon Lo 
257289be27e3SBrandon Lo 	switch (ret) {
257389be27e3SBrandon Lo 	case 0:
257489be27e3SBrandon Lo 		ret = test_ops.test();
257589be27e3SBrandon Lo 		if ((ret == 0) || (ret == -EPERM || ret == -ENOTSUP))
257689be27e3SBrandon Lo 			break;
257789be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error %i: test block\n",
257889be27e3SBrandon Lo 				ret);
257989be27e3SBrandon Lo 		break;
258089be27e3SBrandon Lo 	default:
258189be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
258289be27e3SBrandon Lo 				ret);
258389be27e3SBrandon Lo 	}
258489be27e3SBrandon Lo 	return ret;
258589be27e3SBrandon Lo }
258689be27e3SBrandon Lo 
258789be27e3SBrandon Lo static int
258889be27e3SBrandon Lo fips_test_one_test_group(void)
258989be27e3SBrandon Lo {
259089be27e3SBrandon Lo 	int ret;
259189be27e3SBrandon Lo 	json_t *tests, *write_tests;
259289be27e3SBrandon Lo 	size_t test_idx, tests_size;
259389be27e3SBrandon Lo 
259489be27e3SBrandon Lo 	write_tests = json_array();
259589be27e3SBrandon Lo 	json_info.json_write_group = json_object();
259689be27e3SBrandon Lo 	json_object_set(json_info.json_write_group, "tgId",
259789be27e3SBrandon Lo 		json_object_get(json_info.json_test_group, "tgId"));
259889be27e3SBrandon Lo 	json_object_set_new(json_info.json_write_group, "tests", write_tests);
259989be27e3SBrandon Lo 
260089be27e3SBrandon Lo 	switch (info.algo) {
2601e27268bdSBrian Dooley 	case FIPS_TEST_ALGO_AES_GMAC:
260289be27e3SBrandon Lo 	case FIPS_TEST_ALGO_AES_GCM:
2603b09aac2dSBrandon Lo 		ret = parse_test_gcm_json_init();
260489be27e3SBrandon Lo 		break;
2605443c93d8SBrandon Lo 	case FIPS_TEST_ALGO_HMAC:
2606443c93d8SBrandon Lo 		ret = parse_test_hmac_json_init();
2607443c93d8SBrandon Lo 		break;
260807da56a6SBrandon Lo 	case FIPS_TEST_ALGO_AES_CMAC:
260907da56a6SBrandon Lo 		ret = parse_test_cmac_json_init();
261007da56a6SBrandon Lo 		break;
2611f8e431edSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_XTS:
2612f8e431edSGowrishankar Muthukrishnan 		ret = parse_test_xts_json_init();
2613f8e431edSGowrishankar Muthukrishnan 		break;
2614f8e431edSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES_CBC:
2615c8956fd2SBrian Dooley 	case FIPS_TEST_ALGO_AES_CTR:
26168b8546aaSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_AES:
26178b8546aaSGowrishankar Muthukrishnan 		ret = parse_test_aes_json_init();
26188b8546aaSGowrishankar Muthukrishnan 		break;
2619d5c24714SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_SHA:
2620d5c24714SGowrishankar Muthukrishnan 		ret = parse_test_sha_json_init();
2621d5c24714SGowrishankar Muthukrishnan 		break;
262264569ffaSGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_TDES:
262364569ffaSGowrishankar Muthukrishnan 		ret = parse_test_tdes_json_init();
262464569ffaSGowrishankar Muthukrishnan 		break;
262536128a67SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_RSA:
262636128a67SGowrishankar Muthukrishnan 		ret = parse_test_rsa_json_init();
262736128a67SGowrishankar Muthukrishnan 		break;
2628b455d261SGowrishankar Muthukrishnan 	case FIPS_TEST_ALGO_ECDSA:
2629b455d261SGowrishankar Muthukrishnan 		ret = parse_test_ecdsa_json_init();
2630b455d261SGowrishankar Muthukrishnan 		break;
263189be27e3SBrandon Lo 	default:
263289be27e3SBrandon Lo 		return -EINVAL;
263389be27e3SBrandon Lo 	}
2634b09aac2dSBrandon Lo 
263589be27e3SBrandon Lo 	if (ret < 0)
263689be27e3SBrandon Lo 		return ret;
263789be27e3SBrandon Lo 
263889be27e3SBrandon Lo 	ret = fips_test_parse_one_json_group();
263989be27e3SBrandon Lo 	if (ret < 0)
264089be27e3SBrandon Lo 		return ret;
264189be27e3SBrandon Lo 
264289be27e3SBrandon Lo 	ret = init_test_ops();
264389be27e3SBrandon Lo 	if (ret < 0)
264489be27e3SBrandon Lo 		return ret;
264589be27e3SBrandon Lo 
264689be27e3SBrandon Lo 	tests = json_object_get(json_info.json_test_group, "tests");
264789be27e3SBrandon Lo 	tests_size = json_array_size(tests);
264889be27e3SBrandon Lo 	for (test_idx = 0; test_idx < tests_size; test_idx++) {
264989be27e3SBrandon Lo 		json_info.json_test_case = json_array_get(tests, test_idx);
265089be27e3SBrandon Lo 		if (fips_test_one_test_case() == 0)
265189be27e3SBrandon Lo 			json_array_append_new(write_tests, json_info.json_write_case);
265289be27e3SBrandon Lo 	}
265389be27e3SBrandon Lo 
265489be27e3SBrandon Lo 	return 0;
265589be27e3SBrandon Lo }
265689be27e3SBrandon Lo 
265789be27e3SBrandon Lo static int
265889be27e3SBrandon Lo fips_test_one_vector_set(void)
265989be27e3SBrandon Lo {
266089be27e3SBrandon Lo 	int ret;
2661b455d261SGowrishankar Muthukrishnan 	json_t *test_groups, *write_groups, *write_version, *write_set, *mode;
266289be27e3SBrandon Lo 	size_t group_idx, num_groups;
266389be27e3SBrandon Lo 
266489be27e3SBrandon Lo 	test_groups = json_object_get(json_info.json_vector_set, "testGroups");
266589be27e3SBrandon Lo 	num_groups = json_array_size(test_groups);
266689be27e3SBrandon Lo 
266789be27e3SBrandon Lo 	json_info.json_write_set = json_array();
266889be27e3SBrandon Lo 	write_version = json_object();
266989be27e3SBrandon Lo 	json_object_set_new(write_version, "acvVersion", json_string(ACVVERSION));
267089be27e3SBrandon Lo 	json_array_append_new(json_info.json_write_set, write_version);
267189be27e3SBrandon Lo 
267289be27e3SBrandon Lo 	write_set = json_object();
267389be27e3SBrandon Lo 	json_array_append(json_info.json_write_set, write_set);
267489be27e3SBrandon Lo 	write_groups = json_array();
267589be27e3SBrandon Lo 
267689be27e3SBrandon Lo 	json_object_set(write_set, "vsId",
267789be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "vsId"));
267889be27e3SBrandon Lo 	json_object_set(write_set, "algorithm",
267989be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "algorithm"));
2680b455d261SGowrishankar Muthukrishnan 	mode = json_object_get(json_info.json_vector_set, "mode");
2681b455d261SGowrishankar Muthukrishnan 	if (mode != NULL)
2682b455d261SGowrishankar Muthukrishnan 		json_object_set_new(write_set, "mode", mode);
2683b455d261SGowrishankar Muthukrishnan 
268489be27e3SBrandon Lo 	json_object_set(write_set, "revision",
268589be27e3SBrandon Lo 		json_object_get(json_info.json_vector_set, "revision"));
268689be27e3SBrandon Lo 	json_object_set_new(write_set, "isSample",
268789be27e3SBrandon Lo 		json_boolean(json_info.is_sample));
268889be27e3SBrandon Lo 	json_object_set_new(write_set, "testGroups", write_groups);
268989be27e3SBrandon Lo 
269089be27e3SBrandon Lo 	ret = fips_test_parse_one_json_vector_set();
269189be27e3SBrandon Lo 	if (ret < 0) {
269289be27e3SBrandon Lo 		RTE_LOG(ERR, USER1, "Error: Unsupported or invalid vector set algorithm: %s\n",
269389be27e3SBrandon Lo 			json_string_value(json_object_get(json_info.json_vector_set, "algorithm")));
269489be27e3SBrandon Lo 		return ret;
269589be27e3SBrandon Lo 	}
269689be27e3SBrandon Lo 
269789be27e3SBrandon Lo 	for (group_idx = 0; group_idx < num_groups; group_idx++) {
269889be27e3SBrandon Lo 		json_info.json_test_group = json_array_get(test_groups, group_idx);
269989be27e3SBrandon Lo 		ret = fips_test_one_test_group();
270089be27e3SBrandon Lo 		json_array_append_new(write_groups, json_info.json_write_group);
270189be27e3SBrandon Lo 	}
270289be27e3SBrandon Lo 
270389be27e3SBrandon Lo 	return 0;
270489be27e3SBrandon Lo }
270589be27e3SBrandon Lo 
270689be27e3SBrandon Lo static int
270789be27e3SBrandon Lo fips_test_one_json_file(void)
270889be27e3SBrandon Lo {
270989be27e3SBrandon Lo 	size_t vector_set_idx, root_size;
271089be27e3SBrandon Lo 
271189be27e3SBrandon Lo 	root_size = json_array_size(json_info.json_root);
271289be27e3SBrandon Lo 	fips_test_json_init_writeback();
271389be27e3SBrandon Lo 
271489be27e3SBrandon Lo 	for (vector_set_idx = 1; vector_set_idx < root_size; vector_set_idx++) {
271589be27e3SBrandon Lo 		/* Vector set index starts at 1, the 0th index contains test session
271689be27e3SBrandon Lo 		 * information.
271789be27e3SBrandon Lo 		 */
271889be27e3SBrandon Lo 		json_info.json_vector_set = json_array_get(json_info.json_root, vector_set_idx);
271989be27e3SBrandon Lo 		fips_test_one_vector_set();
272089be27e3SBrandon Lo 		json_array_append_new(json_info.json_write_root, json_info.json_write_set);
2721d5c24714SGowrishankar Muthukrishnan 		json_incref(json_info.json_write_set);
272289be27e3SBrandon Lo 	}
272389be27e3SBrandon Lo 
272489be27e3SBrandon Lo 	json_dumpf(json_info.json_write_root, info.fp_wr, JSON_INDENT(4));
272589be27e3SBrandon Lo 	json_decref(json_info.json_write_root);
272689be27e3SBrandon Lo 
272789be27e3SBrandon Lo 	return 0;
272889be27e3SBrandon Lo }
27298d70a194SDavid Marchand #endif /* USE_JANSSON */
2730