1*527cbf3dSMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause 2*527cbf3dSMarko Kovacevic * Copyright(c) 2018 Intel Corporation 3*527cbf3dSMarko Kovacevic */ 4*527cbf3dSMarko Kovacevic 5*527cbf3dSMarko Kovacevic #include <string.h> 6*527cbf3dSMarko Kovacevic #include <stdio.h> 7*527cbf3dSMarko Kovacevic 8*527cbf3dSMarko Kovacevic #include <rte_malloc.h> 9*527cbf3dSMarko Kovacevic #include <rte_cryptodev.h> 10*527cbf3dSMarko Kovacevic 11*527cbf3dSMarko Kovacevic #include "fips_validation.h" 12*527cbf3dSMarko Kovacevic 13*527cbf3dSMarko Kovacevic #define NEW_LINE_STR "#" 14*527cbf3dSMarko Kovacevic #define TEST_TYPE_KEY " for CBC" 15*527cbf3dSMarko Kovacevic #define TEST_CBCI_KEY " for CBCI" 16*527cbf3dSMarko Kovacevic 17*527cbf3dSMarko Kovacevic #define ENC_STR "[ENCRYPT]" 18*527cbf3dSMarko Kovacevic #define DEC_STR "[DECRYPT]" 19*527cbf3dSMarko Kovacevic 20*527cbf3dSMarko Kovacevic #define COUNT_STR "COUNT = " 21*527cbf3dSMarko Kovacevic #define KEY1_STR "KEY1 = " 22*527cbf3dSMarko Kovacevic #define KEY2_STR "KEY2 = " 23*527cbf3dSMarko Kovacevic #define KEY3_STR "KEY3 = " 24*527cbf3dSMarko Kovacevic 25*527cbf3dSMarko Kovacevic #define KEYS_STR "KEYs = " 26*527cbf3dSMarko Kovacevic #define IV_STR "IV = " 27*527cbf3dSMarko Kovacevic #define PT_STR "PLAINTEXT = " 28*527cbf3dSMarko Kovacevic #define CT_STR "CIPHERTEXT = " 29*527cbf3dSMarko Kovacevic #define NK_STR "NumKeys = " 30*527cbf3dSMarko Kovacevic 31*527cbf3dSMarko Kovacevic #define SET_STR " = " 32*527cbf3dSMarko Kovacevic 33*527cbf3dSMarko Kovacevic #define PLAIN_TEXT 0 34*527cbf3dSMarko Kovacevic #define CIPHER_TEXT 1 35*527cbf3dSMarko Kovacevic #define KEY_TEXT 2 36*527cbf3dSMarko Kovacevic #define IV_TEXT 3 37*527cbf3dSMarko Kovacevic 38*527cbf3dSMarko Kovacevic #define DEVICE_STR "# Config Info for : " 39*527cbf3dSMarko Kovacevic 40*527cbf3dSMarko Kovacevic struct { 41*527cbf3dSMarko Kovacevic uint32_t type; 42*527cbf3dSMarko Kovacevic const char *desc; 43*527cbf3dSMarko Kovacevic } test_types[] = { 44*527cbf3dSMarko Kovacevic {TDES_INVERSE_PERMUTATION, "INVERSE PERMUTATION"}, 45*527cbf3dSMarko Kovacevic {TDES_PERMUTATION, "PERMUTATION OPERATION"}, 46*527cbf3dSMarko Kovacevic {TDES_SUBSTITUTION_TABLE, "SUBSTITUTION TABLE"}, 47*527cbf3dSMarko Kovacevic {TDES_VARIABLE_KEY, "VARIABLE KEY"}, 48*527cbf3dSMarko Kovacevic {TDES_VARIABLE_TEXT, "VARIABLE PLAINTEXT/CIPHERTEXT"}, 49*527cbf3dSMarko Kovacevic {TDES_VARIABLE_TEXT, "KAT"}, 50*527cbf3dSMarko Kovacevic {TDES_MCT, "Monte Carlo (Modes) Test"}, 51*527cbf3dSMarko Kovacevic {TDES_MMT, "Multi block Message Test"}, 52*527cbf3dSMarko Kovacevic }; 53*527cbf3dSMarko Kovacevic 54*527cbf3dSMarko Kovacevic static int 55*527cbf3dSMarko Kovacevic writeback_tdes_hex_str(const char *key, char *dst, struct fips_val *val); 56*527cbf3dSMarko Kovacevic 57*527cbf3dSMarko Kovacevic static int 58*527cbf3dSMarko Kovacevic parse_tdes_uint8_hex_str(const char *key, char *src, struct fips_val *val); 59*527cbf3dSMarko Kovacevic 60*527cbf3dSMarko Kovacevic static int 61*527cbf3dSMarko Kovacevic parse_tdes_interim(const char *key, 62*527cbf3dSMarko Kovacevic __attribute__((__unused__)) char *text, 63*527cbf3dSMarko Kovacevic struct fips_val *val); 64*527cbf3dSMarko Kovacevic 65*527cbf3dSMarko Kovacevic struct fips_test_callback tdes_tests_vectors[] = { 66*527cbf3dSMarko Kovacevic {KEYS_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key}, 67*527cbf3dSMarko Kovacevic {KEY1_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key}, 68*527cbf3dSMarko Kovacevic {KEY2_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key}, 69*527cbf3dSMarko Kovacevic {KEY3_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key}, 70*527cbf3dSMarko Kovacevic {IV_STR, parse_uint8_hex_str, &vec.iv}, 71*527cbf3dSMarko Kovacevic {PT_STR, parse_uint8_hex_str, &vec.pt}, 72*527cbf3dSMarko Kovacevic {CT_STR, parse_uint8_hex_str, &vec.ct}, 73*527cbf3dSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 74*527cbf3dSMarko Kovacevic }; 75*527cbf3dSMarko Kovacevic 76*527cbf3dSMarko Kovacevic struct fips_test_callback tdes_tests_interim_vectors[] = { 77*527cbf3dSMarko Kovacevic {ENC_STR, parse_tdes_interim, NULL}, 78*527cbf3dSMarko Kovacevic {DEC_STR, parse_tdes_interim, NULL}, 79*527cbf3dSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 80*527cbf3dSMarko Kovacevic }; 81*527cbf3dSMarko Kovacevic 82*527cbf3dSMarko Kovacevic struct fips_test_callback tdes_writeback_callbacks[] = { 83*527cbf3dSMarko Kovacevic /** First element is used to pass COUNT string */ 84*527cbf3dSMarko Kovacevic {COUNT_STR, NULL, NULL}, 85*527cbf3dSMarko Kovacevic {IV_STR, writeback_hex_str, &vec.iv}, 86*527cbf3dSMarko Kovacevic {KEY1_STR, writeback_tdes_hex_str, &vec.cipher_auth.key}, 87*527cbf3dSMarko Kovacevic {KEY2_STR, writeback_tdes_hex_str, &vec.cipher_auth.key}, 88*527cbf3dSMarko Kovacevic {KEY3_STR, writeback_tdes_hex_str, &vec.cipher_auth.key}, 89*527cbf3dSMarko Kovacevic {KEYS_STR, writeback_tdes_hex_str, &vec.cipher_auth.key}, 90*527cbf3dSMarko Kovacevic {PT_STR, writeback_hex_str, &vec.pt}, 91*527cbf3dSMarko Kovacevic {CT_STR, writeback_hex_str, &vec.ct}, 92*527cbf3dSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 93*527cbf3dSMarko Kovacevic }; 94*527cbf3dSMarko Kovacevic 95*527cbf3dSMarko Kovacevic static int 96*527cbf3dSMarko Kovacevic parse_tdes_interim(const char *key, 97*527cbf3dSMarko Kovacevic __attribute__((__unused__)) char *text, 98*527cbf3dSMarko Kovacevic __attribute__((__unused__)) struct fips_val *val) 99*527cbf3dSMarko Kovacevic { 100*527cbf3dSMarko Kovacevic if (strstr(key, ENC_STR)) 101*527cbf3dSMarko Kovacevic info.op = FIPS_TEST_ENC_AUTH_GEN; 102*527cbf3dSMarko Kovacevic else if (strstr(key, DEC_STR)) 103*527cbf3dSMarko Kovacevic info.op = FIPS_TEST_DEC_AUTH_VERIF; 104*527cbf3dSMarko Kovacevic else if (strstr(NK_STR, "NumKeys = 1")) 105*527cbf3dSMarko Kovacevic info.interim_info.tdes_data.nb_keys = 1; 106*527cbf3dSMarko Kovacevic else if (strstr(NK_STR, "NumKeys = 2")) 107*527cbf3dSMarko Kovacevic info.interim_info.tdes_data.nb_keys = 2; 108*527cbf3dSMarko Kovacevic else if (strstr(NK_STR, "NumKeys = 3")) 109*527cbf3dSMarko Kovacevic info.interim_info.tdes_data.nb_keys = 3; 110*527cbf3dSMarko Kovacevic else 111*527cbf3dSMarko Kovacevic return -EINVAL; 112*527cbf3dSMarko Kovacevic 113*527cbf3dSMarko Kovacevic return 0; 114*527cbf3dSMarko Kovacevic } 115*527cbf3dSMarko Kovacevic 116*527cbf3dSMarko Kovacevic static int 117*527cbf3dSMarko Kovacevic parse_tdes_uint8_hex_str(const char *key, char *src, struct fips_val *val) 118*527cbf3dSMarko Kovacevic { 119*527cbf3dSMarko Kovacevic uint8_t tmp_key[24] = {0}; 120*527cbf3dSMarko Kovacevic uint32_t len, i; 121*527cbf3dSMarko Kovacevic 122*527cbf3dSMarko Kovacevic src += strlen(key); 123*527cbf3dSMarko Kovacevic 124*527cbf3dSMarko Kovacevic len = strlen(src) / 2; 125*527cbf3dSMarko Kovacevic 126*527cbf3dSMarko Kovacevic if (val->val) { 127*527cbf3dSMarko Kovacevic memcpy(tmp_key, val->val, val->len); 128*527cbf3dSMarko Kovacevic rte_free(val->val); 129*527cbf3dSMarko Kovacevic } 130*527cbf3dSMarko Kovacevic 131*527cbf3dSMarko Kovacevic val->val = rte_zmalloc(NULL, 24, 0); 132*527cbf3dSMarko Kovacevic if (!val->val) 133*527cbf3dSMarko Kovacevic return -1; 134*527cbf3dSMarko Kovacevic 135*527cbf3dSMarko Kovacevic memcpy(val->val, tmp_key, 24); 136*527cbf3dSMarko Kovacevic 137*527cbf3dSMarko Kovacevic if (strstr(key, KEYS_STR)) { 138*527cbf3dSMarko Kovacevic for (i = 0; i < len; i++) { 139*527cbf3dSMarko Kovacevic char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'}; 140*527cbf3dSMarko Kovacevic 141*527cbf3dSMarko Kovacevic if (parser_read_uint8_hex(&val->val[i], byte) < 0) 142*527cbf3dSMarko Kovacevic goto error_exit; 143*527cbf3dSMarko Kovacevic } 144*527cbf3dSMarko Kovacevic 145*527cbf3dSMarko Kovacevic memcpy(val->val + 8, val->val, 8); 146*527cbf3dSMarko Kovacevic memcpy(val->val + 16, val->val, 8); 147*527cbf3dSMarko Kovacevic 148*527cbf3dSMarko Kovacevic } else if (strstr(key, KEY1_STR)) { 149*527cbf3dSMarko Kovacevic for (i = 0; i < len; i++) { 150*527cbf3dSMarko Kovacevic char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'}; 151*527cbf3dSMarko Kovacevic 152*527cbf3dSMarko Kovacevic if (parser_read_uint8_hex(&val->val[i], byte) < 0) 153*527cbf3dSMarko Kovacevic goto error_exit; 154*527cbf3dSMarko Kovacevic } 155*527cbf3dSMarko Kovacevic 156*527cbf3dSMarko Kovacevic if (info.interim_info.tdes_data.nb_keys == 2) 157*527cbf3dSMarko Kovacevic memcpy(val->val + 16, val->val, 8); 158*527cbf3dSMarko Kovacevic 159*527cbf3dSMarko Kovacevic } else if (strstr(key, KEY2_STR)) { 160*527cbf3dSMarko Kovacevic for (i = 0; i < len; i++) { 161*527cbf3dSMarko Kovacevic char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'}; 162*527cbf3dSMarko Kovacevic 163*527cbf3dSMarko Kovacevic if (parser_read_uint8_hex(&val->val[i + 8], byte) < 0) 164*527cbf3dSMarko Kovacevic goto error_exit; 165*527cbf3dSMarko Kovacevic } 166*527cbf3dSMarko Kovacevic 167*527cbf3dSMarko Kovacevic } else if (strstr(key, KEY3_STR)) { 168*527cbf3dSMarko Kovacevic for (i = 0; i < len; i++) { 169*527cbf3dSMarko Kovacevic char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'}; 170*527cbf3dSMarko Kovacevic 171*527cbf3dSMarko Kovacevic if (parser_read_uint8_hex(&val->val[i + 16], byte) < 0) 172*527cbf3dSMarko Kovacevic goto error_exit; 173*527cbf3dSMarko Kovacevic } 174*527cbf3dSMarko Kovacevic } else 175*527cbf3dSMarko Kovacevic return -EINVAL; 176*527cbf3dSMarko Kovacevic 177*527cbf3dSMarko Kovacevic val->len = 24; 178*527cbf3dSMarko Kovacevic 179*527cbf3dSMarko Kovacevic return 0; 180*527cbf3dSMarko Kovacevic 181*527cbf3dSMarko Kovacevic error_exit: 182*527cbf3dSMarko Kovacevic rte_free(val->val); 183*527cbf3dSMarko Kovacevic memset(val, 0, sizeof(*val)); 184*527cbf3dSMarko Kovacevic return -EINVAL; 185*527cbf3dSMarko Kovacevic } 186*527cbf3dSMarko Kovacevic 187*527cbf3dSMarko Kovacevic static int 188*527cbf3dSMarko Kovacevic parse_test_tdes_writeback(struct fips_val *val) 189*527cbf3dSMarko Kovacevic { 190*527cbf3dSMarko Kovacevic 191*527cbf3dSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) 192*527cbf3dSMarko Kovacevic fprintf(info.fp_wr, "%s", CT_STR); 193*527cbf3dSMarko Kovacevic else 194*527cbf3dSMarko Kovacevic fprintf(info.fp_wr, "%s", PT_STR); 195*527cbf3dSMarko Kovacevic 196*527cbf3dSMarko Kovacevic parse_write_hex_str(val); 197*527cbf3dSMarko Kovacevic 198*527cbf3dSMarko Kovacevic return 0; 199*527cbf3dSMarko Kovacevic 200*527cbf3dSMarko Kovacevic } 201*527cbf3dSMarko Kovacevic 202*527cbf3dSMarko Kovacevic static int 203*527cbf3dSMarko Kovacevic writeback_tdes_hex_str(const char *key, char *dst, struct fips_val *val) 204*527cbf3dSMarko Kovacevic { 205*527cbf3dSMarko Kovacevic struct fips_val tmp_val; 206*527cbf3dSMarko Kovacevic 207*527cbf3dSMarko Kovacevic tmp_val.len = 8; 208*527cbf3dSMarko Kovacevic 209*527cbf3dSMarko Kovacevic if (strstr(key, KEY1_STR)) 210*527cbf3dSMarko Kovacevic tmp_val.val = val->val; 211*527cbf3dSMarko Kovacevic else if (strstr(key, KEY2_STR)) 212*527cbf3dSMarko Kovacevic tmp_val.val = val->val + 8; 213*527cbf3dSMarko Kovacevic else if (strstr(key, KEY3_STR)) 214*527cbf3dSMarko Kovacevic tmp_val.val = val->val + 16; 215*527cbf3dSMarko Kovacevic 216*527cbf3dSMarko Kovacevic return writeback_hex_str(key, dst, &tmp_val); 217*527cbf3dSMarko Kovacevic } 218*527cbf3dSMarko Kovacevic 219*527cbf3dSMarko Kovacevic static int 220*527cbf3dSMarko Kovacevic rsp_test_tdes_check(struct fips_val *val) 221*527cbf3dSMarko Kovacevic { 222*527cbf3dSMarko Kovacevic struct fips_val *data; 223*527cbf3dSMarko Kovacevic 224*527cbf3dSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) 225*527cbf3dSMarko Kovacevic data = &vec.ct; 226*527cbf3dSMarko Kovacevic else 227*527cbf3dSMarko Kovacevic data = &vec.pt; 228*527cbf3dSMarko Kovacevic 229*527cbf3dSMarko Kovacevic if (memcmp(val->val, data->val, val->len) == 0) 230*527cbf3dSMarko Kovacevic fprintf(info.fp_wr, "Success\n"); 231*527cbf3dSMarko Kovacevic else 232*527cbf3dSMarko Kovacevic fprintf(info.fp_wr, "Failed\n"); 233*527cbf3dSMarko Kovacevic 234*527cbf3dSMarko Kovacevic return 0; 235*527cbf3dSMarko Kovacevic } 236*527cbf3dSMarko Kovacevic 237*527cbf3dSMarko Kovacevic int 238*527cbf3dSMarko Kovacevic parse_test_tdes_init(void) 239*527cbf3dSMarko Kovacevic { 240*527cbf3dSMarko Kovacevic uint32_t i; 241*527cbf3dSMarko Kovacevic 242*527cbf3dSMarko Kovacevic for (i = 0; i < info.nb_vec_lines; i++) { 243*527cbf3dSMarko Kovacevic char *line = info.vec[i]; 244*527cbf3dSMarko Kovacevic uint32_t j; 245*527cbf3dSMarko Kovacevic 246*527cbf3dSMarko Kovacevic if (strstr(line, TEST_CBCI_KEY)) 247*527cbf3dSMarko Kovacevic return -EPERM; 248*527cbf3dSMarko Kovacevic 249*527cbf3dSMarko Kovacevic for (j = 0; j < RTE_DIM(test_types); j++) 250*527cbf3dSMarko Kovacevic if (strstr(line, test_types[j].desc)) { 251*527cbf3dSMarko Kovacevic info.interim_info.tdes_data.test_type = 252*527cbf3dSMarko Kovacevic test_types[j].type; 253*527cbf3dSMarko Kovacevic break; 254*527cbf3dSMarko Kovacevic } 255*527cbf3dSMarko Kovacevic } 256*527cbf3dSMarko Kovacevic 257*527cbf3dSMarko Kovacevic info.parse_writeback = parse_test_tdes_writeback; 258*527cbf3dSMarko Kovacevic info.callbacks = tdes_tests_vectors; 259*527cbf3dSMarko Kovacevic info.interim_callbacks = tdes_tests_interim_vectors; 260*527cbf3dSMarko Kovacevic info.writeback_callbacks = tdes_writeback_callbacks; 261*527cbf3dSMarko Kovacevic info.kat_check = rsp_test_tdes_check; 262*527cbf3dSMarko Kovacevic 263*527cbf3dSMarko Kovacevic return 0; 264*527cbf3dSMarko Kovacevic } 265