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