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
10*3d3408ddSGowrishankar Muthukrishnan #include <rte_malloc.h>
11f4797baeSDamian Nowak #include <rte_cryptodev.h>
12f4797baeSDamian Nowak
13f4797baeSDamian Nowak #include "fips_validation.h"
14f4797baeSDamian Nowak
15f4797baeSDamian Nowak #define ALGO_PREFIX "[L = "
16f4797baeSDamian Nowak #define MSGLEN_STR "Len = "
17f4797baeSDamian Nowak #define MSG_STR "Msg = "
18f4797baeSDamian Nowak #define MD_STR "MD = "
19f4797baeSDamian Nowak #define SEED_STR "Seed = "
20f4797baeSDamian Nowak #define MCT_STR "Monte"
21f4797baeSDamian Nowak
22d5c24714SGowrishankar Muthukrishnan #define ALGO_JSON_STR "algorithm"
23d5c24714SGowrishankar Muthukrishnan #define TESTTYPE_JSON_STR "testType"
24d5c24714SGowrishankar Muthukrishnan
25d5c24714SGowrishankar Muthukrishnan #define PT_JSON_STR "msg"
26225f04fbSGowrishankar Muthukrishnan #define OUTLEN_JSON_STR "outLen"
27225f04fbSGowrishankar Muthukrishnan #define MINOUTLEN_JSON_STR "minOutLen"
28225f04fbSGowrishankar Muthukrishnan #define MAXOUTLEN_JSON_STR "maxOutLen"
29d5c24714SGowrishankar Muthukrishnan
30f4797baeSDamian Nowak struct plain_hash_size_conversion {
31f4797baeSDamian Nowak const char *str;
32*3d3408ddSGowrishankar Muthukrishnan uint8_t md_blocks;
33f4797baeSDamian Nowak enum rte_crypto_auth_algorithm algo;
34f4797baeSDamian Nowak } phsc[] = {
35*3d3408ddSGowrishankar Muthukrishnan {"20", 3, RTE_CRYPTO_AUTH_SHA1},
36*3d3408ddSGowrishankar Muthukrishnan {"28", 3, RTE_CRYPTO_AUTH_SHA224},
37*3d3408ddSGowrishankar Muthukrishnan {"32", 3, RTE_CRYPTO_AUTH_SHA256},
38*3d3408ddSGowrishankar Muthukrishnan {"48", 3, RTE_CRYPTO_AUTH_SHA384},
39*3d3408ddSGowrishankar Muthukrishnan {"64", 3, RTE_CRYPTO_AUTH_SHA512},
40*3d3408ddSGowrishankar Muthukrishnan {"28", 1, RTE_CRYPTO_AUTH_SHA3_224},
41*3d3408ddSGowrishankar Muthukrishnan {"32", 1, RTE_CRYPTO_AUTH_SHA3_256},
42*3d3408ddSGowrishankar Muthukrishnan {"48", 1, RTE_CRYPTO_AUTH_SHA3_384},
43*3d3408ddSGowrishankar Muthukrishnan {"64", 1, RTE_CRYPTO_AUTH_SHA3_512},
44*3d3408ddSGowrishankar Muthukrishnan {"16", 1, RTE_CRYPTO_AUTH_SHAKE_128},
45*3d3408ddSGowrishankar Muthukrishnan {"32", 1, RTE_CRYPTO_AUTH_SHAKE_256},
46f4797baeSDamian Nowak };
47f4797baeSDamian Nowak
488bc8ba43SGowrishankar Muthukrishnan int
parse_test_sha_hash_size(enum rte_crypto_auth_algorithm algo)498bc8ba43SGowrishankar Muthukrishnan parse_test_sha_hash_size(enum rte_crypto_auth_algorithm algo)
508bc8ba43SGowrishankar Muthukrishnan {
518bc8ba43SGowrishankar Muthukrishnan int ret = -EINVAL;
528bc8ba43SGowrishankar Muthukrishnan uint8_t i;
538bc8ba43SGowrishankar Muthukrishnan
548bc8ba43SGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(phsc); i++) {
558bc8ba43SGowrishankar Muthukrishnan if (phsc[i].algo == algo) {
568bc8ba43SGowrishankar Muthukrishnan ret = atoi(phsc[i].str);
578bc8ba43SGowrishankar Muthukrishnan break;
588bc8ba43SGowrishankar Muthukrishnan }
598bc8ba43SGowrishankar Muthukrishnan }
608bc8ba43SGowrishankar Muthukrishnan
618bc8ba43SGowrishankar Muthukrishnan return ret;
628bc8ba43SGowrishankar Muthukrishnan }
638bc8ba43SGowrishankar Muthukrishnan
64f4797baeSDamian Nowak static int
parse_interim_algo(__rte_unused const char * key,char * text,__rte_unused struct fips_val * val)65f2fc83b4SThomas Monjalon parse_interim_algo(__rte_unused const char *key,
66f4797baeSDamian Nowak char *text,
67f2fc83b4SThomas Monjalon __rte_unused struct fips_val *val)
68f4797baeSDamian Nowak {
69f4797baeSDamian Nowak uint32_t i;
70f4797baeSDamian Nowak
71f4797baeSDamian Nowak for (i = 0; i < RTE_DIM(phsc); i++) {
72f4797baeSDamian Nowak if (strstr(text, phsc[i].str)) {
73f4797baeSDamian Nowak info.interim_info.sha_data.algo = phsc[i].algo;
74*3d3408ddSGowrishankar Muthukrishnan info.interim_info.sha_data.md_blocks = phsc[i].md_blocks;
75f4797baeSDamian Nowak parser_read_uint32_val(ALGO_PREFIX,
76f4797baeSDamian Nowak text, &vec.cipher_auth.digest);
77f4797baeSDamian Nowak break;
78f4797baeSDamian Nowak }
79f4797baeSDamian Nowak }
80f4797baeSDamian Nowak
81f4797baeSDamian Nowak if (i == RTE_DIM(phsc))
82f4797baeSDamian Nowak return -1;
83f4797baeSDamian Nowak
84f4797baeSDamian Nowak return 0;
85f4797baeSDamian Nowak }
86f4797baeSDamian Nowak
87f4797baeSDamian Nowak struct fips_test_callback sha_tests_vectors[] = {
88f4797baeSDamian Nowak {MSGLEN_STR, parser_read_uint32_bit_val, &vec.pt},
89f4797baeSDamian Nowak {MSG_STR, parse_uint8_known_len_hex_str, &vec.pt},
90*3d3408ddSGowrishankar Muthukrishnan {SEED_STR, parse_uint8_hex_str, &vec.pt},
91f4797baeSDamian Nowak {NULL, NULL, NULL} /**< end pointer */
92f4797baeSDamian Nowak };
93f4797baeSDamian Nowak
94f4797baeSDamian Nowak struct fips_test_callback sha_tests_interim_vectors[] = {
95f4797baeSDamian Nowak {ALGO_PREFIX, parse_interim_algo, NULL},
96f4797baeSDamian Nowak {NULL, NULL, NULL} /**< end pointer */
97f4797baeSDamian Nowak };
98f4797baeSDamian Nowak
99d5c24714SGowrishankar Muthukrishnan #ifdef USE_JANSSON
100225f04fbSGowrishankar Muthukrishnan static int
parse_interim_str(const char * key,char * src,struct fips_val * val)101225f04fbSGowrishankar Muthukrishnan parse_interim_str(const char *key, char *src, struct fips_val *val)
102225f04fbSGowrishankar Muthukrishnan {
103225f04fbSGowrishankar Muthukrishnan RTE_SET_USED(val);
104225f04fbSGowrishankar Muthukrishnan
105225f04fbSGowrishankar Muthukrishnan if (strcmp(key, MINOUTLEN_JSON_STR) == 0)
106225f04fbSGowrishankar Muthukrishnan info.interim_info.sha_data.min_outlen = atoi(src) / 8;
107225f04fbSGowrishankar Muthukrishnan else if (strcmp(key, MAXOUTLEN_JSON_STR) == 0)
108225f04fbSGowrishankar Muthukrishnan vec.cipher_auth.digest.len = atoi(src) / 8;
109225f04fbSGowrishankar Muthukrishnan
110225f04fbSGowrishankar Muthukrishnan return 0;
111225f04fbSGowrishankar Muthukrishnan }
112225f04fbSGowrishankar Muthukrishnan
113d5c24714SGowrishankar Muthukrishnan static struct {
114d5c24714SGowrishankar Muthukrishnan uint32_t type;
115d5c24714SGowrishankar Muthukrishnan const char *desc;
116d5c24714SGowrishankar Muthukrishnan } sha_test_types[] = {
117d5c24714SGowrishankar Muthukrishnan {SHA_MCT, "MCT"},
118d5c24714SGowrishankar Muthukrishnan {SHA_AFT, "AFT"},
119225f04fbSGowrishankar Muthukrishnan {SHAKE_VOT, "VOT"},
120d5c24714SGowrishankar Muthukrishnan };
121d5c24714SGowrishankar Muthukrishnan
122d5c24714SGowrishankar Muthukrishnan static struct plain_hash_algorithms {
123d5c24714SGowrishankar Muthukrishnan const char *str;
124d5c24714SGowrishankar Muthukrishnan enum rte_crypto_auth_algorithm algo;
1251ea7940eSGowrishankar Muthukrishnan uint8_t md_blocks;
126d5c24714SGowrishankar Muthukrishnan } json_algorithms[] = {
1271ea7940eSGowrishankar Muthukrishnan {"SHA-1", RTE_CRYPTO_AUTH_SHA1, 3},
1281ea7940eSGowrishankar Muthukrishnan {"SHA2-224", RTE_CRYPTO_AUTH_SHA224, 3},
1291ea7940eSGowrishankar Muthukrishnan {"SHA2-256", RTE_CRYPTO_AUTH_SHA256, 3},
1301ea7940eSGowrishankar Muthukrishnan {"SHA2-384", RTE_CRYPTO_AUTH_SHA384, 3},
1311ea7940eSGowrishankar Muthukrishnan {"SHA2-512", RTE_CRYPTO_AUTH_SHA512, 3},
1321ea7940eSGowrishankar Muthukrishnan {"SHA3-224", RTE_CRYPTO_AUTH_SHA3_224, 1},
1331ea7940eSGowrishankar Muthukrishnan {"SHA3-256", RTE_CRYPTO_AUTH_SHA3_256, 1},
1341ea7940eSGowrishankar Muthukrishnan {"SHA3-384", RTE_CRYPTO_AUTH_SHA3_384, 1},
1351ea7940eSGowrishankar Muthukrishnan {"SHA3-512", RTE_CRYPTO_AUTH_SHA3_512, 1},
136225f04fbSGowrishankar Muthukrishnan {"SHAKE-128", RTE_CRYPTO_AUTH_SHAKE_128, 1},
137225f04fbSGowrishankar Muthukrishnan {"SHAKE-256", RTE_CRYPTO_AUTH_SHAKE_256, 1},
138d5c24714SGowrishankar Muthukrishnan };
139d5c24714SGowrishankar Muthukrishnan
140d5c24714SGowrishankar Muthukrishnan struct fips_test_callback sha_tests_json_vectors[] = {
141d5c24714SGowrishankar Muthukrishnan {PT_JSON_STR, parse_uint8_hex_str, &vec.pt},
142225f04fbSGowrishankar Muthukrishnan {OUTLEN_JSON_STR, parser_read_uint32_bit_val, &vec.cipher_auth.digest},
143225f04fbSGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */
144225f04fbSGowrishankar Muthukrishnan };
145225f04fbSGowrishankar Muthukrishnan
146225f04fbSGowrishankar Muthukrishnan struct fips_test_callback sha_tests_interim_json_vectors[] = {
147225f04fbSGowrishankar Muthukrishnan {MINOUTLEN_JSON_STR, parse_interim_str, NULL},
148225f04fbSGowrishankar Muthukrishnan {MAXOUTLEN_JSON_STR, parse_interim_str, NULL},
149d5c24714SGowrishankar Muthukrishnan {NULL, NULL, NULL} /**< end pointer */
150d5c24714SGowrishankar Muthukrishnan };
151d5c24714SGowrishankar Muthukrishnan #endif /* USE_JANSSON */
152d5c24714SGowrishankar Muthukrishnan
153f4797baeSDamian Nowak static int
parse_test_sha_writeback(struct fips_val * val)154f4797baeSDamian Nowak parse_test_sha_writeback(struct fips_val *val) // !
155f4797baeSDamian Nowak {
156f4797baeSDamian Nowak struct fips_val val_local;
157f4797baeSDamian Nowak
158f4797baeSDamian Nowak fprintf(info.fp_wr, "%s", MD_STR);
159f4797baeSDamian Nowak
160f4797baeSDamian Nowak val_local.val = val->val + vec.pt.len;
161f4797baeSDamian Nowak val_local.len = vec.cipher_auth.digest.len;
162f4797baeSDamian Nowak
163f4797baeSDamian Nowak parse_write_hex_str(&val_local);
164f4797baeSDamian Nowak return 0;
165f4797baeSDamian Nowak }
166f4797baeSDamian Nowak
167f4797baeSDamian Nowak static int
rsp_test_sha_check(struct fips_val * val)168f4797baeSDamian Nowak rsp_test_sha_check(struct fips_val *val)
169f4797baeSDamian Nowak {
170f4797baeSDamian Nowak if (memcmp(val->val + vec.pt.len, vec.cipher_auth.digest.val,
171f4797baeSDamian Nowak vec.cipher_auth.digest.len) == 0)
172f4797baeSDamian Nowak fprintf(info.fp_wr, "Success\n");
173f4797baeSDamian Nowak else
174f4797baeSDamian Nowak fprintf(info.fp_wr, "Failed\n");
175f4797baeSDamian Nowak
176f4797baeSDamian Nowak return 0;
177f4797baeSDamian Nowak }
178f4797baeSDamian Nowak
179f4797baeSDamian Nowak int
parse_test_sha_init(void)180f4797baeSDamian Nowak parse_test_sha_init(void)
181f4797baeSDamian Nowak {
182f4797baeSDamian Nowak uint32_t i;
183f4797baeSDamian Nowak
184f4797baeSDamian Nowak info.interim_info.sha_data.test_type = SHA_KAT;
185f4797baeSDamian Nowak for (i = 0; i < info.nb_vec_lines; i++) {
186f4797baeSDamian Nowak char *line = info.vec[i];
187f4797baeSDamian Nowak if (strstr(line, MCT_STR))
188f4797baeSDamian Nowak info.interim_info.sha_data.test_type = SHA_MCT;
189f4797baeSDamian Nowak }
190f4797baeSDamian Nowak
191f4797baeSDamian Nowak info.op = FIPS_TEST_ENC_AUTH_GEN;
192f4797baeSDamian Nowak info.parse_writeback = parse_test_sha_writeback;
193f4797baeSDamian Nowak info.callbacks = sha_tests_vectors;
194f4797baeSDamian Nowak info.interim_callbacks = sha_tests_interim_vectors;
195f4797baeSDamian Nowak info.writeback_callbacks = NULL;
196f4797baeSDamian Nowak info.kat_check = rsp_test_sha_check;
197f4797baeSDamian Nowak return 0;
198f4797baeSDamian Nowak }
199d5c24714SGowrishankar Muthukrishnan
200d5c24714SGowrishankar Muthukrishnan #ifdef USE_JANSSON
201d5c24714SGowrishankar Muthukrishnan static int
parse_test_sha_json_writeback(struct fips_val * val)202d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_writeback(struct fips_val *val)
203d5c24714SGowrishankar Muthukrishnan {
204d5c24714SGowrishankar Muthukrishnan struct fips_val val_local;
205d5c24714SGowrishankar Muthukrishnan json_t *tcId, *md;
206d5c24714SGowrishankar Muthukrishnan
207d5c24714SGowrishankar Muthukrishnan tcId = json_object_get(json_info.json_test_case, "tcId");
208d5c24714SGowrishankar Muthukrishnan
209d5c24714SGowrishankar Muthukrishnan json_info.json_write_case = json_object();
210d5c24714SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "tcId", tcId);
211d5c24714SGowrishankar Muthukrishnan
212d5c24714SGowrishankar Muthukrishnan val_local.val = val->val + vec.pt.len;
213d5c24714SGowrishankar Muthukrishnan val_local.len = vec.cipher_auth.digest.len;
214d5c24714SGowrishankar Muthukrishnan
215d5c24714SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &val_local);
216d5c24714SGowrishankar Muthukrishnan md = json_string(info.one_line_text);
217d5c24714SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "md", md);
218d5c24714SGowrishankar Muthukrishnan
219225f04fbSGowrishankar Muthukrishnan if (info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_128 ||
220225f04fbSGowrishankar Muthukrishnan info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_256)
221225f04fbSGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "outLen",
222225f04fbSGowrishankar Muthukrishnan json_integer(vec.cipher_auth.digest.len * 8));
223225f04fbSGowrishankar Muthukrishnan
224d5c24714SGowrishankar Muthukrishnan return 0;
225d5c24714SGowrishankar Muthukrishnan }
226d5c24714SGowrishankar Muthukrishnan
227d5c24714SGowrishankar Muthukrishnan static int
parse_test_sha_mct_json_writeback(struct fips_val * val)228d5c24714SGowrishankar Muthukrishnan parse_test_sha_mct_json_writeback(struct fips_val *val)
229d5c24714SGowrishankar Muthukrishnan {
230fc78f69dSGowrishankar Muthukrishnan json_t *tcId, *md, *resArr, *res;
231d5c24714SGowrishankar Muthukrishnan struct fips_val val_local;
232225f04fbSGowrishankar Muthukrishnan bool is_shake = false;
233225f04fbSGowrishankar Muthukrishnan
234225f04fbSGowrishankar Muthukrishnan if (info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_128 ||
235225f04fbSGowrishankar Muthukrishnan info.interim_info.sha_data.algo == RTE_CRYPTO_AUTH_SHAKE_256)
236225f04fbSGowrishankar Muthukrishnan is_shake = true;
237d5c24714SGowrishankar Muthukrishnan
238d5c24714SGowrishankar Muthukrishnan tcId = json_object_get(json_info.json_test_case, "tcId");
239d5c24714SGowrishankar Muthukrishnan if (json_info.json_write_case) {
240d5c24714SGowrishankar Muthukrishnan json_t *wcId;
241d5c24714SGowrishankar Muthukrishnan
242d5c24714SGowrishankar Muthukrishnan wcId = json_object_get(json_info.json_write_case, "tcId");
243d5c24714SGowrishankar Muthukrishnan if (!json_equal(tcId, wcId)) {
244d5c24714SGowrishankar Muthukrishnan json_info.json_write_case = json_object();
245d5c24714SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "tcId", tcId);
246d5c24714SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "resultsArray",
247d5c24714SGowrishankar Muthukrishnan json_array());
248225f04fbSGowrishankar Muthukrishnan if (is_shake)
249225f04fbSGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "outLen",
250225f04fbSGowrishankar Muthukrishnan json_integer(0));
251d5c24714SGowrishankar Muthukrishnan }
252d5c24714SGowrishankar Muthukrishnan } else {
253d5c24714SGowrishankar Muthukrishnan json_info.json_write_case = json_object();
254d5c24714SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "tcId", tcId);
255d5c24714SGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "resultsArray", json_array());
256225f04fbSGowrishankar Muthukrishnan if (is_shake)
257225f04fbSGowrishankar Muthukrishnan json_object_set_new(json_info.json_write_case, "outLen",
258225f04fbSGowrishankar Muthukrishnan json_integer(0));
259d5c24714SGowrishankar Muthukrishnan }
260d5c24714SGowrishankar Muthukrishnan
261d5c24714SGowrishankar Muthukrishnan resArr = json_object_get(json_info.json_write_case, "resultsArray");
262d5c24714SGowrishankar Muthukrishnan if (!json_is_array(resArr))
263d5c24714SGowrishankar Muthukrishnan return -EINVAL;
264d5c24714SGowrishankar Muthukrishnan
265d5c24714SGowrishankar Muthukrishnan res = json_object();
266d5c24714SGowrishankar Muthukrishnan
267fc78f69dSGowrishankar Muthukrishnan val_local.val = val->val + vec.pt.len;
268d5c24714SGowrishankar Muthukrishnan val_local.len = vec.cipher_auth.digest.len;
269d5c24714SGowrishankar Muthukrishnan
270d5c24714SGowrishankar Muthukrishnan writeback_hex_str("", info.one_line_text, &val_local);
271d5c24714SGowrishankar Muthukrishnan md = json_string(info.one_line_text);
272d5c24714SGowrishankar Muthukrishnan json_object_set_new(res, "md", md);
273d5c24714SGowrishankar Muthukrishnan
274225f04fbSGowrishankar Muthukrishnan if (is_shake)
275225f04fbSGowrishankar Muthukrishnan json_object_set_new(res, "outLen", json_integer(vec.cipher_auth.digest.len * 8));
276225f04fbSGowrishankar Muthukrishnan
277d5c24714SGowrishankar Muthukrishnan json_array_append_new(resArr, res);
278d5c24714SGowrishankar Muthukrishnan return 0;
279d5c24714SGowrishankar Muthukrishnan }
280d5c24714SGowrishankar Muthukrishnan
281d5c24714SGowrishankar Muthukrishnan int
parse_test_sha_json_algorithm(void)282d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_algorithm(void)
283d5c24714SGowrishankar Muthukrishnan {
284d5c24714SGowrishankar Muthukrishnan json_t *algorithm_object;
285d5c24714SGowrishankar Muthukrishnan const char *algorithm_str;
286d5c24714SGowrishankar Muthukrishnan uint32_t i;
2878bc8ba43SGowrishankar Muthukrishnan int sz;
288d5c24714SGowrishankar Muthukrishnan
289d5c24714SGowrishankar Muthukrishnan algorithm_object = json_object_get(json_info.json_vector_set, "algorithm");
290d5c24714SGowrishankar Muthukrishnan algorithm_str = json_string_value(algorithm_object);
291d5c24714SGowrishankar Muthukrishnan
292d5c24714SGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(json_algorithms); i++) {
293d5c24714SGowrishankar Muthukrishnan if (strstr(algorithm_str, json_algorithms[i].str)) {
294d5c24714SGowrishankar Muthukrishnan info.interim_info.sha_data.algo = json_algorithms[i].algo;
2951ea7940eSGowrishankar Muthukrishnan info.interim_info.sha_data.md_blocks = json_algorithms[i].md_blocks;
296d5c24714SGowrishankar Muthukrishnan break;
297d5c24714SGowrishankar Muthukrishnan }
298d5c24714SGowrishankar Muthukrishnan }
299d5c24714SGowrishankar Muthukrishnan
300d5c24714SGowrishankar Muthukrishnan if (i == RTE_DIM(json_algorithms))
301d5c24714SGowrishankar Muthukrishnan return -1;
302d5c24714SGowrishankar Muthukrishnan
303225f04fbSGowrishankar Muthukrishnan if (info.interim_info.sha_data.test_type == SHAKE_VOT) {
304225f04fbSGowrishankar Muthukrishnan sz = vec.cipher_auth.digest.len;
305225f04fbSGowrishankar Muthukrishnan } else {
3068bc8ba43SGowrishankar Muthukrishnan sz = parse_test_sha_hash_size(info.interim_info.sha_data.algo);
307225f04fbSGowrishankar Muthukrishnan vec.cipher_auth.digest.len = sz;
308225f04fbSGowrishankar Muthukrishnan }
309225f04fbSGowrishankar Muthukrishnan
3108bc8ba43SGowrishankar Muthukrishnan if (sz < 0)
3118bc8ba43SGowrishankar Muthukrishnan return -1;
3128bc8ba43SGowrishankar Muthukrishnan
313*3d3408ddSGowrishankar Muthukrishnan rte_free(vec.cipher_auth.digest.val);
314*3d3408ddSGowrishankar Muthukrishnan vec.cipher_auth.digest.val = rte_malloc(NULL, sz, 0);
315d5c24714SGowrishankar Muthukrishnan if (vec.cipher_auth.digest.val == NULL)
316d5c24714SGowrishankar Muthukrishnan return -1;
317d5c24714SGowrishankar Muthukrishnan
318d5c24714SGowrishankar Muthukrishnan return 0;
319d5c24714SGowrishankar Muthukrishnan }
320d5c24714SGowrishankar Muthukrishnan
321d5c24714SGowrishankar Muthukrishnan int
parse_test_sha_json_test_type(void)322d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_test_type(void)
323d5c24714SGowrishankar Muthukrishnan {
324d5c24714SGowrishankar Muthukrishnan json_t *type_object;
325d5c24714SGowrishankar Muthukrishnan const char *type_str;
326d5c24714SGowrishankar Muthukrishnan uint32_t i;
327d5c24714SGowrishankar Muthukrishnan
328d5c24714SGowrishankar Muthukrishnan type_object = json_object_get(json_info.json_test_group, TESTTYPE_JSON_STR);
329d5c24714SGowrishankar Muthukrishnan type_str = json_string_value(type_object);
330d5c24714SGowrishankar Muthukrishnan
331d5c24714SGowrishankar Muthukrishnan for (i = 0; i < RTE_DIM(sha_test_types); i++)
332d5c24714SGowrishankar Muthukrishnan if (strstr(type_str, sha_test_types[i].desc)) {
3336ea24fc7SGowrishankar Muthukrishnan info.interim_info.sha_data.test_type =
334d5c24714SGowrishankar Muthukrishnan sha_test_types[i].type;
335d5c24714SGowrishankar Muthukrishnan break;
336d5c24714SGowrishankar Muthukrishnan }
337d5c24714SGowrishankar Muthukrishnan
338d5c24714SGowrishankar Muthukrishnan if (i == RTE_DIM(sha_test_types))
339d5c24714SGowrishankar Muthukrishnan return -1;
340d5c24714SGowrishankar Muthukrishnan
341d5c24714SGowrishankar Muthukrishnan switch (info.interim_info.sha_data.test_type) {
342d5c24714SGowrishankar Muthukrishnan case SHA_MCT:
343d5c24714SGowrishankar Muthukrishnan info.parse_writeback = parse_test_sha_mct_json_writeback;
344d5c24714SGowrishankar Muthukrishnan break;
345d5c24714SGowrishankar Muthukrishnan case SHA_AFT:
346225f04fbSGowrishankar Muthukrishnan case SHAKE_VOT:
347d5c24714SGowrishankar Muthukrishnan info.parse_writeback = parse_test_sha_json_writeback;
348d5c24714SGowrishankar Muthukrishnan break;
349d5c24714SGowrishankar Muthukrishnan default:
350d5c24714SGowrishankar Muthukrishnan info.parse_writeback = NULL;
351d5c24714SGowrishankar Muthukrishnan }
352d5c24714SGowrishankar Muthukrishnan
353d5c24714SGowrishankar Muthukrishnan if (!info.parse_writeback)
354d5c24714SGowrishankar Muthukrishnan return -1;
355d5c24714SGowrishankar Muthukrishnan
356d5c24714SGowrishankar Muthukrishnan return 0;
357d5c24714SGowrishankar Muthukrishnan }
358d5c24714SGowrishankar Muthukrishnan
359d5c24714SGowrishankar Muthukrishnan int
parse_test_sha_json_init(void)360d5c24714SGowrishankar Muthukrishnan parse_test_sha_json_init(void)
361d5c24714SGowrishankar Muthukrishnan {
362d5c24714SGowrishankar Muthukrishnan info.op = FIPS_TEST_ENC_AUTH_GEN;
363d5c24714SGowrishankar Muthukrishnan info.parse_writeback = parse_test_sha_json_writeback;
364d5c24714SGowrishankar Muthukrishnan info.callbacks = sha_tests_json_vectors;
365d5c24714SGowrishankar Muthukrishnan info.writeback_callbacks = NULL;
366d5c24714SGowrishankar Muthukrishnan info.kat_check = rsp_test_sha_check;
367225f04fbSGowrishankar Muthukrishnan info.interim_callbacks = sha_tests_interim_json_vectors;
368d5c24714SGowrishankar Muthukrishnan
369d5c24714SGowrishankar Muthukrishnan if (parse_test_sha_json_test_type() < 0)
370d5c24714SGowrishankar Muthukrishnan return -1;
371d5c24714SGowrishankar Muthukrishnan
372225f04fbSGowrishankar Muthukrishnan if (parse_test_sha_json_algorithm() < 0)
373225f04fbSGowrishankar Muthukrishnan return -1;
374225f04fbSGowrishankar Muthukrishnan
375d5c24714SGowrishankar Muthukrishnan return 0;
376d5c24714SGowrishankar Muthukrishnan }
377d5c24714SGowrishankar Muthukrishnan #endif /* USE_JANSSON */
378