xref: /dpdk/examples/fips_validation/fips_validation_sha.c (revision 8bc8ba4373c5dc7fe8db65b33ee9d99ca626cd05)
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