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