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