14418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang * Copyright(c) 2019 Intel Corporation
34418919fSjohnjiang */
44418919fSjohnjiang
54418919fSjohnjiang #include <string.h>
64418919fSjohnjiang #include <time.h>
74418919fSjohnjiang #include <stdio.h>
84418919fSjohnjiang
94418919fSjohnjiang #include <rte_cryptodev.h>
104418919fSjohnjiang
114418919fSjohnjiang #include "fips_validation.h"
124418919fSjohnjiang
134418919fSjohnjiang #define ALGO_PREFIX "[L = "
144418919fSjohnjiang #define MSGLEN_STR "Len = "
154418919fSjohnjiang #define MSG_STR "Msg = "
164418919fSjohnjiang #define MD_STR "MD = "
174418919fSjohnjiang #define SEED_STR "Seed = "
184418919fSjohnjiang #define MCT_STR "Monte"
194418919fSjohnjiang
204418919fSjohnjiang struct plain_hash_size_conversion {
214418919fSjohnjiang const char *str;
224418919fSjohnjiang enum rte_crypto_auth_algorithm algo;
234418919fSjohnjiang } phsc[] = {
244418919fSjohnjiang {"20", RTE_CRYPTO_AUTH_SHA1},
254418919fSjohnjiang {"28", RTE_CRYPTO_AUTH_SHA224},
264418919fSjohnjiang {"32", RTE_CRYPTO_AUTH_SHA256},
274418919fSjohnjiang {"48", RTE_CRYPTO_AUTH_SHA384},
284418919fSjohnjiang {"64", RTE_CRYPTO_AUTH_SHA512},
294418919fSjohnjiang };
304418919fSjohnjiang
314418919fSjohnjiang static int
parse_interim_algo(__rte_unused const char * key,char * text,__rte_unused struct fips_val * val)32*2d9fd380Sjfb8856606 parse_interim_algo(__rte_unused const char *key,
334418919fSjohnjiang char *text,
34*2d9fd380Sjfb8856606 __rte_unused struct fips_val *val)
354418919fSjohnjiang {
364418919fSjohnjiang uint32_t i;
374418919fSjohnjiang
384418919fSjohnjiang for (i = 0; i < RTE_DIM(phsc); i++) {
394418919fSjohnjiang if (strstr(text, phsc[i].str)) {
404418919fSjohnjiang info.interim_info.sha_data.algo = phsc[i].algo;
414418919fSjohnjiang parser_read_uint32_val(ALGO_PREFIX,
424418919fSjohnjiang text, &vec.cipher_auth.digest);
434418919fSjohnjiang break;
444418919fSjohnjiang }
454418919fSjohnjiang }
464418919fSjohnjiang
474418919fSjohnjiang if (i == RTE_DIM(phsc))
484418919fSjohnjiang return -1;
494418919fSjohnjiang
504418919fSjohnjiang return 0;
514418919fSjohnjiang }
524418919fSjohnjiang
534418919fSjohnjiang struct fips_test_callback sha_tests_vectors[] = {
544418919fSjohnjiang {MSGLEN_STR, parser_read_uint32_bit_val, &vec.pt},
554418919fSjohnjiang {MSG_STR, parse_uint8_known_len_hex_str, &vec.pt},
564418919fSjohnjiang {SEED_STR, parse_uint8_hex_str, &vec.cipher_auth.digest},
574418919fSjohnjiang {NULL, NULL, NULL} /**< end pointer */
584418919fSjohnjiang };
594418919fSjohnjiang
604418919fSjohnjiang struct fips_test_callback sha_tests_interim_vectors[] = {
614418919fSjohnjiang {ALGO_PREFIX, parse_interim_algo, NULL},
624418919fSjohnjiang {NULL, NULL, NULL} /**< end pointer */
634418919fSjohnjiang };
644418919fSjohnjiang
654418919fSjohnjiang static int
parse_test_sha_writeback(struct fips_val * val)664418919fSjohnjiang parse_test_sha_writeback(struct fips_val *val) // !
674418919fSjohnjiang {
684418919fSjohnjiang struct fips_val val_local;
694418919fSjohnjiang
704418919fSjohnjiang fprintf(info.fp_wr, "%s", MD_STR);
714418919fSjohnjiang
724418919fSjohnjiang val_local.val = val->val + vec.pt.len;
734418919fSjohnjiang val_local.len = vec.cipher_auth.digest.len;
744418919fSjohnjiang
754418919fSjohnjiang parse_write_hex_str(&val_local);
764418919fSjohnjiang return 0;
774418919fSjohnjiang }
784418919fSjohnjiang
794418919fSjohnjiang static int
rsp_test_sha_check(struct fips_val * val)804418919fSjohnjiang rsp_test_sha_check(struct fips_val *val)
814418919fSjohnjiang {
824418919fSjohnjiang if (memcmp(val->val + vec.pt.len, vec.cipher_auth.digest.val,
834418919fSjohnjiang vec.cipher_auth.digest.len) == 0)
844418919fSjohnjiang fprintf(info.fp_wr, "Success\n");
854418919fSjohnjiang else
864418919fSjohnjiang fprintf(info.fp_wr, "Failed\n");
874418919fSjohnjiang
884418919fSjohnjiang return 0;
894418919fSjohnjiang }
904418919fSjohnjiang
914418919fSjohnjiang int
parse_test_sha_init(void)924418919fSjohnjiang parse_test_sha_init(void)
934418919fSjohnjiang {
944418919fSjohnjiang uint32_t i;
954418919fSjohnjiang
964418919fSjohnjiang info.interim_info.sha_data.test_type = SHA_KAT;
974418919fSjohnjiang for (i = 0; i < info.nb_vec_lines; i++) {
984418919fSjohnjiang char *line = info.vec[i];
994418919fSjohnjiang if (strstr(line, MCT_STR))
1004418919fSjohnjiang info.interim_info.sha_data.test_type = SHA_MCT;
1014418919fSjohnjiang }
1024418919fSjohnjiang
1034418919fSjohnjiang info.op = FIPS_TEST_ENC_AUTH_GEN;
1044418919fSjohnjiang info.parse_writeback = parse_test_sha_writeback;
1054418919fSjohnjiang info.callbacks = sha_tests_vectors;
1064418919fSjohnjiang info.interim_callbacks = sha_tests_interim_vectors;
1074418919fSjohnjiang info.writeback_callbacks = NULL;
1084418919fSjohnjiang info.kat_check = rsp_test_sha_check;
1094418919fSjohnjiang return 0;
1104418919fSjohnjiang }
111