1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606  * Copyright(c) 2018 Intel Corporation
3d30ea906Sjfb8856606  */
4d30ea906Sjfb8856606 
5d30ea906Sjfb8856606 #include <string.h>
6d30ea906Sjfb8856606 #include <time.h>
7d30ea906Sjfb8856606 #include <stdio.h>
8d30ea906Sjfb8856606 
9d30ea906Sjfb8856606 #include <rte_cryptodev.h>
10d30ea906Sjfb8856606 
11d30ea906Sjfb8856606 #include "fips_validation.h"
12d30ea906Sjfb8856606 
13d30ea906Sjfb8856606 #define ALGO_PREFIX	"[L="
14d30ea906Sjfb8856606 #define KEYLEN_STR	"Klen = "
15d30ea906Sjfb8856606 #define TAGLEN_STR	"Tlen = "
16d30ea906Sjfb8856606 
17d30ea906Sjfb8856606 #define COUNT_STR	"Count = "
18d30ea906Sjfb8856606 #define KEY_STR		"Key = "
19d30ea906Sjfb8856606 #define PT_STR		"Msg = "
20d30ea906Sjfb8856606 #define TAG_STR		"Mac = "
21d30ea906Sjfb8856606 
22d30ea906Sjfb8856606 struct hash_size_conversion {
23d30ea906Sjfb8856606 	const char *str;
24d30ea906Sjfb8856606 	enum rte_crypto_auth_algorithm algo;
25d30ea906Sjfb8856606 } hsc[] = {
26d30ea906Sjfb8856606 		{"20", RTE_CRYPTO_AUTH_SHA1_HMAC},
27d30ea906Sjfb8856606 		{"28", RTE_CRYPTO_AUTH_SHA224_HMAC},
28d30ea906Sjfb8856606 		{"32", RTE_CRYPTO_AUTH_SHA256_HMAC},
29d30ea906Sjfb8856606 		{"48", RTE_CRYPTO_AUTH_SHA384_HMAC},
30d30ea906Sjfb8856606 		{"64", RTE_CRYPTO_AUTH_SHA512_HMAC},
31d30ea906Sjfb8856606 };
32d30ea906Sjfb8856606 
33d30ea906Sjfb8856606 static int
parse_interim_algo(__rte_unused const char * key,char * text,__rte_unused struct fips_val * val)34*2d9fd380Sjfb8856606 parse_interim_algo(__rte_unused const char *key,
35d30ea906Sjfb8856606 		char *text,
36*2d9fd380Sjfb8856606 		__rte_unused struct fips_val *val)
37d30ea906Sjfb8856606 {
38d30ea906Sjfb8856606 
39d30ea906Sjfb8856606 	uint32_t i;
40d30ea906Sjfb8856606 
41d30ea906Sjfb8856606 	for (i = 0; i < RTE_DIM(hsc); i++) {
42d30ea906Sjfb8856606 		if (strstr(text, hsc[i].str)) {
43d30ea906Sjfb8856606 			info.interim_info.hmac_data.algo = hsc[i].algo;
44d30ea906Sjfb8856606 			break;
45d30ea906Sjfb8856606 		}
46d30ea906Sjfb8856606 	}
47d30ea906Sjfb8856606 
48d30ea906Sjfb8856606 	if (i == RTE_DIM(hsc))
49d30ea906Sjfb8856606 		return -1;
50d30ea906Sjfb8856606 
51d30ea906Sjfb8856606 	return 0;
52d30ea906Sjfb8856606 }
53d30ea906Sjfb8856606 
54d30ea906Sjfb8856606 struct fips_test_callback hmac_tests_vectors[] = {
55d30ea906Sjfb8856606 		{KEYLEN_STR, parser_read_uint32_val, &vec.cipher_auth.key},
56d30ea906Sjfb8856606 		{TAGLEN_STR, parser_read_uint32_val, &vec.cipher_auth.digest},
57d30ea906Sjfb8856606 		{KEY_STR, parse_uint8_hex_str, &vec.cipher_auth.key},
58d30ea906Sjfb8856606 		{PT_STR, parse_uint8_hex_str, &vec.pt},
59d30ea906Sjfb8856606 		{TAG_STR, parse_uint8_hex_str, &vec.cipher_auth.digest},
60d30ea906Sjfb8856606 		{NULL, NULL, NULL} /**< end pointer */
61d30ea906Sjfb8856606 };
62d30ea906Sjfb8856606 
63d30ea906Sjfb8856606 struct fips_test_callback hmac_tests_interim_vectors[] = {
64d30ea906Sjfb8856606 		{ALGO_PREFIX, parse_interim_algo, NULL},
65d30ea906Sjfb8856606 		{NULL, NULL, NULL} /**< end pointer */
66d30ea906Sjfb8856606 };
67d30ea906Sjfb8856606 
68d30ea906Sjfb8856606 static int
parse_test_hmac_writeback(struct fips_val * val)69d30ea906Sjfb8856606 parse_test_hmac_writeback(struct fips_val *val)
70d30ea906Sjfb8856606 {
71d30ea906Sjfb8856606 	struct fips_val val_local;
72d30ea906Sjfb8856606 
73d30ea906Sjfb8856606 	fprintf(info.fp_wr, "%s", TAG_STR);
74d30ea906Sjfb8856606 
75d30ea906Sjfb8856606 	val_local.val = val->val + vec.pt.len;
76d30ea906Sjfb8856606 	val_local.len = vec.cipher_auth.digest.len;
77d30ea906Sjfb8856606 
78d30ea906Sjfb8856606 	parse_write_hex_str(&val_local);
79d30ea906Sjfb8856606 	return 0;
80d30ea906Sjfb8856606 }
81d30ea906Sjfb8856606 
82d30ea906Sjfb8856606 static int
rsp_test_hmac_check(struct fips_val * val)83d30ea906Sjfb8856606 rsp_test_hmac_check(struct fips_val *val)
84d30ea906Sjfb8856606 {
85d30ea906Sjfb8856606 	if (memcmp(val->val + vec.pt.len, vec.cipher_auth.digest.val,
86d30ea906Sjfb8856606 			vec.cipher_auth.digest.len) == 0)
87d30ea906Sjfb8856606 		fprintf(info.fp_wr, "Success\n");
88d30ea906Sjfb8856606 	else
89d30ea906Sjfb8856606 		fprintf(info.fp_wr, "Failed\n");
90d30ea906Sjfb8856606 
91d30ea906Sjfb8856606 	return 0;
92d30ea906Sjfb8856606 }
93d30ea906Sjfb8856606 
94d30ea906Sjfb8856606 int
parse_test_hmac_init(void)95d30ea906Sjfb8856606 parse_test_hmac_init(void)
96d30ea906Sjfb8856606 {
97d30ea906Sjfb8856606 	info.op = FIPS_TEST_ENC_AUTH_GEN;
98d30ea906Sjfb8856606 	info.parse_writeback = parse_test_hmac_writeback;
99d30ea906Sjfb8856606 	info.callbacks = hmac_tests_vectors;
100d30ea906Sjfb8856606 	info.interim_callbacks = hmac_tests_interim_vectors;
101d30ea906Sjfb8856606 	info.writeback_callbacks = NULL;
102d30ea906Sjfb8856606 	info.kat_check = rsp_test_hmac_check;
103d30ea906Sjfb8856606 
104d30ea906Sjfb8856606 	return 0;
105d30ea906Sjfb8856606 }
106