xref: /dpdk/examples/fips_validation/main.c (revision cd255ccf57647830bfdda8d760dad833f019b76a)
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>
83d0fad56SMarko Kovacevic 
93d0fad56SMarko Kovacevic #include <rte_cryptodev.h>
103d0fad56SMarko Kovacevic #include <rte_cryptodev_pmd.h>
113d0fad56SMarko Kovacevic #include <rte_mempool.h>
123d0fad56SMarko Kovacevic #include <rte_mbuf.h>
133d0fad56SMarko Kovacevic #include <rte_string_fns.h>
143d0fad56SMarko Kovacevic 
153d0fad56SMarko Kovacevic #include "fips_validation.h"
163d0fad56SMarko Kovacevic 
173d0fad56SMarko Kovacevic #define REQ_FILE_PATH_KEYWORD	"req-file"
183d0fad56SMarko Kovacevic #define RSP_FILE_PATH_KEYWORD	"rsp-file"
193d0fad56SMarko Kovacevic #define FOLDER_KEYWORD		"path-is-folder"
203d0fad56SMarko Kovacevic #define CRYPTODEV_KEYWORD	"cryptodev"
213d0fad56SMarko Kovacevic #define CRYPTODEV_ID_KEYWORD	"cryptodev-id"
223d0fad56SMarko Kovacevic 
233d0fad56SMarko Kovacevic struct fips_test_vector vec;
243d0fad56SMarko Kovacevic struct fips_test_interim_info info;
253d0fad56SMarko Kovacevic 
263d0fad56SMarko Kovacevic struct cryptodev_fips_validate_env {
273d0fad56SMarko Kovacevic 	const char *req_path;
283d0fad56SMarko Kovacevic 	const char *rsp_path;
293d0fad56SMarko Kovacevic 	uint32_t is_path_folder;
303d0fad56SMarko Kovacevic 	uint32_t dev_id;
313d0fad56SMarko Kovacevic 	struct rte_mempool *mpool;
323d0fad56SMarko Kovacevic 	struct rte_mempool *op_pool;
333d0fad56SMarko Kovacevic 	struct rte_mbuf *mbuf;
343d0fad56SMarko Kovacevic 	struct rte_crypto_op *op;
353d0fad56SMarko Kovacevic 	struct rte_cryptodev_sym_session *sess;
363d0fad56SMarko Kovacevic } env;
373d0fad56SMarko Kovacevic 
383d0fad56SMarko Kovacevic static int
393d0fad56SMarko Kovacevic cryptodev_fips_validate_app_int(void)
403d0fad56SMarko Kovacevic {
413d0fad56SMarko Kovacevic 	struct rte_cryptodev_config conf = {rte_socket_id(), 1};
423d0fad56SMarko Kovacevic 	struct rte_cryptodev_qp_conf qp_conf = {128};
433d0fad56SMarko Kovacevic 	int ret;
443d0fad56SMarko Kovacevic 
453d0fad56SMarko Kovacevic 	ret = rte_cryptodev_configure(env.dev_id, &conf);
463d0fad56SMarko Kovacevic 	if (ret < 0)
473d0fad56SMarko Kovacevic 		return ret;
483d0fad56SMarko Kovacevic 
493d0fad56SMarko Kovacevic 	env.mpool = rte_pktmbuf_pool_create("FIPS_MEMPOOL", 128, 0, 0,
503d0fad56SMarko Kovacevic 			UINT16_MAX, rte_socket_id());
513d0fad56SMarko Kovacevic 	if (!env.mpool)
523d0fad56SMarko Kovacevic 		return ret;
533d0fad56SMarko Kovacevic 
543d0fad56SMarko Kovacevic 	ret = rte_cryptodev_queue_pair_setup(env.dev_id, 0, &qp_conf,
553d0fad56SMarko Kovacevic 			rte_socket_id(), env.mpool);
563d0fad56SMarko Kovacevic 	if (ret < 0)
573d0fad56SMarko Kovacevic 		return ret;
583d0fad56SMarko Kovacevic 
593d0fad56SMarko Kovacevic 	ret = -ENOMEM;
603d0fad56SMarko Kovacevic 
613d0fad56SMarko Kovacevic 	env.op_pool = rte_crypto_op_pool_create(
623d0fad56SMarko Kovacevic 			"FIPS_OP_POOL",
633d0fad56SMarko Kovacevic 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
643d0fad56SMarko Kovacevic 			1, 0,
653d0fad56SMarko Kovacevic 			16,
663d0fad56SMarko Kovacevic 			rte_socket_id());
673d0fad56SMarko Kovacevic 	if (!env.op_pool)
683d0fad56SMarko Kovacevic 		goto error_exit;
693d0fad56SMarko Kovacevic 
703d0fad56SMarko Kovacevic 	env.mbuf = rte_pktmbuf_alloc(env.mpool);
713d0fad56SMarko Kovacevic 	if (!env.mbuf)
723d0fad56SMarko Kovacevic 		goto error_exit;
733d0fad56SMarko Kovacevic 
743d0fad56SMarko Kovacevic 	env.op = rte_crypto_op_alloc(env.op_pool, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
753d0fad56SMarko Kovacevic 	if (!env.op)
763d0fad56SMarko Kovacevic 		goto error_exit;
773d0fad56SMarko Kovacevic 
783d0fad56SMarko Kovacevic 	return 0;
793d0fad56SMarko Kovacevic 
803d0fad56SMarko Kovacevic error_exit:
813d0fad56SMarko Kovacevic 	rte_mempool_free(env.mpool);
823d0fad56SMarko Kovacevic 	if (env.op_pool)
833d0fad56SMarko Kovacevic 		rte_mempool_free(env.op_pool);
843d0fad56SMarko Kovacevic 
853d0fad56SMarko Kovacevic 	return ret;
863d0fad56SMarko Kovacevic }
873d0fad56SMarko Kovacevic 
883d0fad56SMarko Kovacevic static void
893d0fad56SMarko Kovacevic cryptodev_fips_validate_app_uninit(void)
903d0fad56SMarko Kovacevic {
913d0fad56SMarko Kovacevic 	rte_pktmbuf_free(env.mbuf);
923d0fad56SMarko Kovacevic 	rte_crypto_op_free(env.op);
933d0fad56SMarko Kovacevic 	rte_cryptodev_sym_session_clear(env.dev_id, env.sess);
943d0fad56SMarko Kovacevic 	rte_cryptodev_sym_session_free(env.sess);
953d0fad56SMarko Kovacevic 	rte_mempool_free(env.mpool);
963d0fad56SMarko Kovacevic 	rte_mempool_free(env.op_pool);
973d0fad56SMarko Kovacevic }
983d0fad56SMarko Kovacevic 
993d0fad56SMarko Kovacevic static int
1003d0fad56SMarko Kovacevic fips_test_one_file(void);
1013d0fad56SMarko Kovacevic 
1023d0fad56SMarko Kovacevic static int
1033d0fad56SMarko Kovacevic parse_cryptodev_arg(char *arg)
1043d0fad56SMarko Kovacevic {
1053d0fad56SMarko Kovacevic 	int id = rte_cryptodev_get_dev_id(arg);
1063d0fad56SMarko Kovacevic 
1073d0fad56SMarko Kovacevic 	if (id < 0) {
1083d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev name %s\n",
1093d0fad56SMarko Kovacevic 				id, arg);
1103d0fad56SMarko Kovacevic 		return id;
1113d0fad56SMarko Kovacevic 	}
1123d0fad56SMarko Kovacevic 
1133d0fad56SMarko Kovacevic 	env.dev_id = (uint32_t)id;
1143d0fad56SMarko Kovacevic 
1153d0fad56SMarko Kovacevic 	return 0;
1163d0fad56SMarko Kovacevic }
1173d0fad56SMarko Kovacevic 
1183d0fad56SMarko Kovacevic static int
1193d0fad56SMarko Kovacevic parse_cryptodev_id_arg(char *arg)
1203d0fad56SMarko Kovacevic {
1213d0fad56SMarko Kovacevic 	uint32_t cryptodev_id;
1223d0fad56SMarko Kovacevic 
1233d0fad56SMarko Kovacevic 	if (parser_read_uint32(&cryptodev_id, arg) < 0) {
1243d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
1253d0fad56SMarko Kovacevic 				-EINVAL, arg);
1263d0fad56SMarko Kovacevic 		return -1;
1273d0fad56SMarko Kovacevic 	}
1283d0fad56SMarko Kovacevic 
1293d0fad56SMarko Kovacevic 
1303d0fad56SMarko Kovacevic 	if (!rte_cryptodev_pmd_is_valid_dev(cryptodev_id)) {
1313d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
1323d0fad56SMarko Kovacevic 				cryptodev_id, arg);
1333d0fad56SMarko Kovacevic 		return -1;
1343d0fad56SMarko Kovacevic 	}
1353d0fad56SMarko Kovacevic 
1363d0fad56SMarko Kovacevic 	env.dev_id = (uint32_t)cryptodev_id;
1373d0fad56SMarko Kovacevic 
1383d0fad56SMarko Kovacevic 	return 0;
1393d0fad56SMarko Kovacevic }
1403d0fad56SMarko Kovacevic 
1413d0fad56SMarko Kovacevic static void
1423d0fad56SMarko Kovacevic cryptodev_fips_validate_usage(const char *prgname)
1433d0fad56SMarko Kovacevic {
1443d0fad56SMarko Kovacevic 	printf("%s [EAL options] --\n"
1453d0fad56SMarko Kovacevic 		"  --%s: REQUEST-FILE-PATH\n"
1463d0fad56SMarko Kovacevic 		"  --%s: RESPONSE-FILE-PATH\n"
1473d0fad56SMarko Kovacevic 		"  --%s: indicating both paths are folders\n"
1483d0fad56SMarko Kovacevic 		"  --%s: CRYPTODEV-NAME\n"
1493d0fad56SMarko Kovacevic 		"  --%s: CRYPTODEV-ID-NAME\n",
1503d0fad56SMarko Kovacevic 		prgname, REQ_FILE_PATH_KEYWORD, RSP_FILE_PATH_KEYWORD,
1513d0fad56SMarko Kovacevic 		FOLDER_KEYWORD, CRYPTODEV_KEYWORD, CRYPTODEV_ID_KEYWORD);
1523d0fad56SMarko Kovacevic }
1533d0fad56SMarko Kovacevic 
1543d0fad56SMarko Kovacevic static int
1553d0fad56SMarko Kovacevic cryptodev_fips_validate_parse_args(int argc, char **argv)
1563d0fad56SMarko Kovacevic {
1573d0fad56SMarko Kovacevic 	int opt, ret;
1583d0fad56SMarko Kovacevic 	char *prgname = argv[0];
1593d0fad56SMarko Kovacevic 	char **argvopt;
1603d0fad56SMarko Kovacevic 	int option_index;
1613d0fad56SMarko Kovacevic 	struct option lgopts[] = {
1623d0fad56SMarko Kovacevic 			{REQ_FILE_PATH_KEYWORD, required_argument, 0, 0},
1633d0fad56SMarko Kovacevic 			{RSP_FILE_PATH_KEYWORD, required_argument, 0, 0},
1643d0fad56SMarko Kovacevic 			{FOLDER_KEYWORD, no_argument, 0, 0},
1653d0fad56SMarko Kovacevic 			{CRYPTODEV_KEYWORD, required_argument, 0, 0},
1663d0fad56SMarko Kovacevic 			{CRYPTODEV_ID_KEYWORD, required_argument, 0, 0},
1673d0fad56SMarko Kovacevic 			{NULL, 0, 0, 0}
1683d0fad56SMarko Kovacevic 	};
1693d0fad56SMarko Kovacevic 
1703d0fad56SMarko Kovacevic 	argvopt = argv;
1713d0fad56SMarko Kovacevic 
1723d0fad56SMarko Kovacevic 	while ((opt = getopt_long(argc, argvopt, "s:",
1733d0fad56SMarko Kovacevic 				  lgopts, &option_index)) != EOF) {
1743d0fad56SMarko Kovacevic 
1753d0fad56SMarko Kovacevic 		switch (opt) {
1763d0fad56SMarko Kovacevic 		case 0:
1773d0fad56SMarko Kovacevic 			if (strcmp(lgopts[option_index].name,
1783d0fad56SMarko Kovacevic 					REQ_FILE_PATH_KEYWORD) == 0)
1793d0fad56SMarko Kovacevic 				env.req_path = optarg;
1803d0fad56SMarko Kovacevic 			else if (strcmp(lgopts[option_index].name,
1813d0fad56SMarko Kovacevic 					RSP_FILE_PATH_KEYWORD) == 0)
1823d0fad56SMarko Kovacevic 				env.rsp_path = optarg;
1833d0fad56SMarko Kovacevic 			else if (strcmp(lgopts[option_index].name,
1843d0fad56SMarko Kovacevic 					FOLDER_KEYWORD) == 0)
1853d0fad56SMarko Kovacevic 				env.is_path_folder = 1;
1863d0fad56SMarko Kovacevic 			else if (strcmp(lgopts[option_index].name,
1873d0fad56SMarko Kovacevic 					CRYPTODEV_KEYWORD) == 0) {
1883d0fad56SMarko Kovacevic 				ret = parse_cryptodev_arg(optarg);
1893d0fad56SMarko Kovacevic 				if (ret < 0) {
1903d0fad56SMarko Kovacevic 					cryptodev_fips_validate_usage(prgname);
1913d0fad56SMarko Kovacevic 					return -EINVAL;
1923d0fad56SMarko Kovacevic 				}
1933d0fad56SMarko Kovacevic 			} else if (strcmp(lgopts[option_index].name,
1943d0fad56SMarko Kovacevic 					CRYPTODEV_ID_KEYWORD) == 0) {
1953d0fad56SMarko Kovacevic 				ret = parse_cryptodev_id_arg(optarg);
1963d0fad56SMarko Kovacevic 				if (ret < 0) {
1973d0fad56SMarko Kovacevic 					cryptodev_fips_validate_usage(prgname);
1983d0fad56SMarko Kovacevic 					return -EINVAL;
1993d0fad56SMarko Kovacevic 				}
2003d0fad56SMarko Kovacevic 			} else {
2013d0fad56SMarko Kovacevic 				cryptodev_fips_validate_usage(prgname);
2023d0fad56SMarko Kovacevic 				return -EINVAL;
2033d0fad56SMarko Kovacevic 			}
2043d0fad56SMarko Kovacevic 			break;
2053d0fad56SMarko Kovacevic 		default:
2063d0fad56SMarko Kovacevic 			return -1;
2073d0fad56SMarko Kovacevic 		}
2083d0fad56SMarko Kovacevic 	}
2093d0fad56SMarko Kovacevic 
2103d0fad56SMarko Kovacevic 	if (env.req_path == NULL || env.rsp_path == NULL ||
2113d0fad56SMarko Kovacevic 			env.dev_id == UINT32_MAX) {
2123d0fad56SMarko Kovacevic 		cryptodev_fips_validate_usage(prgname);
2133d0fad56SMarko Kovacevic 		return -EINVAL;
2143d0fad56SMarko Kovacevic 	}
2153d0fad56SMarko Kovacevic 
2163d0fad56SMarko Kovacevic 	return 0;
2173d0fad56SMarko Kovacevic }
2183d0fad56SMarko Kovacevic 
2193d0fad56SMarko Kovacevic int
2203d0fad56SMarko Kovacevic main(int argc, char *argv[])
2213d0fad56SMarko Kovacevic {
2223d0fad56SMarko Kovacevic 	int ret;
2233d0fad56SMarko Kovacevic 
2243d0fad56SMarko Kovacevic 	ret = rte_eal_init(argc, argv);
2253d0fad56SMarko Kovacevic 	if (ret < 0) {
2263d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
2273d0fad56SMarko Kovacevic 		return -1;
2283d0fad56SMarko Kovacevic 	}
2293d0fad56SMarko Kovacevic 
2303d0fad56SMarko Kovacevic 	argc -= ret;
2313d0fad56SMarko Kovacevic 	argv += ret;
2323d0fad56SMarko Kovacevic 
2333d0fad56SMarko Kovacevic 	ret = cryptodev_fips_validate_parse_args(argc, argv);
2343d0fad56SMarko Kovacevic 	if (ret < 0)
2353d0fad56SMarko Kovacevic 		rte_exit(EXIT_FAILURE, "Failed to parse arguments!\n");
2363d0fad56SMarko Kovacevic 
2373d0fad56SMarko Kovacevic 	ret = cryptodev_fips_validate_app_int();
2383d0fad56SMarko Kovacevic 	if (ret < 0) {
2393d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
2403d0fad56SMarko Kovacevic 		return -1;
2413d0fad56SMarko Kovacevic 	}
2423d0fad56SMarko Kovacevic 
2433d0fad56SMarko Kovacevic 	if (!env.is_path_folder) {
2443d0fad56SMarko Kovacevic 		printf("Processing file %s... ", env.req_path);
2453d0fad56SMarko Kovacevic 
2463d0fad56SMarko Kovacevic 		ret = fips_test_init(env.req_path, env.rsp_path,
2473d0fad56SMarko Kovacevic 			rte_cryptodev_name_get(env.dev_id));
2483d0fad56SMarko Kovacevic 		if (ret < 0) {
2493d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
2503d0fad56SMarko Kovacevic 					ret, env.req_path);
2513d0fad56SMarko Kovacevic 			goto exit;
2523d0fad56SMarko Kovacevic 		}
2533d0fad56SMarko Kovacevic 
2543d0fad56SMarko Kovacevic 
2553d0fad56SMarko Kovacevic 		ret = fips_test_one_file();
2563d0fad56SMarko Kovacevic 		if (ret < 0) {
2573d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
2583d0fad56SMarko Kovacevic 					ret, env.req_path);
2593d0fad56SMarko Kovacevic 			goto exit;
2603d0fad56SMarko Kovacevic 		}
2613d0fad56SMarko Kovacevic 
2623d0fad56SMarko Kovacevic 		printf("Done\n");
2633d0fad56SMarko Kovacevic 
2643d0fad56SMarko Kovacevic 	} else {
2653d0fad56SMarko Kovacevic 		struct dirent *dir;
2663d0fad56SMarko Kovacevic 		DIR *d_req, *d_rsp;
2673d0fad56SMarko Kovacevic 		char req_path[1024];
2683d0fad56SMarko Kovacevic 		char rsp_path[1024];
2693d0fad56SMarko Kovacevic 
2703d0fad56SMarko Kovacevic 		d_req = opendir(env.req_path);
2713d0fad56SMarko Kovacevic 		if (!d_req) {
2723d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Path %s not exist\n",
2733d0fad56SMarko Kovacevic 					-EINVAL, env.req_path);
2743d0fad56SMarko Kovacevic 			goto exit;
2753d0fad56SMarko Kovacevic 		}
2763d0fad56SMarko Kovacevic 
2773d0fad56SMarko Kovacevic 		d_rsp = opendir(env.rsp_path);
2783d0fad56SMarko Kovacevic 		if (!d_rsp) {
2793d0fad56SMarko Kovacevic 			ret = mkdir(env.rsp_path, 0700);
2803d0fad56SMarko Kovacevic 			if (ret == 0)
2813d0fad56SMarko Kovacevic 				d_rsp = opendir(env.rsp_path);
2823d0fad56SMarko Kovacevic 			else {
2833d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Invalid %s\n",
2843d0fad56SMarko Kovacevic 						-EINVAL, env.rsp_path);
2853d0fad56SMarko Kovacevic 				goto exit;
2863d0fad56SMarko Kovacevic 			}
2873d0fad56SMarko Kovacevic 		}
2883d0fad56SMarko Kovacevic 		closedir(d_rsp);
2893d0fad56SMarko Kovacevic 
2903d0fad56SMarko Kovacevic 		while ((dir = readdir(d_req)) != NULL) {
2913d0fad56SMarko Kovacevic 			if (strstr(dir->d_name, "req") == NULL)
2923d0fad56SMarko Kovacevic 				continue;
2933d0fad56SMarko Kovacevic 
2943d0fad56SMarko Kovacevic 			snprintf(req_path, 1023, "%s/%s", env.req_path,
2953d0fad56SMarko Kovacevic 					dir->d_name);
2963d0fad56SMarko Kovacevic 			snprintf(rsp_path, 1023, "%s/%s", env.rsp_path,
2973d0fad56SMarko Kovacevic 					dir->d_name);
2983d0fad56SMarko Kovacevic 			strlcpy(strstr(rsp_path, "req"), "rsp", 4);
2993d0fad56SMarko Kovacevic 
3003d0fad56SMarko Kovacevic 			printf("Processing file %s... ", req_path);
3013d0fad56SMarko Kovacevic 
3023d0fad56SMarko Kovacevic 			ret = fips_test_init(req_path, rsp_path,
3033d0fad56SMarko Kovacevic 			rte_cryptodev_name_get(env.dev_id));
3043d0fad56SMarko Kovacevic 			if (ret < 0) {
3053d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
3063d0fad56SMarko Kovacevic 						ret, req_path);
3073d0fad56SMarko Kovacevic 				break;
3083d0fad56SMarko Kovacevic 			}
3093d0fad56SMarko Kovacevic 
3103d0fad56SMarko Kovacevic 			ret = fips_test_one_file();
3113d0fad56SMarko Kovacevic 			if (ret < 0) {
3123d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
3133d0fad56SMarko Kovacevic 						ret, req_path);
3143d0fad56SMarko Kovacevic 				break;
3153d0fad56SMarko Kovacevic 			}
3163d0fad56SMarko Kovacevic 
3173d0fad56SMarko Kovacevic 			printf("Done\n");
3183d0fad56SMarko Kovacevic 		}
3193d0fad56SMarko Kovacevic 
3203d0fad56SMarko Kovacevic 		closedir(d_req);
3213d0fad56SMarko Kovacevic 	}
3223d0fad56SMarko Kovacevic 
3233d0fad56SMarko Kovacevic 
3243d0fad56SMarko Kovacevic exit:
3253d0fad56SMarko Kovacevic 	fips_test_clear();
3263d0fad56SMarko Kovacevic 	cryptodev_fips_validate_app_uninit();
3273d0fad56SMarko Kovacevic 
3283d0fad56SMarko Kovacevic 	return ret;
3293d0fad56SMarko Kovacevic 
3303d0fad56SMarko Kovacevic }
3313d0fad56SMarko Kovacevic 
332*cd255ccfSMarko Kovacevic #define IV_OFF (sizeof(struct rte_crypto_op) + sizeof(struct rte_crypto_sym_op))
333*cd255ccfSMarko Kovacevic #define CRYPTODEV_FIPS_MAX_RETRIES	16
334*cd255ccfSMarko Kovacevic 
335*cd255ccfSMarko Kovacevic typedef int (*fips_test_one_case_t)(void);
336*cd255ccfSMarko Kovacevic typedef int (*fips_prepare_op_t)(void);
337*cd255ccfSMarko Kovacevic typedef int (*fips_prepare_xform_t)(struct rte_crypto_sym_xform *);
338*cd255ccfSMarko Kovacevic 
339*cd255ccfSMarko Kovacevic struct fips_test_ops {
340*cd255ccfSMarko Kovacevic 	fips_prepare_xform_t prepare_xform;
341*cd255ccfSMarko Kovacevic 	fips_prepare_op_t prepare_op;
342*cd255ccfSMarko Kovacevic 	fips_test_one_case_t test;
343*cd255ccfSMarko Kovacevic } test_ops;
344*cd255ccfSMarko Kovacevic 
345*cd255ccfSMarko Kovacevic static int
346*cd255ccfSMarko Kovacevic prepare_cipher_op(void)
347*cd255ccfSMarko Kovacevic {
348*cd255ccfSMarko Kovacevic 	struct rte_crypto_sym_op *sym = env.op->sym;
349*cd255ccfSMarko Kovacevic 	uint8_t *iv = rte_crypto_op_ctod_offset(env.op, uint8_t *, IV_OFF);
350*cd255ccfSMarko Kovacevic 
351*cd255ccfSMarko Kovacevic 	__rte_crypto_op_reset(env.op, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
352*cd255ccfSMarko Kovacevic 	rte_pktmbuf_reset(env.mbuf);
353*cd255ccfSMarko Kovacevic 
354*cd255ccfSMarko Kovacevic 	sym->m_src = env.mbuf;
355*cd255ccfSMarko Kovacevic 	sym->cipher.data.offset = 0;
356*cd255ccfSMarko Kovacevic 
357*cd255ccfSMarko Kovacevic 	memcpy(iv, vec.iv.val, vec.iv.len);
358*cd255ccfSMarko Kovacevic 
359*cd255ccfSMarko Kovacevic 	if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
360*cd255ccfSMarko Kovacevic 		uint8_t *pt;
361*cd255ccfSMarko Kovacevic 
362*cd255ccfSMarko Kovacevic 		if (vec.pt.len > RTE_MBUF_MAX_NB_SEGS) {
363*cd255ccfSMarko Kovacevic 			RTE_LOG(ERR, USER1, "PT len %u\n", vec.pt.len);
364*cd255ccfSMarko Kovacevic 			return -EPERM;
365*cd255ccfSMarko Kovacevic 		}
366*cd255ccfSMarko Kovacevic 
367*cd255ccfSMarko Kovacevic 		pt = (uint8_t *)rte_pktmbuf_append(env.mbuf, vec.pt.len);
368*cd255ccfSMarko Kovacevic 
369*cd255ccfSMarko Kovacevic 		if (!pt) {
370*cd255ccfSMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: MBUF too small\n",
371*cd255ccfSMarko Kovacevic 					-ENOMEM);
372*cd255ccfSMarko Kovacevic 			return -ENOMEM;
373*cd255ccfSMarko Kovacevic 		}
374*cd255ccfSMarko Kovacevic 
375*cd255ccfSMarko Kovacevic 		memcpy(pt, vec.pt.val, vec.pt.len);
376*cd255ccfSMarko Kovacevic 		sym->cipher.data.length = vec.pt.len;
377*cd255ccfSMarko Kovacevic 
378*cd255ccfSMarko Kovacevic 	} else {
379*cd255ccfSMarko Kovacevic 		uint8_t *ct;
380*cd255ccfSMarko Kovacevic 
381*cd255ccfSMarko Kovacevic 		if (vec.ct.len > RTE_MBUF_MAX_NB_SEGS) {
382*cd255ccfSMarko Kovacevic 			RTE_LOG(ERR, USER1, "CT len %u\n", vec.ct.len);
383*cd255ccfSMarko Kovacevic 			return -EPERM;
384*cd255ccfSMarko Kovacevic 		}
385*cd255ccfSMarko Kovacevic 
386*cd255ccfSMarko Kovacevic 		ct = (uint8_t *)rte_pktmbuf_append(env.mbuf, vec.ct.len);
387*cd255ccfSMarko Kovacevic 
388*cd255ccfSMarko Kovacevic 		if (!ct) {
389*cd255ccfSMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: MBUF too small\n",
390*cd255ccfSMarko Kovacevic 					-ENOMEM);
391*cd255ccfSMarko Kovacevic 			return -ENOMEM;
392*cd255ccfSMarko Kovacevic 		}
393*cd255ccfSMarko Kovacevic 
394*cd255ccfSMarko Kovacevic 		memcpy(ct, vec.ct.val, vec.ct.len);
395*cd255ccfSMarko Kovacevic 		sym->cipher.data.length = vec.ct.len;
396*cd255ccfSMarko Kovacevic 	}
397*cd255ccfSMarko Kovacevic 
398*cd255ccfSMarko Kovacevic 	rte_crypto_op_attach_sym_session(env.op, env.sess);
399*cd255ccfSMarko Kovacevic 
400*cd255ccfSMarko Kovacevic 	return 0;
401*cd255ccfSMarko Kovacevic }
402*cd255ccfSMarko Kovacevic 
403*cd255ccfSMarko Kovacevic static int
404*cd255ccfSMarko Kovacevic prepare_aes_xform(struct rte_crypto_sym_xform *xform)
405*cd255ccfSMarko Kovacevic {
406*cd255ccfSMarko Kovacevic 	const struct rte_cryptodev_symmetric_capability *cap;
407*cd255ccfSMarko Kovacevic 	struct rte_cryptodev_sym_capability_idx cap_idx;
408*cd255ccfSMarko Kovacevic 	struct rte_crypto_cipher_xform *cipher_xform = &xform->cipher;
409*cd255ccfSMarko Kovacevic 
410*cd255ccfSMarko Kovacevic 	xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
411*cd255ccfSMarko Kovacevic 
412*cd255ccfSMarko Kovacevic 	cipher_xform->algo = RTE_CRYPTO_CIPHER_AES_CBC;
413*cd255ccfSMarko Kovacevic 	cipher_xform->op = (info.op == FIPS_TEST_ENC_AUTH_GEN) ?
414*cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_ENCRYPT :
415*cd255ccfSMarko Kovacevic 			RTE_CRYPTO_CIPHER_OP_DECRYPT;
416*cd255ccfSMarko Kovacevic 	cipher_xform->key.data = vec.cipher_auth.key.val;
417*cd255ccfSMarko Kovacevic 	cipher_xform->key.length = vec.cipher_auth.key.len;
418*cd255ccfSMarko Kovacevic 	cipher_xform->iv.length = vec.iv.len;
419*cd255ccfSMarko Kovacevic 	cipher_xform->iv.offset = IV_OFF;
420*cd255ccfSMarko Kovacevic 
421*cd255ccfSMarko Kovacevic 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
422*cd255ccfSMarko Kovacevic 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
423*cd255ccfSMarko Kovacevic 
424*cd255ccfSMarko Kovacevic 	cap = rte_cryptodev_sym_capability_get(env.dev_id, &cap_idx);
425*cd255ccfSMarko Kovacevic 	if (!cap) {
426*cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Failed to get capability for cdev %u\n",
427*cd255ccfSMarko Kovacevic 				env.dev_id);
428*cd255ccfSMarko Kovacevic 		return -EINVAL;
429*cd255ccfSMarko Kovacevic 	}
430*cd255ccfSMarko Kovacevic 
431*cd255ccfSMarko Kovacevic 	if (rte_cryptodev_sym_capability_check_cipher(cap,
432*cd255ccfSMarko Kovacevic 			cipher_xform->key.length,
433*cd255ccfSMarko Kovacevic 			cipher_xform->iv.length) != 0) {
434*cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "PMD %s key length %u IV length %u\n",
435*cd255ccfSMarko Kovacevic 				info.device_name, cipher_xform->key.length,
436*cd255ccfSMarko Kovacevic 				cipher_xform->iv.length);
437*cd255ccfSMarko Kovacevic 		return -EPERM;
438*cd255ccfSMarko Kovacevic 	}
439*cd255ccfSMarko Kovacevic 
440*cd255ccfSMarko Kovacevic 	return 0;
441*cd255ccfSMarko Kovacevic }
442*cd255ccfSMarko Kovacevic 
443*cd255ccfSMarko Kovacevic static void
444*cd255ccfSMarko Kovacevic get_writeback_data(struct fips_val *val)
445*cd255ccfSMarko Kovacevic {
446*cd255ccfSMarko Kovacevic 	val->val = rte_pktmbuf_mtod(env.mbuf, uint8_t *);
447*cd255ccfSMarko Kovacevic 	val->len = rte_pktmbuf_pkt_len(env.mbuf);
448*cd255ccfSMarko Kovacevic }
449*cd255ccfSMarko Kovacevic 
450*cd255ccfSMarko Kovacevic static int
451*cd255ccfSMarko Kovacevic fips_run_test(void)
452*cd255ccfSMarko Kovacevic {
453*cd255ccfSMarko Kovacevic 	struct rte_crypto_sym_xform xform = {0};
454*cd255ccfSMarko Kovacevic 	uint16_t n_deqd;
455*cd255ccfSMarko Kovacevic 	int ret;
456*cd255ccfSMarko Kovacevic 
457*cd255ccfSMarko Kovacevic 	ret = test_ops.prepare_xform(&xform);
458*cd255ccfSMarko Kovacevic 	if (ret < 0)
459*cd255ccfSMarko Kovacevic 		return ret;
460*cd255ccfSMarko Kovacevic 
461*cd255ccfSMarko Kovacevic 	env.sess = rte_cryptodev_sym_session_create(env.mpool);
462*cd255ccfSMarko Kovacevic 	if (!env.sess)
463*cd255ccfSMarko Kovacevic 		return -ENOMEM;
464*cd255ccfSMarko Kovacevic 
465*cd255ccfSMarko Kovacevic 	ret = rte_cryptodev_sym_session_init(env.dev_id,
466*cd255ccfSMarko Kovacevic 			env.sess, &xform, env.mpool);
467*cd255ccfSMarko Kovacevic 	if (ret < 0) {
468*cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Init session\n",
469*cd255ccfSMarko Kovacevic 				ret);
470*cd255ccfSMarko Kovacevic 		return ret;
471*cd255ccfSMarko Kovacevic 	}
472*cd255ccfSMarko Kovacevic 
473*cd255ccfSMarko Kovacevic 	ret = test_ops.prepare_op();
474*cd255ccfSMarko Kovacevic 	if (ret < 0) {
475*cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Prepare op\n",
476*cd255ccfSMarko Kovacevic 				ret);
477*cd255ccfSMarko Kovacevic 		return ret;
478*cd255ccfSMarko Kovacevic 	}
479*cd255ccfSMarko Kovacevic 
480*cd255ccfSMarko Kovacevic 	if (rte_cryptodev_enqueue_burst(env.dev_id, 0, &env.op, 1) < 1) {
481*cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error: Failed enqueue\n");
482*cd255ccfSMarko Kovacevic 		return ret;
483*cd255ccfSMarko Kovacevic 	}
484*cd255ccfSMarko Kovacevic 
485*cd255ccfSMarko Kovacevic 	do {
486*cd255ccfSMarko Kovacevic 		struct rte_crypto_op *deqd_op;
487*cd255ccfSMarko Kovacevic 
488*cd255ccfSMarko Kovacevic 		n_deqd = rte_cryptodev_dequeue_burst(env.dev_id, 0, &deqd_op,
489*cd255ccfSMarko Kovacevic 				1);
490*cd255ccfSMarko Kovacevic 	} while (n_deqd == 0);
491*cd255ccfSMarko Kovacevic 
492*cd255ccfSMarko Kovacevic 	vec.status = env.op->status;
493*cd255ccfSMarko Kovacevic 
494*cd255ccfSMarko Kovacevic 	rte_cryptodev_sym_session_clear(env.dev_id, env.sess);
495*cd255ccfSMarko Kovacevic 	rte_cryptodev_sym_session_free(env.sess);
496*cd255ccfSMarko Kovacevic 	env.sess = NULL;
497*cd255ccfSMarko Kovacevic 
498*cd255ccfSMarko Kovacevic 	return ret;
499*cd255ccfSMarko Kovacevic }
500*cd255ccfSMarko Kovacevic 
501*cd255ccfSMarko Kovacevic static int
502*cd255ccfSMarko Kovacevic fips_generic_test(void)
503*cd255ccfSMarko Kovacevic {
504*cd255ccfSMarko Kovacevic 	struct fips_val val;
505*cd255ccfSMarko Kovacevic 	int ret;
506*cd255ccfSMarko Kovacevic 
507*cd255ccfSMarko Kovacevic 	fips_test_write_one_case();
508*cd255ccfSMarko Kovacevic 
509*cd255ccfSMarko Kovacevic 	ret = fips_run_test();
510*cd255ccfSMarko Kovacevic 	if (ret < 0) {
511*cd255ccfSMarko Kovacevic 		if (ret == -EPERM) {
512*cd255ccfSMarko Kovacevic 			fprintf(info.fp_wr, "Bypass\n\n");
513*cd255ccfSMarko Kovacevic 			return 0;
514*cd255ccfSMarko Kovacevic 		}
515*cd255ccfSMarko Kovacevic 
516*cd255ccfSMarko Kovacevic 		return ret;
517*cd255ccfSMarko Kovacevic 	}
518*cd255ccfSMarko Kovacevic 
519*cd255ccfSMarko Kovacevic 	get_writeback_data(&val);
520*cd255ccfSMarko Kovacevic 
521*cd255ccfSMarko Kovacevic 	switch (info.file_type) {
522*cd255ccfSMarko Kovacevic 	case FIPS_TYPE_REQ:
523*cd255ccfSMarko Kovacevic 	case FIPS_TYPE_RSP:
524*cd255ccfSMarko Kovacevic 		if (info.parse_writeback == NULL)
525*cd255ccfSMarko Kovacevic 			return -EPERM;
526*cd255ccfSMarko Kovacevic 		ret = info.parse_writeback(&val);
527*cd255ccfSMarko Kovacevic 		if (ret < 0)
528*cd255ccfSMarko Kovacevic 			return ret;
529*cd255ccfSMarko Kovacevic 		break;
530*cd255ccfSMarko Kovacevic 	case FIPS_TYPE_FAX:
531*cd255ccfSMarko Kovacevic 		if (info.kat_check == NULL)
532*cd255ccfSMarko Kovacevic 			return -EPERM;
533*cd255ccfSMarko Kovacevic 		ret = info.kat_check(&val);
534*cd255ccfSMarko Kovacevic 		if (ret < 0)
535*cd255ccfSMarko Kovacevic 			return ret;
536*cd255ccfSMarko Kovacevic 		break;
537*cd255ccfSMarko Kovacevic 	}
538*cd255ccfSMarko Kovacevic 
539*cd255ccfSMarko Kovacevic 	fprintf(info.fp_wr, "\n");
540*cd255ccfSMarko Kovacevic 
541*cd255ccfSMarko Kovacevic 	return 0;
542*cd255ccfSMarko Kovacevic }
543*cd255ccfSMarko Kovacevic 
544*cd255ccfSMarko Kovacevic static int
545*cd255ccfSMarko Kovacevic fips_mct_aes_test(void)
546*cd255ccfSMarko Kovacevic {
547*cd255ccfSMarko Kovacevic #define AES_BLOCK_SIZE	16
548*cd255ccfSMarko Kovacevic #define AES_EXTERN_ITER	100
549*cd255ccfSMarko Kovacevic #define AES_INTERN_ITER	1000
550*cd255ccfSMarko Kovacevic 	struct fips_val val, val_key;
551*cd255ccfSMarko Kovacevic 	uint8_t prev_out[AES_BLOCK_SIZE] = {0};
552*cd255ccfSMarko Kovacevic 	uint8_t prev_in[AES_BLOCK_SIZE] = {0};
553*cd255ccfSMarko Kovacevic 	uint32_t i, j, k;
554*cd255ccfSMarko Kovacevic 	int ret;
555*cd255ccfSMarko Kovacevic 
556*cd255ccfSMarko Kovacevic 	for (i = 0; i < AES_EXTERN_ITER; i++) {
557*cd255ccfSMarko Kovacevic 		if (i != 0)
558*cd255ccfSMarko Kovacevic 			update_info_vec(i);
559*cd255ccfSMarko Kovacevic 
560*cd255ccfSMarko Kovacevic 		fips_test_write_one_case();
561*cd255ccfSMarko Kovacevic 
562*cd255ccfSMarko Kovacevic 		for (j = 0; j < AES_INTERN_ITER; j++) {
563*cd255ccfSMarko Kovacevic 			ret = fips_run_test();
564*cd255ccfSMarko Kovacevic 			if (ret < 0) {
565*cd255ccfSMarko Kovacevic 				if (ret == -EPERM) {
566*cd255ccfSMarko Kovacevic 					fprintf(info.fp_wr, "Bypass\n");
567*cd255ccfSMarko Kovacevic 					return 0;
568*cd255ccfSMarko Kovacevic 				}
569*cd255ccfSMarko Kovacevic 
570*cd255ccfSMarko Kovacevic 				return ret;
571*cd255ccfSMarko Kovacevic 			}
572*cd255ccfSMarko Kovacevic 
573*cd255ccfSMarko Kovacevic 			get_writeback_data(&val);
574*cd255ccfSMarko Kovacevic 
575*cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
576*cd255ccfSMarko Kovacevic 				memcpy(prev_in, vec.ct.val, AES_BLOCK_SIZE);
577*cd255ccfSMarko Kovacevic 
578*cd255ccfSMarko Kovacevic 			if (j == 0) {
579*cd255ccfSMarko Kovacevic 				memcpy(prev_out, val.val, AES_BLOCK_SIZE);
580*cd255ccfSMarko Kovacevic 
581*cd255ccfSMarko Kovacevic 				if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
582*cd255ccfSMarko Kovacevic 					memcpy(vec.pt.val, vec.iv.val,
583*cd255ccfSMarko Kovacevic 							AES_BLOCK_SIZE);
584*cd255ccfSMarko Kovacevic 					memcpy(vec.iv.val, val.val,
585*cd255ccfSMarko Kovacevic 							AES_BLOCK_SIZE);
586*cd255ccfSMarko Kovacevic 				} else {
587*cd255ccfSMarko Kovacevic 					memcpy(vec.ct.val, vec.iv.val,
588*cd255ccfSMarko Kovacevic 							AES_BLOCK_SIZE);
589*cd255ccfSMarko Kovacevic 					memcpy(vec.iv.val, prev_in,
590*cd255ccfSMarko Kovacevic 							AES_BLOCK_SIZE);
591*cd255ccfSMarko Kovacevic 				}
592*cd255ccfSMarko Kovacevic 				continue;
593*cd255ccfSMarko Kovacevic 			}
594*cd255ccfSMarko Kovacevic 
595*cd255ccfSMarko Kovacevic 			if (info.op == FIPS_TEST_ENC_AUTH_GEN) {
596*cd255ccfSMarko Kovacevic 				memcpy(vec.iv.val, val.val, AES_BLOCK_SIZE);
597*cd255ccfSMarko Kovacevic 				memcpy(vec.pt.val, prev_out, AES_BLOCK_SIZE);
598*cd255ccfSMarko Kovacevic 			} else {
599*cd255ccfSMarko Kovacevic 				memcpy(vec.iv.val, prev_in, AES_BLOCK_SIZE);
600*cd255ccfSMarko Kovacevic 				memcpy(vec.ct.val, prev_out, AES_BLOCK_SIZE);
601*cd255ccfSMarko Kovacevic 			}
602*cd255ccfSMarko Kovacevic 
603*cd255ccfSMarko Kovacevic 			if (j == AES_INTERN_ITER - 1)
604*cd255ccfSMarko Kovacevic 				continue;
605*cd255ccfSMarko Kovacevic 
606*cd255ccfSMarko Kovacevic 			memcpy(prev_out, val.val, AES_BLOCK_SIZE);
607*cd255ccfSMarko Kovacevic 		}
608*cd255ccfSMarko Kovacevic 
609*cd255ccfSMarko Kovacevic 		info.parse_writeback(&val);
610*cd255ccfSMarko Kovacevic 		fprintf(info.fp_wr, "\n");
611*cd255ccfSMarko Kovacevic 
612*cd255ccfSMarko Kovacevic 		if (i == AES_EXTERN_ITER - 1)
613*cd255ccfSMarko Kovacevic 			continue;
614*cd255ccfSMarko Kovacevic 
615*cd255ccfSMarko Kovacevic 		/** update key */
616*cd255ccfSMarko Kovacevic 		memcpy(&val_key, &vec.cipher_auth.key, sizeof(val_key));
617*cd255ccfSMarko Kovacevic 		for (k = 0; k < vec.cipher_auth.key.len; k++) {
618*cd255ccfSMarko Kovacevic 			switch (vec.cipher_auth.key.len) {
619*cd255ccfSMarko Kovacevic 			case 16:
620*cd255ccfSMarko Kovacevic 				val_key.val[k] ^= val.val[k];
621*cd255ccfSMarko Kovacevic 				break;
622*cd255ccfSMarko Kovacevic 			case 24:
623*cd255ccfSMarko Kovacevic 				if (k < 8)
624*cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k + 8];
625*cd255ccfSMarko Kovacevic 				else
626*cd255ccfSMarko Kovacevic 					val_key.val[k] ^= val.val[k - 8];
627*cd255ccfSMarko Kovacevic 				break;
628*cd255ccfSMarko Kovacevic 			case 32:
629*cd255ccfSMarko Kovacevic 				if (k < 16)
630*cd255ccfSMarko Kovacevic 					val_key.val[k] ^= prev_out[k];
631*cd255ccfSMarko Kovacevic 				else
632*cd255ccfSMarko Kovacevic 					val_key.val[k] ^= val.val[k - 16];
633*cd255ccfSMarko Kovacevic 				break;
634*cd255ccfSMarko Kovacevic 			default:
635*cd255ccfSMarko Kovacevic 				return -1;
636*cd255ccfSMarko Kovacevic 			}
637*cd255ccfSMarko Kovacevic 		}
638*cd255ccfSMarko Kovacevic 
639*cd255ccfSMarko Kovacevic 		if (info.op == FIPS_TEST_DEC_AUTH_VERIF)
640*cd255ccfSMarko Kovacevic 			memcpy(vec.iv.val, val.val, AES_BLOCK_SIZE);
641*cd255ccfSMarko Kovacevic 	}
642*cd255ccfSMarko Kovacevic 
643*cd255ccfSMarko Kovacevic 	return 0;
644*cd255ccfSMarko Kovacevic }
645*cd255ccfSMarko Kovacevic 
646*cd255ccfSMarko Kovacevic static int
647*cd255ccfSMarko Kovacevic init_test_ops(void)
648*cd255ccfSMarko Kovacevic {
649*cd255ccfSMarko Kovacevic 	switch (info.algo) {
650*cd255ccfSMarko Kovacevic 	case FIPS_TEST_ALGO_AES:
651*cd255ccfSMarko Kovacevic 		test_ops.prepare_op = prepare_cipher_op;
652*cd255ccfSMarko Kovacevic 		test_ops.prepare_xform  = prepare_aes_xform;
653*cd255ccfSMarko Kovacevic 		if (info.interim_info.aes_data.test_type == AESAVS_TYPE_MCT)
654*cd255ccfSMarko Kovacevic 			test_ops.test = fips_mct_aes_test;
655*cd255ccfSMarko Kovacevic 		else
656*cd255ccfSMarko Kovacevic 			test_ops.test = fips_generic_test;
657*cd255ccfSMarko Kovacevic 		break;
658*cd255ccfSMarko Kovacevic 
659*cd255ccfSMarko Kovacevic 	default:
660*cd255ccfSMarko Kovacevic 		return -1;
661*cd255ccfSMarko Kovacevic 	}
662*cd255ccfSMarko Kovacevic 
663*cd255ccfSMarko Kovacevic 	return 0;
664*cd255ccfSMarko Kovacevic }
665*cd255ccfSMarko Kovacevic 
6663d0fad56SMarko Kovacevic static void
6673d0fad56SMarko Kovacevic print_test_block(void)
6683d0fad56SMarko Kovacevic {
6693d0fad56SMarko Kovacevic 	uint32_t i;
6703d0fad56SMarko Kovacevic 
6713d0fad56SMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++)
6723d0fad56SMarko Kovacevic 		printf("%s\n", info.vec[i]);
6733d0fad56SMarko Kovacevic 
6743d0fad56SMarko Kovacevic 	printf("\n");
6753d0fad56SMarko Kovacevic }
6763d0fad56SMarko Kovacevic 
6773d0fad56SMarko Kovacevic static int
6783d0fad56SMarko Kovacevic fips_test_one_file(void)
6793d0fad56SMarko Kovacevic {
6803d0fad56SMarko Kovacevic 	int fetch_ret = 0, ret;
6813d0fad56SMarko Kovacevic 
682*cd255ccfSMarko Kovacevic 
683*cd255ccfSMarko Kovacevic 	ret = init_test_ops();
684*cd255ccfSMarko Kovacevic 	if (ret < 0) {
685*cd255ccfSMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Init test op\n", ret);
686*cd255ccfSMarko Kovacevic 		return ret;
687*cd255ccfSMarko Kovacevic 	}
688*cd255ccfSMarko Kovacevic 
689*cd255ccfSMarko Kovacevic 	while (ret >= 0 && fetch_ret == 0) {
6903d0fad56SMarko Kovacevic 		fetch_ret = fips_test_fetch_one_block();
6913d0fad56SMarko Kovacevic 		if (fetch_ret < 0) {
6923d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Fetch block\n",
6933d0fad56SMarko Kovacevic 					fetch_ret);
6943d0fad56SMarko Kovacevic 			ret = fetch_ret;
6953d0fad56SMarko Kovacevic 			goto error_one_case;
6963d0fad56SMarko Kovacevic 		}
6973d0fad56SMarko Kovacevic 
6983d0fad56SMarko Kovacevic 		if (info.nb_vec_lines == 0) {
6993d0fad56SMarko Kovacevic 			if (fetch_ret == -EOF)
7003d0fad56SMarko Kovacevic 				break;
7013d0fad56SMarko Kovacevic 
7023d0fad56SMarko Kovacevic 			fprintf(info.fp_wr, "\n");
7033d0fad56SMarko Kovacevic 			continue;
7043d0fad56SMarko Kovacevic 		}
7053d0fad56SMarko Kovacevic 
7063d0fad56SMarko Kovacevic 		ret = fips_test_parse_one_case();
7073d0fad56SMarko Kovacevic 		switch (ret) {
7083d0fad56SMarko Kovacevic 		case 0:
709*cd255ccfSMarko Kovacevic 			ret = test_ops.test();
7103d0fad56SMarko Kovacevic 			if (ret == 0)
7113d0fad56SMarko Kovacevic 				break;
7123d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: test block\n",
7133d0fad56SMarko Kovacevic 					ret);
7143d0fad56SMarko Kovacevic 			goto error_one_case;
7153d0fad56SMarko Kovacevic 		case 1:
7163d0fad56SMarko Kovacevic 			break;
7173d0fad56SMarko Kovacevic 		default:
7183d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
7193d0fad56SMarko Kovacevic 					ret);
7203d0fad56SMarko Kovacevic 			goto error_one_case;
7213d0fad56SMarko Kovacevic 		}
7223d0fad56SMarko Kovacevic 
7233d0fad56SMarko Kovacevic 		continue;
7243d0fad56SMarko Kovacevic error_one_case:
7253d0fad56SMarko Kovacevic 		print_test_block();
7263d0fad56SMarko Kovacevic 	}
7273d0fad56SMarko Kovacevic 
7283d0fad56SMarko Kovacevic 	fips_test_clear();
7293d0fad56SMarko Kovacevic 
730*cd255ccfSMarko Kovacevic 	return ret;
731*cd255ccfSMarko Kovacevic 
7323d0fad56SMarko Kovacevic }
733