xref: /dpdk/examples/fips_validation/fips_validation_hmac.c (revision 1ea7940e0f44b91b3c0ba8160ff15f3a6c0e8d62)
1f64adb67SMarko Kovacevic /* SPDX-License-Identifier: BSD-3-Clause
2f64adb67SMarko Kovacevic  * Copyright(c) 2018 Intel Corporation
3f64adb67SMarko Kovacevic  */
4f64adb67SMarko Kovacevic 
5f64adb67SMarko Kovacevic #include <string.h>
6f64adb67SMarko Kovacevic #include <time.h>
7f64adb67SMarko Kovacevic #include <stdio.h>
8f64adb67SMarko Kovacevic 
9f64adb67SMarko Kovacevic #include <rte_cryptodev.h>
10f64adb67SMarko Kovacevic 
11f64adb67SMarko Kovacevic #include "fips_validation.h"
12f64adb67SMarko Kovacevic 
13f64adb67SMarko Kovacevic #define ALGO_PREFIX	"[L="
14f64adb67SMarko Kovacevic #define KEYLEN_STR	"Klen = "
15f64adb67SMarko Kovacevic #define TAGLEN_STR	"Tlen = "
16f64adb67SMarko Kovacevic 
17f64adb67SMarko Kovacevic #define COUNT_STR	"Count = "
18f64adb67SMarko Kovacevic #define KEY_STR		"Key = "
19f64adb67SMarko Kovacevic #define PT_STR		"Msg = "
20f64adb67SMarko Kovacevic #define TAG_STR		"Mac = "
21f64adb67SMarko Kovacevic 
22443c93d8SBrandon Lo #define ALGO_JSON_STR	"algorithm"
23443c93d8SBrandon Lo 
24443c93d8SBrandon Lo #define KEYLEN_JSON_STR	"keyLen"
25443c93d8SBrandon Lo #define TAGLEN_JSON_STR	"macLen"
26443c93d8SBrandon Lo 
27443c93d8SBrandon Lo #define KEY_JSON_STR	"key"
28443c93d8SBrandon Lo #define PT_JSON_STR		"msg"
29443c93d8SBrandon Lo #define TAG_JSON_STR	"mac"
30443c93d8SBrandon Lo 
31f64adb67SMarko Kovacevic struct hash_size_conversion {
32f64adb67SMarko Kovacevic 	const char *str;
33f64adb67SMarko Kovacevic 	enum rte_crypto_auth_algorithm algo;
34f64adb67SMarko Kovacevic } hsc[] = {
35f64adb67SMarko Kovacevic 		{"20", RTE_CRYPTO_AUTH_SHA1_HMAC},
36f64adb67SMarko Kovacevic 		{"28", RTE_CRYPTO_AUTH_SHA224_HMAC},
37f64adb67SMarko Kovacevic 		{"32", RTE_CRYPTO_AUTH_SHA256_HMAC},
38f64adb67SMarko Kovacevic 		{"48", RTE_CRYPTO_AUTH_SHA384_HMAC},
39f64adb67SMarko Kovacevic 		{"64", RTE_CRYPTO_AUTH_SHA512_HMAC},
40*1ea7940eSGowrishankar Muthukrishnan 		{"28", RTE_CRYPTO_AUTH_SHA3_224_HMAC},
41*1ea7940eSGowrishankar Muthukrishnan 		{"32", RTE_CRYPTO_AUTH_SHA3_256_HMAC},
42*1ea7940eSGowrishankar Muthukrishnan 		{"48", RTE_CRYPTO_AUTH_SHA3_384_HMAC},
43*1ea7940eSGowrishankar Muthukrishnan 		{"64", RTE_CRYPTO_AUTH_SHA3_512_HMAC},
44f64adb67SMarko Kovacevic };
45f64adb67SMarko Kovacevic 
46f64adb67SMarko Kovacevic static int
parse_interim_algo(__rte_unused const char * key,char * text,__rte_unused struct fips_val * val)47f2fc83b4SThomas Monjalon parse_interim_algo(__rte_unused const char *key,
48f64adb67SMarko Kovacevic 		char *text,
49f2fc83b4SThomas Monjalon 		__rte_unused struct fips_val *val)
50f64adb67SMarko Kovacevic {
51f64adb67SMarko Kovacevic 
52f64adb67SMarko Kovacevic 	uint32_t i;
53f64adb67SMarko Kovacevic 
54f64adb67SMarko Kovacevic 	for (i = 0; i < RTE_DIM(hsc); i++) {
55f64adb67SMarko Kovacevic 		if (strstr(text, hsc[i].str)) {
56f64adb67SMarko Kovacevic 			info.interim_info.hmac_data.algo = hsc[i].algo;
57f64adb67SMarko Kovacevic 			break;
58f64adb67SMarko Kovacevic 		}
59f64adb67SMarko Kovacevic 	}
60f64adb67SMarko Kovacevic 
61f64adb67SMarko Kovacevic 	if (i == RTE_DIM(hsc))
62f64adb67SMarko Kovacevic 		return -1;
63f64adb67SMarko Kovacevic 
64f64adb67SMarko Kovacevic 	return 0;
65f64adb67SMarko Kovacevic }
66f64adb67SMarko Kovacevic 
67f64adb67SMarko Kovacevic struct fips_test_callback hmac_tests_vectors[] = {
68f64adb67SMarko Kovacevic 		{KEYLEN_STR, parser_read_uint32_val, &vec.cipher_auth.key},
69f64adb67SMarko Kovacevic 		{TAGLEN_STR, parser_read_uint32_val, &vec.cipher_auth.digest},
70f64adb67SMarko Kovacevic 		{KEY_STR, parse_uint8_hex_str, &vec.cipher_auth.key},
71f64adb67SMarko Kovacevic 		{PT_STR, parse_uint8_hex_str, &vec.pt},
72f64adb67SMarko Kovacevic 		{TAG_STR, parse_uint8_hex_str, &vec.cipher_auth.digest},
73f64adb67SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
74f64adb67SMarko Kovacevic };
75f64adb67SMarko Kovacevic 
76f64adb67SMarko Kovacevic struct fips_test_callback hmac_tests_interim_vectors[] = {
77f64adb67SMarko Kovacevic 		{ALGO_PREFIX, parse_interim_algo, NULL},
78f64adb67SMarko Kovacevic 		{NULL, NULL, NULL} /**< end pointer */
79f64adb67SMarko Kovacevic };
80f64adb67SMarko Kovacevic 
818d70a194SDavid Marchand #ifdef USE_JANSSON
82443c93d8SBrandon Lo struct hash_size_conversion json_algorithms[] = {
83443c93d8SBrandon Lo 		{"HMAC-SHA-1", RTE_CRYPTO_AUTH_SHA1_HMAC},
84443c93d8SBrandon Lo 		{"HMAC-SHA2-224", RTE_CRYPTO_AUTH_SHA224_HMAC},
85443c93d8SBrandon Lo 		{"HMAC-SHA2-256", RTE_CRYPTO_AUTH_SHA256_HMAC},
86443c93d8SBrandon Lo 		{"HMAC-SHA2-384", RTE_CRYPTO_AUTH_SHA384_HMAC},
87443c93d8SBrandon Lo 		{"HMAC-SHA2-512", RTE_CRYPTO_AUTH_SHA512_HMAC},
88*1ea7940eSGowrishankar Muthukrishnan 		{"HMAC-SHA3-224", RTE_CRYPTO_AUTH_SHA3_224_HMAC},
89*1ea7940eSGowrishankar Muthukrishnan 		{"HMAC-SHA3-256", RTE_CRYPTO_AUTH_SHA3_256_HMAC},
90*1ea7940eSGowrishankar Muthukrishnan 		{"HMAC-SHA3-384", RTE_CRYPTO_AUTH_SHA3_384_HMAC},
91*1ea7940eSGowrishankar Muthukrishnan 		{"HMAC-SHA3-512", RTE_CRYPTO_AUTH_SHA3_512_HMAC},
92443c93d8SBrandon Lo };
93443c93d8SBrandon Lo 
94443c93d8SBrandon Lo struct fips_test_callback hmac_tests_json_vectors[] = {
95443c93d8SBrandon Lo 		{KEY_JSON_STR, parse_uint8_hex_str, &vec.cipher_auth.key},
96443c93d8SBrandon Lo 		{PT_JSON_STR, parse_uint8_hex_str, &vec.pt},
97443c93d8SBrandon Lo 		{TAG_JSON_STR, parse_uint8_hex_str, &vec.cipher_auth.digest},
98443c93d8SBrandon Lo 		{NULL, NULL, NULL} /**< end pointer */
99443c93d8SBrandon Lo };
100443c93d8SBrandon Lo 
101443c93d8SBrandon Lo struct fips_test_callback hmac_tests_interim_json_vectors[] = {
102443c93d8SBrandon Lo 		{KEYLEN_JSON_STR, parser_read_uint32_val, &vec.cipher_auth.key},
103443c93d8SBrandon Lo 		{TAGLEN_JSON_STR, parser_read_uint32_bit_val, &vec.cipher_auth.digest},
104443c93d8SBrandon Lo 		{NULL, NULL, NULL} /**< end pointer */
105443c93d8SBrandon Lo };
1068d70a194SDavid Marchand #endif /* USE_JANSSON */
107443c93d8SBrandon Lo 
108f64adb67SMarko Kovacevic static int
parse_test_hmac_writeback(struct fips_val * val)109f64adb67SMarko Kovacevic parse_test_hmac_writeback(struct fips_val *val)
110f64adb67SMarko Kovacevic {
111f64adb67SMarko Kovacevic 	struct fips_val val_local;
112f64adb67SMarko Kovacevic 
113f64adb67SMarko Kovacevic 	fprintf(info.fp_wr, "%s", TAG_STR);
114f64adb67SMarko Kovacevic 
115f64adb67SMarko Kovacevic 	val_local.val = val->val + vec.pt.len;
116f64adb67SMarko Kovacevic 	val_local.len = vec.cipher_auth.digest.len;
117f64adb67SMarko Kovacevic 
118f64adb67SMarko Kovacevic 	parse_write_hex_str(&val_local);
119f64adb67SMarko Kovacevic 	return 0;
120f64adb67SMarko Kovacevic }
121f64adb67SMarko Kovacevic 
122f64adb67SMarko Kovacevic static int
rsp_test_hmac_check(struct fips_val * val)123f64adb67SMarko Kovacevic rsp_test_hmac_check(struct fips_val *val)
124f64adb67SMarko Kovacevic {
125f64adb67SMarko Kovacevic 	if (memcmp(val->val + vec.pt.len, vec.cipher_auth.digest.val,
126f64adb67SMarko Kovacevic 			vec.cipher_auth.digest.len) == 0)
127f64adb67SMarko Kovacevic 		fprintf(info.fp_wr, "Success\n");
128f64adb67SMarko Kovacevic 	else
129f64adb67SMarko Kovacevic 		fprintf(info.fp_wr, "Failed\n");
130f64adb67SMarko Kovacevic 
131f64adb67SMarko Kovacevic 	return 0;
132f64adb67SMarko Kovacevic }
133f64adb67SMarko Kovacevic 
134f64adb67SMarko Kovacevic int
parse_test_hmac_init(void)135f64adb67SMarko Kovacevic parse_test_hmac_init(void)
136f64adb67SMarko Kovacevic {
137f64adb67SMarko Kovacevic 	info.op = FIPS_TEST_ENC_AUTH_GEN;
138f64adb67SMarko Kovacevic 	info.parse_writeback = parse_test_hmac_writeback;
139f64adb67SMarko Kovacevic 	info.callbacks = hmac_tests_vectors;
140f64adb67SMarko Kovacevic 	info.interim_callbacks = hmac_tests_interim_vectors;
141f64adb67SMarko Kovacevic 	info.writeback_callbacks = NULL;
142f64adb67SMarko Kovacevic 	info.kat_check = rsp_test_hmac_check;
143f64adb67SMarko Kovacevic 
144f64adb67SMarko Kovacevic 	return 0;
145f64adb67SMarko Kovacevic }
146443c93d8SBrandon Lo 
1478d70a194SDavid Marchand #ifdef USE_JANSSON
148443c93d8SBrandon Lo static int
parse_test_hmac_json_writeback(struct fips_val * val)149443c93d8SBrandon Lo parse_test_hmac_json_writeback(struct fips_val *val)
150443c93d8SBrandon Lo {
151443c93d8SBrandon Lo 	struct fips_val val_local;
152443c93d8SBrandon Lo 	json_t *tcId, *mac;
153443c93d8SBrandon Lo 
154443c93d8SBrandon Lo 	tcId = json_object_get(json_info.json_test_case, "tcId");
155443c93d8SBrandon Lo 
156443c93d8SBrandon Lo 	json_info.json_write_case = json_object();
157443c93d8SBrandon Lo 	json_object_set(json_info.json_write_case, "tcId", tcId);
158443c93d8SBrandon Lo 
159443c93d8SBrandon Lo 
160443c93d8SBrandon Lo 	val_local.val = val->val + vec.pt.len;
161443c93d8SBrandon Lo 	val_local.len = vec.cipher_auth.digest.len;
162443c93d8SBrandon Lo 
163443c93d8SBrandon Lo 	writeback_hex_str("", info.one_line_text, &val_local);
164443c93d8SBrandon Lo 
165443c93d8SBrandon Lo 	mac = json_string(info.one_line_text);
166443c93d8SBrandon Lo 	json_object_set_new(json_info.json_write_case, TAG_JSON_STR, mac);
167443c93d8SBrandon Lo 
168443c93d8SBrandon Lo 	return 0;
169443c93d8SBrandon Lo }
170443c93d8SBrandon Lo 
171443c93d8SBrandon Lo int
parse_test_hmac_json_algorithm(void)172443c93d8SBrandon Lo parse_test_hmac_json_algorithm(void)
173443c93d8SBrandon Lo {
174443c93d8SBrandon Lo 	json_t *algorithm_object;
175443c93d8SBrandon Lo 	const char *algorithm_str;
176443c93d8SBrandon Lo 	uint32_t i;
177443c93d8SBrandon Lo 
178443c93d8SBrandon Lo 	algorithm_object = json_object_get(json_info.json_vector_set, "algorithm");
179443c93d8SBrandon Lo 	algorithm_str = json_string_value(algorithm_object);
180443c93d8SBrandon Lo 
181443c93d8SBrandon Lo 	for (i = 0; i < RTE_DIM(json_algorithms); i++) {
182443c93d8SBrandon Lo 		if (strstr(algorithm_str, json_algorithms[i].str)) {
183443c93d8SBrandon Lo 			info.interim_info.hmac_data.algo = json_algorithms[i].algo;
184443c93d8SBrandon Lo 			return 0;
185443c93d8SBrandon Lo 		}
186443c93d8SBrandon Lo 	}
187443c93d8SBrandon Lo 
188443c93d8SBrandon Lo 	return -1;
189443c93d8SBrandon Lo }
190443c93d8SBrandon Lo 
191443c93d8SBrandon Lo int
parse_test_hmac_json_init(void)192443c93d8SBrandon Lo parse_test_hmac_json_init(void)
193443c93d8SBrandon Lo {
194443c93d8SBrandon Lo 	info.op = FIPS_TEST_ENC_AUTH_GEN;
195443c93d8SBrandon Lo 	info.parse_writeback = parse_test_hmac_json_writeback;
196443c93d8SBrandon Lo 	info.callbacks = hmac_tests_json_vectors;
197443c93d8SBrandon Lo 	info.writeback_callbacks = NULL;
198443c93d8SBrandon Lo 	info.kat_check = rsp_test_hmac_check;
199443c93d8SBrandon Lo 	info.interim_callbacks = hmac_tests_interim_json_vectors;
200443c93d8SBrandon Lo 
201443c93d8SBrandon Lo 	if (parse_test_hmac_json_algorithm() < 0)
202443c93d8SBrandon Lo 		return -1;
203443c93d8SBrandon Lo 
204443c93d8SBrandon Lo 	return 0;
205443c93d8SBrandon Lo }
2068d70a194SDavid Marchand #endif /* USE_JANSSON */
207