1f4797baeSDamian Nowak /* SPDX-License-Identifier: BSD-3-Clause 2f4797baeSDamian Nowak * Copyright(c) 2019 Intel Corporation 3f4797baeSDamian Nowak */ 4f4797baeSDamian Nowak 5f4797baeSDamian Nowak #include <string.h> 6f4797baeSDamian Nowak #include <time.h> 7f4797baeSDamian Nowak #include <stdio.h> 8f4797baeSDamian Nowak 9f4797baeSDamian Nowak #include <rte_cryptodev.h> 10f4797baeSDamian Nowak 11f4797baeSDamian Nowak #include "fips_validation.h" 12f4797baeSDamian Nowak 13f4797baeSDamian Nowak #define ALGO_PREFIX "[L = " 14f4797baeSDamian Nowak #define MSGLEN_STR "Len = " 15f4797baeSDamian Nowak #define MSG_STR "Msg = " 16f4797baeSDamian Nowak #define MD_STR "MD = " 17f4797baeSDamian Nowak #define SEED_STR "Seed = " 18f4797baeSDamian Nowak #define MCT_STR "Monte" 19f4797baeSDamian Nowak 20*d5c24714SGowrishankar Muthukrishnan #define ALGO_JSON_STR "algorithm" 21*d5c24714SGowrishankar Muthukrishnan #define TESTTYPE_JSON_STR "testType" 22*d5c24714SGowrishankar Muthukrishnan 23*d5c24714SGowrishankar Muthukrishnan #define PT_JSON_STR "msg" 24*d5c24714SGowrishankar Muthukrishnan 25f4797baeSDamian Nowak struct plain_hash_size_conversion { 26f4797baeSDamian Nowak const char *str; 27f4797baeSDamian Nowak enum rte_crypto_auth_algorithm algo; 28f4797baeSDamian Nowak } phsc[] = { 29f4797baeSDamian Nowak {"20", RTE_CRYPTO_AUTH_SHA1}, 30f4797baeSDamian Nowak {"28", RTE_CRYPTO_AUTH_SHA224}, 31f4797baeSDamian Nowak {"32", RTE_CRYPTO_AUTH_SHA256}, 32f4797baeSDamian Nowak {"48", RTE_CRYPTO_AUTH_SHA384}, 33f4797baeSDamian Nowak {"64", RTE_CRYPTO_AUTH_SHA512}, 34f4797baeSDamian Nowak }; 35f4797baeSDamian Nowak 36f4797baeSDamian Nowak static int 37f2fc83b4SThomas Monjalon parse_interim_algo(__rte_unused const char *key, 38f4797baeSDamian Nowak char *text, 39f2fc83b4SThomas Monjalon __rte_unused struct fips_val *val) 40f4797baeSDamian Nowak { 41f4797baeSDamian Nowak uint32_t i; 42f4797baeSDamian Nowak 43f4797baeSDamian Nowak for (i = 0; i < RTE_DIM(phsc); i++) { 44f4797baeSDamian Nowak if (strstr(text, phsc[i].str)) { 45f4797baeSDamian Nowak info.interim_info.sha_data.algo = phsc[i].algo; 46f4797baeSDamian Nowak parser_read_uint32_val(ALGO_PREFIX, 47f4797baeSDamian Nowak text, &vec.cipher_auth.digest); 48f4797baeSDamian Nowak break; 49f4797baeSDamian Nowak } 50f4797baeSDamian Nowak } 51f4797baeSDamian Nowak 52f4797baeSDamian Nowak if (i == RTE_DIM(phsc)) 53f4797baeSDamian Nowak return -1; 54f4797baeSDamian Nowak 55f4797baeSDamian Nowak return 0; 56f4797baeSDamian Nowak } 57f4797baeSDamian Nowak 58f4797baeSDamian Nowak struct fips_test_callback sha_tests_vectors[] = { 59f4797baeSDamian Nowak {MSGLEN_STR, parser_read_uint32_bit_val, &vec.pt}, 60f4797baeSDamian Nowak {MSG_STR, parse_uint8_known_len_hex_str, &vec.pt}, 61f4797baeSDamian Nowak {SEED_STR, parse_uint8_hex_str, &vec.cipher_auth.digest}, 62f4797baeSDamian Nowak {NULL, NULL, NULL} /**< end pointer */ 63f4797baeSDamian Nowak }; 64f4797baeSDamian Nowak 65f4797baeSDamian Nowak struct fips_test_callback sha_tests_interim_vectors[] = { 66f4797baeSDamian Nowak {ALGO_PREFIX, parse_interim_algo, NULL}, 67f4797baeSDamian Nowak {NULL, NULL, NULL} /**< end pointer */ 68f4797baeSDamian Nowak }; 69f4797baeSDamian Nowak 70*d5c24714SGowrishankar Muthukrishnan #ifdef USE_JANSSON 71*d5c24714SGowrishankar Muthukrishnan static struct { 72*d5c24714SGowrishankar Muthukrishnan uint32_t type; 73*d5c24714SGowrishankar Muthukrishnan const char *desc; 74*d5c24714SGowrishankar Muthukrishnan } sha_test_types[] = { 75*d5c24714SGowrishankar Muthukrishnan {SHA_MCT, "MCT"}, 76*d5c24714SGowrishankar Muthukrishnan {SHA_AFT, "AFT"}, 77*d5c24714SGowrishankar Muthukrishnan }; 78*d5c24714SGowrishankar Muthukrishnan 79*d5c24714SGowrishankar Muthukrishnan static struct plain_hash_algorithms { 80*d5c24714SGowrishankar Muthukrishnan const char *str; 81*d5c24714SGowrishankar Muthukrishnan enum rte_crypto_auth_algorithm algo; 82*d5c24714SGowrishankar Muthukrishnan } json_algorithms[] = { 83*d5c24714SGowrishankar Muthukrishnan {"SHA-1", RTE_CRYPTO_AUTH_SHA1}, 84*d5c24714SGowrishankar Muthukrishnan {"SHA2-224", RTE_CRYPTO_AUTH_SHA224}, 85*d5c24714SGowrishankar Muthukrishnan {"SHA2-256", RTE_CRYPTO_AUTH_SHA256}, 86*d5c24714SGowrishankar Muthukrishnan {"SHA2-384", RTE_CRYPTO_AUTH_SHA384}, 87*d5c24714SGowrishankar Muthukrishnan {"SHA2-512", RTE_CRYPTO_AUTH_SHA512}, 88*d5c24714SGowrishankar Muthukrishnan }; 89*d5c24714SGowrishankar Muthukrishnan 90*d5c24714SGowrishankar Muthukrishnan struct fips_test_callback sha_tests_json_vectors[] = { 91*d5c24714SGowrishankar Muthukrishnan {PT_JSON_STR, parse_uint8_hex_str, &vec.pt}, 92*d5c24714SGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */ 93*d5c24714SGowrishankar Muthukrishnan }; 94*d5c24714SGowrishankar Muthukrishnan #endif /* USE_JANSSON */ 95*d5c24714SGowrishankar Muthukrishnan 96f4797baeSDamian Nowak static int 97f4797baeSDamian Nowak parse_test_sha_writeback(struct fips_val *val) // ! 98f4797baeSDamian Nowak { 99f4797baeSDamian Nowak struct fips_val val_local; 100f4797baeSDamian Nowak 101f4797baeSDamian Nowak fprintf(info.fp_wr, "%s", MD_STR); 102f4797baeSDamian Nowak 103f4797baeSDamian Nowak val_local.val = val->val + vec.pt.len; 104f4797baeSDamian Nowak val_local.len = vec.cipher_auth.digest.len; 105f4797baeSDamian Nowak 106f4797baeSDamian Nowak parse_write_hex_str(&val_local); 107f4797baeSDamian Nowak return 0; 108f4797baeSDamian Nowak } 109f4797baeSDamian Nowak 110f4797baeSDamian Nowak static int 111f4797baeSDamian Nowak rsp_test_sha_check(struct fips_val *val) 112f4797baeSDamian Nowak { 113f4797baeSDamian Nowak if (memcmp(val->val + vec.pt.len, vec.cipher_auth.digest.val, 114f4797baeSDamian Nowak vec.cipher_auth.digest.len) == 0) 115f4797baeSDamian Nowak fprintf(info.fp_wr, "Success\n"); 116f4797baeSDamian Nowak else 117f4797baeSDamian Nowak fprintf(info.fp_wr, "Failed\n"); 118f4797baeSDamian Nowak 119f4797baeSDamian Nowak return 0; 120f4797baeSDamian Nowak } 121f4797baeSDamian Nowak 122f4797baeSDamian Nowak int 123f4797baeSDamian Nowak parse_test_sha_init(void) 124f4797baeSDamian Nowak { 125f4797baeSDamian Nowak uint32_t i; 126f4797baeSDamian Nowak 127f4797baeSDamian Nowak info.interim_info.sha_data.test_type = SHA_KAT; 128f4797baeSDamian Nowak for (i = 0; i < info.nb_vec_lines; i++) { 129f4797baeSDamian Nowak char *line = info.vec[i]; 130f4797baeSDamian Nowak if (strstr(line, MCT_STR)) 131f4797baeSDamian Nowak info.interim_info.sha_data.test_type = SHA_MCT; 132f4797baeSDamian Nowak } 133f4797baeSDamian Nowak 134f4797baeSDamian Nowak info.op = FIPS_TEST_ENC_AUTH_GEN; 135f4797baeSDamian Nowak info.parse_writeback = parse_test_sha_writeback; 136f4797baeSDamian Nowak info.callbacks = sha_tests_vectors; 137f4797baeSDamian Nowak info.interim_callbacks = sha_tests_interim_vectors; 138f4797baeSDamian Nowak info.writeback_callbacks = NULL; 139f4797baeSDamian Nowak info.kat_check = rsp_test_sha_check; 140f4797baeSDamian Nowak return 0; 141f4797baeSDamian Nowak } 142*d5c24714SGowrishankar Muthukrishnan 143*d5c24714SGowrishankar Muthukrishnan #ifdef USE_JANSSON 144*d5c24714SGowrishankar Muthukrishnan static int 145*d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_writeback(struct fips_val *val) 146*d5c24714SGowrishankar Muthukrishnan { 147*d5c24714SGowrishankar Muthukrishnan struct fips_val val_local; 148*d5c24714SGowrishankar Muthukrishnan json_t *tcId, *md; 149*d5c24714SGowrishankar Muthukrishnan 150*d5c24714SGowrishankar Muthukrishnan tcId = json_object_get(json_info.json_test_case, "tcId"); 151*d5c24714SGowrishankar Muthukrishnan 152*d5c24714SGowrishankar Muthukrishnan json_info.json_write_case = json_object(); 153*d5c24714SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "tcId", tcId); 154*d5c24714SGowrishankar Muthukrishnan 155*d5c24714SGowrishankar Muthukrishnan val_local.val = val->val + vec.pt.len; 156*d5c24714SGowrishankar Muthukrishnan val_local.len = vec.cipher_auth.digest.len; 157*d5c24714SGowrishankar Muthukrishnan 158*d5c24714SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &val_local); 159*d5c24714SGowrishankar Muthukrishnan md = json_string(info.one_line_text); 160*d5c24714SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "md", md); 161*d5c24714SGowrishankar Muthukrishnan 162*d5c24714SGowrishankar Muthukrishnan return 0; 163*d5c24714SGowrishankar Muthukrishnan } 164*d5c24714SGowrishankar Muthukrishnan 165*d5c24714SGowrishankar Muthukrishnan static int 166*d5c24714SGowrishankar Muthukrishnan parse_test_sha_mct_json_writeback(struct fips_val *val) 167*d5c24714SGowrishankar Muthukrishnan { 168*d5c24714SGowrishankar Muthukrishnan json_t *tcId, *msg, *md, *resArr, *res; 169*d5c24714SGowrishankar Muthukrishnan struct fips_val val_local; 170*d5c24714SGowrishankar Muthukrishnan 171*d5c24714SGowrishankar Muthukrishnan tcId = json_object_get(json_info.json_test_case, "tcId"); 172*d5c24714SGowrishankar Muthukrishnan if (json_info.json_write_case) { 173*d5c24714SGowrishankar Muthukrishnan json_t *wcId; 174*d5c24714SGowrishankar Muthukrishnan 175*d5c24714SGowrishankar Muthukrishnan wcId = json_object_get(json_info.json_write_case, "tcId"); 176*d5c24714SGowrishankar Muthukrishnan if (!json_equal(tcId, wcId)) { 177*d5c24714SGowrishankar Muthukrishnan json_info.json_write_case = json_object(); 178*d5c24714SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "tcId", tcId); 179*d5c24714SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "resultsArray", 180*d5c24714SGowrishankar Muthukrishnan json_array()); 181*d5c24714SGowrishankar Muthukrishnan } 182*d5c24714SGowrishankar Muthukrishnan } else { 183*d5c24714SGowrishankar Muthukrishnan json_info.json_write_case = json_object(); 184*d5c24714SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "tcId", tcId); 185*d5c24714SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "resultsArray", json_array()); 186*d5c24714SGowrishankar Muthukrishnan } 187*d5c24714SGowrishankar Muthukrishnan 188*d5c24714SGowrishankar Muthukrishnan resArr = json_object_get(json_info.json_write_case, "resultsArray"); 189*d5c24714SGowrishankar Muthukrishnan if (!json_is_array(resArr)) 190*d5c24714SGowrishankar Muthukrishnan return -EINVAL; 191*d5c24714SGowrishankar Muthukrishnan 192*d5c24714SGowrishankar Muthukrishnan res = json_object(); 193*d5c24714SGowrishankar Muthukrishnan 194*d5c24714SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &val[1]); 195*d5c24714SGowrishankar Muthukrishnan msg = json_string(info.one_line_text); 196*d5c24714SGowrishankar Muthukrishnan json_object_set_new(res, "msg", msg); 197*d5c24714SGowrishankar Muthukrishnan 198*d5c24714SGowrishankar Muthukrishnan val_local.val = val[0].val + vec.pt.len; 199*d5c24714SGowrishankar Muthukrishnan val_local.len = vec.cipher_auth.digest.len; 200*d5c24714SGowrishankar Muthukrishnan 201*d5c24714SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &val_local); 202*d5c24714SGowrishankar Muthukrishnan md = json_string(info.one_line_text); 203*d5c24714SGowrishankar Muthukrishnan json_object_set_new(res, "md", md); 204*d5c24714SGowrishankar Muthukrishnan 205*d5c24714SGowrishankar Muthukrishnan json_array_append_new(resArr, res); 206*d5c24714SGowrishankar Muthukrishnan return 0; 207*d5c24714SGowrishankar Muthukrishnan } 208*d5c24714SGowrishankar Muthukrishnan 209*d5c24714SGowrishankar Muthukrishnan int 210*d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_algorithm(void) 211*d5c24714SGowrishankar Muthukrishnan { 212*d5c24714SGowrishankar Muthukrishnan json_t *algorithm_object; 213*d5c24714SGowrishankar Muthukrishnan const char *algorithm_str; 214*d5c24714SGowrishankar Muthukrishnan uint32_t i; 215*d5c24714SGowrishankar Muthukrishnan 216*d5c24714SGowrishankar Muthukrishnan algorithm_object = json_object_get(json_info.json_vector_set, "algorithm"); 217*d5c24714SGowrishankar Muthukrishnan algorithm_str = json_string_value(algorithm_object); 218*d5c24714SGowrishankar Muthukrishnan 219*d5c24714SGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(json_algorithms); i++) { 220*d5c24714SGowrishankar Muthukrishnan if (strstr(algorithm_str, json_algorithms[i].str)) { 221*d5c24714SGowrishankar Muthukrishnan info.interim_info.sha_data.algo = json_algorithms[i].algo; 222*d5c24714SGowrishankar Muthukrishnan break; 223*d5c24714SGowrishankar Muthukrishnan } 224*d5c24714SGowrishankar Muthukrishnan } 225*d5c24714SGowrishankar Muthukrishnan 226*d5c24714SGowrishankar Muthukrishnan if (i == RTE_DIM(json_algorithms)) 227*d5c24714SGowrishankar Muthukrishnan return -1; 228*d5c24714SGowrishankar Muthukrishnan 229*d5c24714SGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(phsc); i++) { 230*d5c24714SGowrishankar Muthukrishnan if (info.interim_info.sha_data.algo == phsc[i].algo) { 231*d5c24714SGowrishankar Muthukrishnan vec.cipher_auth.digest.len = atoi(phsc[i].str); 232*d5c24714SGowrishankar Muthukrishnan free(vec.cipher_auth.digest.val); 233*d5c24714SGowrishankar Muthukrishnan vec.cipher_auth.digest.val = calloc(1, vec.cipher_auth.digest.len); 234*d5c24714SGowrishankar Muthukrishnan if (vec.cipher_auth.digest.val == NULL) 235*d5c24714SGowrishankar Muthukrishnan return -1; 236*d5c24714SGowrishankar Muthukrishnan 237*d5c24714SGowrishankar Muthukrishnan break; 238*d5c24714SGowrishankar Muthukrishnan } 239*d5c24714SGowrishankar Muthukrishnan } 240*d5c24714SGowrishankar Muthukrishnan 241*d5c24714SGowrishankar Muthukrishnan if (i == RTE_DIM(phsc)) { 242*d5c24714SGowrishankar Muthukrishnan free(vec.cipher_auth.digest.val); 243*d5c24714SGowrishankar Muthukrishnan vec.cipher_auth.digest.val = NULL; 244*d5c24714SGowrishankar Muthukrishnan return -1; 245*d5c24714SGowrishankar Muthukrishnan } 246*d5c24714SGowrishankar Muthukrishnan 247*d5c24714SGowrishankar Muthukrishnan return 0; 248*d5c24714SGowrishankar Muthukrishnan } 249*d5c24714SGowrishankar Muthukrishnan 250*d5c24714SGowrishankar Muthukrishnan int 251*d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_test_type(void) 252*d5c24714SGowrishankar Muthukrishnan { 253*d5c24714SGowrishankar Muthukrishnan json_t *type_object; 254*d5c24714SGowrishankar Muthukrishnan const char *type_str; 255*d5c24714SGowrishankar Muthukrishnan uint32_t i; 256*d5c24714SGowrishankar Muthukrishnan 257*d5c24714SGowrishankar Muthukrishnan type_object = json_object_get(json_info.json_test_group, TESTTYPE_JSON_STR); 258*d5c24714SGowrishankar Muthukrishnan type_str = json_string_value(type_object); 259*d5c24714SGowrishankar Muthukrishnan 260*d5c24714SGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(sha_test_types); i++) 261*d5c24714SGowrishankar Muthukrishnan if (strstr(type_str, sha_test_types[i].desc)) { 262*d5c24714SGowrishankar Muthukrishnan info.interim_info.aes_data.test_type = 263*d5c24714SGowrishankar Muthukrishnan sha_test_types[i].type; 264*d5c24714SGowrishankar Muthukrishnan break; 265*d5c24714SGowrishankar Muthukrishnan } 266*d5c24714SGowrishankar Muthukrishnan 267*d5c24714SGowrishankar Muthukrishnan if (i == RTE_DIM(sha_test_types)) 268*d5c24714SGowrishankar Muthukrishnan return -1; 269*d5c24714SGowrishankar Muthukrishnan 270*d5c24714SGowrishankar Muthukrishnan switch (info.interim_info.sha_data.test_type) { 271*d5c24714SGowrishankar Muthukrishnan case SHA_MCT: 272*d5c24714SGowrishankar Muthukrishnan info.parse_writeback = parse_test_sha_mct_json_writeback; 273*d5c24714SGowrishankar Muthukrishnan break; 274*d5c24714SGowrishankar Muthukrishnan case SHA_AFT: 275*d5c24714SGowrishankar Muthukrishnan info.parse_writeback = parse_test_sha_json_writeback; 276*d5c24714SGowrishankar Muthukrishnan break; 277*d5c24714SGowrishankar Muthukrishnan default: 278*d5c24714SGowrishankar Muthukrishnan info.parse_writeback = NULL; 279*d5c24714SGowrishankar Muthukrishnan } 280*d5c24714SGowrishankar Muthukrishnan 281*d5c24714SGowrishankar Muthukrishnan if (!info.parse_writeback) 282*d5c24714SGowrishankar Muthukrishnan return -1; 283*d5c24714SGowrishankar Muthukrishnan 284*d5c24714SGowrishankar Muthukrishnan return 0; 285*d5c24714SGowrishankar Muthukrishnan } 286*d5c24714SGowrishankar Muthukrishnan 287*d5c24714SGowrishankar Muthukrishnan int 288*d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_init(void) 289*d5c24714SGowrishankar Muthukrishnan { 290*d5c24714SGowrishankar Muthukrishnan info.op = FIPS_TEST_ENC_AUTH_GEN; 291*d5c24714SGowrishankar Muthukrishnan info.parse_writeback = parse_test_sha_json_writeback; 292*d5c24714SGowrishankar Muthukrishnan info.callbacks = sha_tests_json_vectors; 293*d5c24714SGowrishankar Muthukrishnan info.writeback_callbacks = NULL; 294*d5c24714SGowrishankar Muthukrishnan info.kat_check = rsp_test_sha_check; 295*d5c24714SGowrishankar Muthukrishnan info.interim_callbacks = NULL; 296*d5c24714SGowrishankar Muthukrishnan 297*d5c24714SGowrishankar Muthukrishnan if (parse_test_sha_json_algorithm() < 0) 298*d5c24714SGowrishankar Muthukrishnan return -1; 299*d5c24714SGowrishankar Muthukrishnan 300*d5c24714SGowrishankar Muthukrishnan if (parse_test_sha_json_test_type() < 0) 301*d5c24714SGowrishankar Muthukrishnan return -1; 302*d5c24714SGowrishankar Muthukrishnan 303*d5c24714SGowrishankar Muthukrishnan return 0; 304*d5c24714SGowrishankar Muthukrishnan } 305*d5c24714SGowrishankar Muthukrishnan #endif /* USE_JANSSON */ 306