xref: /dpdk/examples/fips_validation/main.c (revision 3d0fad56b74a02fe6c1bb2b3ee752646c34cfbc5)
1*3d0fad56SMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause
2*3d0fad56SMarko Kovacevic  * Copyright(c) 2018 Intel Corporation
3*3d0fad56SMarko Kovacevic  */
4*3d0fad56SMarko Kovacevic 
5*3d0fad56SMarko Kovacevic #include <sys/stat.h>
6*3d0fad56SMarko Kovacevic #include <getopt.h>
7*3d0fad56SMarko Kovacevic #include <dirent.h>
8*3d0fad56SMarko Kovacevic 
9*3d0fad56SMarko Kovacevic #include <rte_cryptodev.h>
10*3d0fad56SMarko Kovacevic #include <rte_cryptodev_pmd.h>
11*3d0fad56SMarko Kovacevic #include <rte_mempool.h>
12*3d0fad56SMarko Kovacevic #include <rte_mbuf.h>
13*3d0fad56SMarko Kovacevic #include <rte_string_fns.h>
14*3d0fad56SMarko Kovacevic 
15*3d0fad56SMarko Kovacevic #include "fips_validation.h"
16*3d0fad56SMarko Kovacevic 
17*3d0fad56SMarko Kovacevic #define REQ_FILE_PATH_KEYWORD	"req-file"
18*3d0fad56SMarko Kovacevic #define RSP_FILE_PATH_KEYWORD	"rsp-file"
19*3d0fad56SMarko Kovacevic #define FOLDER_KEYWORD		"path-is-folder"
20*3d0fad56SMarko Kovacevic #define CRYPTODEV_KEYWORD	"cryptodev"
21*3d0fad56SMarko Kovacevic #define CRYPTODEV_ID_KEYWORD	"cryptodev-id"
22*3d0fad56SMarko Kovacevic 
23*3d0fad56SMarko Kovacevic struct fips_test_vector vec;
24*3d0fad56SMarko Kovacevic struct fips_test_interim_info info;
25*3d0fad56SMarko Kovacevic 
26*3d0fad56SMarko Kovacevic struct cryptodev_fips_validate_env {
27*3d0fad56SMarko Kovacevic 	const char *req_path;
28*3d0fad56SMarko Kovacevic 	const char *rsp_path;
29*3d0fad56SMarko Kovacevic 	uint32_t is_path_folder;
30*3d0fad56SMarko Kovacevic 	uint32_t dev_id;
31*3d0fad56SMarko Kovacevic 	struct rte_mempool *mpool;
32*3d0fad56SMarko Kovacevic 	struct rte_mempool *op_pool;
33*3d0fad56SMarko Kovacevic 	struct rte_mbuf *mbuf;
34*3d0fad56SMarko Kovacevic 	struct rte_crypto_op *op;
35*3d0fad56SMarko Kovacevic 	struct rte_cryptodev_sym_session *sess;
36*3d0fad56SMarko Kovacevic } env;
37*3d0fad56SMarko Kovacevic 
38*3d0fad56SMarko Kovacevic static int
39*3d0fad56SMarko Kovacevic cryptodev_fips_validate_app_int(void)
40*3d0fad56SMarko Kovacevic {
41*3d0fad56SMarko Kovacevic 	struct rte_cryptodev_config conf = {rte_socket_id(), 1};
42*3d0fad56SMarko Kovacevic 	struct rte_cryptodev_qp_conf qp_conf = {128};
43*3d0fad56SMarko Kovacevic 	int ret;
44*3d0fad56SMarko Kovacevic 
45*3d0fad56SMarko Kovacevic 	ret = rte_cryptodev_configure(env.dev_id, &conf);
46*3d0fad56SMarko Kovacevic 	if (ret < 0)
47*3d0fad56SMarko Kovacevic 		return ret;
48*3d0fad56SMarko Kovacevic 
49*3d0fad56SMarko Kovacevic 	env.mpool = rte_pktmbuf_pool_create("FIPS_MEMPOOL", 128, 0, 0,
50*3d0fad56SMarko Kovacevic 			UINT16_MAX, rte_socket_id());
51*3d0fad56SMarko Kovacevic 	if (!env.mpool)
52*3d0fad56SMarko Kovacevic 		return ret;
53*3d0fad56SMarko Kovacevic 
54*3d0fad56SMarko Kovacevic 	ret = rte_cryptodev_queue_pair_setup(env.dev_id, 0, &qp_conf,
55*3d0fad56SMarko Kovacevic 			rte_socket_id(), env.mpool);
56*3d0fad56SMarko Kovacevic 	if (ret < 0)
57*3d0fad56SMarko Kovacevic 		return ret;
58*3d0fad56SMarko Kovacevic 
59*3d0fad56SMarko Kovacevic 	ret = -ENOMEM;
60*3d0fad56SMarko Kovacevic 
61*3d0fad56SMarko Kovacevic 	env.op_pool = rte_crypto_op_pool_create(
62*3d0fad56SMarko Kovacevic 			"FIPS_OP_POOL",
63*3d0fad56SMarko Kovacevic 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
64*3d0fad56SMarko Kovacevic 			1, 0,
65*3d0fad56SMarko Kovacevic 			16,
66*3d0fad56SMarko Kovacevic 			rte_socket_id());
67*3d0fad56SMarko Kovacevic 	if (!env.op_pool)
68*3d0fad56SMarko Kovacevic 		goto error_exit;
69*3d0fad56SMarko Kovacevic 
70*3d0fad56SMarko Kovacevic 	env.mbuf = rte_pktmbuf_alloc(env.mpool);
71*3d0fad56SMarko Kovacevic 	if (!env.mbuf)
72*3d0fad56SMarko Kovacevic 		goto error_exit;
73*3d0fad56SMarko Kovacevic 
74*3d0fad56SMarko Kovacevic 	env.op = rte_crypto_op_alloc(env.op_pool, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
75*3d0fad56SMarko Kovacevic 	if (!env.op)
76*3d0fad56SMarko Kovacevic 		goto error_exit;
77*3d0fad56SMarko Kovacevic 
78*3d0fad56SMarko Kovacevic 	return 0;
79*3d0fad56SMarko Kovacevic 
80*3d0fad56SMarko Kovacevic error_exit:
81*3d0fad56SMarko Kovacevic 	rte_mempool_free(env.mpool);
82*3d0fad56SMarko Kovacevic 	if (env.op_pool)
83*3d0fad56SMarko Kovacevic 		rte_mempool_free(env.op_pool);
84*3d0fad56SMarko Kovacevic 
85*3d0fad56SMarko Kovacevic 	return ret;
86*3d0fad56SMarko Kovacevic }
87*3d0fad56SMarko Kovacevic 
88*3d0fad56SMarko Kovacevic static void
89*3d0fad56SMarko Kovacevic cryptodev_fips_validate_app_uninit(void)
90*3d0fad56SMarko Kovacevic {
91*3d0fad56SMarko Kovacevic 	rte_pktmbuf_free(env.mbuf);
92*3d0fad56SMarko Kovacevic 	rte_crypto_op_free(env.op);
93*3d0fad56SMarko Kovacevic 	rte_cryptodev_sym_session_clear(env.dev_id, env.sess);
94*3d0fad56SMarko Kovacevic 	rte_cryptodev_sym_session_free(env.sess);
95*3d0fad56SMarko Kovacevic 	rte_mempool_free(env.mpool);
96*3d0fad56SMarko Kovacevic 	rte_mempool_free(env.op_pool);
97*3d0fad56SMarko Kovacevic }
98*3d0fad56SMarko Kovacevic 
99*3d0fad56SMarko Kovacevic static int
100*3d0fad56SMarko Kovacevic fips_test_one_file(void);
101*3d0fad56SMarko Kovacevic 
102*3d0fad56SMarko Kovacevic static int
103*3d0fad56SMarko Kovacevic parse_cryptodev_arg(char *arg)
104*3d0fad56SMarko Kovacevic {
105*3d0fad56SMarko Kovacevic 	int id = rte_cryptodev_get_dev_id(arg);
106*3d0fad56SMarko Kovacevic 
107*3d0fad56SMarko Kovacevic 	if (id < 0) {
108*3d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev name %s\n",
109*3d0fad56SMarko Kovacevic 				id, arg);
110*3d0fad56SMarko Kovacevic 		return id;
111*3d0fad56SMarko Kovacevic 	}
112*3d0fad56SMarko Kovacevic 
113*3d0fad56SMarko Kovacevic 	env.dev_id = (uint32_t)id;
114*3d0fad56SMarko Kovacevic 
115*3d0fad56SMarko Kovacevic 	return 0;
116*3d0fad56SMarko Kovacevic }
117*3d0fad56SMarko Kovacevic 
118*3d0fad56SMarko Kovacevic static int
119*3d0fad56SMarko Kovacevic parse_cryptodev_id_arg(char *arg)
120*3d0fad56SMarko Kovacevic {
121*3d0fad56SMarko Kovacevic 	uint32_t cryptodev_id;
122*3d0fad56SMarko Kovacevic 
123*3d0fad56SMarko Kovacevic 	if (parser_read_uint32(&cryptodev_id, arg) < 0) {
124*3d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
125*3d0fad56SMarko Kovacevic 				-EINVAL, arg);
126*3d0fad56SMarko Kovacevic 		return -1;
127*3d0fad56SMarko Kovacevic 	}
128*3d0fad56SMarko Kovacevic 
129*3d0fad56SMarko Kovacevic 
130*3d0fad56SMarko Kovacevic 	if (!rte_cryptodev_pmd_is_valid_dev(cryptodev_id)) {
131*3d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: invalid cryptodev id %s\n",
132*3d0fad56SMarko Kovacevic 				cryptodev_id, arg);
133*3d0fad56SMarko Kovacevic 		return -1;
134*3d0fad56SMarko Kovacevic 	}
135*3d0fad56SMarko Kovacevic 
136*3d0fad56SMarko Kovacevic 	env.dev_id = (uint32_t)cryptodev_id;
137*3d0fad56SMarko Kovacevic 
138*3d0fad56SMarko Kovacevic 	return 0;
139*3d0fad56SMarko Kovacevic }
140*3d0fad56SMarko Kovacevic 
141*3d0fad56SMarko Kovacevic static void
142*3d0fad56SMarko Kovacevic cryptodev_fips_validate_usage(const char *prgname)
143*3d0fad56SMarko Kovacevic {
144*3d0fad56SMarko Kovacevic 	printf("%s [EAL options] --\n"
145*3d0fad56SMarko Kovacevic 		"  --%s: REQUEST-FILE-PATH\n"
146*3d0fad56SMarko Kovacevic 		"  --%s: RESPONSE-FILE-PATH\n"
147*3d0fad56SMarko Kovacevic 		"  --%s: indicating both paths are folders\n"
148*3d0fad56SMarko Kovacevic 		"  --%s: CRYPTODEV-NAME\n"
149*3d0fad56SMarko Kovacevic 		"  --%s: CRYPTODEV-ID-NAME\n",
150*3d0fad56SMarko Kovacevic 		prgname, REQ_FILE_PATH_KEYWORD, RSP_FILE_PATH_KEYWORD,
151*3d0fad56SMarko Kovacevic 		FOLDER_KEYWORD, CRYPTODEV_KEYWORD, CRYPTODEV_ID_KEYWORD);
152*3d0fad56SMarko Kovacevic }
153*3d0fad56SMarko Kovacevic 
154*3d0fad56SMarko Kovacevic static int
155*3d0fad56SMarko Kovacevic cryptodev_fips_validate_parse_args(int argc, char **argv)
156*3d0fad56SMarko Kovacevic {
157*3d0fad56SMarko Kovacevic 	int opt, ret;
158*3d0fad56SMarko Kovacevic 	char *prgname = argv[0];
159*3d0fad56SMarko Kovacevic 	char **argvopt;
160*3d0fad56SMarko Kovacevic 	int option_index;
161*3d0fad56SMarko Kovacevic 	struct option lgopts[] = {
162*3d0fad56SMarko Kovacevic 			{REQ_FILE_PATH_KEYWORD, required_argument, 0, 0},
163*3d0fad56SMarko Kovacevic 			{RSP_FILE_PATH_KEYWORD, required_argument, 0, 0},
164*3d0fad56SMarko Kovacevic 			{FOLDER_KEYWORD, no_argument, 0, 0},
165*3d0fad56SMarko Kovacevic 			{CRYPTODEV_KEYWORD, required_argument, 0, 0},
166*3d0fad56SMarko Kovacevic 			{CRYPTODEV_ID_KEYWORD, required_argument, 0, 0},
167*3d0fad56SMarko Kovacevic 			{NULL, 0, 0, 0}
168*3d0fad56SMarko Kovacevic 	};
169*3d0fad56SMarko Kovacevic 
170*3d0fad56SMarko Kovacevic 	argvopt = argv;
171*3d0fad56SMarko Kovacevic 
172*3d0fad56SMarko Kovacevic 	while ((opt = getopt_long(argc, argvopt, "s:",
173*3d0fad56SMarko Kovacevic 				  lgopts, &option_index)) != EOF) {
174*3d0fad56SMarko Kovacevic 
175*3d0fad56SMarko Kovacevic 		switch (opt) {
176*3d0fad56SMarko Kovacevic 		case 0:
177*3d0fad56SMarko Kovacevic 			if (strcmp(lgopts[option_index].name,
178*3d0fad56SMarko Kovacevic 					REQ_FILE_PATH_KEYWORD) == 0)
179*3d0fad56SMarko Kovacevic 				env.req_path = optarg;
180*3d0fad56SMarko Kovacevic 			else if (strcmp(lgopts[option_index].name,
181*3d0fad56SMarko Kovacevic 					RSP_FILE_PATH_KEYWORD) == 0)
182*3d0fad56SMarko Kovacevic 				env.rsp_path = optarg;
183*3d0fad56SMarko Kovacevic 			else if (strcmp(lgopts[option_index].name,
184*3d0fad56SMarko Kovacevic 					FOLDER_KEYWORD) == 0)
185*3d0fad56SMarko Kovacevic 				env.is_path_folder = 1;
186*3d0fad56SMarko Kovacevic 			else if (strcmp(lgopts[option_index].name,
187*3d0fad56SMarko Kovacevic 					CRYPTODEV_KEYWORD) == 0) {
188*3d0fad56SMarko Kovacevic 				ret = parse_cryptodev_arg(optarg);
189*3d0fad56SMarko Kovacevic 				if (ret < 0) {
190*3d0fad56SMarko Kovacevic 					cryptodev_fips_validate_usage(prgname);
191*3d0fad56SMarko Kovacevic 					return -EINVAL;
192*3d0fad56SMarko Kovacevic 				}
193*3d0fad56SMarko Kovacevic 			} else if (strcmp(lgopts[option_index].name,
194*3d0fad56SMarko Kovacevic 					CRYPTODEV_ID_KEYWORD) == 0) {
195*3d0fad56SMarko Kovacevic 				ret = parse_cryptodev_id_arg(optarg);
196*3d0fad56SMarko Kovacevic 				if (ret < 0) {
197*3d0fad56SMarko Kovacevic 					cryptodev_fips_validate_usage(prgname);
198*3d0fad56SMarko Kovacevic 					return -EINVAL;
199*3d0fad56SMarko Kovacevic 				}
200*3d0fad56SMarko Kovacevic 			} else {
201*3d0fad56SMarko Kovacevic 				cryptodev_fips_validate_usage(prgname);
202*3d0fad56SMarko Kovacevic 				return -EINVAL;
203*3d0fad56SMarko Kovacevic 			}
204*3d0fad56SMarko Kovacevic 			break;
205*3d0fad56SMarko Kovacevic 		default:
206*3d0fad56SMarko Kovacevic 			return -1;
207*3d0fad56SMarko Kovacevic 		}
208*3d0fad56SMarko Kovacevic 	}
209*3d0fad56SMarko Kovacevic 
210*3d0fad56SMarko Kovacevic 	if (env.req_path == NULL || env.rsp_path == NULL ||
211*3d0fad56SMarko Kovacevic 			env.dev_id == UINT32_MAX) {
212*3d0fad56SMarko Kovacevic 		cryptodev_fips_validate_usage(prgname);
213*3d0fad56SMarko Kovacevic 		return -EINVAL;
214*3d0fad56SMarko Kovacevic 	}
215*3d0fad56SMarko Kovacevic 
216*3d0fad56SMarko Kovacevic 	return 0;
217*3d0fad56SMarko Kovacevic }
218*3d0fad56SMarko Kovacevic 
219*3d0fad56SMarko Kovacevic int
220*3d0fad56SMarko Kovacevic main(int argc, char *argv[])
221*3d0fad56SMarko Kovacevic {
222*3d0fad56SMarko Kovacevic 	int ret;
223*3d0fad56SMarko Kovacevic 
224*3d0fad56SMarko Kovacevic 	ret = rte_eal_init(argc, argv);
225*3d0fad56SMarko Kovacevic 	if (ret < 0) {
226*3d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
227*3d0fad56SMarko Kovacevic 		return -1;
228*3d0fad56SMarko Kovacevic 	}
229*3d0fad56SMarko Kovacevic 
230*3d0fad56SMarko Kovacevic 	argc -= ret;
231*3d0fad56SMarko Kovacevic 	argv += ret;
232*3d0fad56SMarko Kovacevic 
233*3d0fad56SMarko Kovacevic 	ret = cryptodev_fips_validate_parse_args(argc, argv);
234*3d0fad56SMarko Kovacevic 	if (ret < 0)
235*3d0fad56SMarko Kovacevic 		rte_exit(EXIT_FAILURE, "Failed to parse arguments!\n");
236*3d0fad56SMarko Kovacevic 
237*3d0fad56SMarko Kovacevic 	ret = cryptodev_fips_validate_app_int();
238*3d0fad56SMarko Kovacevic 	if (ret < 0) {
239*3d0fad56SMarko Kovacevic 		RTE_LOG(ERR, USER1, "Error %i: Failed init\n", ret);
240*3d0fad56SMarko Kovacevic 		return -1;
241*3d0fad56SMarko Kovacevic 	}
242*3d0fad56SMarko Kovacevic 
243*3d0fad56SMarko Kovacevic 	if (!env.is_path_folder) {
244*3d0fad56SMarko Kovacevic 		printf("Processing file %s... ", env.req_path);
245*3d0fad56SMarko Kovacevic 
246*3d0fad56SMarko Kovacevic 		ret = fips_test_init(env.req_path, env.rsp_path,
247*3d0fad56SMarko Kovacevic 			rte_cryptodev_name_get(env.dev_id));
248*3d0fad56SMarko Kovacevic 		if (ret < 0) {
249*3d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
250*3d0fad56SMarko Kovacevic 					ret, env.req_path);
251*3d0fad56SMarko Kovacevic 			goto exit;
252*3d0fad56SMarko Kovacevic 		}
253*3d0fad56SMarko Kovacevic 
254*3d0fad56SMarko Kovacevic 
255*3d0fad56SMarko Kovacevic 		ret = fips_test_one_file();
256*3d0fad56SMarko Kovacevic 		if (ret < 0) {
257*3d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
258*3d0fad56SMarko Kovacevic 					ret, env.req_path);
259*3d0fad56SMarko Kovacevic 			goto exit;
260*3d0fad56SMarko Kovacevic 		}
261*3d0fad56SMarko Kovacevic 
262*3d0fad56SMarko Kovacevic 		printf("Done\n");
263*3d0fad56SMarko Kovacevic 
264*3d0fad56SMarko Kovacevic 	} else {
265*3d0fad56SMarko Kovacevic 		struct dirent *dir;
266*3d0fad56SMarko Kovacevic 		DIR *d_req, *d_rsp;
267*3d0fad56SMarko Kovacevic 		char req_path[1024];
268*3d0fad56SMarko Kovacevic 		char rsp_path[1024];
269*3d0fad56SMarko Kovacevic 
270*3d0fad56SMarko Kovacevic 		d_req = opendir(env.req_path);
271*3d0fad56SMarko Kovacevic 		if (!d_req) {
272*3d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Path %s not exist\n",
273*3d0fad56SMarko Kovacevic 					-EINVAL, env.req_path);
274*3d0fad56SMarko Kovacevic 			goto exit;
275*3d0fad56SMarko Kovacevic 		}
276*3d0fad56SMarko Kovacevic 
277*3d0fad56SMarko Kovacevic 		d_rsp = opendir(env.rsp_path);
278*3d0fad56SMarko Kovacevic 		if (!d_rsp) {
279*3d0fad56SMarko Kovacevic 			ret = mkdir(env.rsp_path, 0700);
280*3d0fad56SMarko Kovacevic 			if (ret == 0)
281*3d0fad56SMarko Kovacevic 				d_rsp = opendir(env.rsp_path);
282*3d0fad56SMarko Kovacevic 			else {
283*3d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Invalid %s\n",
284*3d0fad56SMarko Kovacevic 						-EINVAL, env.rsp_path);
285*3d0fad56SMarko Kovacevic 				goto exit;
286*3d0fad56SMarko Kovacevic 			}
287*3d0fad56SMarko Kovacevic 		}
288*3d0fad56SMarko Kovacevic 		closedir(d_rsp);
289*3d0fad56SMarko Kovacevic 
290*3d0fad56SMarko Kovacevic 		while ((dir = readdir(d_req)) != NULL) {
291*3d0fad56SMarko Kovacevic 			if (strstr(dir->d_name, "req") == NULL)
292*3d0fad56SMarko Kovacevic 				continue;
293*3d0fad56SMarko Kovacevic 
294*3d0fad56SMarko Kovacevic 			snprintf(req_path, 1023, "%s/%s", env.req_path,
295*3d0fad56SMarko Kovacevic 					dir->d_name);
296*3d0fad56SMarko Kovacevic 			snprintf(rsp_path, 1023, "%s/%s", env.rsp_path,
297*3d0fad56SMarko Kovacevic 					dir->d_name);
298*3d0fad56SMarko Kovacevic 			strlcpy(strstr(rsp_path, "req"), "rsp", 4);
299*3d0fad56SMarko Kovacevic 
300*3d0fad56SMarko Kovacevic 			printf("Processing file %s... ", req_path);
301*3d0fad56SMarko Kovacevic 
302*3d0fad56SMarko Kovacevic 			ret = fips_test_init(req_path, rsp_path,
303*3d0fad56SMarko Kovacevic 			rte_cryptodev_name_get(env.dev_id));
304*3d0fad56SMarko Kovacevic 			if (ret < 0) {
305*3d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
306*3d0fad56SMarko Kovacevic 						ret, req_path);
307*3d0fad56SMarko Kovacevic 				break;
308*3d0fad56SMarko Kovacevic 			}
309*3d0fad56SMarko Kovacevic 
310*3d0fad56SMarko Kovacevic 			ret = fips_test_one_file();
311*3d0fad56SMarko Kovacevic 			if (ret < 0) {
312*3d0fad56SMarko Kovacevic 				RTE_LOG(ERR, USER1, "Error %i: Failed test %s\n",
313*3d0fad56SMarko Kovacevic 						ret, req_path);
314*3d0fad56SMarko Kovacevic 				break;
315*3d0fad56SMarko Kovacevic 			}
316*3d0fad56SMarko Kovacevic 
317*3d0fad56SMarko Kovacevic 			printf("Done\n");
318*3d0fad56SMarko Kovacevic 		}
319*3d0fad56SMarko Kovacevic 
320*3d0fad56SMarko Kovacevic 		closedir(d_req);
321*3d0fad56SMarko Kovacevic 	}
322*3d0fad56SMarko Kovacevic 
323*3d0fad56SMarko Kovacevic 
324*3d0fad56SMarko Kovacevic exit:
325*3d0fad56SMarko Kovacevic 	fips_test_clear();
326*3d0fad56SMarko Kovacevic 	cryptodev_fips_validate_app_uninit();
327*3d0fad56SMarko Kovacevic 
328*3d0fad56SMarko Kovacevic 	return ret;
329*3d0fad56SMarko Kovacevic 
330*3d0fad56SMarko Kovacevic }
331*3d0fad56SMarko Kovacevic 
332*3d0fad56SMarko Kovacevic static void
333*3d0fad56SMarko Kovacevic print_test_block(void)
334*3d0fad56SMarko Kovacevic {
335*3d0fad56SMarko Kovacevic 	uint32_t i;
336*3d0fad56SMarko Kovacevic 
337*3d0fad56SMarko Kovacevic 	for (i = 0; i < info.nb_vec_lines; i++)
338*3d0fad56SMarko Kovacevic 		printf("%s\n", info.vec[i]);
339*3d0fad56SMarko Kovacevic 
340*3d0fad56SMarko Kovacevic 	printf("\n");
341*3d0fad56SMarko Kovacevic }
342*3d0fad56SMarko Kovacevic 
343*3d0fad56SMarko Kovacevic static int
344*3d0fad56SMarko Kovacevic fips_test_one_file(void)
345*3d0fad56SMarko Kovacevic {
346*3d0fad56SMarko Kovacevic 	int fetch_ret = 0, ret;
347*3d0fad56SMarko Kovacevic 
348*3d0fad56SMarko Kovacevic 	while (fetch_ret == 0) {
349*3d0fad56SMarko Kovacevic 		fetch_ret = fips_test_fetch_one_block();
350*3d0fad56SMarko Kovacevic 		if (fetch_ret < 0) {
351*3d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Fetch block\n",
352*3d0fad56SMarko Kovacevic 					fetch_ret);
353*3d0fad56SMarko Kovacevic 			ret = fetch_ret;
354*3d0fad56SMarko Kovacevic 			goto error_one_case;
355*3d0fad56SMarko Kovacevic 		}
356*3d0fad56SMarko Kovacevic 
357*3d0fad56SMarko Kovacevic 		if (info.nb_vec_lines == 0) {
358*3d0fad56SMarko Kovacevic 			if (fetch_ret == -EOF)
359*3d0fad56SMarko Kovacevic 				break;
360*3d0fad56SMarko Kovacevic 
361*3d0fad56SMarko Kovacevic 			fprintf(info.fp_wr, "\n");
362*3d0fad56SMarko Kovacevic 			continue;
363*3d0fad56SMarko Kovacevic 		}
364*3d0fad56SMarko Kovacevic 
365*3d0fad56SMarko Kovacevic 		ret = fips_test_parse_one_case();
366*3d0fad56SMarko Kovacevic 		switch (ret) {
367*3d0fad56SMarko Kovacevic 		case 0:
368*3d0fad56SMarko Kovacevic 			if (ret == 0)
369*3d0fad56SMarko Kovacevic 				break;
370*3d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: test block\n",
371*3d0fad56SMarko Kovacevic 					ret);
372*3d0fad56SMarko Kovacevic 			goto error_one_case;
373*3d0fad56SMarko Kovacevic 		case 1:
374*3d0fad56SMarko Kovacevic 			break;
375*3d0fad56SMarko Kovacevic 		default:
376*3d0fad56SMarko Kovacevic 			RTE_LOG(ERR, USER1, "Error %i: Parse block\n",
377*3d0fad56SMarko Kovacevic 					ret);
378*3d0fad56SMarko Kovacevic 			goto error_one_case;
379*3d0fad56SMarko Kovacevic 		}
380*3d0fad56SMarko Kovacevic 
381*3d0fad56SMarko Kovacevic 		continue;
382*3d0fad56SMarko Kovacevic error_one_case:
383*3d0fad56SMarko Kovacevic 		print_test_block();
384*3d0fad56SMarko Kovacevic 	}
385*3d0fad56SMarko Kovacevic 
386*3d0fad56SMarko Kovacevic 	fips_test_clear();
387*3d0fad56SMarko Kovacevic 
388*3d0fad56SMarko Kovacevic }
389