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