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