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