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