1*305921f4SMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause 2*305921f4SMarko Kovacevic * Copyright(c) 2018 Intel Corporation 3*305921f4SMarko Kovacevic */ 4*305921f4SMarko Kovacevic 5*305921f4SMarko Kovacevic #include <stdio.h> 6*305921f4SMarko Kovacevic #include <string.h> 7*305921f4SMarko Kovacevic 8*305921f4SMarko Kovacevic #include <rte_string_fns.h> 9*305921f4SMarko Kovacevic #include <rte_cryptodev.h> 10*305921f4SMarko Kovacevic #include <rte_malloc.h> 11*305921f4SMarko Kovacevic 12*305921f4SMarko Kovacevic #include "fips_validation.h" 13*305921f4SMarko Kovacevic 14*305921f4SMarko Kovacevic #define DVPT_STR "CCM-DVPT" 15*305921f4SMarko Kovacevic #define VADT_STR "CCM-VADT" 16*305921f4SMarko Kovacevic #define VPT_STR "CCM-VPT" 17*305921f4SMarko Kovacevic #define VNT_STR "CCM-VNT" 18*305921f4SMarko Kovacevic #define VTT_STR "CCM-VTT" 19*305921f4SMarko Kovacevic 20*305921f4SMarko Kovacevic #define PARAM_PREFIX "[" 21*305921f4SMarko Kovacevic #define ALEN_PREFIX "Alen = " 22*305921f4SMarko Kovacevic #define PLEN_PREFIX "Plen = " 23*305921f4SMarko Kovacevic #define IVLEN_PREFIX "Nlen = " 24*305921f4SMarko Kovacevic #define DIGESTL_PREFIX "Tlen = " 25*305921f4SMarko Kovacevic 26*305921f4SMarko Kovacevic #define COUNT_STR "Count = " 27*305921f4SMarko Kovacevic #define KEY_STR "Key = " 28*305921f4SMarko Kovacevic #define IV_STR "Nonce = " 29*305921f4SMarko Kovacevic #define PT_STR "Payload = " 30*305921f4SMarko Kovacevic #define CT_STR "CT = " 31*305921f4SMarko Kovacevic #define AAD_STR "Adata = " 32*305921f4SMarko Kovacevic #define POS_NEG_STR "Result = " 33*305921f4SMarko Kovacevic 34*305921f4SMarko Kovacevic #define POS_KEYWORD "Pass" 35*305921f4SMarko Kovacevic #define NEG_KEYWORD "Fail" 36*305921f4SMarko Kovacevic 37*305921f4SMarko Kovacevic static int 38*305921f4SMarko Kovacevic parser_dvpt_interim(const char *key, char *src, struct fips_val *val) 39*305921f4SMarko Kovacevic { 40*305921f4SMarko Kovacevic char *tmp, c, value[10]; 41*305921f4SMarko Kovacevic char num_pattern[] = "0123456789"; 42*305921f4SMarko Kovacevic int i = 0; 43*305921f4SMarko Kovacevic 44*305921f4SMarko Kovacevic memset(value, 0, 10); 45*305921f4SMarko Kovacevic 46*305921f4SMarko Kovacevic tmp = strstr(src, key); 47*305921f4SMarko Kovacevic if (!tmp) 48*305921f4SMarko Kovacevic return -1; 49*305921f4SMarko Kovacevic 50*305921f4SMarko Kovacevic tmp += strlen(key); 51*305921f4SMarko Kovacevic 52*305921f4SMarko Kovacevic c = tmp[0]; 53*305921f4SMarko Kovacevic 54*305921f4SMarko Kovacevic while (strchr(num_pattern, c) && i < 10) { 55*305921f4SMarko Kovacevic value[i++] = c; 56*305921f4SMarko Kovacevic c = tmp[i]; 57*305921f4SMarko Kovacevic } 58*305921f4SMarko Kovacevic 59*305921f4SMarko Kovacevic return parser_read_uint32_val("", value, val); 60*305921f4SMarko Kovacevic } 61*305921f4SMarko Kovacevic 62*305921f4SMarko Kovacevic static int 63*305921f4SMarko Kovacevic parse_dvpt_ct_hex_str(const char *key, char *src, struct fips_val *val) 64*305921f4SMarko Kovacevic { 65*305921f4SMarko Kovacevic int ret; 66*305921f4SMarko Kovacevic 67*305921f4SMarko Kovacevic val->len = vec.pt.len; 68*305921f4SMarko Kovacevic 69*305921f4SMarko Kovacevic ret = parse_uint8_known_len_hex_str(key, src, val); 70*305921f4SMarko Kovacevic if (ret < 0) 71*305921f4SMarko Kovacevic return ret; 72*305921f4SMarko Kovacevic 73*305921f4SMarko Kovacevic src += strlen(key) + val->len * 2; 74*305921f4SMarko Kovacevic 75*305921f4SMarko Kovacevic ret = parse_uint8_known_len_hex_str("", src, &vec.aead.digest); 76*305921f4SMarko Kovacevic if (ret < 0) { 77*305921f4SMarko Kovacevic rte_free(val->val); 78*305921f4SMarko Kovacevic memset(val, 0, sizeof(*val)); 79*305921f4SMarko Kovacevic return ret; 80*305921f4SMarko Kovacevic } 81*305921f4SMarko Kovacevic 82*305921f4SMarko Kovacevic return 0; 83*305921f4SMarko Kovacevic } 84*305921f4SMarko Kovacevic 85*305921f4SMarko Kovacevic static int 86*305921f4SMarko Kovacevic parse_uint8_ccm_aad_str(const char *key, char *src, struct fips_val *val) 87*305921f4SMarko Kovacevic { 88*305921f4SMarko Kovacevic uint32_t len = val->len, j; 89*305921f4SMarko Kovacevic 90*305921f4SMarko Kovacevic src += strlen(key); 91*305921f4SMarko Kovacevic 92*305921f4SMarko Kovacevic /* CCM aad requires 18 bytes padding before the real content */ 93*305921f4SMarko Kovacevic val->val = rte_zmalloc(NULL, len + 18, 0); 94*305921f4SMarko Kovacevic if (!val->val) 95*305921f4SMarko Kovacevic return -1; 96*305921f4SMarko Kovacevic 97*305921f4SMarko Kovacevic for (j = 0; j < len; j++) { 98*305921f4SMarko Kovacevic char byte[3] = {src[j * 2], src[j * 2 + 1], '\0'}; 99*305921f4SMarko Kovacevic 100*305921f4SMarko Kovacevic if (parser_read_uint8_hex(&val->val[j + 18], byte) < 0) { 101*305921f4SMarko Kovacevic rte_free(val->val); 102*305921f4SMarko Kovacevic memset(val, 0, sizeof(*val)); 103*305921f4SMarko Kovacevic return -EINVAL; 104*305921f4SMarko Kovacevic } 105*305921f4SMarko Kovacevic } 106*305921f4SMarko Kovacevic 107*305921f4SMarko Kovacevic return 0; 108*305921f4SMarko Kovacevic } 109*305921f4SMarko Kovacevic 110*305921f4SMarko Kovacevic struct fips_test_callback ccm_vnt_vec[] = { 111*305921f4SMarko Kovacevic {IV_STR, parse_uint8_known_len_hex_str, &vec.iv}, 112*305921f4SMarko Kovacevic {AAD_STR, parse_uint8_ccm_aad_str, &vec.aead.aad}, 113*305921f4SMarko Kovacevic {PT_STR, parse_uint8_known_len_hex_str, &vec.pt}, 114*305921f4SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 115*305921f4SMarko Kovacevic }; 116*305921f4SMarko Kovacevic 117*305921f4SMarko Kovacevic struct fips_test_callback ccm_vnt_interim_vec[] = { 118*305921f4SMarko Kovacevic {ALEN_PREFIX, parser_read_uint32_val, &vec.aead.aad}, 119*305921f4SMarko Kovacevic {PLEN_PREFIX, parser_read_uint32_val, &vec.pt}, 120*305921f4SMarko Kovacevic {DIGESTL_PREFIX, parser_read_uint32_val, &vec.aead.digest}, 121*305921f4SMarko Kovacevic {IVLEN_PREFIX, parser_read_uint32_val, &vec.iv}, 122*305921f4SMarko Kovacevic {KEY_STR, parse_uint8_hex_str, &vec.aead.key}, 123*305921f4SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 124*305921f4SMarko Kovacevic }; 125*305921f4SMarko Kovacevic 126*305921f4SMarko Kovacevic struct fips_test_callback ccm_vtt_vec[] = { 127*305921f4SMarko Kovacevic {AAD_STR, parse_uint8_ccm_aad_str, &vec.aead.aad}, 128*305921f4SMarko Kovacevic {PT_STR, parse_uint8_known_len_hex_str, &vec.pt}, 129*305921f4SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 130*305921f4SMarko Kovacevic }; 131*305921f4SMarko Kovacevic 132*305921f4SMarko Kovacevic struct fips_test_callback ccm_vtt_interim_vec[] = { 133*305921f4SMarko Kovacevic {ALEN_PREFIX, parser_read_uint32_val, &vec.aead.aad}, 134*305921f4SMarko Kovacevic {PLEN_PREFIX, parser_read_uint32_val, &vec.pt}, 135*305921f4SMarko Kovacevic {IVLEN_PREFIX, parser_read_uint32_val, &vec.iv}, 136*305921f4SMarko Kovacevic {DIGESTL_PREFIX, parser_read_uint32_val, &vec.aead.digest}, 137*305921f4SMarko Kovacevic {KEY_STR, parse_uint8_hex_str, &vec.aead.key}, 138*305921f4SMarko Kovacevic {IV_STR, parse_uint8_known_len_hex_str, &vec.iv}, 139*305921f4SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 140*305921f4SMarko Kovacevic }; 141*305921f4SMarko Kovacevic 142*305921f4SMarko Kovacevic struct fips_test_callback ccm_vadt_vec[] = { 143*305921f4SMarko Kovacevic {AAD_STR, parse_uint8_ccm_aad_str, &vec.aead.aad}, 144*305921f4SMarko Kovacevic {PT_STR, parse_uint8_known_len_hex_str, &vec.pt}, 145*305921f4SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 146*305921f4SMarko Kovacevic }; 147*305921f4SMarko Kovacevic 148*305921f4SMarko Kovacevic struct fips_test_callback ccm_vadt_interim_vec[] = { 149*305921f4SMarko Kovacevic {PLEN_PREFIX, parser_read_uint32_val, &vec.pt}, 150*305921f4SMarko Kovacevic {IVLEN_PREFIX, parser_read_uint32_val, &vec.iv}, 151*305921f4SMarko Kovacevic {ALEN_PREFIX, parser_read_uint32_val, &vec.aead.aad}, 152*305921f4SMarko Kovacevic {DIGESTL_PREFIX, parser_read_uint32_val, &vec.aead.digest}, 153*305921f4SMarko Kovacevic {KEY_STR, parse_uint8_hex_str, &vec.aead.key}, 154*305921f4SMarko Kovacevic {IV_STR, parse_uint8_known_len_hex_str, &vec.iv}, 155*305921f4SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 156*305921f4SMarko Kovacevic }; 157*305921f4SMarko Kovacevic 158*305921f4SMarko Kovacevic struct fips_test_callback ccm_vpt_vec[] = { 159*305921f4SMarko Kovacevic {AAD_STR, parse_uint8_ccm_aad_str, &vec.aead.aad}, 160*305921f4SMarko Kovacevic {PT_STR, parse_uint8_known_len_hex_str, &vec.pt}, 161*305921f4SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 162*305921f4SMarko Kovacevic }; 163*305921f4SMarko Kovacevic 164*305921f4SMarko Kovacevic struct fips_test_callback ccm_vpt_interim_vec[] = { 165*305921f4SMarko Kovacevic {ALEN_PREFIX, parser_read_uint32_val, &vec.aead.aad}, 166*305921f4SMarko Kovacevic {IVLEN_PREFIX, parser_read_uint32_val, &vec.iv}, 167*305921f4SMarko Kovacevic {DIGESTL_PREFIX, parser_read_uint32_val, &vec.aead.digest}, 168*305921f4SMarko Kovacevic {PLEN_PREFIX, parser_read_uint32_val, &vec.pt}, 169*305921f4SMarko Kovacevic {KEY_STR, parse_uint8_hex_str, &vec.aead.key}, 170*305921f4SMarko Kovacevic {IV_STR, parse_uint8_known_len_hex_str, &vec.iv}, 171*305921f4SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 172*305921f4SMarko Kovacevic }; 173*305921f4SMarko Kovacevic 174*305921f4SMarko Kovacevic struct fips_test_callback ccm_dvpt_vec[] = { 175*305921f4SMarko Kovacevic {IV_STR, parse_uint8_known_len_hex_str, &vec.iv}, 176*305921f4SMarko Kovacevic {AAD_STR, parse_uint8_ccm_aad_str, &vec.aead.aad}, 177*305921f4SMarko Kovacevic {CT_STR, parse_dvpt_ct_hex_str, &vec.ct}, 178*305921f4SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 179*305921f4SMarko Kovacevic }; 180*305921f4SMarko Kovacevic 181*305921f4SMarko Kovacevic struct fips_test_callback ccm_dvpt_interim_vec[] = { 182*305921f4SMarko Kovacevic {ALEN_PREFIX, parser_dvpt_interim, &vec.aead.aad}, 183*305921f4SMarko Kovacevic {PLEN_PREFIX, parser_dvpt_interim, &vec.pt}, 184*305921f4SMarko Kovacevic {IVLEN_PREFIX, parser_dvpt_interim, &vec.iv}, 185*305921f4SMarko Kovacevic {DIGESTL_PREFIX, parser_dvpt_interim, &vec.aead.digest}, 186*305921f4SMarko Kovacevic {KEY_STR, parse_uint8_hex_str, &vec.aead.key}, 187*305921f4SMarko Kovacevic {NULL, NULL, NULL} /**< end pointer */ 188*305921f4SMarko Kovacevic }; 189*305921f4SMarko Kovacevic 190*305921f4SMarko Kovacevic struct ccm_test_types { 191*305921f4SMarko Kovacevic const char *str; 192*305921f4SMarko Kovacevic uint32_t type; 193*305921f4SMarko Kovacevic const struct fips_test_callback *cb; 194*305921f4SMarko Kovacevic const struct fips_test_callback *cb_interim; 195*305921f4SMarko Kovacevic enum fips_test_op op; 196*305921f4SMarko Kovacevic } ctt[] = { 197*305921f4SMarko Kovacevic {DVPT_STR, CCM_DVPT, ccm_dvpt_vec, ccm_dvpt_interim_vec, 198*305921f4SMarko Kovacevic FIPS_TEST_DEC_AUTH_VERIF}, 199*305921f4SMarko Kovacevic {VPT_STR, CCM_VPT, ccm_vpt_vec, ccm_vpt_interim_vec, 200*305921f4SMarko Kovacevic FIPS_TEST_ENC_AUTH_GEN}, 201*305921f4SMarko Kovacevic {VADT_STR, CCM_VADT, ccm_vadt_vec, ccm_vadt_interim_vec, 202*305921f4SMarko Kovacevic FIPS_TEST_ENC_AUTH_GEN}, 203*305921f4SMarko Kovacevic {VNT_STR, CCM_VNT, ccm_vnt_vec, ccm_vnt_interim_vec, 204*305921f4SMarko Kovacevic FIPS_TEST_ENC_AUTH_GEN}, 205*305921f4SMarko Kovacevic {VTT_STR, CCM_VTT, ccm_vtt_vec, ccm_vtt_interim_vec, 206*305921f4SMarko Kovacevic FIPS_TEST_ENC_AUTH_GEN}, 207*305921f4SMarko Kovacevic }; 208*305921f4SMarko Kovacevic 209*305921f4SMarko Kovacevic static int 210*305921f4SMarko Kovacevic parse_test_ccm_writeback(struct fips_val *val) 211*305921f4SMarko Kovacevic { 212*305921f4SMarko Kovacevic struct fips_val tmp_val; 213*305921f4SMarko Kovacevic 214*305921f4SMarko Kovacevic switch (info.interim_info.ccm_data.test_type) { 215*305921f4SMarko Kovacevic case CCM_DVPT: 216*305921f4SMarko Kovacevic fprintf(info.fp_wr, "%s", POS_NEG_STR); 217*305921f4SMarko Kovacevic if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS) { 218*305921f4SMarko Kovacevic fprintf(info.fp_wr, "%s\n", POS_KEYWORD); 219*305921f4SMarko Kovacevic fprintf(info.fp_wr, "%s", PT_STR); 220*305921f4SMarko Kovacevic 221*305921f4SMarko Kovacevic tmp_val.val = val->val; 222*305921f4SMarko Kovacevic tmp_val.len = vec.pt.len; 223*305921f4SMarko Kovacevic 224*305921f4SMarko Kovacevic if (tmp_val.len == 0) 225*305921f4SMarko Kovacevic fprintf(info.fp_wr, "00\n"); 226*305921f4SMarko Kovacevic else 227*305921f4SMarko Kovacevic parse_write_hex_str(&tmp_val); 228*305921f4SMarko Kovacevic } else 229*305921f4SMarko Kovacevic fprintf(info.fp_wr, "%s\n", NEG_KEYWORD); 230*305921f4SMarko Kovacevic 231*305921f4SMarko Kovacevic break; 232*305921f4SMarko Kovacevic 233*305921f4SMarko Kovacevic case CCM_VADT: 234*305921f4SMarko Kovacevic case CCM_VNT: 235*305921f4SMarko Kovacevic case CCM_VPT: 236*305921f4SMarko Kovacevic case CCM_VTT: 237*305921f4SMarko Kovacevic fprintf(info.fp_wr, "%s", CT_STR); 238*305921f4SMarko Kovacevic 239*305921f4SMarko Kovacevic parse_write_hex_str(val); 240*305921f4SMarko Kovacevic 241*305921f4SMarko Kovacevic break; 242*305921f4SMarko Kovacevic 243*305921f4SMarko Kovacevic } 244*305921f4SMarko Kovacevic 245*305921f4SMarko Kovacevic return 0; 246*305921f4SMarko Kovacevic } 247*305921f4SMarko Kovacevic 248*305921f4SMarko Kovacevic int 249*305921f4SMarko Kovacevic parse_test_ccm_init(void) 250*305921f4SMarko Kovacevic { 251*305921f4SMarko Kovacevic 252*305921f4SMarko Kovacevic uint32_t i; 253*305921f4SMarko Kovacevic 254*305921f4SMarko Kovacevic for (i = 0; i < info.nb_vec_lines; i++) { 255*305921f4SMarko Kovacevic char *line = info.vec[i]; 256*305921f4SMarko Kovacevic uint32_t j; 257*305921f4SMarko Kovacevic 258*305921f4SMarko Kovacevic for (j = 0; j < RTE_DIM(ctt); j++) 259*305921f4SMarko Kovacevic if (strstr(line, ctt[j].str)) { 260*305921f4SMarko Kovacevic info.interim_info.ccm_data.test_type = 261*305921f4SMarko Kovacevic ctt[j].type; 262*305921f4SMarko Kovacevic info.callbacks = ctt[j].cb; 263*305921f4SMarko Kovacevic info.interim_callbacks = ctt[j].cb_interim; 264*305921f4SMarko Kovacevic info.op = ctt[j].op; 265*305921f4SMarko Kovacevic break; 266*305921f4SMarko Kovacevic } 267*305921f4SMarko Kovacevic } 268*305921f4SMarko Kovacevic 269*305921f4SMarko Kovacevic info.parse_writeback = parse_test_ccm_writeback; 270*305921f4SMarko Kovacevic 271*305921f4SMarko Kovacevic return 0; 272*305921f4SMarko Kovacevic } 273