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