xref: /dpdk/app/test-crypto-perf/cperf_test_vector_parsing.c (revision 5fbc1d498f548026cfdcd63f28330d687761f2a3)
1174a1631SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2174a1631SBruce Richardson  * Copyright(c) 2016-2017 Intel Corporation
3f8b7fdd3SPablo de Lara  */
4*5fbc1d49SBruce Richardson #ifdef RTE_EXEC_ENV_FREEBSD
542537ad1SDaniel Mrzyglod 	#define _WITH_GETLINE
642537ad1SDaniel Mrzyglod #endif
7f8be1786SSlawomir Mrozowicz #include <stdio.h>
8f8be1786SSlawomir Mrozowicz 
9f8be1786SSlawomir Mrozowicz #include <rte_malloc.h>
10f8be1786SSlawomir Mrozowicz 
11f8be1786SSlawomir Mrozowicz #include "cperf_options.h"
12f8be1786SSlawomir Mrozowicz #include "cperf_test_vectors.h"
13f8be1786SSlawomir Mrozowicz #include "cperf_test_vector_parsing.h"
14f8be1786SSlawomir Mrozowicz 
15f8be1786SSlawomir Mrozowicz int
16f8be1786SSlawomir Mrozowicz free_test_vector(struct cperf_test_vector *vector, struct cperf_options *opts)
17f8be1786SSlawomir Mrozowicz {
18f8be1786SSlawomir Mrozowicz 	if (vector == NULL || opts == NULL)
19f8be1786SSlawomir Mrozowicz 		return -1;
20f8be1786SSlawomir Mrozowicz 
21acf86169SPablo de Lara 	rte_free(vector->cipher_iv.data);
22acf86169SPablo de Lara 	rte_free(vector->auth_iv.data);
23f8be1786SSlawomir Mrozowicz 	rte_free(vector->aad.data);
24f8be1786SSlawomir Mrozowicz 	rte_free(vector->digest.data);
25f8be1786SSlawomir Mrozowicz 
26f8be1786SSlawomir Mrozowicz 	if (opts->test_file != NULL) {
27f8be1786SSlawomir Mrozowicz 		rte_free(vector->plaintext.data);
28f8be1786SSlawomir Mrozowicz 		rte_free(vector->cipher_key.data);
29f8be1786SSlawomir Mrozowicz 		rte_free(vector->auth_key.data);
30f8be1786SSlawomir Mrozowicz 		rte_free(vector->ciphertext.data);
31f8be1786SSlawomir Mrozowicz 	}
32f8be1786SSlawomir Mrozowicz 
33f8be1786SSlawomir Mrozowicz 	rte_free(vector);
34f8be1786SSlawomir Mrozowicz 
35f8be1786SSlawomir Mrozowicz 	return 0;
36f8be1786SSlawomir Mrozowicz }
37f8be1786SSlawomir Mrozowicz 
38f8be1786SSlawomir Mrozowicz void
39f8be1786SSlawomir Mrozowicz show_test_vector(struct cperf_test_vector *test_vector)
40f8be1786SSlawomir Mrozowicz {
41f8be1786SSlawomir Mrozowicz 	const uint8_t wrap = 32;
42f8be1786SSlawomir Mrozowicz 	uint32_t i;
43f8be1786SSlawomir Mrozowicz 
44f8be1786SSlawomir Mrozowicz 	if (test_vector == NULL)
45f8be1786SSlawomir Mrozowicz 		return;
46f8be1786SSlawomir Mrozowicz 
47f8be1786SSlawomir Mrozowicz 	if (test_vector->plaintext.data) {
48f8be1786SSlawomir Mrozowicz 		printf("\nplaintext =\n");
49f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->plaintext.length; ++i) {
50f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
51f8be1786SSlawomir Mrozowicz 				printf("\n");
52f8be1786SSlawomir Mrozowicz 			if (i == test_vector->plaintext.length - 1)
53f8be1786SSlawomir Mrozowicz 				printf("0x%02x",
54f8be1786SSlawomir Mrozowicz 					test_vector->plaintext.data[i]);
55f8be1786SSlawomir Mrozowicz 			else
56f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ",
57f8be1786SSlawomir Mrozowicz 					test_vector->plaintext.data[i]);
58f8be1786SSlawomir Mrozowicz 		}
59f8be1786SSlawomir Mrozowicz 		printf("\n");
60f8be1786SSlawomir Mrozowicz 	}
61f8be1786SSlawomir Mrozowicz 
62f8be1786SSlawomir Mrozowicz 	if (test_vector->cipher_key.data) {
63f8be1786SSlawomir Mrozowicz 		printf("\ncipher_key =\n");
64f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->cipher_key.length; ++i) {
65f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
66f8be1786SSlawomir Mrozowicz 				printf("\n");
67f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->cipher_key.length - 1))
68f8be1786SSlawomir Mrozowicz 				printf("0x%02x",
69f8be1786SSlawomir Mrozowicz 					test_vector->cipher_key.data[i]);
70f8be1786SSlawomir Mrozowicz 			else
71f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ",
72f8be1786SSlawomir Mrozowicz 					test_vector->cipher_key.data[i]);
73f8be1786SSlawomir Mrozowicz 		}
74f8be1786SSlawomir Mrozowicz 		printf("\n");
75f8be1786SSlawomir Mrozowicz 	}
76f8be1786SSlawomir Mrozowicz 
77f8be1786SSlawomir Mrozowicz 	if (test_vector->auth_key.data) {
78f8be1786SSlawomir Mrozowicz 		printf("\nauth_key =\n");
79f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->auth_key.length; ++i) {
80f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
81f8be1786SSlawomir Mrozowicz 				printf("\n");
82f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->auth_key.length - 1))
83f8be1786SSlawomir Mrozowicz 				printf("0x%02x", test_vector->auth_key.data[i]);
84f8be1786SSlawomir Mrozowicz 			else
85f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ",
86f8be1786SSlawomir Mrozowicz 					test_vector->auth_key.data[i]);
87f8be1786SSlawomir Mrozowicz 		}
88f8be1786SSlawomir Mrozowicz 		printf("\n");
89f8be1786SSlawomir Mrozowicz 	}
90f8be1786SSlawomir Mrozowicz 
91da181392SPablo de Lara 	if (test_vector->aead_key.data) {
92da181392SPablo de Lara 		printf("\naead_key =\n");
93da181392SPablo de Lara 		for (i = 0; i < test_vector->aead_key.length; ++i) {
94da181392SPablo de Lara 			if ((i % wrap == 0) && (i != 0))
95da181392SPablo de Lara 				printf("\n");
96da181392SPablo de Lara 			if (i == (uint32_t)(test_vector->aead_key.length - 1))
97da181392SPablo de Lara 				printf("0x%02x", test_vector->aead_key.data[i]);
98da181392SPablo de Lara 			else
99da181392SPablo de Lara 				printf("0x%02x, ",
100da181392SPablo de Lara 					test_vector->aead_key.data[i]);
101da181392SPablo de Lara 		}
102da181392SPablo de Lara 		printf("\n");
103da181392SPablo de Lara 	}
104da181392SPablo de Lara 
105acf86169SPablo de Lara 	if (test_vector->cipher_iv.data) {
106acf86169SPablo de Lara 		printf("\ncipher_iv =\n");
107acf86169SPablo de Lara 		for (i = 0; i < test_vector->cipher_iv.length; ++i) {
108f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
109f8be1786SSlawomir Mrozowicz 				printf("\n");
110acf86169SPablo de Lara 			if (i == (uint32_t)(test_vector->cipher_iv.length - 1))
111acf86169SPablo de Lara 				printf("0x%02x", test_vector->cipher_iv.data[i]);
112f8be1786SSlawomir Mrozowicz 			else
113acf86169SPablo de Lara 				printf("0x%02x, ", test_vector->cipher_iv.data[i]);
114acf86169SPablo de Lara 		}
115acf86169SPablo de Lara 		printf("\n");
116acf86169SPablo de Lara 	}
117acf86169SPablo de Lara 
118acf86169SPablo de Lara 	if (test_vector->auth_iv.data) {
119acf86169SPablo de Lara 		printf("\nauth_iv =\n");
120acf86169SPablo de Lara 		for (i = 0; i < test_vector->auth_iv.length; ++i) {
121acf86169SPablo de Lara 			if ((i % wrap == 0) && (i != 0))
122acf86169SPablo de Lara 				printf("\n");
123acf86169SPablo de Lara 			if (i == (uint32_t)(test_vector->auth_iv.length - 1))
124acf86169SPablo de Lara 				printf("0x%02x", test_vector->auth_iv.data[i]);
125acf86169SPablo de Lara 			else
126acf86169SPablo de Lara 				printf("0x%02x, ", test_vector->auth_iv.data[i]);
127f8be1786SSlawomir Mrozowicz 		}
128f8be1786SSlawomir Mrozowicz 		printf("\n");
129f8be1786SSlawomir Mrozowicz 	}
130f8be1786SSlawomir Mrozowicz 
131da181392SPablo de Lara 	if (test_vector->aead_iv.data) {
132da181392SPablo de Lara 		printf("\naead_iv =\n");
133da181392SPablo de Lara 		for (i = 0; i < test_vector->aead_iv.length; ++i) {
134da181392SPablo de Lara 			if ((i % wrap == 0) && (i != 0))
135da181392SPablo de Lara 				printf("\n");
136da181392SPablo de Lara 			if (i == (uint32_t)(test_vector->aead_iv.length - 1))
137da181392SPablo de Lara 				printf("0x%02x", test_vector->aead_iv.data[i]);
138da181392SPablo de Lara 			else
139da181392SPablo de Lara 				printf("0x%02x, ", test_vector->aead_iv.data[i]);
140da181392SPablo de Lara 		}
141da181392SPablo de Lara 		printf("\n");
142da181392SPablo de Lara 	}
143da181392SPablo de Lara 
144f8be1786SSlawomir Mrozowicz 	if (test_vector->ciphertext.data) {
145f8be1786SSlawomir Mrozowicz 		printf("\nciphertext =\n");
146f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->ciphertext.length; ++i) {
147f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
148f8be1786SSlawomir Mrozowicz 				printf("\n");
149f8be1786SSlawomir Mrozowicz 			if (i == test_vector->ciphertext.length - 1)
150f8be1786SSlawomir Mrozowicz 				printf("0x%02x",
151f8be1786SSlawomir Mrozowicz 					test_vector->ciphertext.data[i]);
152f8be1786SSlawomir Mrozowicz 			else
153f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ",
154f8be1786SSlawomir Mrozowicz 					test_vector->ciphertext.data[i]);
155f8be1786SSlawomir Mrozowicz 		}
156f8be1786SSlawomir Mrozowicz 		printf("\n");
157f8be1786SSlawomir Mrozowicz 	}
158f8be1786SSlawomir Mrozowicz 
159f8be1786SSlawomir Mrozowicz 	if (test_vector->aad.data) {
160f8be1786SSlawomir Mrozowicz 		printf("\naad =\n");
161f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->aad.length; ++i) {
162f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
163f8be1786SSlawomir Mrozowicz 				printf("\n");
164f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->aad.length - 1))
165f8be1786SSlawomir Mrozowicz 				printf("0x%02x", test_vector->aad.data[i]);
166f8be1786SSlawomir Mrozowicz 			else
167f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ", test_vector->aad.data[i]);
168f8be1786SSlawomir Mrozowicz 		}
169f8be1786SSlawomir Mrozowicz 		printf("\n");
170f8be1786SSlawomir Mrozowicz 	}
171f8be1786SSlawomir Mrozowicz 
172f8be1786SSlawomir Mrozowicz 	if (test_vector->digest.data) {
173f8be1786SSlawomir Mrozowicz 		printf("\ndigest =\n");
174f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->digest.length; ++i) {
175f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
176f8be1786SSlawomir Mrozowicz 				printf("\n");
177f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->digest.length - 1))
178f8be1786SSlawomir Mrozowicz 				printf("0x%02x", test_vector->digest.data[i]);
179f8be1786SSlawomir Mrozowicz 			else
180f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ", test_vector->digest.data[i]);
181f8be1786SSlawomir Mrozowicz 		}
182f8be1786SSlawomir Mrozowicz 		printf("\n");
183f8be1786SSlawomir Mrozowicz 	}
184f8be1786SSlawomir Mrozowicz }
185f8be1786SSlawomir Mrozowicz 
186f8be1786SSlawomir Mrozowicz /* trim leading and trailing spaces */
187f8be1786SSlawomir Mrozowicz static char *
188f8be1786SSlawomir Mrozowicz trim_space(char *str)
189f8be1786SSlawomir Mrozowicz {
190f8be1786SSlawomir Mrozowicz 	char *start, *end;
191f8be1786SSlawomir Mrozowicz 
192f8be1786SSlawomir Mrozowicz 	for (start = str; *start; start++) {
193f8be1786SSlawomir Mrozowicz 		if (!isspace((unsigned char) start[0]))
194f8be1786SSlawomir Mrozowicz 			break;
195f8be1786SSlawomir Mrozowicz 	}
196f8be1786SSlawomir Mrozowicz 
197f8be1786SSlawomir Mrozowicz 	for (end = start + strlen(start); end > start + 1; end--) {
198f8be1786SSlawomir Mrozowicz 		if (!isspace((unsigned char) end[-1]))
199f8be1786SSlawomir Mrozowicz 			break;
200f8be1786SSlawomir Mrozowicz 	}
201f8be1786SSlawomir Mrozowicz 
202f8be1786SSlawomir Mrozowicz 	*end = 0;
203f8be1786SSlawomir Mrozowicz 
204f8be1786SSlawomir Mrozowicz 	/* Shift from "start" to the beginning of the string */
205f8be1786SSlawomir Mrozowicz 	if (start > str)
206f8be1786SSlawomir Mrozowicz 		memmove(str, start, (end - start) + 1);
207f8be1786SSlawomir Mrozowicz 
208f8be1786SSlawomir Mrozowicz 	return str;
209f8be1786SSlawomir Mrozowicz }
210f8be1786SSlawomir Mrozowicz 
211f8be1786SSlawomir Mrozowicz /* tokenization test values separated by a comma */
212f8be1786SSlawomir Mrozowicz static int
213f8be1786SSlawomir Mrozowicz parse_values(char *tokens, uint8_t **data, uint32_t *data_length)
214f8be1786SSlawomir Mrozowicz {
215f8be1786SSlawomir Mrozowicz 	uint32_t n_tokens;
216f8be1786SSlawomir Mrozowicz 	uint32_t data_size = 32;
217f8be1786SSlawomir Mrozowicz 
218f8be1786SSlawomir Mrozowicz 	uint8_t *values, *values_resized;
219f8be1786SSlawomir Mrozowicz 	char *tok, *error = NULL;
220f8be1786SSlawomir Mrozowicz 
221f8be1786SSlawomir Mrozowicz 	tok = strtok(tokens, CPERF_VALUE_DELIMITER);
222f8be1786SSlawomir Mrozowicz 	if (tok == NULL)
223f8be1786SSlawomir Mrozowicz 		return -1;
224f8be1786SSlawomir Mrozowicz 
225f8be1786SSlawomir Mrozowicz 	values = (uint8_t *) rte_zmalloc(NULL, sizeof(uint8_t) * data_size, 0);
226f8be1786SSlawomir Mrozowicz 	if (values == NULL)
227f8be1786SSlawomir Mrozowicz 		return -1;
228f8be1786SSlawomir Mrozowicz 
229f8be1786SSlawomir Mrozowicz 	n_tokens = 0;
230f8be1786SSlawomir Mrozowicz 	while (tok != NULL) {
231f8be1786SSlawomir Mrozowicz 		values_resized = NULL;
232f8be1786SSlawomir Mrozowicz 
233f8be1786SSlawomir Mrozowicz 		if (n_tokens >= data_size) {
234f8be1786SSlawomir Mrozowicz 			data_size *= 2;
235f8be1786SSlawomir Mrozowicz 
236f8be1786SSlawomir Mrozowicz 			values_resized = (uint8_t *) rte_realloc(values,
237f8be1786SSlawomir Mrozowicz 				sizeof(uint8_t) * data_size, 0);
238f8be1786SSlawomir Mrozowicz 			if (values_resized == NULL) {
239f8be1786SSlawomir Mrozowicz 				rte_free(values);
240f8be1786SSlawomir Mrozowicz 				return -1;
241f8be1786SSlawomir Mrozowicz 			}
242f8be1786SSlawomir Mrozowicz 			values = values_resized;
243f8be1786SSlawomir Mrozowicz 		}
244f8be1786SSlawomir Mrozowicz 
245f8be1786SSlawomir Mrozowicz 		values[n_tokens] = (uint8_t) strtoul(tok, &error, 0);
246f8be1786SSlawomir Mrozowicz 		if ((error == NULL) || (*error != '\0')) {
247f8be1786SSlawomir Mrozowicz 			printf("Failed with convert '%s'\n", tok);
248f8be1786SSlawomir Mrozowicz 			rte_free(values);
249f8be1786SSlawomir Mrozowicz 			return -1;
250f8be1786SSlawomir Mrozowicz 		}
251f8be1786SSlawomir Mrozowicz 
252f8be1786SSlawomir Mrozowicz 		tok = strtok(NULL, CPERF_VALUE_DELIMITER);
253f8be1786SSlawomir Mrozowicz 		if (tok == NULL)
254f8be1786SSlawomir Mrozowicz 			break;
255f8be1786SSlawomir Mrozowicz 
256f8be1786SSlawomir Mrozowicz 		n_tokens++;
257f8be1786SSlawomir Mrozowicz 	}
258f8be1786SSlawomir Mrozowicz 
259f8be1786SSlawomir Mrozowicz 	values_resized = (uint8_t *) rte_realloc(values,
260f8be1786SSlawomir Mrozowicz 		sizeof(uint8_t) * (n_tokens + 1), 0);
261f8be1786SSlawomir Mrozowicz 
262f8be1786SSlawomir Mrozowicz 	if (values_resized == NULL) {
263f8be1786SSlawomir Mrozowicz 		rte_free(values);
264f8be1786SSlawomir Mrozowicz 		return -1;
265f8be1786SSlawomir Mrozowicz 	}
266f8be1786SSlawomir Mrozowicz 
267f8be1786SSlawomir Mrozowicz 	*data = values_resized;
268f8be1786SSlawomir Mrozowicz 	*data_length = n_tokens + 1;
269f8be1786SSlawomir Mrozowicz 
270f8be1786SSlawomir Mrozowicz 	return 0;
271f8be1786SSlawomir Mrozowicz }
272f8be1786SSlawomir Mrozowicz 
273f8be1786SSlawomir Mrozowicz /* checks the type of key and assigns data */
274f8be1786SSlawomir Mrozowicz static int
275f8be1786SSlawomir Mrozowicz parse_entry(char *entry, struct cperf_test_vector *vector,
276f8be1786SSlawomir Mrozowicz 	struct cperf_options *opts, uint8_t tc_found)
277f8be1786SSlawomir Mrozowicz {
278f8be1786SSlawomir Mrozowicz 	int status;
279f8be1786SSlawomir Mrozowicz 	uint32_t data_length;
280f8be1786SSlawomir Mrozowicz 
281f8be1786SSlawomir Mrozowicz 	uint8_t *data = NULL;
282f8be1786SSlawomir Mrozowicz 	char *token, *key_token;
283f8be1786SSlawomir Mrozowicz 
284559ef920SSlawomir Mrozowicz 	if (entry == NULL) {
285559ef920SSlawomir Mrozowicz 		printf("Expected entry value\n");
286559ef920SSlawomir Mrozowicz 		return -1;
287559ef920SSlawomir Mrozowicz 	}
288559ef920SSlawomir Mrozowicz 
289f8be1786SSlawomir Mrozowicz 	/* get key */
290f8be1786SSlawomir Mrozowicz 	token = strtok(entry, CPERF_ENTRY_DELIMITER);
291f8be1786SSlawomir Mrozowicz 	key_token = token;
292f8be1786SSlawomir Mrozowicz 	/* get values for key */
293f8be1786SSlawomir Mrozowicz 	token = strtok(NULL, CPERF_ENTRY_DELIMITER);
294559ef920SSlawomir Mrozowicz 
295559ef920SSlawomir Mrozowicz 	if (key_token == NULL || token == NULL) {
296559ef920SSlawomir Mrozowicz 		printf("Expected 'key = values' but was '%.40s'..\n", entry);
297f8be1786SSlawomir Mrozowicz 		return -1;
298f8be1786SSlawomir Mrozowicz 	}
299f8be1786SSlawomir Mrozowicz 
300f8be1786SSlawomir Mrozowicz 	status = parse_values(token, &data, &data_length);
301f8be1786SSlawomir Mrozowicz 	if (status)
302f8be1786SSlawomir Mrozowicz 		return -1;
303f8be1786SSlawomir Mrozowicz 
304f8be1786SSlawomir Mrozowicz 	/* compare keys */
305f8be1786SSlawomir Mrozowicz 	if (strstr(key_token, "plaintext")) {
306f8be1786SSlawomir Mrozowicz 		rte_free(vector->plaintext.data);
307f8be1786SSlawomir Mrozowicz 		vector->plaintext.data = data;
308f8be1786SSlawomir Mrozowicz 		if (tc_found)
309f8be1786SSlawomir Mrozowicz 			vector->plaintext.length = data_length;
310f8be1786SSlawomir Mrozowicz 		else {
311f6cefe25SPablo de Lara 			if (opts->max_buffer_size > data_length) {
312f8be1786SSlawomir Mrozowicz 				printf("Global plaintext shorter than "
313f8be1786SSlawomir Mrozowicz 					"buffer_sz\n");
314f8be1786SSlawomir Mrozowicz 				return -1;
315f8be1786SSlawomir Mrozowicz 			}
316f6cefe25SPablo de Lara 			vector->plaintext.length = opts->max_buffer_size;
317f8be1786SSlawomir Mrozowicz 		}
318f8be1786SSlawomir Mrozowicz 
319f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "cipher_key")) {
320f8be1786SSlawomir Mrozowicz 		rte_free(vector->cipher_key.data);
321f8be1786SSlawomir Mrozowicz 		vector->cipher_key.data = data;
322f8be1786SSlawomir Mrozowicz 		if (tc_found)
323f8be1786SSlawomir Mrozowicz 			vector->cipher_key.length = data_length;
324f8be1786SSlawomir Mrozowicz 		else {
325f8be1786SSlawomir Mrozowicz 			if (opts->cipher_key_sz > data_length) {
326f8be1786SSlawomir Mrozowicz 				printf("Global cipher_key shorter than "
327f8be1786SSlawomir Mrozowicz 					"cipher_key_sz\n");
328f8be1786SSlawomir Mrozowicz 				return -1;
329f8be1786SSlawomir Mrozowicz 			}
330f8be1786SSlawomir Mrozowicz 			vector->cipher_key.length = opts->cipher_key_sz;
331f8be1786SSlawomir Mrozowicz 		}
332f8be1786SSlawomir Mrozowicz 
333f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "auth_key")) {
334f8be1786SSlawomir Mrozowicz 		rte_free(vector->auth_key.data);
335f8be1786SSlawomir Mrozowicz 		vector->auth_key.data = data;
336f8be1786SSlawomir Mrozowicz 		if (tc_found)
337f8be1786SSlawomir Mrozowicz 			vector->auth_key.length = data_length;
338f8be1786SSlawomir Mrozowicz 		else {
339f8be1786SSlawomir Mrozowicz 			if (opts->auth_key_sz > data_length) {
340f8be1786SSlawomir Mrozowicz 				printf("Global auth_key shorter than "
341f8be1786SSlawomir Mrozowicz 					"auth_key_sz\n");
342f8be1786SSlawomir Mrozowicz 				return -1;
343f8be1786SSlawomir Mrozowicz 			}
344f8be1786SSlawomir Mrozowicz 			vector->auth_key.length = opts->auth_key_sz;
345f8be1786SSlawomir Mrozowicz 		}
346f8be1786SSlawomir Mrozowicz 
347da181392SPablo de Lara 	} else if (strstr(key_token, "aead_key")) {
348da181392SPablo de Lara 		rte_free(vector->aead_key.data);
349da181392SPablo de Lara 		vector->aead_key.data = data;
350da181392SPablo de Lara 		if (tc_found)
351da181392SPablo de Lara 			vector->aead_key.length = data_length;
352da181392SPablo de Lara 		else {
353da181392SPablo de Lara 			if (opts->aead_key_sz > data_length) {
354da181392SPablo de Lara 				printf("Global aead_key shorter than "
355da181392SPablo de Lara 					"aead_key_sz\n");
356da181392SPablo de Lara 				return -1;
357da181392SPablo de Lara 			}
358da181392SPablo de Lara 			vector->aead_key.length = opts->aead_key_sz;
359da181392SPablo de Lara 		}
360da181392SPablo de Lara 
361acf86169SPablo de Lara 	} else if (strstr(key_token, "cipher_iv")) {
362acf86169SPablo de Lara 		rte_free(vector->cipher_iv.data);
363acf86169SPablo de Lara 		vector->cipher_iv.data = data;
364f8be1786SSlawomir Mrozowicz 		if (tc_found)
365acf86169SPablo de Lara 			vector->cipher_iv.length = data_length;
366f8be1786SSlawomir Mrozowicz 		else {
367f8be1786SSlawomir Mrozowicz 			if (opts->cipher_iv_sz > data_length) {
368acf86169SPablo de Lara 				printf("Global cipher iv shorter than "
369f8be1786SSlawomir Mrozowicz 					"cipher_iv_sz\n");
370f8be1786SSlawomir Mrozowicz 				return -1;
371f8be1786SSlawomir Mrozowicz 			}
372acf86169SPablo de Lara 			vector->cipher_iv.length = opts->cipher_iv_sz;
373acf86169SPablo de Lara 		}
374acf86169SPablo de Lara 
375acf86169SPablo de Lara 	} else if (strstr(key_token, "auth_iv")) {
376acf86169SPablo de Lara 		rte_free(vector->auth_iv.data);
377acf86169SPablo de Lara 		vector->auth_iv.data = data;
378acf86169SPablo de Lara 		if (tc_found)
379acf86169SPablo de Lara 			vector->auth_iv.length = data_length;
380acf86169SPablo de Lara 		else {
381acf86169SPablo de Lara 			if (opts->auth_iv_sz > data_length) {
382acf86169SPablo de Lara 				printf("Global auth iv shorter than "
383acf86169SPablo de Lara 					"auth_iv_sz\n");
384acf86169SPablo de Lara 				return -1;
385acf86169SPablo de Lara 			}
386acf86169SPablo de Lara 			vector->auth_iv.length = opts->auth_iv_sz;
387f8be1786SSlawomir Mrozowicz 		}
388f8be1786SSlawomir Mrozowicz 
389da181392SPablo de Lara 	} else if (strstr(key_token, "aead_iv")) {
390da181392SPablo de Lara 		rte_free(vector->aead_iv.data);
391da181392SPablo de Lara 		vector->aead_iv.data = data;
392da181392SPablo de Lara 		if (tc_found)
393da181392SPablo de Lara 			vector->aead_iv.length = data_length;
394da181392SPablo de Lara 		else {
395da181392SPablo de Lara 			if (opts->aead_iv_sz > data_length) {
396da181392SPablo de Lara 				printf("Global aead iv shorter than "
397da181392SPablo de Lara 					"aead_iv_sz\n");
398da181392SPablo de Lara 				return -1;
399da181392SPablo de Lara 			}
400da181392SPablo de Lara 			vector->aead_iv.length = opts->aead_iv_sz;
401da181392SPablo de Lara 		}
402da181392SPablo de Lara 
403f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "ciphertext")) {
404f8be1786SSlawomir Mrozowicz 		rte_free(vector->ciphertext.data);
405f8be1786SSlawomir Mrozowicz 		vector->ciphertext.data = data;
406f8be1786SSlawomir Mrozowicz 		if (tc_found)
407f8be1786SSlawomir Mrozowicz 			vector->ciphertext.length = data_length;
408f8be1786SSlawomir Mrozowicz 		else {
409f6cefe25SPablo de Lara 			if (opts->max_buffer_size > data_length) {
410f8be1786SSlawomir Mrozowicz 				printf("Global ciphertext shorter than "
411f8be1786SSlawomir Mrozowicz 					"buffer_sz\n");
412f8be1786SSlawomir Mrozowicz 				return -1;
413f8be1786SSlawomir Mrozowicz 			}
414f6cefe25SPablo de Lara 			vector->ciphertext.length = opts->max_buffer_size;
415f8be1786SSlawomir Mrozowicz 		}
416f8be1786SSlawomir Mrozowicz 
417f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "aad")) {
418f8be1786SSlawomir Mrozowicz 		rte_free(vector->aad.data);
419f8be1786SSlawomir Mrozowicz 		vector->aad.data = data;
42087cf4c6cSThomas Monjalon 		vector->aad.phys_addr = rte_malloc_virt2iova(vector->aad.data);
421f8be1786SSlawomir Mrozowicz 		if (tc_found)
422f8be1786SSlawomir Mrozowicz 			vector->aad.length = data_length;
423f8be1786SSlawomir Mrozowicz 		else {
4248a5b494aSPablo de Lara 			if (opts->aead_aad_sz > data_length) {
425f8be1786SSlawomir Mrozowicz 				printf("Global aad shorter than "
4268a5b494aSPablo de Lara 					"aead_aad_sz\n");
427f8be1786SSlawomir Mrozowicz 				return -1;
428f8be1786SSlawomir Mrozowicz 			}
4298a5b494aSPablo de Lara 			vector->aad.length = opts->aead_aad_sz;
430f8be1786SSlawomir Mrozowicz 		}
431f8be1786SSlawomir Mrozowicz 
432f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "digest")) {
433f8be1786SSlawomir Mrozowicz 		rte_free(vector->digest.data);
434f8be1786SSlawomir Mrozowicz 		vector->digest.data = data;
43587cf4c6cSThomas Monjalon 		vector->digest.phys_addr = rte_malloc_virt2iova(
436f8be1786SSlawomir Mrozowicz 			vector->digest.data);
437f8be1786SSlawomir Mrozowicz 		if (tc_found)
438f8be1786SSlawomir Mrozowicz 			vector->digest.length = data_length;
439f8be1786SSlawomir Mrozowicz 		else {
4408a5b494aSPablo de Lara 			if (opts->digest_sz > data_length) {
441f8be1786SSlawomir Mrozowicz 				printf("Global digest shorter than "
4428a5b494aSPablo de Lara 					"digest_sz\n");
443f8be1786SSlawomir Mrozowicz 				return -1;
444f8be1786SSlawomir Mrozowicz 			}
4458a5b494aSPablo de Lara 			vector->digest.length = opts->digest_sz;
446f8be1786SSlawomir Mrozowicz 		}
447f8be1786SSlawomir Mrozowicz 	} else {
448f8be1786SSlawomir Mrozowicz 		printf("Not valid key: '%s'\n", trim_space(key_token));
449f8be1786SSlawomir Mrozowicz 		return -1;
450f8be1786SSlawomir Mrozowicz 	}
451f8be1786SSlawomir Mrozowicz 
452f8be1786SSlawomir Mrozowicz 	return 0;
453f8be1786SSlawomir Mrozowicz }
454f8be1786SSlawomir Mrozowicz 
455f8be1786SSlawomir Mrozowicz /* searches in the file for test keys and values */
456f8be1786SSlawomir Mrozowicz static int
457f8be1786SSlawomir Mrozowicz parse_file(struct cperf_test_vector *vector, struct cperf_options *opts)
458f8be1786SSlawomir Mrozowicz {
459f8be1786SSlawomir Mrozowicz 	uint8_t tc_found = 0;
460f8be1786SSlawomir Mrozowicz 	uint8_t tc_data_start = 0;
461f8be1786SSlawomir Mrozowicz 	ssize_t read;
462f8be1786SSlawomir Mrozowicz 	size_t len = 0;
463f8be1786SSlawomir Mrozowicz 	int status = 0;
464f8be1786SSlawomir Mrozowicz 
465f8be1786SSlawomir Mrozowicz 	FILE *fp;
466f8be1786SSlawomir Mrozowicz 	char *line = NULL;
467f8be1786SSlawomir Mrozowicz 	char *entry = NULL;
468f8be1786SSlawomir Mrozowicz 
469f8be1786SSlawomir Mrozowicz 	fp = fopen(opts->test_file, "r");
470f8be1786SSlawomir Mrozowicz 	if (fp == NULL) {
471f8be1786SSlawomir Mrozowicz 		printf("File %s does not exists\n", opts->test_file);
472f8be1786SSlawomir Mrozowicz 		return -1;
473f8be1786SSlawomir Mrozowicz 	}
474f8be1786SSlawomir Mrozowicz 
475f8be1786SSlawomir Mrozowicz 	while ((read = getline(&line, &len, fp)) != -1) {
476f8be1786SSlawomir Mrozowicz 
477f8be1786SSlawomir Mrozowicz 		/* ignore comments and new lines */
478f8be1786SSlawomir Mrozowicz 		if (line[0] == '#' || line[0] == '/' || line[0] == '\n'
479f8be1786SSlawomir Mrozowicz 			|| line[0] == '\r' || line[0] == ' ')
480f8be1786SSlawomir Mrozowicz 			continue;
481f8be1786SSlawomir Mrozowicz 
482f8be1786SSlawomir Mrozowicz 		trim_space(line);
483f8be1786SSlawomir Mrozowicz 
484f8be1786SSlawomir Mrozowicz 		/* next test case is started */
485f8be1786SSlawomir Mrozowicz 		if (line[0] == '[' && line[strlen(line) - 1] == ']' && tc_found)
486f8be1786SSlawomir Mrozowicz 			break;
487f8be1786SSlawomir Mrozowicz 		/* test case section started, end of global data */
488f8be1786SSlawomir Mrozowicz 		else if (line[0] == '[' && line[strlen(line) - 1] == ']')
489f8be1786SSlawomir Mrozowicz 			tc_data_start = 1;
490f8be1786SSlawomir Mrozowicz 
491f8be1786SSlawomir Mrozowicz 		/* test name unspecified, end after global data */
492f8be1786SSlawomir Mrozowicz 		if (tc_data_start && opts->test_name == NULL)
493f8be1786SSlawomir Mrozowicz 			break;
494f8be1786SSlawomir Mrozowicz 		/* searching for a suitable test */
495f8be1786SSlawomir Mrozowicz 		else if (tc_data_start && tc_found == 0) {
496f8be1786SSlawomir Mrozowicz 			if (!strcmp(line, opts->test_name)) {
497f8be1786SSlawomir Mrozowicz 				tc_found = 1;
498f8be1786SSlawomir Mrozowicz 				continue;
499f8be1786SSlawomir Mrozowicz 			} else
500f8be1786SSlawomir Mrozowicz 				continue;
501f8be1786SSlawomir Mrozowicz 		}
502f8be1786SSlawomir Mrozowicz 
503f8be1786SSlawomir Mrozowicz 		/* buffer for multiline */
504f8be1786SSlawomir Mrozowicz 		entry = (char *) rte_realloc(entry,
505f8be1786SSlawomir Mrozowicz 					sizeof(char) * strlen(line) + 1, 0);
506f8be1786SSlawomir Mrozowicz 		if (entry == NULL)
507f8be1786SSlawomir Mrozowicz 			return -1;
508f8be1786SSlawomir Mrozowicz 
50921f579fcSJerin Jacob 		strcpy(entry, line);
510f8be1786SSlawomir Mrozowicz 
511f8be1786SSlawomir Mrozowicz 		/* check if entry ends with , or = */
512f8be1786SSlawomir Mrozowicz 		if (entry[strlen(entry) - 1] == ','
513f8be1786SSlawomir Mrozowicz 			|| entry[strlen(entry) - 1] == '=') {
514f8be1786SSlawomir Mrozowicz 			while ((read = getline(&line, &len, fp)) != -1) {
515f8be1786SSlawomir Mrozowicz 				trim_space(line);
516f8be1786SSlawomir Mrozowicz 
517f8be1786SSlawomir Mrozowicz 				/* extend entry about length of new line */
518f8be1786SSlawomir Mrozowicz 				char *entry_extended = (char *) rte_realloc(
519f8be1786SSlawomir Mrozowicz 					entry, sizeof(char)
520f8be1786SSlawomir Mrozowicz 						* (strlen(line) + strlen(entry))
521f8be1786SSlawomir Mrozowicz 						+ 1, 0);
522f8be1786SSlawomir Mrozowicz 
523f8be1786SSlawomir Mrozowicz 				if (entry_extended == NULL)
524f8be1786SSlawomir Mrozowicz 					goto err;
525f8be1786SSlawomir Mrozowicz 				entry = entry_extended;
52621f579fcSJerin Jacob 				/* entry has been allocated accordingly */
52721f579fcSJerin Jacob 				strcpy(&entry[strlen(entry)], line);
528f8be1786SSlawomir Mrozowicz 
529f8be1786SSlawomir Mrozowicz 				if (entry[strlen(entry) - 1] != ',')
530f8be1786SSlawomir Mrozowicz 					break;
531f8be1786SSlawomir Mrozowicz 			}
532f8be1786SSlawomir Mrozowicz 		}
533f8be1786SSlawomir Mrozowicz 		status = parse_entry(entry, vector, opts, tc_found);
534f8be1786SSlawomir Mrozowicz 		if (status) {
535f8be1786SSlawomir Mrozowicz 			printf("An error occurred while parsing!\n");
536f8be1786SSlawomir Mrozowicz 			goto err;
537f8be1786SSlawomir Mrozowicz 		}
538f8be1786SSlawomir Mrozowicz 	}
539f8be1786SSlawomir Mrozowicz 
540f8be1786SSlawomir Mrozowicz 	if (tc_found == 0 && opts->test_name != NULL) {
541f8be1786SSlawomir Mrozowicz 		printf("Not found '%s' case in test file\n", opts->test_name);
542f8be1786SSlawomir Mrozowicz 		goto err;
543f8be1786SSlawomir Mrozowicz 	}
544f8be1786SSlawomir Mrozowicz 
545f8be1786SSlawomir Mrozowicz 	fclose(fp);
546f8be1786SSlawomir Mrozowicz 	free(line);
547f8be1786SSlawomir Mrozowicz 	rte_free(entry);
548f8be1786SSlawomir Mrozowicz 
549f8be1786SSlawomir Mrozowicz 	return 0;
550f8be1786SSlawomir Mrozowicz 
551f8be1786SSlawomir Mrozowicz err:
552f8be1786SSlawomir Mrozowicz 	if (fp)
553f8be1786SSlawomir Mrozowicz 		fclose(fp);
554f8be1786SSlawomir Mrozowicz 	if (line)
555f8be1786SSlawomir Mrozowicz 		free(line);
556f8be1786SSlawomir Mrozowicz 	if (entry)
557f8be1786SSlawomir Mrozowicz 		rte_free(entry);
558f8be1786SSlawomir Mrozowicz 
559f8be1786SSlawomir Mrozowicz 	return -1;
560f8be1786SSlawomir Mrozowicz }
561f8be1786SSlawomir Mrozowicz 
562f8be1786SSlawomir Mrozowicz struct cperf_test_vector*
563f8be1786SSlawomir Mrozowicz cperf_test_vector_get_from_file(struct cperf_options *opts)
564f8be1786SSlawomir Mrozowicz {
565f8be1786SSlawomir Mrozowicz 	int status;
566f8be1786SSlawomir Mrozowicz 	struct cperf_test_vector *test_vector = NULL;
567f8be1786SSlawomir Mrozowicz 
568f8be1786SSlawomir Mrozowicz 	if (opts == NULL || opts->test_file == NULL)
569f8be1786SSlawomir Mrozowicz 		return test_vector;
570f8be1786SSlawomir Mrozowicz 
571f8be1786SSlawomir Mrozowicz 	test_vector = (struct cperf_test_vector *) rte_zmalloc(NULL,
572f8be1786SSlawomir Mrozowicz 		sizeof(struct cperf_test_vector), 0);
573f8be1786SSlawomir Mrozowicz 	if (test_vector == NULL)
574f8be1786SSlawomir Mrozowicz 		return test_vector;
575f8be1786SSlawomir Mrozowicz 
576f8be1786SSlawomir Mrozowicz 	/* filling the vector with data from a file */
577f8be1786SSlawomir Mrozowicz 	status = parse_file(test_vector, opts);
578f8be1786SSlawomir Mrozowicz 	if (status) {
579f8be1786SSlawomir Mrozowicz 		free_test_vector(test_vector, opts);
580f8be1786SSlawomir Mrozowicz 		return NULL;
581f8be1786SSlawomir Mrozowicz 	}
582f8be1786SSlawomir Mrozowicz 
583f8be1786SSlawomir Mrozowicz 	/* other values not included in the file */
584f8be1786SSlawomir Mrozowicz 	test_vector->data.cipher_offset = 0;
585f6cefe25SPablo de Lara 	test_vector->data.cipher_length = opts->max_buffer_size;
586f8be1786SSlawomir Mrozowicz 
587f8be1786SSlawomir Mrozowicz 	test_vector->data.auth_offset = 0;
588f6cefe25SPablo de Lara 	test_vector->data.auth_length = opts->max_buffer_size;
589f8be1786SSlawomir Mrozowicz 
590f8be1786SSlawomir Mrozowicz 	return test_vector;
591f8be1786SSlawomir Mrozowicz }
592