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