1cd255ccfSMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause 2cd255ccfSMarko Kovacevic * Copyright(c) 2018 Intel Corporation 3cd255ccfSMarko Kovacevic */ 4cd255ccfSMarko Kovacevic 5cd255ccfSMarko Kovacevic #include <string.h> 6cd255ccfSMarko Kovacevic #include <time.h> 7cd255ccfSMarko Kovacevic #include <stdio.h> 8cd255ccfSMarko Kovacevic 9cd255ccfSMarko Kovacevic #include <rte_cryptodev.h> 10cd255ccfSMarko Kovacevic 11cd255ccfSMarko Kovacevic #include "fips_validation.h" 12cd255ccfSMarko Kovacevic 13cd255ccfSMarko Kovacevic #define MODE_STR "AESVS" 14cd255ccfSMarko Kovacevic #define ALGO_STR "test data for " 15cd255ccfSMarko Kovacevic #define OP_STR "State" 16cd255ccfSMarko Kovacevic #define KEY_SIZE_STR "Key Length : " 17cd255ccfSMarko Kovacevic 18cd255ccfSMarko Kovacevic 19cd255ccfSMarko Kovacevic #define COUNT_STR "COUNT = " 20cd255ccfSMarko Kovacevic #define KEY_STR "KEY = " 21cd255ccfSMarko Kovacevic #define IV_STR "IV = " 22cd255ccfSMarko Kovacevic #define PT_STR "PLAINTEXT = " 23cd255ccfSMarko Kovacevic #define CT_STR "CIPHERTEXT = " 24cd255ccfSMarko Kovacevic 25cd255ccfSMarko Kovacevic #define OP_ENC_STR "ENCRYPT" 26cd255ccfSMarko Kovacevic #define OP_DEC_STR "DECRYPT" 27cd255ccfSMarko Kovacevic 28cd255ccfSMarko Kovacevic struct { 29cd255ccfSMarko Kovacevic uint32_t type; 30cd255ccfSMarko Kovacevic const char *desc; 31cd255ccfSMarko Kovacevic } aes_test_types[] = { 32cd255ccfSMarko Kovacevic {AESAVS_TYPE_GFXBOX, "GFSbox"}, 33cd255ccfSMarko Kovacevic {AESAVS_TYPE_KEYSBOX, "KeySbox"}, 34cd255ccfSMarko Kovacevic {AESAVS_TYPE_VARKEY, "VarKey"}, 35cd255ccfSMarko Kovacevic {AESAVS_TYPE_VARTXT, "VarTxt"}, 36527cbf3dSMarko Kovacevic {TDES_VARIABLE_TEXT, "VARIABLE PLAINTEXT/CIPHERTEXT"}, 37527cbf3dSMarko Kovacevic {TDES_VARIABLE_TEXT, "KAT"}, 38cd255ccfSMarko Kovacevic {AESAVS_TYPE_MMT, "MMT"}, 39cd255ccfSMarko Kovacevic {AESAVS_TYPE_MCT, "MCT"}, 40cd255ccfSMarko Kovacevic }; 41cd255ccfSMarko Kovacevic 42cd255ccfSMarko Kovacevic struct aes_test_algo { 43cd255ccfSMarko Kovacevic const char *name; 44cd255ccfSMarko Kovacevic enum rte_crypto_cipher_algorithm algo; 45cd255ccfSMarko Kovacevic } const algo_con[] = { 46cd255ccfSMarko Kovacevic {"CBC", RTE_CRYPTO_CIPHER_AES_CBC}, 47*d3190431SMichael Shamis {"ECB", RTE_CRYPTO_CIPHER_AES_ECB}, 48cd255ccfSMarko Kovacevic }; 49cd255ccfSMarko Kovacevic 50cd255ccfSMarko Kovacevic static int 51cd255ccfSMarko Kovacevic parse_interim_enc_dec(const char *key, 52cd255ccfSMarko Kovacevic __attribute__((__unused__)) char *text, 53cd255ccfSMarko Kovacevic __attribute__((__unused__)) struct fips_val *val) 54cd255ccfSMarko Kovacevic { 55cd255ccfSMarko Kovacevic if (strcmp(key, OP_ENC_STR) == 0) 56cd255ccfSMarko Kovacevic info.op = FIPS_TEST_ENC_AUTH_GEN; 57cd255ccfSMarko Kovacevic else if (strcmp(key, OP_DEC_STR) == 0) 58cd255ccfSMarko Kovacevic info.op = FIPS_TEST_DEC_AUTH_VERIF; 59cd255ccfSMarko Kovacevic else 60cd255ccfSMarko Kovacevic return -1; 61cd255ccfSMarko Kovacevic 62cd255ccfSMarko Kovacevic return 0; 63cd255ccfSMarko Kovacevic } 64cd255ccfSMarko Kovacevic 65cd255ccfSMarko Kovacevic struct fips_test_callback aes_tests_interim[] = { 66cd255ccfSMarko Kovacevic {OP_ENC_STR, parse_interim_enc_dec, NULL}, 67cd255ccfSMarko Kovacevic {OP_DEC_STR, parse_interim_enc_dec, NULL}, 68cd255ccfSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 69cd255ccfSMarko Kovacevic }; 70cd255ccfSMarko Kovacevic 71cd255ccfSMarko Kovacevic struct fips_test_callback aes_tests_vectors[] = { 72cd255ccfSMarko Kovacevic {KEY_STR, parse_uint8_hex_str, &vec.cipher_auth.key}, 73cd255ccfSMarko Kovacevic {IV_STR, parse_uint8_hex_str, &vec.iv}, 74cd255ccfSMarko Kovacevic {PT_STR, parse_uint8_hex_str, &vec.pt}, 75cd255ccfSMarko Kovacevic {CT_STR, parse_uint8_hex_str, &vec.ct}, 76cd255ccfSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 77cd255ccfSMarko Kovacevic }; 78cd255ccfSMarko Kovacevic 79cd255ccfSMarko Kovacevic struct fips_test_callback aes_tests_interim_vectors[] = { 80cd255ccfSMarko Kovacevic {OP_ENC_STR, parse_interim_enc_dec, NULL}, 81cd255ccfSMarko Kovacevic {OP_DEC_STR, parse_interim_enc_dec, NULL}, 82cd255ccfSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 83cd255ccfSMarko Kovacevic }; 84cd255ccfSMarko Kovacevic 85cd255ccfSMarko Kovacevic struct fips_test_callback aes_writeback_callbacks[] = { 86cd255ccfSMarko Kovacevic /** First element is used to pass COUNT string */ 87cd255ccfSMarko Kovacevic {COUNT_STR, NULL, NULL}, 88cd255ccfSMarko Kovacevic {IV_STR, writeback_hex_str, &vec.iv}, 89cd255ccfSMarko Kovacevic {KEY_STR, writeback_hex_str, &vec.cipher_auth.key}, 90cd255ccfSMarko Kovacevic {PT_STR, writeback_hex_str, &vec.pt}, 91cd255ccfSMarko Kovacevic {CT_STR, writeback_hex_str, &vec.ct}, 92cd255ccfSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 93cd255ccfSMarko Kovacevic }; 94cd255ccfSMarko Kovacevic 95cd255ccfSMarko Kovacevic static int 96cd255ccfSMarko Kovacevic parse_test_aes_writeback(struct fips_val *val) 97cd255ccfSMarko Kovacevic { 98cd255ccfSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) 99cd255ccfSMarko Kovacevic fprintf(info.fp_wr, "%s", CT_STR); 100cd255ccfSMarko Kovacevic else 101cd255ccfSMarko Kovacevic fprintf(info.fp_wr, "%s", PT_STR); 102cd255ccfSMarko Kovacevic 103cd255ccfSMarko Kovacevic parse_write_hex_str(val); 104cd255ccfSMarko Kovacevic 105cd255ccfSMarko Kovacevic return 0; 106cd255ccfSMarko Kovacevic } 107cd255ccfSMarko Kovacevic 108cd255ccfSMarko Kovacevic static int 109cd255ccfSMarko Kovacevic rsp_test_aes_check(struct fips_val *val) 110cd255ccfSMarko Kovacevic { 111cd255ccfSMarko Kovacevic struct fips_val *data; 112cd255ccfSMarko Kovacevic 113cd255ccfSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) 114cd255ccfSMarko Kovacevic data = &vec.ct; 115cd255ccfSMarko Kovacevic else 116cd255ccfSMarko Kovacevic data = &vec.pt; 117cd255ccfSMarko Kovacevic 118cd255ccfSMarko Kovacevic if (memcmp(val->val, data->val, val->len) == 0) 119cd255ccfSMarko Kovacevic fprintf(info.fp_wr, "Success\n"); 120cd255ccfSMarko Kovacevic else 121cd255ccfSMarko Kovacevic fprintf(info.fp_wr, "Failed\n"); 122cd255ccfSMarko Kovacevic 123cd255ccfSMarko Kovacevic return 0; 124cd255ccfSMarko Kovacevic } 125cd255ccfSMarko Kovacevic 126cd255ccfSMarko Kovacevic int 127cd255ccfSMarko Kovacevic parse_test_aes_init(void) 128cd255ccfSMarko Kovacevic { 129cd255ccfSMarko Kovacevic char *tmp; 130cd255ccfSMarko Kovacevic uint32_t i, j; 131cd255ccfSMarko Kovacevic 132cd255ccfSMarko Kovacevic for (i = 0; i < info.nb_vec_lines; i++) { 133cd255ccfSMarko Kovacevic char *line = info.vec[i]; 134cd255ccfSMarko Kovacevic 135cd255ccfSMarko Kovacevic tmp = strstr(line, MODE_STR); 136cd255ccfSMarko Kovacevic if (tmp) { 137cd255ccfSMarko Kovacevic for (j = 0; j < RTE_DIM(aes_test_types); j++) 138cd255ccfSMarko Kovacevic if (strstr(line, aes_test_types[j].desc)) { 139cd255ccfSMarko Kovacevic info.interim_info.aes_data.test_type = 140cd255ccfSMarko Kovacevic aes_test_types[j].type; 141cd255ccfSMarko Kovacevic break; 142cd255ccfSMarko Kovacevic } 143cd255ccfSMarko Kovacevic 144cd255ccfSMarko Kovacevic if (j >= RTE_DIM(aes_test_types)) 145cd255ccfSMarko Kovacevic return -EINVAL; 146cd255ccfSMarko Kovacevic 147cd255ccfSMarko Kovacevic tmp = strstr(line, ALGO_STR); 148cd255ccfSMarko Kovacevic if (!tmp) 149cd255ccfSMarko Kovacevic return -EINVAL; 150cd255ccfSMarko Kovacevic 151cd255ccfSMarko Kovacevic tmp += strlen(ALGO_STR); 152cd255ccfSMarko Kovacevic for (j = 0; j < RTE_DIM(algo_con); j++) 153cd255ccfSMarko Kovacevic if (strcmp(algo_con[j].name, tmp) == 0) { 154cd255ccfSMarko Kovacevic info.interim_info.aes_data.cipher_algo = 155cd255ccfSMarko Kovacevic (uint32_t)algo_con[j].algo; 156cd255ccfSMarko Kovacevic break; 157cd255ccfSMarko Kovacevic } 158cd255ccfSMarko Kovacevic if (j >= RTE_DIM(algo_con)) 159cd255ccfSMarko Kovacevic return -EINVAL; 160cd255ccfSMarko Kovacevic 161cd255ccfSMarko Kovacevic continue; 162cd255ccfSMarko Kovacevic } 163cd255ccfSMarko Kovacevic 164cd255ccfSMarko Kovacevic tmp = strstr(line, OP_STR); 165cd255ccfSMarko Kovacevic if (tmp) 166cd255ccfSMarko Kovacevic continue; 167cd255ccfSMarko Kovacevic 168cd255ccfSMarko Kovacevic tmp = strstr(line, KEY_SIZE_STR); 169cd255ccfSMarko Kovacevic if (tmp) { 170cd255ccfSMarko Kovacevic tmp += strlen(KEY_SIZE_STR); 171cd255ccfSMarko Kovacevic if (parser_read_uint32 172cd255ccfSMarko Kovacevic (&info.interim_info.aes_data.key_len, 173cd255ccfSMarko Kovacevic tmp) < 0) 174cd255ccfSMarko Kovacevic return -EINVAL; 175cd255ccfSMarko Kovacevic 176cd255ccfSMarko Kovacevic info.interim_info.aes_data.key_len /= 8; 177cd255ccfSMarko Kovacevic 178cd255ccfSMarko Kovacevic continue; 179cd255ccfSMarko Kovacevic } 180cd255ccfSMarko Kovacevic } 181cd255ccfSMarko Kovacevic 182cd255ccfSMarko Kovacevic info.parse_writeback = parse_test_aes_writeback; 183cd255ccfSMarko Kovacevic info.callbacks = aes_tests_vectors; 184cd255ccfSMarko Kovacevic info.interim_callbacks = aes_tests_interim_vectors; 185cd255ccfSMarko Kovacevic info.writeback_callbacks = aes_writeback_callbacks; 186cd255ccfSMarko Kovacevic info.kat_check = rsp_test_aes_check; 187cd255ccfSMarko Kovacevic 188cd255ccfSMarko Kovacevic return 0; 189cd255ccfSMarko Kovacevic } 190