xref: /dpdk/app/test-crypto-perf/cperf_test_vector_parsing.c (revision f8b7fdd38917833e9c0f67d4ebdeb3b3a0162ef5)
1*f8b7fdd3SPablo de Lara /*-
2*f8b7fdd3SPablo de Lara  *   BSD LICENSE
3*f8b7fdd3SPablo de Lara  *
4*f8b7fdd3SPablo de Lara  *   Copyright(c) 2016-2017 Intel Corporation. All rights reserved.
5*f8b7fdd3SPablo de Lara  *
6*f8b7fdd3SPablo de Lara  *   Redistribution and use in source and binary forms, with or without
7*f8b7fdd3SPablo de Lara  *   modification, are permitted provided that the following conditions
8*f8b7fdd3SPablo de Lara  *   are met:
9*f8b7fdd3SPablo de Lara  *
10*f8b7fdd3SPablo de Lara  *     * Redistributions of source code must retain the above copyright
11*f8b7fdd3SPablo de Lara  *       notice, this list of conditions and the following disclaimer.
12*f8b7fdd3SPablo de Lara  *     * Redistributions in binary form must reproduce the above copyright
13*f8b7fdd3SPablo de Lara  *       notice, this list of conditions and the following disclaimer in
14*f8b7fdd3SPablo de Lara  *       the documentation and/or other materials provided with the
15*f8b7fdd3SPablo de Lara  *       distribution.
16*f8b7fdd3SPablo de Lara  *     * Neither the name of Intel Corporation nor the names of its
17*f8b7fdd3SPablo de Lara  *       contributors may be used to endorse or promote products derived
18*f8b7fdd3SPablo de Lara  *       from this software without specific prior written permission.
19*f8b7fdd3SPablo de Lara  *
20*f8b7fdd3SPablo de Lara  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*f8b7fdd3SPablo de Lara  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*f8b7fdd3SPablo de Lara  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*f8b7fdd3SPablo de Lara  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24*f8b7fdd3SPablo de Lara  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25*f8b7fdd3SPablo de Lara  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26*f8b7fdd3SPablo de Lara  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*f8b7fdd3SPablo de Lara  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*f8b7fdd3SPablo de Lara  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*f8b7fdd3SPablo de Lara  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30*f8b7fdd3SPablo de Lara  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*f8b7fdd3SPablo de Lara  */
3242537ad1SDaniel Mrzyglod #ifdef RTE_EXEC_ENV_BSDAPP
3342537ad1SDaniel Mrzyglod 	#define _WITH_GETLINE
3442537ad1SDaniel Mrzyglod #endif
35f8be1786SSlawomir Mrozowicz #include <stdio.h>
36f8be1786SSlawomir Mrozowicz 
37f8be1786SSlawomir Mrozowicz #include <rte_malloc.h>
38f8be1786SSlawomir Mrozowicz 
39f8be1786SSlawomir Mrozowicz #include "cperf_options.h"
40f8be1786SSlawomir Mrozowicz #include "cperf_test_vectors.h"
41f8be1786SSlawomir Mrozowicz #include "cperf_test_vector_parsing.h"
42f8be1786SSlawomir Mrozowicz 
43f8be1786SSlawomir Mrozowicz int
44f8be1786SSlawomir Mrozowicz free_test_vector(struct cperf_test_vector *vector, struct cperf_options *opts)
45f8be1786SSlawomir Mrozowicz {
46f8be1786SSlawomir Mrozowicz 	if (vector == NULL || opts == NULL)
47f8be1786SSlawomir Mrozowicz 		return -1;
48f8be1786SSlawomir Mrozowicz 
49f8be1786SSlawomir Mrozowicz 	rte_free(vector->iv.data);
50f8be1786SSlawomir Mrozowicz 	rte_free(vector->aad.data);
51f8be1786SSlawomir Mrozowicz 	rte_free(vector->digest.data);
52f8be1786SSlawomir Mrozowicz 
53f8be1786SSlawomir Mrozowicz 	if (opts->test_file != NULL) {
54f8be1786SSlawomir Mrozowicz 		rte_free(vector->plaintext.data);
55f8be1786SSlawomir Mrozowicz 		rte_free(vector->cipher_key.data);
56f8be1786SSlawomir Mrozowicz 		rte_free(vector->auth_key.data);
57f8be1786SSlawomir Mrozowicz 		rte_free(vector->ciphertext.data);
58f8be1786SSlawomir Mrozowicz 	}
59f8be1786SSlawomir Mrozowicz 
60f8be1786SSlawomir Mrozowicz 	rte_free(vector);
61f8be1786SSlawomir Mrozowicz 
62f8be1786SSlawomir Mrozowicz 	return 0;
63f8be1786SSlawomir Mrozowicz }
64f8be1786SSlawomir Mrozowicz 
65f8be1786SSlawomir Mrozowicz void
66f8be1786SSlawomir Mrozowicz show_test_vector(struct cperf_test_vector *test_vector)
67f8be1786SSlawomir Mrozowicz {
68f8be1786SSlawomir Mrozowicz 	const uint8_t wrap = 32;
69f8be1786SSlawomir Mrozowicz 	uint32_t i;
70f8be1786SSlawomir Mrozowicz 
71f8be1786SSlawomir Mrozowicz 	if (test_vector == NULL)
72f8be1786SSlawomir Mrozowicz 		return;
73f8be1786SSlawomir Mrozowicz 
74f8be1786SSlawomir Mrozowicz 	if (test_vector->plaintext.data) {
75f8be1786SSlawomir Mrozowicz 		printf("\nplaintext =\n");
76f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->plaintext.length; ++i) {
77f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
78f8be1786SSlawomir Mrozowicz 				printf("\n");
79f8be1786SSlawomir Mrozowicz 			if (i == test_vector->plaintext.length - 1)
80f8be1786SSlawomir Mrozowicz 				printf("0x%02x",
81f8be1786SSlawomir Mrozowicz 					test_vector->plaintext.data[i]);
82f8be1786SSlawomir Mrozowicz 			else
83f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ",
84f8be1786SSlawomir Mrozowicz 					test_vector->plaintext.data[i]);
85f8be1786SSlawomir Mrozowicz 		}
86f8be1786SSlawomir Mrozowicz 		printf("\n");
87f8be1786SSlawomir Mrozowicz 	}
88f8be1786SSlawomir Mrozowicz 
89f8be1786SSlawomir Mrozowicz 	if (test_vector->cipher_key.data) {
90f8be1786SSlawomir Mrozowicz 		printf("\ncipher_key =\n");
91f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->cipher_key.length; ++i) {
92f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
93f8be1786SSlawomir Mrozowicz 				printf("\n");
94f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->cipher_key.length - 1))
95f8be1786SSlawomir Mrozowicz 				printf("0x%02x",
96f8be1786SSlawomir Mrozowicz 					test_vector->cipher_key.data[i]);
97f8be1786SSlawomir Mrozowicz 			else
98f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ",
99f8be1786SSlawomir Mrozowicz 					test_vector->cipher_key.data[i]);
100f8be1786SSlawomir Mrozowicz 		}
101f8be1786SSlawomir Mrozowicz 		printf("\n");
102f8be1786SSlawomir Mrozowicz 	}
103f8be1786SSlawomir Mrozowicz 
104f8be1786SSlawomir Mrozowicz 	if (test_vector->auth_key.data) {
105f8be1786SSlawomir Mrozowicz 		printf("\nauth_key =\n");
106f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->auth_key.length; ++i) {
107f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
108f8be1786SSlawomir Mrozowicz 				printf("\n");
109f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->auth_key.length - 1))
110f8be1786SSlawomir Mrozowicz 				printf("0x%02x", test_vector->auth_key.data[i]);
111f8be1786SSlawomir Mrozowicz 			else
112f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ",
113f8be1786SSlawomir Mrozowicz 					test_vector->auth_key.data[i]);
114f8be1786SSlawomir Mrozowicz 		}
115f8be1786SSlawomir Mrozowicz 		printf("\n");
116f8be1786SSlawomir Mrozowicz 	}
117f8be1786SSlawomir Mrozowicz 
118f8be1786SSlawomir Mrozowicz 	if (test_vector->iv.data) {
119f8be1786SSlawomir Mrozowicz 		printf("\niv =\n");
120f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->iv.length; ++i) {
121f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
122f8be1786SSlawomir Mrozowicz 				printf("\n");
123f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->iv.length - 1))
124f8be1786SSlawomir Mrozowicz 				printf("0x%02x", test_vector->iv.data[i]);
125f8be1786SSlawomir Mrozowicz 			else
126f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ", test_vector->iv.data[i]);
127f8be1786SSlawomir Mrozowicz 		}
128f8be1786SSlawomir Mrozowicz 		printf("\n");
129f8be1786SSlawomir Mrozowicz 	}
130f8be1786SSlawomir Mrozowicz 
131f8be1786SSlawomir Mrozowicz 	if (test_vector->ciphertext.data) {
132f8be1786SSlawomir Mrozowicz 		printf("\nciphertext =\n");
133f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->ciphertext.length; ++i) {
134f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
135f8be1786SSlawomir Mrozowicz 				printf("\n");
136f8be1786SSlawomir Mrozowicz 			if (i == test_vector->ciphertext.length - 1)
137f8be1786SSlawomir Mrozowicz 				printf("0x%02x",
138f8be1786SSlawomir Mrozowicz 					test_vector->ciphertext.data[i]);
139f8be1786SSlawomir Mrozowicz 			else
140f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ",
141f8be1786SSlawomir Mrozowicz 					test_vector->ciphertext.data[i]);
142f8be1786SSlawomir Mrozowicz 		}
143f8be1786SSlawomir Mrozowicz 		printf("\n");
144f8be1786SSlawomir Mrozowicz 	}
145f8be1786SSlawomir Mrozowicz 
146f8be1786SSlawomir Mrozowicz 	if (test_vector->aad.data) {
147f8be1786SSlawomir Mrozowicz 		printf("\naad =\n");
148f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->aad.length; ++i) {
149f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
150f8be1786SSlawomir Mrozowicz 				printf("\n");
151f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->aad.length - 1))
152f8be1786SSlawomir Mrozowicz 				printf("0x%02x", test_vector->aad.data[i]);
153f8be1786SSlawomir Mrozowicz 			else
154f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ", test_vector->aad.data[i]);
155f8be1786SSlawomir Mrozowicz 		}
156f8be1786SSlawomir Mrozowicz 		printf("\n");
157f8be1786SSlawomir Mrozowicz 	}
158f8be1786SSlawomir Mrozowicz 
159f8be1786SSlawomir Mrozowicz 	if (test_vector->digest.data) {
160f8be1786SSlawomir Mrozowicz 		printf("\ndigest =\n");
161f8be1786SSlawomir Mrozowicz 		for (i = 0; i < test_vector->digest.length; ++i) {
162f8be1786SSlawomir Mrozowicz 			if ((i % wrap == 0) && (i != 0))
163f8be1786SSlawomir Mrozowicz 				printf("\n");
164f8be1786SSlawomir Mrozowicz 			if (i == (uint32_t)(test_vector->digest.length - 1))
165f8be1786SSlawomir Mrozowicz 				printf("0x%02x", test_vector->digest.data[i]);
166f8be1786SSlawomir Mrozowicz 			else
167f8be1786SSlawomir Mrozowicz 				printf("0x%02x, ", test_vector->digest.data[i]);
168f8be1786SSlawomir Mrozowicz 		}
169f8be1786SSlawomir Mrozowicz 		printf("\n");
170f8be1786SSlawomir Mrozowicz 	}
171f8be1786SSlawomir Mrozowicz }
172f8be1786SSlawomir Mrozowicz 
173f8be1786SSlawomir Mrozowicz /* trim leading and trailing spaces */
174f8be1786SSlawomir Mrozowicz static char *
175f8be1786SSlawomir Mrozowicz trim_space(char *str)
176f8be1786SSlawomir Mrozowicz {
177f8be1786SSlawomir Mrozowicz 	char *start, *end;
178f8be1786SSlawomir Mrozowicz 
179f8be1786SSlawomir Mrozowicz 	for (start = str; *start; start++) {
180f8be1786SSlawomir Mrozowicz 		if (!isspace((unsigned char) start[0]))
181f8be1786SSlawomir Mrozowicz 			break;
182f8be1786SSlawomir Mrozowicz 	}
183f8be1786SSlawomir Mrozowicz 
184f8be1786SSlawomir Mrozowicz 	for (end = start + strlen(start); end > start + 1; end--) {
185f8be1786SSlawomir Mrozowicz 		if (!isspace((unsigned char) end[-1]))
186f8be1786SSlawomir Mrozowicz 			break;
187f8be1786SSlawomir Mrozowicz 	}
188f8be1786SSlawomir Mrozowicz 
189f8be1786SSlawomir Mrozowicz 	*end = 0;
190f8be1786SSlawomir Mrozowicz 
191f8be1786SSlawomir Mrozowicz 	/* Shift from "start" to the beginning of the string */
192f8be1786SSlawomir Mrozowicz 	if (start > str)
193f8be1786SSlawomir Mrozowicz 		memmove(str, start, (end - start) + 1);
194f8be1786SSlawomir Mrozowicz 
195f8be1786SSlawomir Mrozowicz 	return str;
196f8be1786SSlawomir Mrozowicz }
197f8be1786SSlawomir Mrozowicz 
198f8be1786SSlawomir Mrozowicz /* tokenization test values separated by a comma */
199f8be1786SSlawomir Mrozowicz static int
200f8be1786SSlawomir Mrozowicz parse_values(char *tokens, uint8_t **data, uint32_t *data_length)
201f8be1786SSlawomir Mrozowicz {
202f8be1786SSlawomir Mrozowicz 	uint32_t n_tokens;
203f8be1786SSlawomir Mrozowicz 	uint32_t data_size = 32;
204f8be1786SSlawomir Mrozowicz 
205f8be1786SSlawomir Mrozowicz 	uint8_t *values, *values_resized;
206f8be1786SSlawomir Mrozowicz 	char *tok, *error = NULL;
207f8be1786SSlawomir Mrozowicz 
208f8be1786SSlawomir Mrozowicz 	tok = strtok(tokens, CPERF_VALUE_DELIMITER);
209f8be1786SSlawomir Mrozowicz 	if (tok == NULL)
210f8be1786SSlawomir Mrozowicz 		return -1;
211f8be1786SSlawomir Mrozowicz 
212f8be1786SSlawomir Mrozowicz 	values = (uint8_t *) rte_zmalloc(NULL, sizeof(uint8_t) * data_size, 0);
213f8be1786SSlawomir Mrozowicz 	if (values == NULL)
214f8be1786SSlawomir Mrozowicz 		return -1;
215f8be1786SSlawomir Mrozowicz 
216f8be1786SSlawomir Mrozowicz 	n_tokens = 0;
217f8be1786SSlawomir Mrozowicz 	while (tok != NULL) {
218f8be1786SSlawomir Mrozowicz 		values_resized = NULL;
219f8be1786SSlawomir Mrozowicz 
220f8be1786SSlawomir Mrozowicz 		if (n_tokens >= data_size) {
221f8be1786SSlawomir Mrozowicz 			data_size *= 2;
222f8be1786SSlawomir Mrozowicz 
223f8be1786SSlawomir Mrozowicz 			values_resized = (uint8_t *) rte_realloc(values,
224f8be1786SSlawomir Mrozowicz 				sizeof(uint8_t) * data_size, 0);
225f8be1786SSlawomir Mrozowicz 			if (values_resized == NULL) {
226f8be1786SSlawomir Mrozowicz 				rte_free(values);
227f8be1786SSlawomir Mrozowicz 				return -1;
228f8be1786SSlawomir Mrozowicz 			}
229f8be1786SSlawomir Mrozowicz 			values = values_resized;
230f8be1786SSlawomir Mrozowicz 		}
231f8be1786SSlawomir Mrozowicz 
232f8be1786SSlawomir Mrozowicz 		values[n_tokens] = (uint8_t) strtoul(tok, &error, 0);
233f8be1786SSlawomir Mrozowicz 		if ((error == NULL) || (*error != '\0')) {
234f8be1786SSlawomir Mrozowicz 			printf("Failed with convert '%s'\n", tok);
235f8be1786SSlawomir Mrozowicz 			rte_free(values);
236f8be1786SSlawomir Mrozowicz 			return -1;
237f8be1786SSlawomir Mrozowicz 		}
238f8be1786SSlawomir Mrozowicz 
239f8be1786SSlawomir Mrozowicz 		tok = strtok(NULL, CPERF_VALUE_DELIMITER);
240f8be1786SSlawomir Mrozowicz 		if (tok == NULL)
241f8be1786SSlawomir Mrozowicz 			break;
242f8be1786SSlawomir Mrozowicz 
243f8be1786SSlawomir Mrozowicz 		n_tokens++;
244f8be1786SSlawomir Mrozowicz 	}
245f8be1786SSlawomir Mrozowicz 
246f8be1786SSlawomir Mrozowicz 	values_resized = (uint8_t *) rte_realloc(values,
247f8be1786SSlawomir Mrozowicz 		sizeof(uint8_t) * (n_tokens + 1), 0);
248f8be1786SSlawomir Mrozowicz 
249f8be1786SSlawomir Mrozowicz 	if (values_resized == NULL) {
250f8be1786SSlawomir Mrozowicz 		rte_free(values);
251f8be1786SSlawomir Mrozowicz 		return -1;
252f8be1786SSlawomir Mrozowicz 	}
253f8be1786SSlawomir Mrozowicz 
254f8be1786SSlawomir Mrozowicz 	*data = values_resized;
255f8be1786SSlawomir Mrozowicz 	*data_length = n_tokens + 1;
256f8be1786SSlawomir Mrozowicz 
257f8be1786SSlawomir Mrozowicz 	return 0;
258f8be1786SSlawomir Mrozowicz }
259f8be1786SSlawomir Mrozowicz 
260f8be1786SSlawomir Mrozowicz /* checks the type of key and assigns data */
261f8be1786SSlawomir Mrozowicz static int
262f8be1786SSlawomir Mrozowicz parse_entry(char *entry, struct cperf_test_vector *vector,
263f8be1786SSlawomir Mrozowicz 	struct cperf_options *opts, uint8_t tc_found)
264f8be1786SSlawomir Mrozowicz {
265f8be1786SSlawomir Mrozowicz 	int status;
266f8be1786SSlawomir Mrozowicz 	uint32_t data_length;
267f8be1786SSlawomir Mrozowicz 
268f8be1786SSlawomir Mrozowicz 	uint8_t *data = NULL;
269f8be1786SSlawomir Mrozowicz 	char *token, *key_token;
270f8be1786SSlawomir Mrozowicz 
271559ef920SSlawomir Mrozowicz 	if (entry == NULL) {
272559ef920SSlawomir Mrozowicz 		printf("Expected entry value\n");
273559ef920SSlawomir Mrozowicz 		return -1;
274559ef920SSlawomir Mrozowicz 	}
275559ef920SSlawomir Mrozowicz 
276f8be1786SSlawomir Mrozowicz 	/* get key */
277f8be1786SSlawomir Mrozowicz 	token = strtok(entry, CPERF_ENTRY_DELIMITER);
278f8be1786SSlawomir Mrozowicz 	key_token = token;
279f8be1786SSlawomir Mrozowicz 	/* get values for key */
280f8be1786SSlawomir Mrozowicz 	token = strtok(NULL, CPERF_ENTRY_DELIMITER);
281559ef920SSlawomir Mrozowicz 
282559ef920SSlawomir Mrozowicz 	if (key_token == NULL || token == NULL) {
283559ef920SSlawomir Mrozowicz 		printf("Expected 'key = values' but was '%.40s'..\n", entry);
284f8be1786SSlawomir Mrozowicz 		return -1;
285f8be1786SSlawomir Mrozowicz 	}
286f8be1786SSlawomir Mrozowicz 
287f8be1786SSlawomir Mrozowicz 	status = parse_values(token, &data, &data_length);
288f8be1786SSlawomir Mrozowicz 	if (status)
289f8be1786SSlawomir Mrozowicz 		return -1;
290f8be1786SSlawomir Mrozowicz 
291f8be1786SSlawomir Mrozowicz 	/* compare keys */
292f8be1786SSlawomir Mrozowicz 	if (strstr(key_token, "plaintext")) {
293f8be1786SSlawomir Mrozowicz 		rte_free(vector->plaintext.data);
294f8be1786SSlawomir Mrozowicz 		vector->plaintext.data = data;
295f8be1786SSlawomir Mrozowicz 		if (tc_found)
296f8be1786SSlawomir Mrozowicz 			vector->plaintext.length = data_length;
297f8be1786SSlawomir Mrozowicz 		else {
298f6cefe25SPablo de Lara 			if (opts->max_buffer_size > data_length) {
299f8be1786SSlawomir Mrozowicz 				printf("Global plaintext shorter than "
300f8be1786SSlawomir Mrozowicz 					"buffer_sz\n");
301f8be1786SSlawomir Mrozowicz 				return -1;
302f8be1786SSlawomir Mrozowicz 			}
303f6cefe25SPablo de Lara 			vector->plaintext.length = opts->max_buffer_size;
304f8be1786SSlawomir Mrozowicz 		}
305f8be1786SSlawomir Mrozowicz 
306f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "cipher_key")) {
307f8be1786SSlawomir Mrozowicz 		rte_free(vector->cipher_key.data);
308f8be1786SSlawomir Mrozowicz 		vector->cipher_key.data = data;
309f8be1786SSlawomir Mrozowicz 		if (tc_found)
310f8be1786SSlawomir Mrozowicz 			vector->cipher_key.length = data_length;
311f8be1786SSlawomir Mrozowicz 		else {
312f8be1786SSlawomir Mrozowicz 			if (opts->cipher_key_sz > data_length) {
313f8be1786SSlawomir Mrozowicz 				printf("Global cipher_key shorter than "
314f8be1786SSlawomir Mrozowicz 					"cipher_key_sz\n");
315f8be1786SSlawomir Mrozowicz 				return -1;
316f8be1786SSlawomir Mrozowicz 			}
317f8be1786SSlawomir Mrozowicz 			vector->cipher_key.length = opts->cipher_key_sz;
318f8be1786SSlawomir Mrozowicz 		}
319f8be1786SSlawomir Mrozowicz 
320f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "auth_key")) {
321f8be1786SSlawomir Mrozowicz 		rte_free(vector->auth_key.data);
322f8be1786SSlawomir Mrozowicz 		vector->auth_key.data = data;
323f8be1786SSlawomir Mrozowicz 		if (tc_found)
324f8be1786SSlawomir Mrozowicz 			vector->auth_key.length = data_length;
325f8be1786SSlawomir Mrozowicz 		else {
326f8be1786SSlawomir Mrozowicz 			if (opts->auth_key_sz > data_length) {
327f8be1786SSlawomir Mrozowicz 				printf("Global auth_key shorter than "
328f8be1786SSlawomir Mrozowicz 					"auth_key_sz\n");
329f8be1786SSlawomir Mrozowicz 				return -1;
330f8be1786SSlawomir Mrozowicz 			}
331f8be1786SSlawomir Mrozowicz 			vector->auth_key.length = opts->auth_key_sz;
332f8be1786SSlawomir Mrozowicz 		}
333f8be1786SSlawomir Mrozowicz 
334f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "iv")) {
335f8be1786SSlawomir Mrozowicz 		rte_free(vector->iv.data);
336f8be1786SSlawomir Mrozowicz 		vector->iv.data = data;
337f8be1786SSlawomir Mrozowicz 		if (tc_found)
338f8be1786SSlawomir Mrozowicz 			vector->iv.length = data_length;
339f8be1786SSlawomir Mrozowicz 		else {
340f8be1786SSlawomir Mrozowicz 			if (opts->cipher_iv_sz > data_length) {
341f8be1786SSlawomir Mrozowicz 				printf("Global iv shorter than "
342f8be1786SSlawomir Mrozowicz 					"cipher_iv_sz\n");
343f8be1786SSlawomir Mrozowicz 				return -1;
344f8be1786SSlawomir Mrozowicz 			}
345f8be1786SSlawomir Mrozowicz 			vector->iv.length = opts->cipher_iv_sz;
346f8be1786SSlawomir Mrozowicz 		}
347f8be1786SSlawomir Mrozowicz 
348f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "ciphertext")) {
349f8be1786SSlawomir Mrozowicz 		rte_free(vector->ciphertext.data);
350f8be1786SSlawomir Mrozowicz 		vector->ciphertext.data = data;
351f8be1786SSlawomir Mrozowicz 		if (tc_found)
352f8be1786SSlawomir Mrozowicz 			vector->ciphertext.length = data_length;
353f8be1786SSlawomir Mrozowicz 		else {
354f6cefe25SPablo de Lara 			if (opts->max_buffer_size > data_length) {
355f8be1786SSlawomir Mrozowicz 				printf("Global ciphertext shorter than "
356f8be1786SSlawomir Mrozowicz 					"buffer_sz\n");
357f8be1786SSlawomir Mrozowicz 				return -1;
358f8be1786SSlawomir Mrozowicz 			}
359f6cefe25SPablo de Lara 			vector->ciphertext.length = opts->max_buffer_size;
360f8be1786SSlawomir Mrozowicz 		}
361f8be1786SSlawomir Mrozowicz 
362f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "aad")) {
363f8be1786SSlawomir Mrozowicz 		rte_free(vector->aad.data);
364f8be1786SSlawomir Mrozowicz 		vector->aad.data = data;
365f8be1786SSlawomir Mrozowicz 		vector->aad.phys_addr = rte_malloc_virt2phy(vector->aad.data);
366f8be1786SSlawomir Mrozowicz 		if (tc_found)
367f8be1786SSlawomir Mrozowicz 			vector->aad.length = data_length;
368f8be1786SSlawomir Mrozowicz 		else {
369f8be1786SSlawomir Mrozowicz 			if (opts->auth_aad_sz > data_length) {
370f8be1786SSlawomir Mrozowicz 				printf("Global aad shorter than "
371f8be1786SSlawomir Mrozowicz 					"auth_aad_sz\n");
372f8be1786SSlawomir Mrozowicz 				return -1;
373f8be1786SSlawomir Mrozowicz 			}
374f8be1786SSlawomir Mrozowicz 			vector->aad.length = opts->auth_aad_sz;
375f8be1786SSlawomir Mrozowicz 		}
376f8be1786SSlawomir Mrozowicz 
377f8be1786SSlawomir Mrozowicz 	} else if (strstr(key_token, "digest")) {
378f8be1786SSlawomir Mrozowicz 		rte_free(vector->digest.data);
379f8be1786SSlawomir Mrozowicz 		vector->digest.data = data;
380f8be1786SSlawomir Mrozowicz 		vector->digest.phys_addr = rte_malloc_virt2phy(
381f8be1786SSlawomir Mrozowicz 			vector->digest.data);
382f8be1786SSlawomir Mrozowicz 		if (tc_found)
383f8be1786SSlawomir Mrozowicz 			vector->digest.length = data_length;
384f8be1786SSlawomir Mrozowicz 		else {
385f8be1786SSlawomir Mrozowicz 			if (opts->auth_digest_sz > data_length) {
386f8be1786SSlawomir Mrozowicz 				printf("Global digest shorter than "
387f8be1786SSlawomir Mrozowicz 					"auth_digest_sz\n");
388f8be1786SSlawomir Mrozowicz 				return -1;
389f8be1786SSlawomir Mrozowicz 			}
390f8be1786SSlawomir Mrozowicz 			vector->digest.length = opts->auth_digest_sz;
391f8be1786SSlawomir Mrozowicz 		}
392f8be1786SSlawomir Mrozowicz 	} else {
393f8be1786SSlawomir Mrozowicz 		printf("Not valid key: '%s'\n", trim_space(key_token));
394f8be1786SSlawomir Mrozowicz 		return -1;
395f8be1786SSlawomir Mrozowicz 	}
396f8be1786SSlawomir Mrozowicz 
397f8be1786SSlawomir Mrozowicz 	return 0;
398f8be1786SSlawomir Mrozowicz }
399f8be1786SSlawomir Mrozowicz 
400f8be1786SSlawomir Mrozowicz /* searches in the file for test keys and values */
401f8be1786SSlawomir Mrozowicz static int
402f8be1786SSlawomir Mrozowicz parse_file(struct cperf_test_vector *vector, struct cperf_options *opts)
403f8be1786SSlawomir Mrozowicz {
404f8be1786SSlawomir Mrozowicz 	uint8_t tc_found = 0;
405f8be1786SSlawomir Mrozowicz 	uint8_t tc_data_start = 0;
406f8be1786SSlawomir Mrozowicz 	ssize_t read;
407f8be1786SSlawomir Mrozowicz 	size_t len = 0;
408f8be1786SSlawomir Mrozowicz 	int status = 0;
409f8be1786SSlawomir Mrozowicz 
410f8be1786SSlawomir Mrozowicz 	FILE *fp;
411f8be1786SSlawomir Mrozowicz 	char *line = NULL;
412f8be1786SSlawomir Mrozowicz 	char *entry = NULL;
413f8be1786SSlawomir Mrozowicz 
414f8be1786SSlawomir Mrozowicz 	fp = fopen(opts->test_file, "r");
415f8be1786SSlawomir Mrozowicz 	if (fp == NULL) {
416f8be1786SSlawomir Mrozowicz 		printf("File %s does not exists\n", opts->test_file);
417f8be1786SSlawomir Mrozowicz 		return -1;
418f8be1786SSlawomir Mrozowicz 	}
419f8be1786SSlawomir Mrozowicz 
420f8be1786SSlawomir Mrozowicz 	while ((read = getline(&line, &len, fp)) != -1) {
421f8be1786SSlawomir Mrozowicz 
422f8be1786SSlawomir Mrozowicz 		/* ignore comments and new lines */
423f8be1786SSlawomir Mrozowicz 		if (line[0] == '#' || line[0] == '/' || line[0] == '\n'
424f8be1786SSlawomir Mrozowicz 			|| line[0] == '\r' || line[0] == ' ')
425f8be1786SSlawomir Mrozowicz 			continue;
426f8be1786SSlawomir Mrozowicz 
427f8be1786SSlawomir Mrozowicz 		trim_space(line);
428f8be1786SSlawomir Mrozowicz 
429f8be1786SSlawomir Mrozowicz 		/* next test case is started */
430f8be1786SSlawomir Mrozowicz 		if (line[0] == '[' && line[strlen(line) - 1] == ']' && tc_found)
431f8be1786SSlawomir Mrozowicz 			break;
432f8be1786SSlawomir Mrozowicz 		/* test case section started, end of global data */
433f8be1786SSlawomir Mrozowicz 		else if (line[0] == '[' && line[strlen(line) - 1] == ']')
434f8be1786SSlawomir Mrozowicz 			tc_data_start = 1;
435f8be1786SSlawomir Mrozowicz 
436f8be1786SSlawomir Mrozowicz 		/* test name unspecified, end after global data */
437f8be1786SSlawomir Mrozowicz 		if (tc_data_start && opts->test_name == NULL)
438f8be1786SSlawomir Mrozowicz 			break;
439f8be1786SSlawomir Mrozowicz 		/* searching for a suitable test */
440f8be1786SSlawomir Mrozowicz 		else if (tc_data_start && tc_found == 0) {
441f8be1786SSlawomir Mrozowicz 			if (!strcmp(line, opts->test_name)) {
442f8be1786SSlawomir Mrozowicz 				tc_found = 1;
443f8be1786SSlawomir Mrozowicz 				continue;
444f8be1786SSlawomir Mrozowicz 			} else
445f8be1786SSlawomir Mrozowicz 				continue;
446f8be1786SSlawomir Mrozowicz 		}
447f8be1786SSlawomir Mrozowicz 
448f8be1786SSlawomir Mrozowicz 		/* buffer for multiline */
449f8be1786SSlawomir Mrozowicz 		entry = (char *) rte_realloc(entry,
450f8be1786SSlawomir Mrozowicz 					sizeof(char) * strlen(line) + 1, 0);
451f8be1786SSlawomir Mrozowicz 		if (entry == NULL)
452f8be1786SSlawomir Mrozowicz 			return -1;
453f8be1786SSlawomir Mrozowicz 
454f8be1786SSlawomir Mrozowicz 		memset(entry, 0, strlen(line) + 1);
455f8be1786SSlawomir Mrozowicz 		strncpy(entry, line, strlen(line));
456f8be1786SSlawomir Mrozowicz 
457f8be1786SSlawomir Mrozowicz 		/* check if entry ends with , or = */
458f8be1786SSlawomir Mrozowicz 		if (entry[strlen(entry) - 1] == ','
459f8be1786SSlawomir Mrozowicz 			|| entry[strlen(entry) - 1] == '=') {
460f8be1786SSlawomir Mrozowicz 			while ((read = getline(&line, &len, fp)) != -1) {
461f8be1786SSlawomir Mrozowicz 				trim_space(line);
462f8be1786SSlawomir Mrozowicz 
463f8be1786SSlawomir Mrozowicz 				/* extend entry about length of new line */
464f8be1786SSlawomir Mrozowicz 				char *entry_extended = (char *) rte_realloc(
465f8be1786SSlawomir Mrozowicz 					entry, sizeof(char)
466f8be1786SSlawomir Mrozowicz 						* (strlen(line) + strlen(entry))
467f8be1786SSlawomir Mrozowicz 						+ 1, 0);
468f8be1786SSlawomir Mrozowicz 
469f8be1786SSlawomir Mrozowicz 				if (entry_extended == NULL)
470f8be1786SSlawomir Mrozowicz 					goto err;
471f8be1786SSlawomir Mrozowicz 				entry = entry_extended;
472f8be1786SSlawomir Mrozowicz 
473f8be1786SSlawomir Mrozowicz 				strncat(entry, line, strlen(line));
474f8be1786SSlawomir Mrozowicz 
475f8be1786SSlawomir Mrozowicz 				if (entry[strlen(entry) - 1] != ',')
476f8be1786SSlawomir Mrozowicz 					break;
477f8be1786SSlawomir Mrozowicz 			}
478f8be1786SSlawomir Mrozowicz 		}
479f8be1786SSlawomir Mrozowicz 		status = parse_entry(entry, vector, opts, tc_found);
480f8be1786SSlawomir Mrozowicz 		if (status) {
481f8be1786SSlawomir Mrozowicz 			printf("An error occurred while parsing!\n");
482f8be1786SSlawomir Mrozowicz 			goto err;
483f8be1786SSlawomir Mrozowicz 		}
484f8be1786SSlawomir Mrozowicz 	}
485f8be1786SSlawomir Mrozowicz 
486f8be1786SSlawomir Mrozowicz 	if (tc_found == 0 && opts->test_name != NULL) {
487f8be1786SSlawomir Mrozowicz 		printf("Not found '%s' case in test file\n", opts->test_name);
488f8be1786SSlawomir Mrozowicz 		goto err;
489f8be1786SSlawomir Mrozowicz 	}
490f8be1786SSlawomir Mrozowicz 
491f8be1786SSlawomir Mrozowicz 	fclose(fp);
492f8be1786SSlawomir Mrozowicz 	free(line);
493f8be1786SSlawomir Mrozowicz 	rte_free(entry);
494f8be1786SSlawomir Mrozowicz 
495f8be1786SSlawomir Mrozowicz 	return 0;
496f8be1786SSlawomir Mrozowicz 
497f8be1786SSlawomir Mrozowicz err:
498f8be1786SSlawomir Mrozowicz 	if (fp)
499f8be1786SSlawomir Mrozowicz 		fclose(fp);
500f8be1786SSlawomir Mrozowicz 	if (line)
501f8be1786SSlawomir Mrozowicz 		free(line);
502f8be1786SSlawomir Mrozowicz 	if (entry)
503f8be1786SSlawomir Mrozowicz 		rte_free(entry);
504f8be1786SSlawomir Mrozowicz 
505f8be1786SSlawomir Mrozowicz 	return -1;
506f8be1786SSlawomir Mrozowicz }
507f8be1786SSlawomir Mrozowicz 
508f8be1786SSlawomir Mrozowicz struct cperf_test_vector*
509f8be1786SSlawomir Mrozowicz cperf_test_vector_get_from_file(struct cperf_options *opts)
510f8be1786SSlawomir Mrozowicz {
511f8be1786SSlawomir Mrozowicz 	int status;
512f8be1786SSlawomir Mrozowicz 	struct cperf_test_vector *test_vector = NULL;
513f8be1786SSlawomir Mrozowicz 
514f8be1786SSlawomir Mrozowicz 	if (opts == NULL || opts->test_file == NULL)
515f8be1786SSlawomir Mrozowicz 		return test_vector;
516f8be1786SSlawomir Mrozowicz 
517f8be1786SSlawomir Mrozowicz 	test_vector = (struct cperf_test_vector *) rte_zmalloc(NULL,
518f8be1786SSlawomir Mrozowicz 		sizeof(struct cperf_test_vector), 0);
519f8be1786SSlawomir Mrozowicz 	if (test_vector == NULL)
520f8be1786SSlawomir Mrozowicz 		return test_vector;
521f8be1786SSlawomir Mrozowicz 
522f8be1786SSlawomir Mrozowicz 	/* filling the vector with data from a file */
523f8be1786SSlawomir Mrozowicz 	status = parse_file(test_vector, opts);
524f8be1786SSlawomir Mrozowicz 	if (status) {
525f8be1786SSlawomir Mrozowicz 		free_test_vector(test_vector, opts);
526f8be1786SSlawomir Mrozowicz 		return NULL;
527f8be1786SSlawomir Mrozowicz 	}
528f8be1786SSlawomir Mrozowicz 
529f8be1786SSlawomir Mrozowicz 	/* other values not included in the file */
530f8be1786SSlawomir Mrozowicz 	test_vector->data.cipher_offset = 0;
531f6cefe25SPablo de Lara 	test_vector->data.cipher_length = opts->max_buffer_size;
532f8be1786SSlawomir Mrozowicz 
533f8be1786SSlawomir Mrozowicz 	test_vector->data.auth_offset = 0;
534f6cefe25SPablo de Lara 	test_vector->data.auth_length = opts->max_buffer_size;
535f8be1786SSlawomir Mrozowicz 
536f8be1786SSlawomir Mrozowicz 	return test_vector;
537f8be1786SSlawomir Mrozowicz }
538