xref: /dpdk/examples/fips_validation/fips_validation_sha.c (revision 225f04fb3e4cce954a987923c030a1caed147299)
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>
88bc8ba43SGowrishankar 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"
25*225f04fbSGowrishankar Muthukrishnan #define OUTLEN_JSON_STR	"outLen"
26*225f04fbSGowrishankar Muthukrishnan #define MINOUTLEN_JSON_STR	"minOutLen"
27*225f04fbSGowrishankar Muthukrishnan #define MAXOUTLEN_JSON_STR	"maxOutLen"
28d5c24714SGowrishankar Muthukrishnan 
29f4797baeSDamian Nowak struct plain_hash_size_conversion {
30f4797baeSDamian Nowak 	const char *str;
31f4797baeSDamian Nowak 	enum rte_crypto_auth_algorithm algo;
32f4797baeSDamian Nowak } phsc[] = {
33f4797baeSDamian Nowak 		{"20", RTE_CRYPTO_AUTH_SHA1},
34f4797baeSDamian Nowak 		{"28", RTE_CRYPTO_AUTH_SHA224},
35f4797baeSDamian Nowak 		{"32", RTE_CRYPTO_AUTH_SHA256},
36f4797baeSDamian Nowak 		{"48", RTE_CRYPTO_AUTH_SHA384},
37f4797baeSDamian Nowak 		{"64", RTE_CRYPTO_AUTH_SHA512},
381ea7940eSGowrishankar Muthukrishnan 		{"28", RTE_CRYPTO_AUTH_SHA3_224},
391ea7940eSGowrishankar Muthukrishnan 		{"32", RTE_CRYPTO_AUTH_SHA3_256},
401ea7940eSGowrishankar Muthukrishnan 		{"48", RTE_CRYPTO_AUTH_SHA3_384},
411ea7940eSGowrishankar Muthukrishnan 		{"64", RTE_CRYPTO_AUTH_SHA3_512},
42*225f04fbSGowrishankar Muthukrishnan 		{"16", RTE_CRYPTO_AUTH_SHAKE_128},
43*225f04fbSGowrishankar Muthukrishnan 		{"32", RTE_CRYPTO_AUTH_SHAKE_256},
44f4797baeSDamian Nowak };
45f4797baeSDamian Nowak 
468bc8ba43SGowrishankar Muthukrishnan int
478bc8ba43SGowrishankar Muthukrishnan parse_test_sha_hash_size(enum rte_crypto_auth_algorithm algo)
488bc8ba43SGowrishankar Muthukrishnan {
498bc8ba43SGowrishankar Muthukrishnan 	int ret = -EINVAL;
508bc8ba43SGowrishankar Muthukrishnan 	uint8_t i;
518bc8ba43SGowrishankar Muthukrishnan 
528bc8ba43SGowrishankar Muthukrishnan 	for (i = 0; i < RTE_DIM(phsc); i++) {
538bc8ba43SGowrishankar Muthukrishnan 		if (phsc[i].algo == algo) {
548bc8ba43SGowrishankar Muthukrishnan 			ret = atoi(phsc[i].str);
558bc8ba43SGowrishankar Muthukrishnan 			break;
568bc8ba43SGowrishankar Muthukrishnan 		}
578bc8ba43SGowrishankar Muthukrishnan 	}
588bc8ba43SGowrishankar Muthukrishnan 
598bc8ba43SGowrishankar Muthukrishnan 	return ret;
608bc8ba43SGowrishankar Muthukrishnan }
618bc8ba43SGowrishankar Muthukrishnan 
62f4797baeSDamian Nowak static int
63f2fc83b4SThomas Monjalon parse_interim_algo(__rte_unused const char *key,
64f4797baeSDamian Nowak 		char *text,
65f2fc83b4SThomas Monjalon 		__rte_unused struct fips_val *val)
66f4797baeSDamian Nowak {
67f4797baeSDamian Nowak 	uint32_t i;
68f4797baeSDamian Nowak 
69f4797baeSDamian Nowak 	for (i = 0; i < RTE_DIM(phsc); i++) {
70f4797baeSDamian Nowak 		if (strstr(text, phsc[i].str)) {
71f4797baeSDamian Nowak 			info.interim_info.sha_data.algo = phsc[i].algo;
72f4797baeSDamian Nowak 			parser_read_uint32_val(ALGO_PREFIX,
73f4797baeSDamian Nowak 				text, &vec.cipher_auth.digest);
74f4797baeSDamian Nowak 			break;
75f4797baeSDamian Nowak 		}
76f4797baeSDamian Nowak 	}
77f4797baeSDamian Nowak 
78f4797baeSDamian Nowak 	if (i == RTE_DIM(phsc))
79f4797baeSDamian Nowak 		return -1;
80f4797baeSDamian Nowak 
81f4797baeSDamian Nowak 	return 0;
82f4797baeSDamian Nowak }
83f4797baeSDamian Nowak 
84f4797baeSDamian Nowak struct fips_test_callback sha_tests_vectors[] = {
85f4797baeSDamian Nowak 		{MSGLEN_STR, parser_read_uint32_bit_val, &vec.pt},
86f4797baeSDamian Nowak 		{MSG_STR, parse_uint8_known_len_hex_str, &vec.pt},
87f4797baeSDamian Nowak 		{SEED_STR, parse_uint8_hex_str, &vec.cipher_auth.digest},
88f4797baeSDamian Nowak 		{NULL, NULL, NULL} /**< end pointer */
89f4797baeSDamian Nowak };
90f4797baeSDamian Nowak 
91f4797baeSDamian Nowak struct fips_test_callback sha_tests_interim_vectors[] = {
92f4797baeSDamian Nowak 		{ALGO_PREFIX, parse_interim_algo, NULL},
93f4797baeSDamian Nowak 		{NULL, NULL, NULL} /**< end pointer */
94f4797baeSDamian Nowak };
95f4797baeSDamian Nowak 
96d5c24714SGowrishankar Muthukrishnan #ifdef USE_JANSSON
97*225f04fbSGowrishankar Muthukrishnan static int
98*225f04fbSGowrishankar Muthukrishnan parse_interim_str(const char *key, char *src, struct fips_val *val)
99*225f04fbSGowrishankar Muthukrishnan {
100*225f04fbSGowrishankar Muthukrishnan 	RTE_SET_USED(val);
101*225f04fbSGowrishankar Muthukrishnan 
102*225f04fbSGowrishankar Muthukrishnan 	if (strcmp(key, MINOUTLEN_JSON_STR) == 0)
103*225f04fbSGowrishankar Muthukrishnan 		info.interim_info.sha_data.min_outlen = atoi(src) / 8;
104*225f04fbSGowrishankar Muthukrishnan 	else if (strcmp(key, MAXOUTLEN_JSON_STR) == 0)
105*225f04fbSGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = atoi(src) / 8;
106*225f04fbSGowrishankar Muthukrishnan 
107*225f04fbSGowrishankar Muthukrishnan 	return 0;
108*225f04fbSGowrishankar Muthukrishnan }
109*225f04fbSGowrishankar Muthukrishnan 
110d5c24714SGowrishankar Muthukrishnan static struct {
111d5c24714SGowrishankar Muthukrishnan 	uint32_t type;
112d5c24714SGowrishankar Muthukrishnan 	const char *desc;
113d5c24714SGowrishankar Muthukrishnan } sha_test_types[] = {
114d5c24714SGowrishankar Muthukrishnan 		{SHA_MCT, "MCT"},
115d5c24714SGowrishankar Muthukrishnan 		{SHA_AFT, "AFT"},
116*225f04fbSGowrishankar Muthukrishnan 		{SHAKE_VOT, "VOT"},
117d5c24714SGowrishankar Muthukrishnan };
118d5c24714SGowrishankar Muthukrishnan 
119d5c24714SGowrishankar Muthukrishnan static struct plain_hash_algorithms {
120d5c24714SGowrishankar Muthukrishnan 	const char *str;
121d5c24714SGowrishankar Muthukrishnan 	enum rte_crypto_auth_algorithm algo;
1221ea7940eSGowrishankar Muthukrishnan 	uint8_t md_blocks;
123d5c24714SGowrishankar Muthukrishnan } json_algorithms[] = {
1241ea7940eSGowrishankar Muthukrishnan 		{"SHA-1", RTE_CRYPTO_AUTH_SHA1, 3},
1251ea7940eSGowrishankar Muthukrishnan 		{"SHA2-224", RTE_CRYPTO_AUTH_SHA224, 3},
1261ea7940eSGowrishankar Muthukrishnan 		{"SHA2-256", RTE_CRYPTO_AUTH_SHA256, 3},
1271ea7940eSGowrishankar Muthukrishnan 		{"SHA2-384", RTE_CRYPTO_AUTH_SHA384, 3},
1281ea7940eSGowrishankar Muthukrishnan 		{"SHA2-512", RTE_CRYPTO_AUTH_SHA512, 3},
1291ea7940eSGowrishankar Muthukrishnan 		{"SHA3-224", RTE_CRYPTO_AUTH_SHA3_224, 1},
1301ea7940eSGowrishankar Muthukrishnan 		{"SHA3-256", RTE_CRYPTO_AUTH_SHA3_256, 1},
1311ea7940eSGowrishankar Muthukrishnan 		{"SHA3-384", RTE_CRYPTO_AUTH_SHA3_384, 1},
1321ea7940eSGowrishankar Muthukrishnan 		{"SHA3-512", RTE_CRYPTO_AUTH_SHA3_512, 1},
133*225f04fbSGowrishankar Muthukrishnan 		{"SHAKE-128", RTE_CRYPTO_AUTH_SHAKE_128, 1},
134*225f04fbSGowrishankar Muthukrishnan 		{"SHAKE-256", RTE_CRYPTO_AUTH_SHAKE_256, 1},
135d5c24714SGowrishankar Muthukrishnan };
136d5c24714SGowrishankar Muthukrishnan 
137d5c24714SGowrishankar Muthukrishnan struct fips_test_callback sha_tests_json_vectors[] = {
138d5c24714SGowrishankar Muthukrishnan 		{PT_JSON_STR, parse_uint8_hex_str, &vec.pt},
139*225f04fbSGowrishankar Muthukrishnan 		{OUTLEN_JSON_STR, parser_read_uint32_bit_val, &vec.cipher_auth.digest},
140*225f04fbSGowrishankar Muthukrishnan 		{NULL, NULL, NULL} /**< end pointer */
141*225f04fbSGowrishankar Muthukrishnan };
142*225f04fbSGowrishankar Muthukrishnan 
143*225f04fbSGowrishankar Muthukrishnan struct fips_test_callback sha_tests_interim_json_vectors[] = {
144*225f04fbSGowrishankar Muthukrishnan 		{MINOUTLEN_JSON_STR, parse_interim_str, NULL},
145*225f04fbSGowrishankar Muthukrishnan 		{MAXOUTLEN_JSON_STR, parse_interim_str, NULL},
146d5c24714SGowrishankar Muthukrishnan 		{NULL, NULL, NULL} /**< end pointer */
147d5c24714SGowrishankar Muthukrishnan };
148d5c24714SGowrishankar Muthukrishnan #endif /* USE_JANSSON */
149d5c24714SGowrishankar Muthukrishnan 
150f4797baeSDamian Nowak static int
151f4797baeSDamian Nowak parse_test_sha_writeback(struct fips_val *val) // !
152f4797baeSDamian Nowak {
153f4797baeSDamian Nowak 	struct fips_val val_local;
154f4797baeSDamian Nowak 
155f4797baeSDamian Nowak 	fprintf(info.fp_wr, "%s", MD_STR);
156f4797baeSDamian Nowak 
157f4797baeSDamian Nowak 	val_local.val = val->val + vec.pt.len;
158f4797baeSDamian Nowak 	val_local.len = vec.cipher_auth.digest.len;
159f4797baeSDamian Nowak 
160f4797baeSDamian Nowak 	parse_write_hex_str(&val_local);
161f4797baeSDamian Nowak 	return 0;
162f4797baeSDamian Nowak }
163f4797baeSDamian Nowak 
164f4797baeSDamian Nowak static int
165f4797baeSDamian Nowak rsp_test_sha_check(struct fips_val *val)
166f4797baeSDamian Nowak {
167f4797baeSDamian Nowak 	if (memcmp(val->val + vec.pt.len, vec.cipher_auth.digest.val,
168f4797baeSDamian Nowak 			vec.cipher_auth.digest.len) == 0)
169f4797baeSDamian Nowak 		fprintf(info.fp_wr, "Success\n");
170f4797baeSDamian Nowak 	else
171f4797baeSDamian Nowak 		fprintf(info.fp_wr, "Failed\n");
172f4797baeSDamian Nowak 
173f4797baeSDamian Nowak 	return 0;
174f4797baeSDamian Nowak }
175f4797baeSDamian Nowak 
176f4797baeSDamian Nowak int
177f4797baeSDamian Nowak parse_test_sha_init(void)
178f4797baeSDamian Nowak {
179f4797baeSDamian Nowak 	uint32_t i;
180f4797baeSDamian Nowak 
181f4797baeSDamian Nowak 	info.interim_info.sha_data.test_type = SHA_KAT;
182f4797baeSDamian Nowak 	for (i = 0; i < info.nb_vec_lines; i++) {
183f4797baeSDamian Nowak 		char *line = info.vec[i];
184f4797baeSDamian Nowak 		if (strstr(line, MCT_STR))
185f4797baeSDamian Nowak 			info.interim_info.sha_data.test_type = SHA_MCT;
186f4797baeSDamian Nowak 	}
187f4797baeSDamian Nowak 
188f4797baeSDamian Nowak 	info.op = FIPS_TEST_ENC_AUTH_GEN;
189f4797baeSDamian Nowak 	info.parse_writeback = parse_test_sha_writeback;
190f4797baeSDamian Nowak 	info.callbacks = sha_tests_vectors;
191f4797baeSDamian Nowak 	info.interim_callbacks = sha_tests_interim_vectors;
192f4797baeSDamian Nowak 	info.writeback_callbacks = NULL;
193f4797baeSDamian Nowak 	info.kat_check = rsp_test_sha_check;
194f4797baeSDamian Nowak 	return 0;
195f4797baeSDamian Nowak }
196d5c24714SGowrishankar Muthukrishnan 
197d5c24714SGowrishankar Muthukrishnan #ifdef USE_JANSSON
198d5c24714SGowrishankar Muthukrishnan static int
199d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_writeback(struct fips_val *val)
200d5c24714SGowrishankar Muthukrishnan {
201d5c24714SGowrishankar Muthukrishnan 	struct fips_val val_local;
202d5c24714SGowrishankar Muthukrishnan 	json_t *tcId, *md;
203d5c24714SGowrishankar Muthukrishnan 
204d5c24714SGowrishankar Muthukrishnan 	tcId = json_object_get(json_info.json_test_case, "tcId");
205d5c24714SGowrishankar Muthukrishnan 
206d5c24714SGowrishankar Muthukrishnan 	json_info.json_write_case = json_object();
207d5c24714SGowrishankar Muthukrishnan 	json_object_set_new(json_info.json_write_case, "tcId", tcId);
208d5c24714SGowrishankar Muthukrishnan 
209d5c24714SGowrishankar Muthukrishnan 	val_local.val = val->val + vec.pt.len;
210d5c24714SGowrishankar Muthukrishnan 	val_local.len = vec.cipher_auth.digest.len;
211d5c24714SGowrishankar Muthukrishnan 
212d5c24714SGowrishankar Muthukrishnan 	writeback_hex_str("", info.one_line_text, &val_local);
213d5c24714SGowrishankar Muthukrishnan 	md = json_string(info.one_line_text);
214d5c24714SGowrishankar Muthukrishnan 	json_object_set_new(json_info.json_write_case, "md", md);
215d5c24714SGowrishankar Muthukrishnan 
216*225f04fbSGowrishankar Muthukrishnan 	if (info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_128 ||
217*225f04fbSGowrishankar Muthukrishnan 		info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_256)
218*225f04fbSGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "outLen",
219*225f04fbSGowrishankar Muthukrishnan 			json_integer(vec.cipher_auth.digest.len * 8));
220*225f04fbSGowrishankar Muthukrishnan 
221d5c24714SGowrishankar Muthukrishnan 	return 0;
222d5c24714SGowrishankar Muthukrishnan }
223d5c24714SGowrishankar Muthukrishnan 
224d5c24714SGowrishankar Muthukrishnan static int
225d5c24714SGowrishankar Muthukrishnan parse_test_sha_mct_json_writeback(struct fips_val *val)
226d5c24714SGowrishankar Muthukrishnan {
227fc78f69dSGowrishankar Muthukrishnan 	json_t *tcId, *md, *resArr, *res;
228d5c24714SGowrishankar Muthukrishnan 	struct fips_val val_local;
229*225f04fbSGowrishankar Muthukrishnan 	bool is_shake = false;
230*225f04fbSGowrishankar Muthukrishnan 
231*225f04fbSGowrishankar Muthukrishnan 	if (info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_128 ||
232*225f04fbSGowrishankar Muthukrishnan 		info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_256)
233*225f04fbSGowrishankar Muthukrishnan 		is_shake = true;
234d5c24714SGowrishankar Muthukrishnan 
235d5c24714SGowrishankar Muthukrishnan 	tcId = json_object_get(json_info.json_test_case, "tcId");
236d5c24714SGowrishankar Muthukrishnan 	if (json_info.json_write_case) {
237d5c24714SGowrishankar Muthukrishnan 		json_t *wcId;
238d5c24714SGowrishankar Muthukrishnan 
239d5c24714SGowrishankar Muthukrishnan 		wcId = json_object_get(json_info.json_write_case, "tcId");
240d5c24714SGowrishankar Muthukrishnan 		if (!json_equal(tcId, wcId)) {
241d5c24714SGowrishankar Muthukrishnan 			json_info.json_write_case = json_object();
242d5c24714SGowrishankar Muthukrishnan 			json_object_set_new(json_info.json_write_case, "tcId", tcId);
243d5c24714SGowrishankar Muthukrishnan 			json_object_set_new(json_info.json_write_case, "resultsArray",
244d5c24714SGowrishankar Muthukrishnan 								json_array());
245*225f04fbSGowrishankar Muthukrishnan 			if (is_shake)
246*225f04fbSGowrishankar Muthukrishnan 				json_object_set_new(json_info.json_write_case, "outLen",
247*225f04fbSGowrishankar Muthukrishnan 									json_integer(0));
248d5c24714SGowrishankar Muthukrishnan 		}
249d5c24714SGowrishankar Muthukrishnan 	} else {
250d5c24714SGowrishankar Muthukrishnan 		json_info.json_write_case = json_object();
251d5c24714SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "tcId", tcId);
252d5c24714SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "resultsArray", json_array());
253*225f04fbSGowrishankar Muthukrishnan 		if (is_shake)
254*225f04fbSGowrishankar Muthukrishnan 			json_object_set_new(json_info.json_write_case, "outLen",
255*225f04fbSGowrishankar Muthukrishnan 								json_integer(0));
256d5c24714SGowrishankar Muthukrishnan 	}
257d5c24714SGowrishankar Muthukrishnan 
258d5c24714SGowrishankar Muthukrishnan 	resArr = json_object_get(json_info.json_write_case, "resultsArray");
259d5c24714SGowrishankar Muthukrishnan 	if (!json_is_array(resArr))
260d5c24714SGowrishankar Muthukrishnan 		return -EINVAL;
261d5c24714SGowrishankar Muthukrishnan 
262d5c24714SGowrishankar Muthukrishnan 	res = json_object();
263d5c24714SGowrishankar Muthukrishnan 
264fc78f69dSGowrishankar Muthukrishnan 	val_local.val = val->val + vec.pt.len;
265d5c24714SGowrishankar Muthukrishnan 	val_local.len = vec.cipher_auth.digest.len;
266d5c24714SGowrishankar Muthukrishnan 
267d5c24714SGowrishankar Muthukrishnan 	writeback_hex_str("", info.one_line_text, &val_local);
268d5c24714SGowrishankar Muthukrishnan 	md = json_string(info.one_line_text);
269d5c24714SGowrishankar Muthukrishnan 	json_object_set_new(res, "md", md);
270d5c24714SGowrishankar Muthukrishnan 
271*225f04fbSGowrishankar Muthukrishnan 	if (is_shake)
272*225f04fbSGowrishankar Muthukrishnan 		json_object_set_new(res, "outLen", json_integer(vec.cipher_auth.digest.len * 8));
273*225f04fbSGowrishankar Muthukrishnan 
274d5c24714SGowrishankar Muthukrishnan 	json_array_append_new(resArr, res);
275d5c24714SGowrishankar Muthukrishnan 	return 0;
276d5c24714SGowrishankar Muthukrishnan }
277d5c24714SGowrishankar Muthukrishnan 
278d5c24714SGowrishankar Muthukrishnan int
279d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_algorithm(void)
280d5c24714SGowrishankar Muthukrishnan {
281d5c24714SGowrishankar Muthukrishnan 	json_t *algorithm_object;
282d5c24714SGowrishankar Muthukrishnan 	const char *algorithm_str;
283d5c24714SGowrishankar Muthukrishnan 	uint32_t i;
2848bc8ba43SGowrishankar Muthukrishnan 	int sz;
285d5c24714SGowrishankar Muthukrishnan 
286d5c24714SGowrishankar Muthukrishnan 	algorithm_object = json_object_get(json_info.json_vector_set, "algorithm");
287d5c24714SGowrishankar Muthukrishnan 	algorithm_str = json_string_value(algorithm_object);
288d5c24714SGowrishankar Muthukrishnan 
289d5c24714SGowrishankar Muthukrishnan 	for (i = 0; i < RTE_DIM(json_algorithms); i++) {
290d5c24714SGowrishankar Muthukrishnan 		if (strstr(algorithm_str, json_algorithms[i].str)) {
291d5c24714SGowrishankar Muthukrishnan 			info.interim_info.sha_data.algo = json_algorithms[i].algo;
2921ea7940eSGowrishankar Muthukrishnan 			info.interim_info.sha_data.md_blocks = json_algorithms[i].md_blocks;
293d5c24714SGowrishankar Muthukrishnan 			break;
294d5c24714SGowrishankar Muthukrishnan 		}
295d5c24714SGowrishankar Muthukrishnan 	}
296d5c24714SGowrishankar Muthukrishnan 
297d5c24714SGowrishankar Muthukrishnan 	if (i == RTE_DIM(json_algorithms))
298d5c24714SGowrishankar Muthukrishnan 		return -1;
299d5c24714SGowrishankar Muthukrishnan 
300*225f04fbSGowrishankar Muthukrishnan 	if (info.interim_info.sha_data.test_type == SHAKE_VOT) {
301*225f04fbSGowrishankar Muthukrishnan 		sz = vec.cipher_auth.digest.len;
302*225f04fbSGowrishankar Muthukrishnan 	} else {
3038bc8ba43SGowrishankar Muthukrishnan 		sz = parse_test_sha_hash_size(info.interim_info.sha_data.algo);
304*225f04fbSGowrishankar Muthukrishnan 		vec.cipher_auth.digest.len = sz;
305*225f04fbSGowrishankar Muthukrishnan 	}
306*225f04fbSGowrishankar Muthukrishnan 
3078bc8ba43SGowrishankar Muthukrishnan 	if (sz < 0)
3088bc8ba43SGowrishankar Muthukrishnan 		return -1;
3098bc8ba43SGowrishankar Muthukrishnan 
310d5c24714SGowrishankar Muthukrishnan 	free(vec.cipher_auth.digest.val);
3118bc8ba43SGowrishankar Muthukrishnan 	vec.cipher_auth.digest.val = calloc(1, sz);
312d5c24714SGowrishankar Muthukrishnan 	if (vec.cipher_auth.digest.val == NULL)
313d5c24714SGowrishankar Muthukrishnan 		return -1;
314d5c24714SGowrishankar Muthukrishnan 
315d5c24714SGowrishankar Muthukrishnan 	return 0;
316d5c24714SGowrishankar Muthukrishnan }
317d5c24714SGowrishankar Muthukrishnan 
318d5c24714SGowrishankar Muthukrishnan int
319d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_test_type(void)
320d5c24714SGowrishankar Muthukrishnan {
321d5c24714SGowrishankar Muthukrishnan 	json_t *type_object;
322d5c24714SGowrishankar Muthukrishnan 	const char *type_str;
323d5c24714SGowrishankar Muthukrishnan 	uint32_t i;
324d5c24714SGowrishankar Muthukrishnan 
325d5c24714SGowrishankar Muthukrishnan 	type_object = json_object_get(json_info.json_test_group, TESTTYPE_JSON_STR);
326d5c24714SGowrishankar Muthukrishnan 	type_str = json_string_value(type_object);
327d5c24714SGowrishankar Muthukrishnan 
328d5c24714SGowrishankar Muthukrishnan 	for (i = 0; i < RTE_DIM(sha_test_types); i++)
329d5c24714SGowrishankar Muthukrishnan 		if (strstr(type_str, sha_test_types[i].desc)) {
3306ea24fc7SGowrishankar Muthukrishnan 			info.interim_info.sha_data.test_type =
331d5c24714SGowrishankar Muthukrishnan 				sha_test_types[i].type;
332d5c24714SGowrishankar Muthukrishnan 			break;
333d5c24714SGowrishankar Muthukrishnan 		}
334d5c24714SGowrishankar Muthukrishnan 
335d5c24714SGowrishankar Muthukrishnan 	if (i == RTE_DIM(sha_test_types))
336d5c24714SGowrishankar Muthukrishnan 		return -1;
337d5c24714SGowrishankar Muthukrishnan 
338d5c24714SGowrishankar Muthukrishnan 	switch (info.interim_info.sha_data.test_type) {
339d5c24714SGowrishankar Muthukrishnan 	case SHA_MCT:
340d5c24714SGowrishankar Muthukrishnan 		info.parse_writeback = parse_test_sha_mct_json_writeback;
341d5c24714SGowrishankar Muthukrishnan 		break;
342d5c24714SGowrishankar Muthukrishnan 	case SHA_AFT:
343*225f04fbSGowrishankar Muthukrishnan 	case SHAKE_VOT:
344d5c24714SGowrishankar Muthukrishnan 		info.parse_writeback = parse_test_sha_json_writeback;
345d5c24714SGowrishankar Muthukrishnan 		break;
346d5c24714SGowrishankar Muthukrishnan 	default:
347d5c24714SGowrishankar Muthukrishnan 		info.parse_writeback = NULL;
348d5c24714SGowrishankar Muthukrishnan 	}
349d5c24714SGowrishankar Muthukrishnan 
350d5c24714SGowrishankar Muthukrishnan 	if (!info.parse_writeback)
351d5c24714SGowrishankar Muthukrishnan 		return -1;
352d5c24714SGowrishankar Muthukrishnan 
353d5c24714SGowrishankar Muthukrishnan 	return 0;
354d5c24714SGowrishankar Muthukrishnan }
355d5c24714SGowrishankar Muthukrishnan 
356d5c24714SGowrishankar Muthukrishnan int
357d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_init(void)
358d5c24714SGowrishankar Muthukrishnan {
359d5c24714SGowrishankar Muthukrishnan 	info.op = FIPS_TEST_ENC_AUTH_GEN;
360d5c24714SGowrishankar Muthukrishnan 	info.parse_writeback = parse_test_sha_json_writeback;
361d5c24714SGowrishankar Muthukrishnan 	info.callbacks = sha_tests_json_vectors;
362d5c24714SGowrishankar Muthukrishnan 	info.writeback_callbacks = NULL;
363d5c24714SGowrishankar Muthukrishnan 	info.kat_check = rsp_test_sha_check;
364*225f04fbSGowrishankar Muthukrishnan 	info.interim_callbacks = sha_tests_interim_json_vectors;
365d5c24714SGowrishankar Muthukrishnan 
366d5c24714SGowrishankar Muthukrishnan 	if (parse_test_sha_json_test_type() < 0)
367d5c24714SGowrishankar Muthukrishnan 		return -1;
368d5c24714SGowrishankar Muthukrishnan 
369*225f04fbSGowrishankar Muthukrishnan 	if (parse_test_sha_json_algorithm() < 0)
370*225f04fbSGowrishankar Muthukrishnan 		return -1;
371*225f04fbSGowrishankar Muthukrishnan 
372d5c24714SGowrishankar Muthukrishnan 	return 0;
373d5c24714SGowrishankar Muthukrishnan }
374d5c24714SGowrishankar Muthukrishnan #endif /* USE_JANSSON */
375