xref: /dpdk/examples/fips_validation/fips_validation_sha.c (revision d5c247145c2c83f92919a1acc6040d287ccf7bfa)
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>
8f4797baeSDamian Nowak 
9f4797baeSDamian Nowak #include <rte_cryptodev.h>
10f4797baeSDamian Nowak 
11f4797baeSDamian Nowak #include "fips_validation.h"
12f4797baeSDamian Nowak 
13f4797baeSDamian Nowak #define ALGO_PREFIX	"[L = "
14f4797baeSDamian Nowak #define MSGLEN_STR	"Len = "
15f4797baeSDamian Nowak #define MSG_STR		"Msg = "
16f4797baeSDamian Nowak #define MD_STR		"MD = "
17f4797baeSDamian Nowak #define SEED_STR	"Seed = "
18f4797baeSDamian Nowak #define MCT_STR		"Monte"
19f4797baeSDamian Nowak 
20*d5c24714SGowrishankar Muthukrishnan #define ALGO_JSON_STR	"algorithm"
21*d5c24714SGowrishankar Muthukrishnan #define TESTTYPE_JSON_STR	"testType"
22*d5c24714SGowrishankar Muthukrishnan 
23*d5c24714SGowrishankar Muthukrishnan #define PT_JSON_STR		"msg"
24*d5c24714SGowrishankar Muthukrishnan 
25f4797baeSDamian Nowak struct plain_hash_size_conversion {
26f4797baeSDamian Nowak 	const char *str;
27f4797baeSDamian Nowak 	enum rte_crypto_auth_algorithm algo;
28f4797baeSDamian Nowak } phsc[] = {
29f4797baeSDamian Nowak 		{"20", RTE_CRYPTO_AUTH_SHA1},
30f4797baeSDamian Nowak 		{"28", RTE_CRYPTO_AUTH_SHA224},
31f4797baeSDamian Nowak 		{"32", RTE_CRYPTO_AUTH_SHA256},
32f4797baeSDamian Nowak 		{"48", RTE_CRYPTO_AUTH_SHA384},
33f4797baeSDamian Nowak 		{"64", RTE_CRYPTO_AUTH_SHA512},
34f4797baeSDamian Nowak };
35f4797baeSDamian Nowak 
36f4797baeSDamian Nowak static int
37f2fc83b4SThomas Monjalon parse_interim_algo(__rte_unused const char *key,
38f4797baeSDamian Nowak 		char *text,
39f2fc83b4SThomas Monjalon 		__rte_unused struct fips_val *val)
40f4797baeSDamian Nowak {
41f4797baeSDamian Nowak 	uint32_t i;
42f4797baeSDamian Nowak 
43f4797baeSDamian Nowak 	for (i = 0; i < RTE_DIM(phsc); i++) {
44f4797baeSDamian Nowak 		if (strstr(text, phsc[i].str)) {
45f4797baeSDamian Nowak 			info.interim_info.sha_data.algo = phsc[i].algo;
46f4797baeSDamian Nowak 			parser_read_uint32_val(ALGO_PREFIX,
47f4797baeSDamian Nowak 				text, &vec.cipher_auth.digest);
48f4797baeSDamian Nowak 			break;
49f4797baeSDamian Nowak 		}
50f4797baeSDamian Nowak 	}
51f4797baeSDamian Nowak 
52f4797baeSDamian Nowak 	if (i == RTE_DIM(phsc))
53f4797baeSDamian Nowak 		return -1;
54f4797baeSDamian Nowak 
55f4797baeSDamian Nowak 	return 0;
56f4797baeSDamian Nowak }
57f4797baeSDamian Nowak 
58f4797baeSDamian Nowak struct fips_test_callback sha_tests_vectors[] = {
59f4797baeSDamian Nowak 		{MSGLEN_STR, parser_read_uint32_bit_val, &vec.pt},
60f4797baeSDamian Nowak 		{MSG_STR, parse_uint8_known_len_hex_str, &vec.pt},
61f4797baeSDamian Nowak 		{SEED_STR, parse_uint8_hex_str, &vec.cipher_auth.digest},
62f4797baeSDamian Nowak 		{NULL, NULL, NULL} /**< end pointer */
63f4797baeSDamian Nowak };
64f4797baeSDamian Nowak 
65f4797baeSDamian Nowak struct fips_test_callback sha_tests_interim_vectors[] = {
66f4797baeSDamian Nowak 		{ALGO_PREFIX, parse_interim_algo, NULL},
67f4797baeSDamian Nowak 		{NULL, NULL, NULL} /**< end pointer */
68f4797baeSDamian Nowak };
69f4797baeSDamian Nowak 
70*d5c24714SGowrishankar Muthukrishnan #ifdef USE_JANSSON
71*d5c24714SGowrishankar Muthukrishnan static struct {
72*d5c24714SGowrishankar Muthukrishnan 	uint32_t type;
73*d5c24714SGowrishankar Muthukrishnan 	const char *desc;
74*d5c24714SGowrishankar Muthukrishnan } sha_test_types[] = {
75*d5c24714SGowrishankar Muthukrishnan 		{SHA_MCT, "MCT"},
76*d5c24714SGowrishankar Muthukrishnan 		{SHA_AFT, "AFT"},
77*d5c24714SGowrishankar Muthukrishnan };
78*d5c24714SGowrishankar Muthukrishnan 
79*d5c24714SGowrishankar Muthukrishnan static struct plain_hash_algorithms {
80*d5c24714SGowrishankar Muthukrishnan 	const char *str;
81*d5c24714SGowrishankar Muthukrishnan 	enum rte_crypto_auth_algorithm algo;
82*d5c24714SGowrishankar Muthukrishnan } json_algorithms[] = {
83*d5c24714SGowrishankar Muthukrishnan 		{"SHA-1", RTE_CRYPTO_AUTH_SHA1},
84*d5c24714SGowrishankar Muthukrishnan 		{"SHA2-224", RTE_CRYPTO_AUTH_SHA224},
85*d5c24714SGowrishankar Muthukrishnan 		{"SHA2-256", RTE_CRYPTO_AUTH_SHA256},
86*d5c24714SGowrishankar Muthukrishnan 		{"SHA2-384", RTE_CRYPTO_AUTH_SHA384},
87*d5c24714SGowrishankar Muthukrishnan 		{"SHA2-512", RTE_CRYPTO_AUTH_SHA512},
88*d5c24714SGowrishankar Muthukrishnan };
89*d5c24714SGowrishankar Muthukrishnan 
90*d5c24714SGowrishankar Muthukrishnan struct fips_test_callback sha_tests_json_vectors[] = {
91*d5c24714SGowrishankar Muthukrishnan 		{PT_JSON_STR, parse_uint8_hex_str, &vec.pt},
92*d5c24714SGowrishankar Muthukrishnan 		{NULL, NULL, NULL} /**< end pointer */
93*d5c24714SGowrishankar Muthukrishnan };
94*d5c24714SGowrishankar Muthukrishnan #endif /* USE_JANSSON */
95*d5c24714SGowrishankar Muthukrishnan 
96f4797baeSDamian Nowak static int
97f4797baeSDamian Nowak parse_test_sha_writeback(struct fips_val *val) // !
98f4797baeSDamian Nowak {
99f4797baeSDamian Nowak 	struct fips_val val_local;
100f4797baeSDamian Nowak 
101f4797baeSDamian Nowak 	fprintf(info.fp_wr, "%s", MD_STR);
102f4797baeSDamian Nowak 
103f4797baeSDamian Nowak 	val_local.val = val->val + vec.pt.len;
104f4797baeSDamian Nowak 	val_local.len = vec.cipher_auth.digest.len;
105f4797baeSDamian Nowak 
106f4797baeSDamian Nowak 	parse_write_hex_str(&val_local);
107f4797baeSDamian Nowak 	return 0;
108f4797baeSDamian Nowak }
109f4797baeSDamian Nowak 
110f4797baeSDamian Nowak static int
111f4797baeSDamian Nowak rsp_test_sha_check(struct fips_val *val)
112f4797baeSDamian Nowak {
113f4797baeSDamian Nowak 	if (memcmp(val->val + vec.pt.len, vec.cipher_auth.digest.val,
114f4797baeSDamian Nowak 			vec.cipher_auth.digest.len) == 0)
115f4797baeSDamian Nowak 		fprintf(info.fp_wr, "Success\n");
116f4797baeSDamian Nowak 	else
117f4797baeSDamian Nowak 		fprintf(info.fp_wr, "Failed\n");
118f4797baeSDamian Nowak 
119f4797baeSDamian Nowak 	return 0;
120f4797baeSDamian Nowak }
121f4797baeSDamian Nowak 
122f4797baeSDamian Nowak int
123f4797baeSDamian Nowak parse_test_sha_init(void)
124f4797baeSDamian Nowak {
125f4797baeSDamian Nowak 	uint32_t i;
126f4797baeSDamian Nowak 
127f4797baeSDamian Nowak 	info.interim_info.sha_data.test_type = SHA_KAT;
128f4797baeSDamian Nowak 	for (i = 0; i < info.nb_vec_lines; i++) {
129f4797baeSDamian Nowak 		char *line = info.vec[i];
130f4797baeSDamian Nowak 		if (strstr(line, MCT_STR))
131f4797baeSDamian Nowak 			info.interim_info.sha_data.test_type = SHA_MCT;
132f4797baeSDamian Nowak 	}
133f4797baeSDamian Nowak 
134f4797baeSDamian Nowak 	info.op = FIPS_TEST_ENC_AUTH_GEN;
135f4797baeSDamian Nowak 	info.parse_writeback = parse_test_sha_writeback;
136f4797baeSDamian Nowak 	info.callbacks = sha_tests_vectors;
137f4797baeSDamian Nowak 	info.interim_callbacks = sha_tests_interim_vectors;
138f4797baeSDamian Nowak 	info.writeback_callbacks = NULL;
139f4797baeSDamian Nowak 	info.kat_check = rsp_test_sha_check;
140f4797baeSDamian Nowak 	return 0;
141f4797baeSDamian Nowak }
142*d5c24714SGowrishankar Muthukrishnan 
143*d5c24714SGowrishankar Muthukrishnan #ifdef USE_JANSSON
144*d5c24714SGowrishankar Muthukrishnan static int
145*d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_writeback(struct fips_val *val)
146*d5c24714SGowrishankar Muthukrishnan {
147*d5c24714SGowrishankar Muthukrishnan 	struct fips_val val_local;
148*d5c24714SGowrishankar Muthukrishnan 	json_t *tcId, *md;
149*d5c24714SGowrishankar Muthukrishnan 
150*d5c24714SGowrishankar Muthukrishnan 	tcId = json_object_get(json_info.json_test_case, "tcId");
151*d5c24714SGowrishankar Muthukrishnan 
152*d5c24714SGowrishankar Muthukrishnan 	json_info.json_write_case = json_object();
153*d5c24714SGowrishankar Muthukrishnan 	json_object_set_new(json_info.json_write_case, "tcId", tcId);
154*d5c24714SGowrishankar Muthukrishnan 
155*d5c24714SGowrishankar Muthukrishnan 	val_local.val = val->val + vec.pt.len;
156*d5c24714SGowrishankar Muthukrishnan 	val_local.len = vec.cipher_auth.digest.len;
157*d5c24714SGowrishankar Muthukrishnan 
158*d5c24714SGowrishankar Muthukrishnan 	writeback_hex_str("", info.one_line_text, &val_local);
159*d5c24714SGowrishankar Muthukrishnan 	md = json_string(info.one_line_text);
160*d5c24714SGowrishankar Muthukrishnan 	json_object_set_new(json_info.json_write_case, "md", md);
161*d5c24714SGowrishankar Muthukrishnan 
162*d5c24714SGowrishankar Muthukrishnan 	return 0;
163*d5c24714SGowrishankar Muthukrishnan }
164*d5c24714SGowrishankar Muthukrishnan 
165*d5c24714SGowrishankar Muthukrishnan static int
166*d5c24714SGowrishankar Muthukrishnan parse_test_sha_mct_json_writeback(struct fips_val *val)
167*d5c24714SGowrishankar Muthukrishnan {
168*d5c24714SGowrishankar Muthukrishnan 	json_t *tcId, *msg, *md, *resArr, *res;
169*d5c24714SGowrishankar Muthukrishnan 	struct fips_val val_local;
170*d5c24714SGowrishankar Muthukrishnan 
171*d5c24714SGowrishankar Muthukrishnan 	tcId = json_object_get(json_info.json_test_case, "tcId");
172*d5c24714SGowrishankar Muthukrishnan 	if (json_info.json_write_case) {
173*d5c24714SGowrishankar Muthukrishnan 		json_t *wcId;
174*d5c24714SGowrishankar Muthukrishnan 
175*d5c24714SGowrishankar Muthukrishnan 		wcId = json_object_get(json_info.json_write_case, "tcId");
176*d5c24714SGowrishankar Muthukrishnan 		if (!json_equal(tcId, wcId)) {
177*d5c24714SGowrishankar Muthukrishnan 			json_info.json_write_case = json_object();
178*d5c24714SGowrishankar Muthukrishnan 			json_object_set_new(json_info.json_write_case, "tcId", tcId);
179*d5c24714SGowrishankar Muthukrishnan 			json_object_set_new(json_info.json_write_case, "resultsArray",
180*d5c24714SGowrishankar Muthukrishnan 								json_array());
181*d5c24714SGowrishankar Muthukrishnan 		}
182*d5c24714SGowrishankar Muthukrishnan 	} else {
183*d5c24714SGowrishankar Muthukrishnan 		json_info.json_write_case = json_object();
184*d5c24714SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "tcId", tcId);
185*d5c24714SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "resultsArray", json_array());
186*d5c24714SGowrishankar Muthukrishnan 	}
187*d5c24714SGowrishankar Muthukrishnan 
188*d5c24714SGowrishankar Muthukrishnan 	resArr = json_object_get(json_info.json_write_case, "resultsArray");
189*d5c24714SGowrishankar Muthukrishnan 	if (!json_is_array(resArr))
190*d5c24714SGowrishankar Muthukrishnan 		return -EINVAL;
191*d5c24714SGowrishankar Muthukrishnan 
192*d5c24714SGowrishankar Muthukrishnan 	res = json_object();
193*d5c24714SGowrishankar Muthukrishnan 
194*d5c24714SGowrishankar Muthukrishnan 	writeback_hex_str("", info.one_line_text, &val[1]);
195*d5c24714SGowrishankar Muthukrishnan 	msg = json_string(info.one_line_text);
196*d5c24714SGowrishankar Muthukrishnan 	json_object_set_new(res, "msg", msg);
197*d5c24714SGowrishankar Muthukrishnan 
198*d5c24714SGowrishankar Muthukrishnan 	val_local.val = val[0].val + vec.pt.len;
199*d5c24714SGowrishankar Muthukrishnan 	val_local.len = vec.cipher_auth.digest.len;
200*d5c24714SGowrishankar Muthukrishnan 
201*d5c24714SGowrishankar Muthukrishnan 	writeback_hex_str("", info.one_line_text, &val_local);
202*d5c24714SGowrishankar Muthukrishnan 	md = json_string(info.one_line_text);
203*d5c24714SGowrishankar Muthukrishnan 	json_object_set_new(res, "md", md);
204*d5c24714SGowrishankar Muthukrishnan 
205*d5c24714SGowrishankar Muthukrishnan 	json_array_append_new(resArr, res);
206*d5c24714SGowrishankar Muthukrishnan 	return 0;
207*d5c24714SGowrishankar Muthukrishnan }
208*d5c24714SGowrishankar Muthukrishnan 
209*d5c24714SGowrishankar Muthukrishnan int
210*d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_algorithm(void)
211*d5c24714SGowrishankar Muthukrishnan {
212*d5c24714SGowrishankar Muthukrishnan 	json_t *algorithm_object;
213*d5c24714SGowrishankar Muthukrishnan 	const char *algorithm_str;
214*d5c24714SGowrishankar Muthukrishnan 	uint32_t i;
215*d5c24714SGowrishankar Muthukrishnan 
216*d5c24714SGowrishankar Muthukrishnan 	algorithm_object = json_object_get(json_info.json_vector_set, "algorithm");
217*d5c24714SGowrishankar Muthukrishnan 	algorithm_str = json_string_value(algorithm_object);
218*d5c24714SGowrishankar Muthukrishnan 
219*d5c24714SGowrishankar Muthukrishnan 	for (i = 0; i < RTE_DIM(json_algorithms); i++) {
220*d5c24714SGowrishankar Muthukrishnan 		if (strstr(algorithm_str, json_algorithms[i].str)) {
221*d5c24714SGowrishankar Muthukrishnan 			info.interim_info.sha_data.algo = json_algorithms[i].algo;
222*d5c24714SGowrishankar Muthukrishnan 			break;
223*d5c24714SGowrishankar Muthukrishnan 		}
224*d5c24714SGowrishankar Muthukrishnan 	}
225*d5c24714SGowrishankar Muthukrishnan 
226*d5c24714SGowrishankar Muthukrishnan 	if (i == RTE_DIM(json_algorithms))
227*d5c24714SGowrishankar Muthukrishnan 		return -1;
228*d5c24714SGowrishankar Muthukrishnan 
229*d5c24714SGowrishankar Muthukrishnan 	for (i = 0; i < RTE_DIM(phsc); i++) {
230*d5c24714SGowrishankar Muthukrishnan 		if (info.interim_info.sha_data.algo == phsc[i].algo) {
231*d5c24714SGowrishankar Muthukrishnan 			vec.cipher_auth.digest.len = atoi(phsc[i].str);
232*d5c24714SGowrishankar Muthukrishnan 			free(vec.cipher_auth.digest.val);
233*d5c24714SGowrishankar Muthukrishnan 			vec.cipher_auth.digest.val = calloc(1, vec.cipher_auth.digest.len);
234*d5c24714SGowrishankar Muthukrishnan 			if (vec.cipher_auth.digest.val == NULL)
235*d5c24714SGowrishankar Muthukrishnan 				return -1;
236*d5c24714SGowrishankar Muthukrishnan 
237*d5c24714SGowrishankar Muthukrishnan 			break;
238*d5c24714SGowrishankar Muthukrishnan 		}
239*d5c24714SGowrishankar Muthukrishnan 	}
240*d5c24714SGowrishankar Muthukrishnan 
241*d5c24714SGowrishankar Muthukrishnan 	if (i == RTE_DIM(phsc)) {
242*d5c24714SGowrishankar Muthukrishnan 		free(vec.cipher_auth.digest.val);
243*d5c24714SGowrishankar Muthukrishnan 		vec.cipher_auth.digest.val = NULL;
244*d5c24714SGowrishankar Muthukrishnan 		return -1;
245*d5c24714SGowrishankar Muthukrishnan 	}
246*d5c24714SGowrishankar Muthukrishnan 
247*d5c24714SGowrishankar Muthukrishnan 	return 0;
248*d5c24714SGowrishankar Muthukrishnan }
249*d5c24714SGowrishankar Muthukrishnan 
250*d5c24714SGowrishankar Muthukrishnan int
251*d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_test_type(void)
252*d5c24714SGowrishankar Muthukrishnan {
253*d5c24714SGowrishankar Muthukrishnan 	json_t *type_object;
254*d5c24714SGowrishankar Muthukrishnan 	const char *type_str;
255*d5c24714SGowrishankar Muthukrishnan 	uint32_t i;
256*d5c24714SGowrishankar Muthukrishnan 
257*d5c24714SGowrishankar Muthukrishnan 	type_object = json_object_get(json_info.json_test_group, TESTTYPE_JSON_STR);
258*d5c24714SGowrishankar Muthukrishnan 	type_str = json_string_value(type_object);
259*d5c24714SGowrishankar Muthukrishnan 
260*d5c24714SGowrishankar Muthukrishnan 	for (i = 0; i < RTE_DIM(sha_test_types); i++)
261*d5c24714SGowrishankar Muthukrishnan 		if (strstr(type_str, sha_test_types[i].desc)) {
262*d5c24714SGowrishankar Muthukrishnan 			info.interim_info.aes_data.test_type =
263*d5c24714SGowrishankar Muthukrishnan 				sha_test_types[i].type;
264*d5c24714SGowrishankar Muthukrishnan 			break;
265*d5c24714SGowrishankar Muthukrishnan 		}
266*d5c24714SGowrishankar Muthukrishnan 
267*d5c24714SGowrishankar Muthukrishnan 	if (i == RTE_DIM(sha_test_types))
268*d5c24714SGowrishankar Muthukrishnan 		return -1;
269*d5c24714SGowrishankar Muthukrishnan 
270*d5c24714SGowrishankar Muthukrishnan 	switch (info.interim_info.sha_data.test_type) {
271*d5c24714SGowrishankar Muthukrishnan 	case SHA_MCT:
272*d5c24714SGowrishankar Muthukrishnan 		info.parse_writeback = parse_test_sha_mct_json_writeback;
273*d5c24714SGowrishankar Muthukrishnan 		break;
274*d5c24714SGowrishankar Muthukrishnan 	case SHA_AFT:
275*d5c24714SGowrishankar Muthukrishnan 		info.parse_writeback = parse_test_sha_json_writeback;
276*d5c24714SGowrishankar Muthukrishnan 		break;
277*d5c24714SGowrishankar Muthukrishnan 	default:
278*d5c24714SGowrishankar Muthukrishnan 		info.parse_writeback = NULL;
279*d5c24714SGowrishankar Muthukrishnan 	}
280*d5c24714SGowrishankar Muthukrishnan 
281*d5c24714SGowrishankar Muthukrishnan 	if (!info.parse_writeback)
282*d5c24714SGowrishankar Muthukrishnan 		return -1;
283*d5c24714SGowrishankar Muthukrishnan 
284*d5c24714SGowrishankar Muthukrishnan 	return 0;
285*d5c24714SGowrishankar Muthukrishnan }
286*d5c24714SGowrishankar Muthukrishnan 
287*d5c24714SGowrishankar Muthukrishnan int
288*d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_init(void)
289*d5c24714SGowrishankar Muthukrishnan {
290*d5c24714SGowrishankar Muthukrishnan 	info.op = FIPS_TEST_ENC_AUTH_GEN;
291*d5c24714SGowrishankar Muthukrishnan 	info.parse_writeback = parse_test_sha_json_writeback;
292*d5c24714SGowrishankar Muthukrishnan 	info.callbacks = sha_tests_json_vectors;
293*d5c24714SGowrishankar Muthukrishnan 	info.writeback_callbacks = NULL;
294*d5c24714SGowrishankar Muthukrishnan 	info.kat_check = rsp_test_sha_check;
295*d5c24714SGowrishankar Muthukrishnan 	info.interim_callbacks = NULL;
296*d5c24714SGowrishankar Muthukrishnan 
297*d5c24714SGowrishankar Muthukrishnan 	if (parse_test_sha_json_algorithm() < 0)
298*d5c24714SGowrishankar Muthukrishnan 		return -1;
299*d5c24714SGowrishankar Muthukrishnan 
300*d5c24714SGowrishankar Muthukrishnan 	if (parse_test_sha_json_test_type() < 0)
301*d5c24714SGowrishankar Muthukrishnan 		return -1;
302*d5c24714SGowrishankar Muthukrishnan 
303*d5c24714SGowrishankar Muthukrishnan 	return 0;
304*d5c24714SGowrishankar Muthukrishnan }
305*d5c24714SGowrishankar Muthukrishnan #endif /* USE_JANSSON */
306