1527cbf3dSMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause 2527cbf3dSMarko Kovacevic * Copyright(c) 2018 Intel Corporation 3527cbf3dSMarko Kovacevic */ 4527cbf3dSMarko Kovacevic 5527cbf3dSMarko Kovacevic #include <string.h> 6527cbf3dSMarko Kovacevic #include <stdio.h> 7527cbf3dSMarko Kovacevic 8527cbf3dSMarko Kovacevic #include <rte_malloc.h> 9527cbf3dSMarko Kovacevic #include <rte_cryptodev.h> 10527cbf3dSMarko Kovacevic 11527cbf3dSMarko Kovacevic #include "fips_validation.h" 12527cbf3dSMarko Kovacevic 13527cbf3dSMarko Kovacevic #define NEW_LINE_STR "#" 14527cbf3dSMarko Kovacevic #define TEST_TYPE_KEY " for CBC" 15efe3a8dbSMichael Shamis #define TEST_TYPE_ECB_KEY " for ECB" 16527cbf3dSMarko Kovacevic #define TEST_CBCI_KEY " for CBCI" 17527cbf3dSMarko Kovacevic 18527cbf3dSMarko Kovacevic #define ENC_STR "[ENCRYPT]" 19527cbf3dSMarko Kovacevic #define DEC_STR "[DECRYPT]" 20527cbf3dSMarko Kovacevic 21527cbf3dSMarko Kovacevic #define COUNT_STR "COUNT = " 22527cbf3dSMarko Kovacevic #define KEY1_STR "KEY1 = " 23527cbf3dSMarko Kovacevic #define KEY2_STR "KEY2 = " 24527cbf3dSMarko Kovacevic #define KEY3_STR "KEY3 = " 25527cbf3dSMarko Kovacevic 26527cbf3dSMarko Kovacevic #define KEYS_STR "KEYs = " 27527cbf3dSMarko Kovacevic #define IV_STR "IV = " 28527cbf3dSMarko Kovacevic #define PT_STR "PLAINTEXT = " 29527cbf3dSMarko Kovacevic #define CT_STR "CIPHERTEXT = " 30527cbf3dSMarko Kovacevic #define NK_STR "NumKeys = " 31527cbf3dSMarko Kovacevic 32527cbf3dSMarko Kovacevic #define SET_STR " = " 33527cbf3dSMarko Kovacevic 34527cbf3dSMarko Kovacevic #define PLAIN_TEXT 0 35527cbf3dSMarko Kovacevic #define CIPHER_TEXT 1 36527cbf3dSMarko Kovacevic #define KEY_TEXT 2 37527cbf3dSMarko Kovacevic #define IV_TEXT 3 38527cbf3dSMarko Kovacevic 39527cbf3dSMarko Kovacevic #define DEVICE_STR "# Config Info for : " 40527cbf3dSMarko Kovacevic 41527cbf3dSMarko Kovacevic struct { 42527cbf3dSMarko Kovacevic uint32_t type; 43527cbf3dSMarko Kovacevic const char *desc; 44527cbf3dSMarko Kovacevic } test_types[] = { 45527cbf3dSMarko Kovacevic {TDES_INVERSE_PERMUTATION, "INVERSE PERMUTATION"}, 46527cbf3dSMarko Kovacevic {TDES_PERMUTATION, "PERMUTATION OPERATION"}, 47527cbf3dSMarko Kovacevic {TDES_SUBSTITUTION_TABLE, "SUBSTITUTION TABLE"}, 48527cbf3dSMarko Kovacevic {TDES_VARIABLE_KEY, "VARIABLE KEY"}, 49527cbf3dSMarko Kovacevic {TDES_VARIABLE_TEXT, "VARIABLE PLAINTEXT/CIPHERTEXT"}, 50527cbf3dSMarko Kovacevic {TDES_VARIABLE_TEXT, "KAT"}, 51527cbf3dSMarko Kovacevic {TDES_MCT, "Monte Carlo (Modes) Test"}, 52527cbf3dSMarko Kovacevic {TDES_MMT, "Multi block Message Test"}, 53527cbf3dSMarko Kovacevic }; 54527cbf3dSMarko Kovacevic 55527cbf3dSMarko Kovacevic static int 56527cbf3dSMarko Kovacevic writeback_tdes_hex_str(const char *key, char *dst, struct fips_val *val); 57527cbf3dSMarko Kovacevic 58527cbf3dSMarko Kovacevic static int 59527cbf3dSMarko Kovacevic parse_tdes_uint8_hex_str(const char *key, char *src, struct fips_val *val); 60527cbf3dSMarko Kovacevic 61527cbf3dSMarko Kovacevic static int 62*a1862286SArchana Muniganti parse_tdes_interim(const char *key, char *text, struct fips_val *val); 63527cbf3dSMarko Kovacevic 64527cbf3dSMarko Kovacevic struct fips_test_callback tdes_tests_vectors[] = { 65527cbf3dSMarko Kovacevic {KEYS_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key}, 66527cbf3dSMarko Kovacevic {KEY1_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key}, 67527cbf3dSMarko Kovacevic {KEY2_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key}, 68527cbf3dSMarko Kovacevic {KEY3_STR, parse_tdes_uint8_hex_str, &vec.cipher_auth.key}, 69527cbf3dSMarko Kovacevic {IV_STR, parse_uint8_hex_str, &vec.iv}, 70527cbf3dSMarko Kovacevic {PT_STR, parse_uint8_hex_str, &vec.pt}, 71527cbf3dSMarko Kovacevic {CT_STR, parse_uint8_hex_str, &vec.ct}, 72527cbf3dSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 73527cbf3dSMarko Kovacevic }; 74527cbf3dSMarko Kovacevic 75527cbf3dSMarko Kovacevic struct fips_test_callback tdes_tests_interim_vectors[] = { 76527cbf3dSMarko Kovacevic {ENC_STR, parse_tdes_interim, NULL}, 77527cbf3dSMarko Kovacevic {DEC_STR, parse_tdes_interim, NULL}, 78*a1862286SArchana Muniganti {NK_STR, parse_tdes_interim, NULL}, 79527cbf3dSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 80527cbf3dSMarko Kovacevic }; 81527cbf3dSMarko Kovacevic 82527cbf3dSMarko Kovacevic struct fips_test_callback tdes_writeback_callbacks[] = { 83527cbf3dSMarko Kovacevic /** First element is used to pass COUNT string */ 84527cbf3dSMarko Kovacevic {COUNT_STR, NULL, NULL}, 85527cbf3dSMarko Kovacevic {IV_STR, writeback_hex_str, &vec.iv}, 86527cbf3dSMarko Kovacevic {KEY1_STR, writeback_tdes_hex_str, &vec.cipher_auth.key}, 87527cbf3dSMarko Kovacevic {KEY2_STR, writeback_tdes_hex_str, &vec.cipher_auth.key}, 88527cbf3dSMarko Kovacevic {KEY3_STR, writeback_tdes_hex_str, &vec.cipher_auth.key}, 89527cbf3dSMarko Kovacevic {KEYS_STR, writeback_tdes_hex_str, &vec.cipher_auth.key}, 90527cbf3dSMarko Kovacevic {PT_STR, writeback_hex_str, &vec.pt}, 91527cbf3dSMarko Kovacevic {CT_STR, writeback_hex_str, &vec.ct}, 92527cbf3dSMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 93527cbf3dSMarko Kovacevic }; 94527cbf3dSMarko Kovacevic 95527cbf3dSMarko Kovacevic static int 96*a1862286SArchana Muniganti parse_tdes_interim(const char *key, char *text, 97f2fc83b4SThomas Monjalon __rte_unused struct fips_val *val) 98527cbf3dSMarko Kovacevic { 99527cbf3dSMarko Kovacevic if (strstr(key, ENC_STR)) 100527cbf3dSMarko Kovacevic info.op = FIPS_TEST_ENC_AUTH_GEN; 101527cbf3dSMarko Kovacevic else if (strstr(key, DEC_STR)) 102527cbf3dSMarko Kovacevic info.op = FIPS_TEST_DEC_AUTH_VERIF; 103*a1862286SArchana Muniganti else if (strstr(key, NK_STR)) { 104*a1862286SArchana Muniganti if (strcmp(text, "NumKeys = 1") == 0) 105527cbf3dSMarko Kovacevic info.interim_info.tdes_data.nb_keys = 1; 106*a1862286SArchana Muniganti else if (strcmp(text, "NumKeys = 2") == 0) 107527cbf3dSMarko Kovacevic info.interim_info.tdes_data.nb_keys = 2; 108*a1862286SArchana Muniganti else if (strcmp(text, "NumKeys = 3") == 0) 109527cbf3dSMarko Kovacevic info.interim_info.tdes_data.nb_keys = 3; 110527cbf3dSMarko Kovacevic else 111527cbf3dSMarko Kovacevic return -EINVAL; 112*a1862286SArchana Muniganti } else 113*a1862286SArchana Muniganti return -EINVAL; 114527cbf3dSMarko Kovacevic 115527cbf3dSMarko Kovacevic return 0; 116527cbf3dSMarko Kovacevic } 117527cbf3dSMarko Kovacevic 118527cbf3dSMarko Kovacevic static int 119527cbf3dSMarko Kovacevic parse_tdes_uint8_hex_str(const char *key, char *src, struct fips_val *val) 120527cbf3dSMarko Kovacevic { 121527cbf3dSMarko Kovacevic uint8_t tmp_key[24] = {0}; 122527cbf3dSMarko Kovacevic uint32_t len, i; 123527cbf3dSMarko Kovacevic 124527cbf3dSMarko Kovacevic src += strlen(key); 125527cbf3dSMarko Kovacevic 126527cbf3dSMarko Kovacevic len = strlen(src) / 2; 127527cbf3dSMarko Kovacevic 128527cbf3dSMarko Kovacevic if (val->val) { 129527cbf3dSMarko Kovacevic memcpy(tmp_key, val->val, val->len); 130527cbf3dSMarko Kovacevic rte_free(val->val); 131527cbf3dSMarko Kovacevic } 132527cbf3dSMarko Kovacevic 133527cbf3dSMarko Kovacevic val->val = rte_zmalloc(NULL, 24, 0); 134527cbf3dSMarko Kovacevic if (!val->val) 135527cbf3dSMarko Kovacevic return -1; 136527cbf3dSMarko Kovacevic 137527cbf3dSMarko Kovacevic memcpy(val->val, tmp_key, 24); 138527cbf3dSMarko Kovacevic 139527cbf3dSMarko Kovacevic if (strstr(key, KEYS_STR)) { 140527cbf3dSMarko Kovacevic for (i = 0; i < len; i++) { 141527cbf3dSMarko Kovacevic char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'}; 142527cbf3dSMarko Kovacevic 143527cbf3dSMarko Kovacevic if (parser_read_uint8_hex(&val->val[i], byte) < 0) 144527cbf3dSMarko Kovacevic goto error_exit; 145527cbf3dSMarko Kovacevic } 146527cbf3dSMarko Kovacevic 147527cbf3dSMarko Kovacevic memcpy(val->val + 8, val->val, 8); 148527cbf3dSMarko Kovacevic memcpy(val->val + 16, val->val, 8); 149527cbf3dSMarko Kovacevic 150527cbf3dSMarko Kovacevic } else if (strstr(key, KEY1_STR)) { 151527cbf3dSMarko Kovacevic for (i = 0; i < len; i++) { 152527cbf3dSMarko Kovacevic char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'}; 153527cbf3dSMarko Kovacevic 154527cbf3dSMarko Kovacevic if (parser_read_uint8_hex(&val->val[i], byte) < 0) 155527cbf3dSMarko Kovacevic goto error_exit; 156527cbf3dSMarko Kovacevic } 157527cbf3dSMarko Kovacevic 158527cbf3dSMarko Kovacevic if (info.interim_info.tdes_data.nb_keys == 2) 159527cbf3dSMarko Kovacevic memcpy(val->val + 16, val->val, 8); 160527cbf3dSMarko Kovacevic 161527cbf3dSMarko Kovacevic } else if (strstr(key, KEY2_STR)) { 162527cbf3dSMarko Kovacevic for (i = 0; i < len; i++) { 163527cbf3dSMarko Kovacevic char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'}; 164527cbf3dSMarko Kovacevic 165527cbf3dSMarko Kovacevic if (parser_read_uint8_hex(&val->val[i + 8], byte) < 0) 166527cbf3dSMarko Kovacevic goto error_exit; 167527cbf3dSMarko Kovacevic } 168527cbf3dSMarko Kovacevic 169527cbf3dSMarko Kovacevic } else if (strstr(key, KEY3_STR)) { 170527cbf3dSMarko Kovacevic for (i = 0; i < len; i++) { 171527cbf3dSMarko Kovacevic char byte[3] = {src[i * 2], src[i * 2 + 1], '\0'}; 172527cbf3dSMarko Kovacevic 173527cbf3dSMarko Kovacevic if (parser_read_uint8_hex(&val->val[i + 16], byte) < 0) 174527cbf3dSMarko Kovacevic goto error_exit; 175527cbf3dSMarko Kovacevic } 176527cbf3dSMarko Kovacevic } else 177527cbf3dSMarko Kovacevic return -EINVAL; 178527cbf3dSMarko Kovacevic 179527cbf3dSMarko Kovacevic val->len = 24; 180527cbf3dSMarko Kovacevic 181527cbf3dSMarko Kovacevic return 0; 182527cbf3dSMarko Kovacevic 183527cbf3dSMarko Kovacevic error_exit: 184527cbf3dSMarko Kovacevic rte_free(val->val); 185527cbf3dSMarko Kovacevic memset(val, 0, sizeof(*val)); 186527cbf3dSMarko Kovacevic return -EINVAL; 187527cbf3dSMarko Kovacevic } 188527cbf3dSMarko Kovacevic 189527cbf3dSMarko Kovacevic static int 190527cbf3dSMarko Kovacevic parse_test_tdes_writeback(struct fips_val *val) 191527cbf3dSMarko Kovacevic { 192527cbf3dSMarko Kovacevic 193527cbf3dSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) 194527cbf3dSMarko Kovacevic fprintf(info.fp_wr, "%s", CT_STR); 195527cbf3dSMarko Kovacevic else 196527cbf3dSMarko Kovacevic fprintf(info.fp_wr, "%s", PT_STR); 197527cbf3dSMarko Kovacevic 198527cbf3dSMarko Kovacevic parse_write_hex_str(val); 199527cbf3dSMarko Kovacevic 200527cbf3dSMarko Kovacevic return 0; 201527cbf3dSMarko Kovacevic 202527cbf3dSMarko Kovacevic } 203527cbf3dSMarko Kovacevic 204527cbf3dSMarko Kovacevic static int 205527cbf3dSMarko Kovacevic writeback_tdes_hex_str(const char *key, char *dst, struct fips_val *val) 206527cbf3dSMarko Kovacevic { 20786ce81afSMarko Kovacevic struct fips_val tmp_val = {0}; 208527cbf3dSMarko Kovacevic 209527cbf3dSMarko Kovacevic tmp_val.len = 8; 210527cbf3dSMarko Kovacevic 211527cbf3dSMarko Kovacevic if (strstr(key, KEY1_STR)) 212527cbf3dSMarko Kovacevic tmp_val.val = val->val; 213527cbf3dSMarko Kovacevic else if (strstr(key, KEY2_STR)) 214527cbf3dSMarko Kovacevic tmp_val.val = val->val + 8; 215527cbf3dSMarko Kovacevic else if (strstr(key, KEY3_STR)) 216527cbf3dSMarko Kovacevic tmp_val.val = val->val + 16; 21775b3dddfSChaitanya Babu Talluri else 21875b3dddfSChaitanya Babu Talluri return -EINVAL; 219527cbf3dSMarko Kovacevic 220527cbf3dSMarko Kovacevic return writeback_hex_str(key, dst, &tmp_val); 221527cbf3dSMarko Kovacevic } 222527cbf3dSMarko Kovacevic 223527cbf3dSMarko Kovacevic static int 224527cbf3dSMarko Kovacevic rsp_test_tdes_check(struct fips_val *val) 225527cbf3dSMarko Kovacevic { 226527cbf3dSMarko Kovacevic struct fips_val *data; 227527cbf3dSMarko Kovacevic 228527cbf3dSMarko Kovacevic if (info.op == FIPS_TEST_ENC_AUTH_GEN) 229527cbf3dSMarko Kovacevic data = &vec.ct; 230527cbf3dSMarko Kovacevic else 231527cbf3dSMarko Kovacevic data = &vec.pt; 232527cbf3dSMarko Kovacevic 233527cbf3dSMarko Kovacevic if (memcmp(val->val, data->val, val->len) == 0) 234527cbf3dSMarko Kovacevic fprintf(info.fp_wr, "Success\n"); 235527cbf3dSMarko Kovacevic else 236527cbf3dSMarko Kovacevic fprintf(info.fp_wr, "Failed\n"); 237527cbf3dSMarko Kovacevic 238527cbf3dSMarko Kovacevic return 0; 239527cbf3dSMarko Kovacevic } 240527cbf3dSMarko Kovacevic 241527cbf3dSMarko Kovacevic int 242527cbf3dSMarko Kovacevic parse_test_tdes_init(void) 243527cbf3dSMarko Kovacevic { 244527cbf3dSMarko Kovacevic uint32_t i; 245527cbf3dSMarko Kovacevic 246527cbf3dSMarko Kovacevic for (i = 0; i < info.nb_vec_lines; i++) { 247527cbf3dSMarko Kovacevic char *line = info.vec[i]; 248527cbf3dSMarko Kovacevic uint32_t j; 249527cbf3dSMarko Kovacevic 250527cbf3dSMarko Kovacevic if (strstr(line, TEST_CBCI_KEY)) 251527cbf3dSMarko Kovacevic return -EPERM; 252527cbf3dSMarko Kovacevic 253527cbf3dSMarko Kovacevic for (j = 0; j < RTE_DIM(test_types); j++) 254527cbf3dSMarko Kovacevic if (strstr(line, test_types[j].desc)) { 255527cbf3dSMarko Kovacevic info.interim_info.tdes_data.test_type = 256527cbf3dSMarko Kovacevic test_types[j].type; 257efe3a8dbSMichael Shamis if (strstr(line, TEST_TYPE_ECB_KEY)) 258efe3a8dbSMichael Shamis info.interim_info.tdes_data.test_mode = 259efe3a8dbSMichael Shamis TDES_MODE_ECB; 260efe3a8dbSMichael Shamis else 261efe3a8dbSMichael Shamis info.interim_info.tdes_data.test_mode = 262efe3a8dbSMichael Shamis TDES_MODE_CBC; 263527cbf3dSMarko Kovacevic break; 264527cbf3dSMarko Kovacevic } 265527cbf3dSMarko Kovacevic } 266527cbf3dSMarko Kovacevic 267527cbf3dSMarko Kovacevic info.parse_writeback = parse_test_tdes_writeback; 268527cbf3dSMarko Kovacevic info.callbacks = tdes_tests_vectors; 269527cbf3dSMarko Kovacevic info.interim_callbacks = tdes_tests_interim_vectors; 270527cbf3dSMarko Kovacevic info.writeback_callbacks = tdes_writeback_callbacks; 271527cbf3dSMarko Kovacevic info.kat_check = rsp_test_tdes_check; 272527cbf3dSMarko Kovacevic 273527cbf3dSMarko Kovacevic return 0; 274527cbf3dSMarko Kovacevic } 275