xref: /dpdk/app/test-crypto-perf/cperf_test_vector_parsing.c (revision f8be1786b1b8de697f68e9ffe2addff864783b06)
1*f8be1786SSlawomir Mrozowicz #include <stdio.h>
2*f8be1786SSlawomir Mrozowicz 
3*f8be1786SSlawomir Mrozowicz #include <rte_malloc.h>
4*f8be1786SSlawomir Mrozowicz 
5*f8be1786SSlawomir Mrozowicz #include "cperf_options.h"
6*f8be1786SSlawomir Mrozowicz #include "cperf_test_vectors.h"
7*f8be1786SSlawomir Mrozowicz #include "cperf_test_vector_parsing.h"
8*f8be1786SSlawomir Mrozowicz 
9*f8be1786SSlawomir Mrozowicz int
10*f8be1786SSlawomir Mrozowicz free_test_vector(struct cperf_test_vector *vector, struct cperf_options *opts)
11*f8be1786SSlawomir Mrozowicz {
12*f8be1786SSlawomir Mrozowicz 	if (vector == NULL || opts == NULL)
13*f8be1786SSlawomir Mrozowicz 		return -1;
14*f8be1786SSlawomir Mrozowicz 
15*f8be1786SSlawomir Mrozowicz 	rte_free(vector->iv.data);
16*f8be1786SSlawomir Mrozowicz 	rte_free(vector->aad.data);
17*f8be1786SSlawomir Mrozowicz 	rte_free(vector->digest.data);
18*f8be1786SSlawomir Mrozowicz 
19*f8be1786SSlawomir Mrozowicz 	if (opts->test_file != NULL) {
20*f8be1786SSlawomir Mrozowicz 		rte_free(vector->plaintext.data);
21*f8be1786SSlawomir Mrozowicz 		rte_free(vector->cipher_key.data);
22*f8be1786SSlawomir Mrozowicz 		rte_free(vector->auth_key.data);
23*f8be1786SSlawomir Mrozowicz 		rte_free(vector->ciphertext.data);
24*f8be1786SSlawomir Mrozowicz 	}
25*f8be1786SSlawomir Mrozowicz 
26*f8be1786SSlawomir Mrozowicz 	rte_free(vector);
27*f8be1786SSlawomir Mrozowicz 
28*f8be1786SSlawomir Mrozowicz 	return 0;
29*f8be1786SSlawomir Mrozowicz }
30*f8be1786SSlawomir Mrozowicz 
31*f8be1786SSlawomir Mrozowicz void
32*f8be1786SSlawomir Mrozowicz show_test_vector(struct cperf_test_vector *test_vector)
33*f8be1786SSlawomir Mrozowicz {
34*f8be1786SSlawomir Mrozowicz 	const uint8_t wrap = 32;
35*f8be1786SSlawomir Mrozowicz 	uint32_t i;
36*f8be1786SSlawomir Mrozowicz 
37*f8be1786SSlawomir Mrozowicz 	if (test_vector == NULL)
38*f8be1786SSlawomir Mrozowicz 		return;
39*f8be1786SSlawomir Mrozowicz 
40*f8be1786SSlawomir Mrozowicz 	if (test_vector->plaintext.data) {
41*f8be1786SSlawomir Mrozowicz 		printf("\nplaintext =\n");
42*f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->plaintext.length; ++i) {
43*f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
44*f8be1786SSlawomir Mrozowicz 				printf("\n");
45*f8be1786SSlawomir Mrozowicz 			if (i == test_vector->plaintext.length - 1)
46*f8be1786SSlawomir Mrozowicz 				printf("0x%02x",
47*f8be1786SSlawomir Mrozowicz 					test_vector->plaintext.data[i]);
48*f8be1786SSlawomir Mrozowicz 			else
49*f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ",
50*f8be1786SSlawomir Mrozowicz 					test_vector->plaintext.data[i]);
51*f8be1786SSlawomir Mrozowicz 		}
52*f8be1786SSlawomir Mrozowicz 		printf("\n");
53*f8be1786SSlawomir Mrozowicz 	}
54*f8be1786SSlawomir Mrozowicz 
55*f8be1786SSlawomir Mrozowicz 	if (test_vector->cipher_key.data) {
56*f8be1786SSlawomir Mrozowicz 		printf("\ncipher_key =\n");
57*f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->cipher_key.length; ++i) {
58*f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
59*f8be1786SSlawomir Mrozowicz 				printf("\n");
60*f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->cipher_key.length - 1))
61*f8be1786SSlawomir Mrozowicz 				printf("0x%02x",
62*f8be1786SSlawomir Mrozowicz 					test_vector->cipher_key.data[i]);
63*f8be1786SSlawomir Mrozowicz 			else
64*f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ",
65*f8be1786SSlawomir Mrozowicz 					test_vector->cipher_key.data[i]);
66*f8be1786SSlawomir Mrozowicz 		}
67*f8be1786SSlawomir Mrozowicz 		printf("\n");
68*f8be1786SSlawomir Mrozowicz 	}
69*f8be1786SSlawomir Mrozowicz 
70*f8be1786SSlawomir Mrozowicz 	if (test_vector->auth_key.data) {
71*f8be1786SSlawomir Mrozowicz 		printf("\nauth_key =\n");
72*f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->auth_key.length; ++i) {
73*f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
74*f8be1786SSlawomir Mrozowicz 				printf("\n");
75*f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->auth_key.length - 1))
76*f8be1786SSlawomir Mrozowicz 				printf("0x%02x", test_vector->auth_key.data[i]);
77*f8be1786SSlawomir Mrozowicz 			else
78*f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ",
79*f8be1786SSlawomir Mrozowicz 					test_vector->auth_key.data[i]);
80*f8be1786SSlawomir Mrozowicz 		}
81*f8be1786SSlawomir Mrozowicz 		printf("\n");
82*f8be1786SSlawomir Mrozowicz 	}
83*f8be1786SSlawomir Mrozowicz 
84*f8be1786SSlawomir Mrozowicz 	if (test_vector->iv.data) {
85*f8be1786SSlawomir Mrozowicz 		printf("\niv =\n");
86*f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->iv.length; ++i) {
87*f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
88*f8be1786SSlawomir Mrozowicz 				printf("\n");
89*f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->iv.length - 1))
90*f8be1786SSlawomir Mrozowicz 				printf("0x%02x", test_vector->iv.data[i]);
91*f8be1786SSlawomir Mrozowicz 			else
92*f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ", test_vector->iv.data[i]);
93*f8be1786SSlawomir Mrozowicz 		}
94*f8be1786SSlawomir Mrozowicz 		printf("\n");
95*f8be1786SSlawomir Mrozowicz 	}
96*f8be1786SSlawomir Mrozowicz 
97*f8be1786SSlawomir Mrozowicz 	if (test_vector->ciphertext.data) {
98*f8be1786SSlawomir Mrozowicz 		printf("\nciphertext =\n");
99*f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->ciphertext.length; ++i) {
100*f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
101*f8be1786SSlawomir Mrozowicz 				printf("\n");
102*f8be1786SSlawomir Mrozowicz 			if (i == test_vector->ciphertext.length - 1)
103*f8be1786SSlawomir Mrozowicz 				printf("0x%02x",
104*f8be1786SSlawomir Mrozowicz 					test_vector->ciphertext.data[i]);
105*f8be1786SSlawomir Mrozowicz 			else
106*f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ",
107*f8be1786SSlawomir Mrozowicz 					test_vector->ciphertext.data[i]);
108*f8be1786SSlawomir Mrozowicz 		}
109*f8be1786SSlawomir Mrozowicz 		printf("\n");
110*f8be1786SSlawomir Mrozowicz 	}
111*f8be1786SSlawomir Mrozowicz 
112*f8be1786SSlawomir Mrozowicz 	if (test_vector->aad.data) {
113*f8be1786SSlawomir Mrozowicz 		printf("\naad =\n");
114*f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->aad.length; ++i) {
115*f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
116*f8be1786SSlawomir Mrozowicz 				printf("\n");
117*f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->aad.length - 1))
118*f8be1786SSlawomir Mrozowicz 				printf("0x%02x", test_vector->aad.data[i]);
119*f8be1786SSlawomir Mrozowicz 			else
120*f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ", test_vector->aad.data[i]);
121*f8be1786SSlawomir Mrozowicz 		}
122*f8be1786SSlawomir Mrozowicz 		printf("\n");
123*f8be1786SSlawomir Mrozowicz 	}
124*f8be1786SSlawomir Mrozowicz 
125*f8be1786SSlawomir Mrozowicz 	if (test_vector->digest.data) {
126*f8be1786SSlawomir Mrozowicz 		printf("\ndigest =\n");
127*f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->digest.length; ++i) {
128*f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
129*f8be1786SSlawomir Mrozowicz 				printf("\n");
130*f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->digest.length - 1))
131*f8be1786SSlawomir Mrozowicz 				printf("0x%02x", test_vector->digest.data[i]);
132*f8be1786SSlawomir Mrozowicz 			else
133*f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ", test_vector->digest.data[i]);
134*f8be1786SSlawomir Mrozowicz 		}
135*f8be1786SSlawomir Mrozowicz 		printf("\n");
136*f8be1786SSlawomir Mrozowicz 	}
137*f8be1786SSlawomir Mrozowicz }
138*f8be1786SSlawomir Mrozowicz 
139*f8be1786SSlawomir Mrozowicz /* trim leading and trailing spaces */
140*f8be1786SSlawomir Mrozowicz static char *
141*f8be1786SSlawomir Mrozowicz trim_space(char *str)
142*f8be1786SSlawomir Mrozowicz {
143*f8be1786SSlawomir Mrozowicz 	char *start, *end;
144*f8be1786SSlawomir Mrozowicz 
145*f8be1786SSlawomir Mrozowicz 	for (start = str; *start; start++) {
146*f8be1786SSlawomir Mrozowicz 		if (!isspace((unsigned char) start[0]))
147*f8be1786SSlawomir Mrozowicz 			break;
148*f8be1786SSlawomir Mrozowicz 	}
149*f8be1786SSlawomir Mrozowicz 
150*f8be1786SSlawomir Mrozowicz 	for (end = start + strlen(start); end > start + 1; end--) {
151*f8be1786SSlawomir Mrozowicz 		if (!isspace((unsigned char) end[-1]))
152*f8be1786SSlawomir Mrozowicz 			break;
153*f8be1786SSlawomir Mrozowicz 	}
154*f8be1786SSlawomir Mrozowicz 
155*f8be1786SSlawomir Mrozowicz 	*end = 0;
156*f8be1786SSlawomir Mrozowicz 
157*f8be1786SSlawomir Mrozowicz 	/* Shift from "start" to the beginning of the string */
158*f8be1786SSlawomir Mrozowicz 	if (start > str)
159*f8be1786SSlawomir Mrozowicz 		memmove(str, start, (end - start) + 1);
160*f8be1786SSlawomir Mrozowicz 
161*f8be1786SSlawomir Mrozowicz 	return str;
162*f8be1786SSlawomir Mrozowicz }
163*f8be1786SSlawomir Mrozowicz 
164*f8be1786SSlawomir Mrozowicz /* tokenization test values separated by a comma */
165*f8be1786SSlawomir Mrozowicz static int
166*f8be1786SSlawomir Mrozowicz parse_values(char *tokens, uint8_t **data, uint32_t *data_length)
167*f8be1786SSlawomir Mrozowicz {
168*f8be1786SSlawomir Mrozowicz 	uint32_t n_tokens;
169*f8be1786SSlawomir Mrozowicz 	uint32_t data_size = 32;
170*f8be1786SSlawomir Mrozowicz 
171*f8be1786SSlawomir Mrozowicz 	uint8_t *values, *values_resized;
172*f8be1786SSlawomir Mrozowicz 	char *tok, *error = NULL;
173*f8be1786SSlawomir Mrozowicz 
174*f8be1786SSlawomir Mrozowicz 	tok = strtok(tokens, CPERF_VALUE_DELIMITER);
175*f8be1786SSlawomir Mrozowicz 	if (tok == NULL)
176*f8be1786SSlawomir Mrozowicz 		return -1;
177*f8be1786SSlawomir Mrozowicz 
178*f8be1786SSlawomir Mrozowicz 	values = (uint8_t *) rte_zmalloc(NULL, sizeof(uint8_t) * data_size, 0);
179*f8be1786SSlawomir Mrozowicz 	if (values == NULL)
180*f8be1786SSlawomir Mrozowicz 		return -1;
181*f8be1786SSlawomir Mrozowicz 
182*f8be1786SSlawomir Mrozowicz 	n_tokens = 0;
183*f8be1786SSlawomir Mrozowicz 	while (tok != NULL) {
184*f8be1786SSlawomir Mrozowicz 		values_resized = NULL;
185*f8be1786SSlawomir Mrozowicz 
186*f8be1786SSlawomir Mrozowicz 		if (n_tokens >= data_size) {
187*f8be1786SSlawomir Mrozowicz 			data_size *= 2;
188*f8be1786SSlawomir Mrozowicz 
189*f8be1786SSlawomir Mrozowicz 			values_resized = (uint8_t *) rte_realloc(values,
190*f8be1786SSlawomir Mrozowicz 				sizeof(uint8_t) * data_size, 0);
191*f8be1786SSlawomir Mrozowicz 			if (values_resized == NULL) {
192*f8be1786SSlawomir Mrozowicz 				rte_free(values);
193*f8be1786SSlawomir Mrozowicz 				return -1;
194*f8be1786SSlawomir Mrozowicz 			}
195*f8be1786SSlawomir Mrozowicz 			values = values_resized;
196*f8be1786SSlawomir Mrozowicz 		}
197*f8be1786SSlawomir Mrozowicz 
198*f8be1786SSlawomir Mrozowicz 		values[n_tokens] = (uint8_t) strtoul(tok, &error, 0);
199*f8be1786SSlawomir Mrozowicz 		if ((error == NULL) || (*error != '\0')) {
200*f8be1786SSlawomir Mrozowicz 			printf("Failed with convert '%s'\n", tok);
201*f8be1786SSlawomir Mrozowicz 			rte_free(values);
202*f8be1786SSlawomir Mrozowicz 			return -1;
203*f8be1786SSlawomir Mrozowicz 		}
204*f8be1786SSlawomir Mrozowicz 
205*f8be1786SSlawomir Mrozowicz 		tok = strtok(NULL, CPERF_VALUE_DELIMITER);
206*f8be1786SSlawomir Mrozowicz 		if (tok == NULL)
207*f8be1786SSlawomir Mrozowicz 			break;
208*f8be1786SSlawomir Mrozowicz 
209*f8be1786SSlawomir Mrozowicz 		n_tokens++;
210*f8be1786SSlawomir Mrozowicz 	}
211*f8be1786SSlawomir Mrozowicz 
212*f8be1786SSlawomir Mrozowicz 	values_resized = (uint8_t *) rte_realloc(values,
213*f8be1786SSlawomir Mrozowicz 		sizeof(uint8_t) * (n_tokens + 1), 0);
214*f8be1786SSlawomir Mrozowicz 
215*f8be1786SSlawomir Mrozowicz 	if (values_resized == NULL) {
216*f8be1786SSlawomir Mrozowicz 		rte_free(values);
217*f8be1786SSlawomir Mrozowicz 		return -1;
218*f8be1786SSlawomir Mrozowicz 	}
219*f8be1786SSlawomir Mrozowicz 
220*f8be1786SSlawomir Mrozowicz 	*data = values_resized;
221*f8be1786SSlawomir Mrozowicz 	*data_length = n_tokens + 1;
222*f8be1786SSlawomir Mrozowicz 
223*f8be1786SSlawomir Mrozowicz 	return 0;
224*f8be1786SSlawomir Mrozowicz }
225*f8be1786SSlawomir Mrozowicz 
226*f8be1786SSlawomir Mrozowicz /* checks the type of key and assigns data */
227*f8be1786SSlawomir Mrozowicz static int
228*f8be1786SSlawomir Mrozowicz parse_entry(char *entry, struct cperf_test_vector *vector,
229*f8be1786SSlawomir Mrozowicz 	struct cperf_options *opts, uint8_t tc_found)
230*f8be1786SSlawomir Mrozowicz {
231*f8be1786SSlawomir Mrozowicz 	int status;
232*f8be1786SSlawomir Mrozowicz 	uint32_t data_length;
233*f8be1786SSlawomir Mrozowicz 
234*f8be1786SSlawomir Mrozowicz 	uint8_t *data = NULL;
235*f8be1786SSlawomir Mrozowicz 	char *token, *key_token;
236*f8be1786SSlawomir Mrozowicz 
237*f8be1786SSlawomir Mrozowicz 	/* get key */
238*f8be1786SSlawomir Mrozowicz 	token = strtok(entry, CPERF_ENTRY_DELIMITER);
239*f8be1786SSlawomir Mrozowicz 	key_token = token;
240*f8be1786SSlawomir Mrozowicz 
241*f8be1786SSlawomir Mrozowicz 	/* get values for key */
242*f8be1786SSlawomir Mrozowicz 	token = strtok(NULL, CPERF_ENTRY_DELIMITER);
243*f8be1786SSlawomir Mrozowicz 	if (token == NULL) {
244*f8be1786SSlawomir Mrozowicz 		printf("Expected 'key = values' but was '%.40s'..\n",
245*f8be1786SSlawomir Mrozowicz 			key_token);
246*f8be1786SSlawomir Mrozowicz 		return -1;
247*f8be1786SSlawomir Mrozowicz 	}
248*f8be1786SSlawomir Mrozowicz 
249*f8be1786SSlawomir Mrozowicz 	status = parse_values(token, &data, &data_length);
250*f8be1786SSlawomir Mrozowicz 	if (status)
251*f8be1786SSlawomir Mrozowicz 		return -1;
252*f8be1786SSlawomir Mrozowicz 
253*f8be1786SSlawomir Mrozowicz 	/* compare keys */
254*f8be1786SSlawomir Mrozowicz 	if (strstr(key_token, "plaintext")) {
255*f8be1786SSlawomir Mrozowicz 		rte_free(vector->plaintext.data);
256*f8be1786SSlawomir Mrozowicz 		vector->plaintext.data = data;
257*f8be1786SSlawomir Mrozowicz 		if (tc_found)
258*f8be1786SSlawomir Mrozowicz 			vector->plaintext.length = data_length;
259*f8be1786SSlawomir Mrozowicz 		else {
260*f8be1786SSlawomir Mrozowicz 			if (opts->buffer_sz > data_length) {
261*f8be1786SSlawomir Mrozowicz 				printf("Global plaintext shorter than "
262*f8be1786SSlawomir Mrozowicz 					"buffer_sz\n");
263*f8be1786SSlawomir Mrozowicz 				return -1;
264*f8be1786SSlawomir Mrozowicz 			}
265*f8be1786SSlawomir Mrozowicz 			vector->plaintext.length = opts->buffer_sz;
266*f8be1786SSlawomir Mrozowicz 		}
267*f8be1786SSlawomir Mrozowicz 
268*f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "cipher_key")) {
269*f8be1786SSlawomir Mrozowicz 		rte_free(vector->cipher_key.data);
270*f8be1786SSlawomir Mrozowicz 		vector->cipher_key.data = data;
271*f8be1786SSlawomir Mrozowicz 		if (tc_found)
272*f8be1786SSlawomir Mrozowicz 			vector->cipher_key.length = data_length;
273*f8be1786SSlawomir Mrozowicz 		else {
274*f8be1786SSlawomir Mrozowicz 			if (opts->cipher_key_sz > data_length) {
275*f8be1786SSlawomir Mrozowicz 				printf("Global cipher_key shorter than "
276*f8be1786SSlawomir Mrozowicz 					"cipher_key_sz\n");
277*f8be1786SSlawomir Mrozowicz 				return -1;
278*f8be1786SSlawomir Mrozowicz 			}
279*f8be1786SSlawomir Mrozowicz 			vector->cipher_key.length = opts->cipher_key_sz;
280*f8be1786SSlawomir Mrozowicz 		}
281*f8be1786SSlawomir Mrozowicz 
282*f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "auth_key")) {
283*f8be1786SSlawomir Mrozowicz 		rte_free(vector->auth_key.data);
284*f8be1786SSlawomir Mrozowicz 		vector->auth_key.data = data;
285*f8be1786SSlawomir Mrozowicz 		if (tc_found)
286*f8be1786SSlawomir Mrozowicz 			vector->auth_key.length = data_length;
287*f8be1786SSlawomir Mrozowicz 		else {
288*f8be1786SSlawomir Mrozowicz 			if (opts->auth_key_sz > data_length) {
289*f8be1786SSlawomir Mrozowicz 				printf("Global auth_key shorter than "
290*f8be1786SSlawomir Mrozowicz 					"auth_key_sz\n");
291*f8be1786SSlawomir Mrozowicz 				return -1;
292*f8be1786SSlawomir Mrozowicz 			}
293*f8be1786SSlawomir Mrozowicz 			vector->auth_key.length = opts->auth_key_sz;
294*f8be1786SSlawomir Mrozowicz 		}
295*f8be1786SSlawomir Mrozowicz 
296*f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "iv")) {
297*f8be1786SSlawomir Mrozowicz 		rte_free(vector->iv.data);
298*f8be1786SSlawomir Mrozowicz 		vector->iv.data = data;
299*f8be1786SSlawomir Mrozowicz 		vector->iv.phys_addr = rte_malloc_virt2phy(vector->iv.data);
300*f8be1786SSlawomir Mrozowicz 		if (tc_found)
301*f8be1786SSlawomir Mrozowicz 			vector->iv.length = data_length;
302*f8be1786SSlawomir Mrozowicz 		else {
303*f8be1786SSlawomir Mrozowicz 			if (opts->cipher_iv_sz > data_length) {
304*f8be1786SSlawomir Mrozowicz 				printf("Global iv shorter than "
305*f8be1786SSlawomir Mrozowicz 					"cipher_iv_sz\n");
306*f8be1786SSlawomir Mrozowicz 				return -1;
307*f8be1786SSlawomir Mrozowicz 			}
308*f8be1786SSlawomir Mrozowicz 			vector->iv.length = opts->cipher_iv_sz;
309*f8be1786SSlawomir Mrozowicz 		}
310*f8be1786SSlawomir Mrozowicz 
311*f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "ciphertext")) {
312*f8be1786SSlawomir Mrozowicz 		rte_free(vector->ciphertext.data);
313*f8be1786SSlawomir Mrozowicz 		vector->ciphertext.data = data;
314*f8be1786SSlawomir Mrozowicz 		if (tc_found)
315*f8be1786SSlawomir Mrozowicz 			vector->ciphertext.length = data_length;
316*f8be1786SSlawomir Mrozowicz 		else {
317*f8be1786SSlawomir Mrozowicz 			if (opts->buffer_sz > data_length) {
318*f8be1786SSlawomir Mrozowicz 				printf("Global ciphertext shorter than "
319*f8be1786SSlawomir Mrozowicz 					"buffer_sz\n");
320*f8be1786SSlawomir Mrozowicz 				return -1;
321*f8be1786SSlawomir Mrozowicz 			}
322*f8be1786SSlawomir Mrozowicz 			vector->ciphertext.length = opts->buffer_sz;
323*f8be1786SSlawomir Mrozowicz 		}
324*f8be1786SSlawomir Mrozowicz 
325*f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "aad")) {
326*f8be1786SSlawomir Mrozowicz 		rte_free(vector->aad.data);
327*f8be1786SSlawomir Mrozowicz 		vector->aad.data = data;
328*f8be1786SSlawomir Mrozowicz 		vector->aad.phys_addr = rte_malloc_virt2phy(vector->aad.data);
329*f8be1786SSlawomir Mrozowicz 		if (tc_found)
330*f8be1786SSlawomir Mrozowicz 			vector->aad.length = data_length;
331*f8be1786SSlawomir Mrozowicz 		else {
332*f8be1786SSlawomir Mrozowicz 			if (opts->auth_aad_sz > data_length) {
333*f8be1786SSlawomir Mrozowicz 				printf("Global aad shorter than "
334*f8be1786SSlawomir Mrozowicz 					"auth_aad_sz\n");
335*f8be1786SSlawomir Mrozowicz 				return -1;
336*f8be1786SSlawomir Mrozowicz 			}
337*f8be1786SSlawomir Mrozowicz 			vector->aad.length = opts->auth_aad_sz;
338*f8be1786SSlawomir Mrozowicz 		}
339*f8be1786SSlawomir Mrozowicz 
340*f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "digest")) {
341*f8be1786SSlawomir Mrozowicz 		rte_free(vector->digest.data);
342*f8be1786SSlawomir Mrozowicz 		vector->digest.data = data;
343*f8be1786SSlawomir Mrozowicz 		vector->digest.phys_addr = rte_malloc_virt2phy(
344*f8be1786SSlawomir Mrozowicz 			vector->digest.data);
345*f8be1786SSlawomir Mrozowicz 		if (tc_found)
346*f8be1786SSlawomir Mrozowicz 			vector->digest.length = data_length;
347*f8be1786SSlawomir Mrozowicz 		else {
348*f8be1786SSlawomir Mrozowicz 			if (opts->auth_digest_sz > data_length) {
349*f8be1786SSlawomir Mrozowicz 				printf("Global digest shorter than "
350*f8be1786SSlawomir Mrozowicz 					"auth_digest_sz\n");
351*f8be1786SSlawomir Mrozowicz 				return -1;
352*f8be1786SSlawomir Mrozowicz 			}
353*f8be1786SSlawomir Mrozowicz 			vector->digest.length = opts->auth_digest_sz;
354*f8be1786SSlawomir Mrozowicz 		}
355*f8be1786SSlawomir Mrozowicz 	} else {
356*f8be1786SSlawomir Mrozowicz 		printf("Not valid key: '%s'\n", trim_space(key_token));
357*f8be1786SSlawomir Mrozowicz 		return -1;
358*f8be1786SSlawomir Mrozowicz 	}
359*f8be1786SSlawomir Mrozowicz 
360*f8be1786SSlawomir Mrozowicz 	return 0;
361*f8be1786SSlawomir Mrozowicz }
362*f8be1786SSlawomir Mrozowicz 
363*f8be1786SSlawomir Mrozowicz /* searches in the file for test keys and values */
364*f8be1786SSlawomir Mrozowicz static int
365*f8be1786SSlawomir Mrozowicz parse_file(struct cperf_test_vector *vector, struct cperf_options *opts)
366*f8be1786SSlawomir Mrozowicz {
367*f8be1786SSlawomir Mrozowicz 	uint8_t tc_found = 0;
368*f8be1786SSlawomir Mrozowicz 	uint8_t tc_data_start = 0;
369*f8be1786SSlawomir Mrozowicz 	ssize_t read;
370*f8be1786SSlawomir Mrozowicz 	size_t len = 0;
371*f8be1786SSlawomir Mrozowicz 	int status = 0;
372*f8be1786SSlawomir Mrozowicz 
373*f8be1786SSlawomir Mrozowicz 	FILE *fp;
374*f8be1786SSlawomir Mrozowicz 	char *line = NULL;
375*f8be1786SSlawomir Mrozowicz 	char *entry = NULL;
376*f8be1786SSlawomir Mrozowicz 
377*f8be1786SSlawomir Mrozowicz 	fp = fopen(opts->test_file, "r");
378*f8be1786SSlawomir Mrozowicz 	if (fp == NULL) {
379*f8be1786SSlawomir Mrozowicz 		printf("File %s does not exists\n", opts->test_file);
380*f8be1786SSlawomir Mrozowicz 		return -1;
381*f8be1786SSlawomir Mrozowicz 	}
382*f8be1786SSlawomir Mrozowicz 
383*f8be1786SSlawomir Mrozowicz 	while ((read = getline(&line, &len, fp)) != -1) {
384*f8be1786SSlawomir Mrozowicz 
385*f8be1786SSlawomir Mrozowicz 		/* ignore comments and new lines */
386*f8be1786SSlawomir Mrozowicz 		if (line[0] == '#' || line[0] == '/' || line[0] == '\n'
387*f8be1786SSlawomir Mrozowicz 			|| line[0] == '\r' || line[0] == ' ')
388*f8be1786SSlawomir Mrozowicz 			continue;
389*f8be1786SSlawomir Mrozowicz 
390*f8be1786SSlawomir Mrozowicz 		trim_space(line);
391*f8be1786SSlawomir Mrozowicz 
392*f8be1786SSlawomir Mrozowicz 		/* next test case is started */
393*f8be1786SSlawomir Mrozowicz 		if (line[0] == '[' && line[strlen(line) - 1] == ']' && tc_found)
394*f8be1786SSlawomir Mrozowicz 			break;
395*f8be1786SSlawomir Mrozowicz 		/* test case section started, end of global data */
396*f8be1786SSlawomir Mrozowicz 		else if (line[0] == '[' && line[strlen(line) - 1] == ']')
397*f8be1786SSlawomir Mrozowicz 			tc_data_start = 1;
398*f8be1786SSlawomir Mrozowicz 
399*f8be1786SSlawomir Mrozowicz 		/* test name unspecified, end after global data */
400*f8be1786SSlawomir Mrozowicz 		if (tc_data_start && opts->test_name == NULL)
401*f8be1786SSlawomir Mrozowicz 			break;
402*f8be1786SSlawomir Mrozowicz 		/* searching for a suitable test */
403*f8be1786SSlawomir Mrozowicz 		else if (tc_data_start && tc_found == 0) {
404*f8be1786SSlawomir Mrozowicz 			if (!strcmp(line, opts->test_name)) {
405*f8be1786SSlawomir Mrozowicz 				tc_found = 1;
406*f8be1786SSlawomir Mrozowicz 				continue;
407*f8be1786SSlawomir Mrozowicz 			} else
408*f8be1786SSlawomir Mrozowicz 				continue;
409*f8be1786SSlawomir Mrozowicz 		}
410*f8be1786SSlawomir Mrozowicz 
411*f8be1786SSlawomir Mrozowicz 		/* buffer for multiline */
412*f8be1786SSlawomir Mrozowicz 		entry = (char *) rte_realloc(entry,
413*f8be1786SSlawomir Mrozowicz 					sizeof(char) * strlen(line) + 1, 0);
414*f8be1786SSlawomir Mrozowicz 		if (entry == NULL)
415*f8be1786SSlawomir Mrozowicz 			return -1;
416*f8be1786SSlawomir Mrozowicz 
417*f8be1786SSlawomir Mrozowicz 		memset(entry, 0, strlen(line) + 1);
418*f8be1786SSlawomir Mrozowicz 		strncpy(entry, line, strlen(line));
419*f8be1786SSlawomir Mrozowicz 
420*f8be1786SSlawomir Mrozowicz 		/* check if entry ends with , or = */
421*f8be1786SSlawomir Mrozowicz 		if (entry[strlen(entry) - 1] == ','
422*f8be1786SSlawomir Mrozowicz 			|| entry[strlen(entry) - 1] == '=') {
423*f8be1786SSlawomir Mrozowicz 			while ((read = getline(&line, &len, fp)) != -1) {
424*f8be1786SSlawomir Mrozowicz 				trim_space(line);
425*f8be1786SSlawomir Mrozowicz 
426*f8be1786SSlawomir Mrozowicz 				/* extend entry about length of new line */
427*f8be1786SSlawomir Mrozowicz 				char *entry_extended = (char *) rte_realloc(
428*f8be1786SSlawomir Mrozowicz 					entry, sizeof(char)
429*f8be1786SSlawomir Mrozowicz 						* (strlen(line) + strlen(entry))
430*f8be1786SSlawomir Mrozowicz 						+ 1, 0);
431*f8be1786SSlawomir Mrozowicz 
432*f8be1786SSlawomir Mrozowicz 				if (entry_extended == NULL)
433*f8be1786SSlawomir Mrozowicz 					goto err;
434*f8be1786SSlawomir Mrozowicz 				entry = entry_extended;
435*f8be1786SSlawomir Mrozowicz 
436*f8be1786SSlawomir Mrozowicz 				strncat(entry, line, strlen(line));
437*f8be1786SSlawomir Mrozowicz 
438*f8be1786SSlawomir Mrozowicz 				if (entry[strlen(entry) - 1] != ',')
439*f8be1786SSlawomir Mrozowicz 					break;
440*f8be1786SSlawomir Mrozowicz 			}
441*f8be1786SSlawomir Mrozowicz 		}
442*f8be1786SSlawomir Mrozowicz 		status = parse_entry(entry, vector, opts, tc_found);
443*f8be1786SSlawomir Mrozowicz 		if (status) {
444*f8be1786SSlawomir Mrozowicz 			printf("An error occurred while parsing!\n");
445*f8be1786SSlawomir Mrozowicz 			goto err;
446*f8be1786SSlawomir Mrozowicz 		}
447*f8be1786SSlawomir Mrozowicz 	}
448*f8be1786SSlawomir Mrozowicz 
449*f8be1786SSlawomir Mrozowicz 	if (tc_found == 0 && opts->test_name != NULL) {
450*f8be1786SSlawomir Mrozowicz 		printf("Not found '%s' case in test file\n", opts->test_name);
451*f8be1786SSlawomir Mrozowicz 		goto err;
452*f8be1786SSlawomir Mrozowicz 	}
453*f8be1786SSlawomir Mrozowicz 
454*f8be1786SSlawomir Mrozowicz 	fclose(fp);
455*f8be1786SSlawomir Mrozowicz 	free(line);
456*f8be1786SSlawomir Mrozowicz 	rte_free(entry);
457*f8be1786SSlawomir Mrozowicz 
458*f8be1786SSlawomir Mrozowicz 	return 0;
459*f8be1786SSlawomir Mrozowicz 
460*f8be1786SSlawomir Mrozowicz err:
461*f8be1786SSlawomir Mrozowicz 	if (fp)
462*f8be1786SSlawomir Mrozowicz 		fclose(fp);
463*f8be1786SSlawomir Mrozowicz 	if (line)
464*f8be1786SSlawomir Mrozowicz 		free(line);
465*f8be1786SSlawomir Mrozowicz 	if (entry)
466*f8be1786SSlawomir Mrozowicz 		rte_free(entry);
467*f8be1786SSlawomir Mrozowicz 
468*f8be1786SSlawomir Mrozowicz 	return -1;
469*f8be1786SSlawomir Mrozowicz }
470*f8be1786SSlawomir Mrozowicz 
471*f8be1786SSlawomir Mrozowicz struct cperf_test_vector*
472*f8be1786SSlawomir Mrozowicz cperf_test_vector_get_from_file(struct cperf_options *opts)
473*f8be1786SSlawomir Mrozowicz {
474*f8be1786SSlawomir Mrozowicz 	int status;
475*f8be1786SSlawomir Mrozowicz 	struct cperf_test_vector *test_vector = NULL;
476*f8be1786SSlawomir Mrozowicz 
477*f8be1786SSlawomir Mrozowicz 	if (opts == NULL || opts->test_file == NULL)
478*f8be1786SSlawomir Mrozowicz 		return test_vector;
479*f8be1786SSlawomir Mrozowicz 
480*f8be1786SSlawomir Mrozowicz 	test_vector = (struct cperf_test_vector *) rte_zmalloc(NULL,
481*f8be1786SSlawomir Mrozowicz 		sizeof(struct cperf_test_vector), 0);
482*f8be1786SSlawomir Mrozowicz 	if (test_vector == NULL)
483*f8be1786SSlawomir Mrozowicz 		return test_vector;
484*f8be1786SSlawomir Mrozowicz 
485*f8be1786SSlawomir Mrozowicz 	/* filling the vector with data from a file */
486*f8be1786SSlawomir Mrozowicz 	status = parse_file(test_vector, opts);
487*f8be1786SSlawomir Mrozowicz 	if (status) {
488*f8be1786SSlawomir Mrozowicz 		free_test_vector(test_vector, opts);
489*f8be1786SSlawomir Mrozowicz 		return NULL;
490*f8be1786SSlawomir Mrozowicz 	}
491*f8be1786SSlawomir Mrozowicz 
492*f8be1786SSlawomir Mrozowicz 	/* other values not included in the file */
493*f8be1786SSlawomir Mrozowicz 	test_vector->data.cipher_offset = 0;
494*f8be1786SSlawomir Mrozowicz 	test_vector->data.cipher_length = opts->buffer_sz;
495*f8be1786SSlawomir Mrozowicz 
496*f8be1786SSlawomir Mrozowicz 	test_vector->data.auth_offset = 0;
497*f8be1786SSlawomir Mrozowicz 	test_vector->data.auth_length = opts->buffer_sz;
498*f8be1786SSlawomir Mrozowicz 
499*f8be1786SSlawomir Mrozowicz 	return test_vector;
500*f8be1786SSlawomir Mrozowicz }
501