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