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"}, 36*527cbf3dSMarko Kovacevic {TDES_VARIABLE_TEXT, "VARIABLE PLAINTEXT/CIPHERTEXT"}, 37*527cbf3dSMarko 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}, 47cd255ccfSMarko Kovacevic }; 48cd255ccfSMarko Kovacevic 49cd255ccfSMarko Kovacevic static int 50cd255ccfSMarko Kovacevic parse_interim_enc_dec(const char *key, 51cd255ccfSMarko Kovacevic __attribute__((__unused__)) char *text, 52cd255ccfSMarko Kovacevic __attribute__((__unused__)) struct fips_val *val) 53cd255ccfSMarko Kovacevic { 54cd255ccfSMarko Kovacevic if (strcmp(key, OP_ENC_STR) == 0) 55cd255ccfSMarko Kovacevic info.op = FIPS_TEST_ENC_AUTH_GEN; 56cd255ccfSMarko Kovacevic else if (strcmp(key, OP_DEC_STR) == 0) 57cd255ccfSMarko Kovacevic info.op = FIPS_TEST_DEC_AUTH_VERIF; 58cd255ccfSMarko Kovacevic else 59cd255ccfSMarko Kovacevic return -1; 60cd255ccfSMarko Kovacevic 61cd255ccfSMarko Kovacevic return 0; 62cd255ccfSMarko Kovacevic } 63cd255ccfSMarko Kovacevic 64cd255ccfSMarko Kovacevic struct fips_test_callback aes_tests_interim[] = { 65cd255ccfSMarko Kovacevic {OP_ENC_STR, parse_interim_enc_dec, NULL}, 66cd255ccfSMarko Kovacevic {OP_DEC_STR, parse_interim_enc_dec, NULL}, 67cd255ccfSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 68cd255ccfSMarko Kovacevic }; 69cd255ccfSMarko Kovacevic 70cd255ccfSMarko Kovacevic struct fips_test_callback aes_tests_vectors[] = { 71cd255ccfSMarko Kovacevic {KEY_STR, parse_uint8_hex_str, &vec.cipher_auth.key}, 72cd255ccfSMarko Kovacevic {IV_STR, parse_uint8_hex_str, &vec.iv}, 73cd255ccfSMarko Kovacevic {PT_STR, parse_uint8_hex_str, &vec.pt}, 74cd255ccfSMarko Kovacevic {CT_STR, parse_uint8_hex_str, &vec.ct}, 75cd255ccfSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 76cd255ccfSMarko Kovacevic }; 77cd255ccfSMarko Kovacevic 78cd255ccfSMarko Kovacevic struct fips_test_callback aes_tests_interim_vectors[] = { 79cd255ccfSMarko Kovacevic {OP_ENC_STR, parse_interim_enc_dec, NULL}, 80cd255ccfSMarko Kovacevic {OP_DEC_STR, parse_interim_enc_dec, NULL}, 81cd255ccfSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 82cd255ccfSMarko Kovacevic }; 83cd255ccfSMarko Kovacevic 84cd255ccfSMarko Kovacevic struct fips_test_callback aes_writeback_callbacks[] = { 85cd255ccfSMarko Kovacevic /** First element is used to pass COUNT string */ 86cd255ccfSMarko Kovacevic {COUNT_STR, NULL, NULL}, 87cd255ccfSMarko Kovacevic {IV_STR, writeback_hex_str, &vec.iv}, 88cd255ccfSMarko Kovacevic {KEY_STR, writeback_hex_str, &vec.cipher_auth.key}, 89cd255ccfSMarko Kovacevic {PT_STR, writeback_hex_str, &vec.pt}, 90cd255ccfSMarko Kovacevic {CT_STR, writeback_hex_str, &vec.ct}, 91cd255ccfSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 92cd255ccfSMarko Kovacevic }; 93cd255ccfSMarko Kovacevic 94cd255ccfSMarko Kovacevic static int 95cd255ccfSMarko Kovacevic parse_test_aes_writeback(struct fips_val *val) 96cd255ccfSMarko Kovacevic { 97cd255ccfSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) 98cd255ccfSMarko Kovacevic fprintf(info.fp_wr, "%s", CT_STR); 99cd255ccfSMarko Kovacevic else 100cd255ccfSMarko Kovacevic fprintf(info.fp_wr, "%s", PT_STR); 101cd255ccfSMarko Kovacevic 102cd255ccfSMarko Kovacevic parse_write_hex_str(val); 103cd255ccfSMarko Kovacevic 104cd255ccfSMarko Kovacevic return 0; 105cd255ccfSMarko Kovacevic } 106cd255ccfSMarko Kovacevic 107cd255ccfSMarko Kovacevic static int 108cd255ccfSMarko Kovacevic rsp_test_aes_check(struct fips_val *val) 109cd255ccfSMarko Kovacevic { 110cd255ccfSMarko Kovacevic struct fips_val *data; 111cd255ccfSMarko Kovacevic 112cd255ccfSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) 113cd255ccfSMarko Kovacevic data = &vec.ct; 114cd255ccfSMarko Kovacevic else 115cd255ccfSMarko Kovacevic data = &vec.pt; 116cd255ccfSMarko Kovacevic 117cd255ccfSMarko Kovacevic if (memcmp(val->val, data->val, val->len) == 0) 118cd255ccfSMarko Kovacevic fprintf(info.fp_wr, "Success\n"); 119cd255ccfSMarko Kovacevic else 120cd255ccfSMarko Kovacevic fprintf(info.fp_wr, "Failed\n"); 121cd255ccfSMarko Kovacevic 122cd255ccfSMarko Kovacevic return 0; 123cd255ccfSMarko Kovacevic } 124cd255ccfSMarko Kovacevic 125cd255ccfSMarko Kovacevic int 126cd255ccfSMarko Kovacevic parse_test_aes_init(void) 127cd255ccfSMarko Kovacevic { 128cd255ccfSMarko Kovacevic char *tmp; 129cd255ccfSMarko Kovacevic uint32_t i, j; 130cd255ccfSMarko Kovacevic 131cd255ccfSMarko Kovacevic for (i = 0; i < info.nb_vec_lines; i++) { 132cd255ccfSMarko Kovacevic char *line = info.vec[i]; 133cd255ccfSMarko Kovacevic 134cd255ccfSMarko Kovacevic tmp = strstr(line, MODE_STR); 135cd255ccfSMarko Kovacevic if (tmp) { 136cd255ccfSMarko Kovacevic for (j = 0; j < RTE_DIM(aes_test_types); j++) 137cd255ccfSMarko Kovacevic if (strstr(line, aes_test_types[j].desc)) { 138cd255ccfSMarko Kovacevic info.interim_info.aes_data.test_type = 139cd255ccfSMarko Kovacevic aes_test_types[j].type; 140cd255ccfSMarko Kovacevic break; 141cd255ccfSMarko Kovacevic } 142cd255ccfSMarko Kovacevic 143cd255ccfSMarko Kovacevic if (j >= RTE_DIM(aes_test_types)) 144cd255ccfSMarko Kovacevic return -EINVAL; 145cd255ccfSMarko Kovacevic 146cd255ccfSMarko Kovacevic tmp = strstr(line, ALGO_STR); 147cd255ccfSMarko Kovacevic if (!tmp) 148cd255ccfSMarko Kovacevic return -EINVAL; 149cd255ccfSMarko Kovacevic 150cd255ccfSMarko Kovacevic tmp += strlen(ALGO_STR); 151cd255ccfSMarko Kovacevic for (j = 0; j < RTE_DIM(algo_con); j++) 152cd255ccfSMarko Kovacevic if (strcmp(algo_con[j].name, tmp) == 0) { 153cd255ccfSMarko Kovacevic info.interim_info.aes_data.cipher_algo = 154cd255ccfSMarko Kovacevic (uint32_t)algo_con[j].algo; 155cd255ccfSMarko Kovacevic break; 156cd255ccfSMarko Kovacevic } 157cd255ccfSMarko Kovacevic if (j >= RTE_DIM(algo_con)) 158cd255ccfSMarko Kovacevic return -EINVAL; 159cd255ccfSMarko Kovacevic 160cd255ccfSMarko Kovacevic continue; 161cd255ccfSMarko Kovacevic } 162cd255ccfSMarko Kovacevic 163cd255ccfSMarko Kovacevic tmp = strstr(line, OP_STR); 164cd255ccfSMarko Kovacevic if (tmp) 165cd255ccfSMarko Kovacevic continue; 166cd255ccfSMarko Kovacevic 167cd255ccfSMarko Kovacevic tmp = strstr(line, KEY_SIZE_STR); 168cd255ccfSMarko Kovacevic if (tmp) { 169cd255ccfSMarko Kovacevic tmp += strlen(KEY_SIZE_STR); 170cd255ccfSMarko Kovacevic if (parser_read_uint32 171cd255ccfSMarko Kovacevic (&info.interim_info.aes_data.key_len, 172cd255ccfSMarko Kovacevic tmp) < 0) 173cd255ccfSMarko Kovacevic return -EINVAL; 174cd255ccfSMarko Kovacevic 175cd255ccfSMarko Kovacevic info.interim_info.aes_data.key_len /= 8; 176cd255ccfSMarko Kovacevic 177cd255ccfSMarko Kovacevic continue; 178cd255ccfSMarko Kovacevic } 179cd255ccfSMarko Kovacevic } 180cd255ccfSMarko Kovacevic 181cd255ccfSMarko Kovacevic info.parse_writeback = parse_test_aes_writeback; 182cd255ccfSMarko Kovacevic info.callbacks = aes_tests_vectors; 183cd255ccfSMarko Kovacevic info.interim_callbacks = aes_tests_interim_vectors; 184cd255ccfSMarko Kovacevic info.writeback_callbacks = aes_writeback_callbacks; 185cd255ccfSMarko Kovacevic info.kat_check = rsp_test_aes_check; 186cd255ccfSMarko Kovacevic 187cd255ccfSMarko Kovacevic return 0; 188cd255ccfSMarko Kovacevic } 189