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