xref: /dpdk/examples/fips_validation/fips_validation_ecdsa.c (revision a22a52281ee50783e25bd6655d45a4f9e0dc9cd8)
1b455d261SGowrishankar Muthukrishnan /* SPDX-License-Identifier: BSD-3-Clause
2b455d261SGowrishankar Muthukrishnan  * Copyright(C) 2022 Marvell.
3b455d261SGowrishankar Muthukrishnan  */
4b455d261SGowrishankar Muthukrishnan 
5b455d261SGowrishankar Muthukrishnan #include <string.h>
6b455d261SGowrishankar Muthukrishnan #include <time.h>
7b455d261SGowrishankar Muthukrishnan #include <stdio.h>
8b455d261SGowrishankar Muthukrishnan #include <sys/types.h>
9b455d261SGowrishankar Muthukrishnan #include <unistd.h>
10b455d261SGowrishankar Muthukrishnan 
11b455d261SGowrishankar Muthukrishnan #ifdef USE_OPENSSL
12b455d261SGowrishankar Muthukrishnan #include <openssl/bn.h>
13b455d261SGowrishankar Muthukrishnan #include <openssl/rand.h>
14b455d261SGowrishankar Muthukrishnan #endif /* USE_OPENSSL */
15b455d261SGowrishankar Muthukrishnan 
16b455d261SGowrishankar Muthukrishnan #include <rte_cryptodev.h>
17b455d261SGowrishankar Muthukrishnan #include <rte_malloc.h>
18b455d261SGowrishankar Muthukrishnan 
19b455d261SGowrishankar Muthukrishnan #include "fips_validation.h"
20b455d261SGowrishankar Muthukrishnan 
21b455d261SGowrishankar Muthukrishnan #define CONFORMANCE_JSON_STR	"conformance"
22b455d261SGowrishankar Muthukrishnan #define TESTTYPE_JSON_STR	"testType"
23b455d261SGowrishankar Muthukrishnan #define CURVE_JSON_STR	"curve"
24b455d261SGowrishankar Muthukrishnan #define HASH_JSON_STR	"hashAlg"
25b455d261SGowrishankar Muthukrishnan #define RV_JSON_STR	"randomValue"
26b455d261SGowrishankar Muthukrishnan 
27b455d261SGowrishankar Muthukrishnan #define MSG_JSON_STR	"message"
28b455d261SGowrishankar Muthukrishnan #define QX_JSON_STR	"qx"
29b455d261SGowrishankar Muthukrishnan #define QY_JSON_STR	"qy"
30b455d261SGowrishankar Muthukrishnan #define R_JSON_STR	"r"
31b455d261SGowrishankar Muthukrishnan #define S_JSON_STR	"s"
32b455d261SGowrishankar Muthukrishnan 
33b455d261SGowrishankar Muthukrishnan #define RV_BUF_LEN (1024/8)
34b455d261SGowrishankar Muthukrishnan #define RV_BIT_LEN (256)
35b455d261SGowrishankar Muthukrishnan 
36b455d261SGowrishankar Muthukrishnan #ifdef USE_JANSSON
37b455d261SGowrishankar Muthukrishnan struct {
38b455d261SGowrishankar Muthukrishnan 	uint8_t type;
39b455d261SGowrishankar Muthukrishnan 	const char *desc;
40b455d261SGowrishankar Muthukrishnan } ecdsa_test_types[] = {
41b455d261SGowrishankar Muthukrishnan 		{ECDSA_AFT, "AFT"}
42b455d261SGowrishankar Muthukrishnan };
43b455d261SGowrishankar Muthukrishnan 
44b455d261SGowrishankar Muthukrishnan struct {
45b455d261SGowrishankar Muthukrishnan 	enum rte_crypto_auth_algorithm auth;
46b455d261SGowrishankar Muthukrishnan 	const char *desc;
47b455d261SGowrishankar Muthukrishnan } ecdsa_auth_algs[] = {
48b455d261SGowrishankar Muthukrishnan 		{RTE_CRYPTO_AUTH_SHA1, "SHA-1"},
49b455d261SGowrishankar Muthukrishnan 		{RTE_CRYPTO_AUTH_SHA224, "SHA2-224"},
50b455d261SGowrishankar Muthukrishnan 		{RTE_CRYPTO_AUTH_SHA256, "SHA2-256"},
51b455d261SGowrishankar Muthukrishnan 		{RTE_CRYPTO_AUTH_SHA384, "SHA2-384"},
52b455d261SGowrishankar Muthukrishnan 		{RTE_CRYPTO_AUTH_SHA512, "SHA2-512"},
53b455d261SGowrishankar Muthukrishnan };
54b455d261SGowrishankar Muthukrishnan 
55b455d261SGowrishankar Muthukrishnan struct {
56b455d261SGowrishankar Muthukrishnan 	enum rte_crypto_curve_id curve_id;
57b455d261SGowrishankar Muthukrishnan 	const char *desc;
58b455d261SGowrishankar Muthukrishnan } ecdsa_curve_ids[] = {
59b455d261SGowrishankar Muthukrishnan 	{RTE_CRYPTO_EC_GROUP_SECP192R1, "P-192"},
60b455d261SGowrishankar Muthukrishnan 	{RTE_CRYPTO_EC_GROUP_SECP224R1, "P-224"},
61b455d261SGowrishankar Muthukrishnan 	{RTE_CRYPTO_EC_GROUP_SECP256R1, "P-256"},
62b455d261SGowrishankar Muthukrishnan 	{RTE_CRYPTO_EC_GROUP_SECP384R1, "P-384"},
63b455d261SGowrishankar Muthukrishnan 	{RTE_CRYPTO_EC_GROUP_SECP521R1, "P-521"},
64b455d261SGowrishankar Muthukrishnan };
65b455d261SGowrishankar Muthukrishnan 
66b455d261SGowrishankar Muthukrishnan struct {
67b455d261SGowrishankar Muthukrishnan 	uint8_t curve_len;
68b455d261SGowrishankar Muthukrishnan 	const char *desc;
69b455d261SGowrishankar Muthukrishnan } ecdsa_curve_len[] = {
70b455d261SGowrishankar Muthukrishnan 	{24, "P-192"},
71b455d261SGowrishankar Muthukrishnan 	{28, "P-224"},
72b455d261SGowrishankar Muthukrishnan 	{32, "P-256"},
73b455d261SGowrishankar Muthukrishnan 	{48, "P-384"},
74b455d261SGowrishankar Muthukrishnan 	{66, "P-521"},
75b455d261SGowrishankar Muthukrishnan };
76b455d261SGowrishankar Muthukrishnan 
77b455d261SGowrishankar Muthukrishnan #ifdef USE_OPENSSL
78b455d261SGowrishankar Muthukrishnan #define MAX_TRIES 10
79b455d261SGowrishankar Muthukrishnan static int
80b455d261SGowrishankar Muthukrishnan prepare_vec_ecdsa(void)
81b455d261SGowrishankar Muthukrishnan {
82b455d261SGowrishankar Muthukrishnan 	BIGNUM *pkey = NULL, *order = NULL, *r = NULL;
83b455d261SGowrishankar Muthukrishnan 	int ret = -1, j;
84b455d261SGowrishankar Muthukrishnan 	unsigned long pid;
85b455d261SGowrishankar Muthukrishnan 
86b455d261SGowrishankar Muthukrishnan 	/* For ECDSA prime fields, order of base points.
87b455d261SGowrishankar Muthukrishnan 	 * Below string array is indexed by starting with first supported
88b455d261SGowrishankar Muthukrishnan 	 * curve (SECP-192R1).
89b455d261SGowrishankar Muthukrishnan 	 */
90b455d261SGowrishankar Muthukrishnan 	static const char * const orderstr[] = {
91b455d261SGowrishankar Muthukrishnan 			"FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831",
92b455d261SGowrishankar Muthukrishnan 			"",
93b455d261SGowrishankar Muthukrishnan 			"FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",
94b455d261SGowrishankar Muthukrishnan 			"",
95b455d261SGowrishankar Muthukrishnan 			"FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
96b455d261SGowrishankar Muthukrishnan 			"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
97b455d261SGowrishankar Muthukrishnan 			"1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409"
98b455d261SGowrishankar Muthukrishnan 	};
99b455d261SGowrishankar Muthukrishnan 
100b455d261SGowrishankar Muthukrishnan 	/* Seed PRNG */
101b455d261SGowrishankar Muthukrishnan 	if (vec.ecdsa.seed.val) {
102b455d261SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.ecdsa.seed);
103b455d261SGowrishankar Muthukrishnan 		RAND_seed((char *)info.one_line_text, strlen(info.one_line_text));
104b455d261SGowrishankar Muthukrishnan 	} else {
105b455d261SGowrishankar Muthukrishnan 		pid = getpid();
106b455d261SGowrishankar Muthukrishnan 		RAND_seed(&pid, sizeof(pid));
107b455d261SGowrishankar Muthukrishnan 	}
108b455d261SGowrishankar Muthukrishnan 
109b455d261SGowrishankar Muthukrishnan 	if (!RAND_status())
110b455d261SGowrishankar Muthukrishnan 		return -1;
111b455d261SGowrishankar Muthukrishnan 
112b455d261SGowrishankar Muthukrishnan 	order = BN_new();
113b455d261SGowrishankar Muthukrishnan 	if (!order)
114b455d261SGowrishankar Muthukrishnan 		goto err;
115b455d261SGowrishankar Muthukrishnan 
116b455d261SGowrishankar Muthukrishnan 	j = info.interim_info.ecdsa_data.curve_id - RTE_CRYPTO_EC_GROUP_SECP192R1;
117b455d261SGowrishankar Muthukrishnan 	if (!BN_hex2bn(&order, orderstr[j]))
118b455d261SGowrishankar Muthukrishnan 		goto err;
119b455d261SGowrishankar Muthukrishnan 
120b455d261SGowrishankar Muthukrishnan 	pkey = BN_new();
121b455d261SGowrishankar Muthukrishnan 	if (!pkey)
122b455d261SGowrishankar Muthukrishnan 		goto err;
123b455d261SGowrishankar Muthukrishnan 
124b455d261SGowrishankar Muthukrishnan 	for (j = 0; j < MAX_TRIES; j++) {
125b455d261SGowrishankar Muthukrishnan 		/* pkey should be in [1, order - 1] */
126b455d261SGowrishankar Muthukrishnan 		if (!BN_rand_range(pkey, order))
127b455d261SGowrishankar Muthukrishnan 			goto err;
128b455d261SGowrishankar Muthukrishnan 
129b455d261SGowrishankar Muthukrishnan 		if (!BN_is_zero(pkey))
130b455d261SGowrishankar Muthukrishnan 			break;
131b455d261SGowrishankar Muthukrishnan 	}
132b455d261SGowrishankar Muthukrishnan 
133b455d261SGowrishankar Muthukrishnan 	if (j == MAX_TRIES)
134b455d261SGowrishankar Muthukrishnan 		goto err;
135b455d261SGowrishankar Muthukrishnan 
136b455d261SGowrishankar Muthukrishnan 	parse_uint8_hex_str("", BN_bn2hex(pkey), &vec.ecdsa.pkey);
137b455d261SGowrishankar Muthukrishnan 
138b455d261SGowrishankar Muthukrishnan 	r = BN_new();
139b455d261SGowrishankar Muthukrishnan 	if (!r)
140b455d261SGowrishankar Muthukrishnan 		goto err;
141b455d261SGowrishankar Muthukrishnan 
142b455d261SGowrishankar Muthukrishnan 	if (info.interim_info.ecdsa_data.random_msg) {
143b455d261SGowrishankar Muthukrishnan 		if (!BN_rand(r, RV_BIT_LEN, 0, 0))
144b455d261SGowrishankar Muthukrishnan 			goto err;
145b455d261SGowrishankar Muthukrishnan 
146b455d261SGowrishankar Muthukrishnan 		parse_uint8_hex_str("", BN_bn2hex(r), &vec.ecdsa.seed);
147b455d261SGowrishankar Muthukrishnan 	}
148b455d261SGowrishankar Muthukrishnan 
149b455d261SGowrishankar Muthukrishnan 	ret = 0;
150b455d261SGowrishankar Muthukrishnan err:
151b455d261SGowrishankar Muthukrishnan 	BN_free(order);
152b455d261SGowrishankar Muthukrishnan 	BN_free(pkey);
153b455d261SGowrishankar Muthukrishnan 	BN_free(r);
154b455d261SGowrishankar Muthukrishnan 	return ret;
155b455d261SGowrishankar Muthukrishnan }
156b455d261SGowrishankar Muthukrishnan 
157b455d261SGowrishankar Muthukrishnan static int
158b455d261SGowrishankar Muthukrishnan prepare_vec_ecdsa_k(void)
159b455d261SGowrishankar Muthukrishnan {
160b455d261SGowrishankar Muthukrishnan 	BIGNUM *pkey = NULL, *k = NULL;
161b455d261SGowrishankar Muthukrishnan 	int ret = -1;
162b455d261SGowrishankar Muthukrishnan 
163b455d261SGowrishankar Muthukrishnan 	if (!vec.ecdsa.pkey.len)
164b455d261SGowrishankar Muthukrishnan 		return -1;
165b455d261SGowrishankar Muthukrishnan 
166b455d261SGowrishankar Muthukrishnan 	pkey = BN_new();
167b455d261SGowrishankar Muthukrishnan 	if (!pkey)
168b455d261SGowrishankar Muthukrishnan 		goto err;
169b455d261SGowrishankar Muthukrishnan 
170b455d261SGowrishankar Muthukrishnan 	writeback_hex_str("", info.one_line_text, &vec.ecdsa.pkey);
171b455d261SGowrishankar Muthukrishnan 	ret = BN_hex2bn(&pkey, info.one_line_text);
172b455d261SGowrishankar Muthukrishnan 	if ((uint32_t)ret != strlen(info.one_line_text))
173b455d261SGowrishankar Muthukrishnan 		goto err;
174b455d261SGowrishankar Muthukrishnan 
175b455d261SGowrishankar Muthukrishnan 	k = BN_new();
176b455d261SGowrishankar Muthukrishnan 	if (!k)
177b455d261SGowrishankar Muthukrishnan 		goto err;
178b455d261SGowrishankar Muthukrishnan 
179b455d261SGowrishankar Muthukrishnan 	if (!BN_sub(k, pkey, BN_value_one()))
180b455d261SGowrishankar Muthukrishnan 		goto err;
181b455d261SGowrishankar Muthukrishnan 
182b455d261SGowrishankar Muthukrishnan 	if (BN_is_zero(pkey)) {
183b455d261SGowrishankar Muthukrishnan 		if (!BN_add(k, pkey, BN_value_one()))
184b455d261SGowrishankar Muthukrishnan 			goto err;
185b455d261SGowrishankar Muthukrishnan 	}
186b455d261SGowrishankar Muthukrishnan 
187b455d261SGowrishankar Muthukrishnan 	parse_uint8_hex_str("", BN_bn2hex(k), &vec.ecdsa.k);
188b455d261SGowrishankar Muthukrishnan 	ret = 0;
189b455d261SGowrishankar Muthukrishnan err:
190b455d261SGowrishankar Muthukrishnan 	BN_free(pkey);
191b455d261SGowrishankar Muthukrishnan 	BN_free(k);
192b455d261SGowrishankar Muthukrishnan 	return ret;
193b455d261SGowrishankar Muthukrishnan }
194b455d261SGowrishankar Muthukrishnan 
195b455d261SGowrishankar Muthukrishnan #else
196b455d261SGowrishankar Muthukrishnan static int
197b455d261SGowrishankar Muthukrishnan prepare_vec_ecdsa(void)
198b455d261SGowrishankar Muthukrishnan {
199b455d261SGowrishankar Muthukrishnan 	/*
200b455d261SGowrishankar Muthukrishnan 	 * Generate ECDSA values.
201b455d261SGowrishankar Muthukrishnan 	 */
202b455d261SGowrishankar Muthukrishnan 	return -ENOTSUP;
203b455d261SGowrishankar Muthukrishnan }
204b455d261SGowrishankar Muthukrishnan 
205b455d261SGowrishankar Muthukrishnan static int
206b455d261SGowrishankar Muthukrishnan prepare_vec_ecdsa_k(void)
207b455d261SGowrishankar Muthukrishnan {
208b455d261SGowrishankar Muthukrishnan 	/*
209b455d261SGowrishankar Muthukrishnan 	 * Generate ECDSA values.
210b455d261SGowrishankar Muthukrishnan 	 */
211b455d261SGowrishankar Muthukrishnan 	return -ENOTSUP;
212b455d261SGowrishankar Muthukrishnan }
213b455d261SGowrishankar Muthukrishnan #endif /* USE_OPENSSL */
214b455d261SGowrishankar Muthukrishnan 
215b455d261SGowrishankar Muthukrishnan static int
216b455d261SGowrishankar Muthukrishnan parse_test_ecdsa_json_interim_writeback(struct fips_val *val)
217b455d261SGowrishankar Muthukrishnan {
218b455d261SGowrishankar Muthukrishnan 	RTE_SET_USED(val);
219b455d261SGowrishankar Muthukrishnan 
220b455d261SGowrishankar Muthukrishnan 	if (info.interim_info.ecdsa_data.random_msg) {
221b455d261SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_group, "conformance",
222b455d261SGowrishankar Muthukrishnan 							json_string("SP800-106"));
223b455d261SGowrishankar Muthukrishnan 	}
224b455d261SGowrishankar Muthukrishnan 
225b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
226b455d261SGowrishankar Muthukrishnan 		/* For siggen tests, ECDSA values can be created soon after
227b455d261SGowrishankar Muthukrishnan 		 * the test group data are parsed.
228b455d261SGowrishankar Muthukrishnan 		 */
229b455d261SGowrishankar Muthukrishnan 		if (vec.ecdsa.pkey.val) {
230b455d261SGowrishankar Muthukrishnan 			rte_free(vec.ecdsa.pkey.val);
231b455d261SGowrishankar Muthukrishnan 			vec.ecdsa.pkey.val = NULL;
232b455d261SGowrishankar Muthukrishnan 		}
233b455d261SGowrishankar Muthukrishnan 
234b455d261SGowrishankar Muthukrishnan 		if (prepare_vec_ecdsa() < 0)
235b455d261SGowrishankar Muthukrishnan 			return -1;
236b455d261SGowrishankar Muthukrishnan 
237b455d261SGowrishankar Muthukrishnan 		info.interim_info.ecdsa_data.pubkey_gen = 1;
238b455d261SGowrishankar Muthukrishnan 	}
239b455d261SGowrishankar Muthukrishnan 
240b455d261SGowrishankar Muthukrishnan 	return 0;
241b455d261SGowrishankar Muthukrishnan }
242b455d261SGowrishankar Muthukrishnan 
243b455d261SGowrishankar Muthukrishnan static int
244b455d261SGowrishankar Muthukrishnan post_test_ecdsa_json_interim_writeback(struct fips_val *val)
245b455d261SGowrishankar Muthukrishnan {
246b455d261SGowrishankar Muthukrishnan 	RTE_SET_USED(val);
247b455d261SGowrishankar Muthukrishnan 
248b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_KEYGEN) {
249b455d261SGowrishankar Muthukrishnan 		json_t *obj;
250b455d261SGowrishankar Muthukrishnan 
251b455d261SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.ecdsa.qx);
252b455d261SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
253b455d261SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_group, "qx", obj);
254b455d261SGowrishankar Muthukrishnan 
255b455d261SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.ecdsa.qy);
256b455d261SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
257b455d261SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_group, "qy", obj);
258b455d261SGowrishankar Muthukrishnan 	}
259b455d261SGowrishankar Muthukrishnan 
260b455d261SGowrishankar Muthukrishnan 	return 0;
261b455d261SGowrishankar Muthukrishnan }
262b455d261SGowrishankar Muthukrishnan 
263b455d261SGowrishankar Muthukrishnan static int
264b455d261SGowrishankar Muthukrishnan parse_test_ecdsa_json_writeback(struct fips_val *val)
265b455d261SGowrishankar Muthukrishnan {
266b455d261SGowrishankar Muthukrishnan 	json_t *tcId;
267b455d261SGowrishankar Muthukrishnan 
268b455d261SGowrishankar Muthukrishnan 	RTE_SET_USED(val);
269b455d261SGowrishankar Muthukrishnan 
270b455d261SGowrishankar Muthukrishnan 	tcId = json_object_get(json_info.json_test_case, "tcId");
271b455d261SGowrishankar Muthukrishnan 
272b455d261SGowrishankar Muthukrishnan 	json_info.json_write_case = json_object();
273b455d261SGowrishankar Muthukrishnan 	json_object_set(json_info.json_write_case, "tcId", tcId);
274b455d261SGowrishankar Muthukrishnan 
275b455d261SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
276b455d261SGowrishankar Muthukrishnan 		json_t *obj;
277b455d261SGowrishankar Muthukrishnan 
278b455d261SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.ecdsa.r);
279b455d261SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
280b455d261SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "r", obj);
281b455d261SGowrishankar Muthukrishnan 
282b455d261SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.ecdsa.s);
283b455d261SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
284b455d261SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "s", obj);
285b455d261SGowrishankar Muthukrishnan 
286b455d261SGowrishankar Muthukrishnan 		if (info.interim_info.ecdsa_data.random_msg) {
287b455d261SGowrishankar Muthukrishnan 			writeback_hex_str("", info.one_line_text, &vec.ecdsa.seed);
288b455d261SGowrishankar Muthukrishnan 			obj = json_string(info.one_line_text);
289b455d261SGowrishankar Muthukrishnan 			json_object_set_new(json_info.json_write_case, "randomValue", obj);
290b455d261SGowrishankar Muthukrishnan 			json_object_set_new(json_info.json_write_case, "randomValueLen",
291b455d261SGowrishankar Muthukrishnan 				json_integer(vec.ecdsa.seed.len * 8));
292b455d261SGowrishankar Muthukrishnan 		}
293b455d261SGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGVER) {
294b455d261SGowrishankar Muthukrishnan 		if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS)
295b455d261SGowrishankar Muthukrishnan 			json_object_set_new(json_info.json_write_case, "testPassed", json_true());
296b455d261SGowrishankar Muthukrishnan 		else
297b455d261SGowrishankar Muthukrishnan 			json_object_set_new(json_info.json_write_case, "testPassed", json_false());
298*a22a5228SGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_KEYGEN) {
299*a22a5228SGowrishankar Muthukrishnan 		json_t *obj;
300*a22a5228SGowrishankar Muthukrishnan 
301*a22a5228SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.ecdsa.pkey);
302*a22a5228SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
303*a22a5228SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "d", obj);
304*a22a5228SGowrishankar Muthukrishnan 
305*a22a5228SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.ecdsa.qx);
306*a22a5228SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
307*a22a5228SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "qx", obj);
308*a22a5228SGowrishankar Muthukrishnan 
309*a22a5228SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.ecdsa.qy);
310*a22a5228SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
311*a22a5228SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "qy", obj);
312b455d261SGowrishankar Muthukrishnan 	}
313b455d261SGowrishankar Muthukrishnan 
314b455d261SGowrishankar Muthukrishnan 	return 0;
315b455d261SGowrishankar Muthukrishnan }
316b455d261SGowrishankar Muthukrishnan 
317b455d261SGowrishankar Muthukrishnan static int
318b455d261SGowrishankar Muthukrishnan parse_interim_str(const char *key, char *src, struct fips_val *val)
319b455d261SGowrishankar Muthukrishnan {
320b455d261SGowrishankar Muthukrishnan 	uint32_t i;
321b455d261SGowrishankar Muthukrishnan 
322b455d261SGowrishankar Muthukrishnan 	RTE_SET_USED(val);
323b455d261SGowrishankar Muthukrishnan 
324b455d261SGowrishankar Muthukrishnan 	if (strcmp(key, TESTTYPE_JSON_STR) == 0) {
325b455d261SGowrishankar Muthukrishnan 		for (i = 0; i < RTE_DIM(ecdsa_test_types); i++)
326b455d261SGowrishankar Muthukrishnan 			if (strstr(src, ecdsa_test_types[i].desc)) {
327b455d261SGowrishankar Muthukrishnan 				info.parse_writeback = parse_test_ecdsa_json_writeback;
328b455d261SGowrishankar Muthukrishnan 				break;
329b455d261SGowrishankar Muthukrishnan 			}
330b455d261SGowrishankar Muthukrishnan 
331b455d261SGowrishankar Muthukrishnan 		if (!info.parse_writeback || i >= RTE_DIM(ecdsa_test_types))
332b455d261SGowrishankar Muthukrishnan 			return -EINVAL;
333b455d261SGowrishankar Muthukrishnan 
334b455d261SGowrishankar Muthukrishnan 	} else if (strcmp(key, CURVE_JSON_STR) == 0) {
335b455d261SGowrishankar Muthukrishnan 		for (i = 0; i < RTE_DIM(ecdsa_curve_ids); i++)
336b455d261SGowrishankar Muthukrishnan 			if (strstr(src, ecdsa_curve_ids[i].desc)) {
337b455d261SGowrishankar Muthukrishnan 				info.interim_info.ecdsa_data.curve_id = ecdsa_curve_ids[i].curve_id;
338b455d261SGowrishankar Muthukrishnan 				info.interim_info.ecdsa_data.curve_len =
339b455d261SGowrishankar Muthukrishnan 					ecdsa_curve_len[i].curve_len;
340b455d261SGowrishankar Muthukrishnan 				break;
341b455d261SGowrishankar Muthukrishnan 			}
342b455d261SGowrishankar Muthukrishnan 
343b455d261SGowrishankar Muthukrishnan 		if (i >= RTE_DIM(ecdsa_curve_ids))
344b455d261SGowrishankar Muthukrishnan 			return -EINVAL;
345b455d261SGowrishankar Muthukrishnan 	} else if (strcmp(key, HASH_JSON_STR) == 0) {
346b455d261SGowrishankar Muthukrishnan 		for (i = 0; i < RTE_DIM(ecdsa_auth_algs); i++)
347b455d261SGowrishankar Muthukrishnan 			if (strstr(src, ecdsa_auth_algs[i].desc)) {
348b455d261SGowrishankar Muthukrishnan 				info.interim_info.ecdsa_data.auth = ecdsa_auth_algs[i].auth;
349b455d261SGowrishankar Muthukrishnan 				break;
350b455d261SGowrishankar Muthukrishnan 			}
351b455d261SGowrishankar Muthukrishnan 
352b455d261SGowrishankar Muthukrishnan 		if (i >= RTE_DIM(ecdsa_auth_algs))
353b455d261SGowrishankar Muthukrishnan 			return -EINVAL;
354b455d261SGowrishankar Muthukrishnan 	} else if (strcmp(key, CONFORMANCE_JSON_STR) == 0) {
355b455d261SGowrishankar Muthukrishnan 		info.interim_info.ecdsa_data.random_msg = 1;
356b455d261SGowrishankar Muthukrishnan 	} else {
357b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
358b455d261SGowrishankar Muthukrishnan 	}
359b455d261SGowrishankar Muthukrishnan 
360b455d261SGowrishankar Muthukrishnan 	return 0;
361b455d261SGowrishankar Muthukrishnan }
362b455d261SGowrishankar Muthukrishnan 
363b455d261SGowrishankar Muthukrishnan static int
364b455d261SGowrishankar Muthukrishnan parse_siggen_message_str(const char *key, char *src, struct fips_val *val)
365b455d261SGowrishankar Muthukrishnan {
366b455d261SGowrishankar Muthukrishnan 	int ret = 0;
367b455d261SGowrishankar Muthukrishnan 
368b455d261SGowrishankar Muthukrishnan 	parse_uint8_hex_str(key, src, val);
369b455d261SGowrishankar Muthukrishnan 	if (info.interim_info.ecdsa_data.random_msg) {
370b455d261SGowrishankar Muthukrishnan 		ret = fips_test_randomize_message(val, &vec.ecdsa.seed);
371b455d261SGowrishankar Muthukrishnan 		if (ret < 0)
372b455d261SGowrishankar Muthukrishnan 			return ret;
373b455d261SGowrishankar Muthukrishnan 	}
374b455d261SGowrishankar Muthukrishnan 
375b455d261SGowrishankar Muthukrishnan 	if (vec.ecdsa.k.val) {
376b455d261SGowrishankar Muthukrishnan 		rte_free(vec.ecdsa.k.val);
377b455d261SGowrishankar Muthukrishnan 		vec.ecdsa.k.val = NULL;
378b455d261SGowrishankar Muthukrishnan 	}
379b455d261SGowrishankar Muthukrishnan 
380b455d261SGowrishankar Muthukrishnan 	ret = prepare_vec_ecdsa_k();
381b455d261SGowrishankar Muthukrishnan 	return ret;
382b455d261SGowrishankar Muthukrishnan }
383b455d261SGowrishankar Muthukrishnan 
384b455d261SGowrishankar Muthukrishnan static int
385*a22a5228SGowrishankar Muthukrishnan parse_keygen_tc_str(const char *key, char *src, struct fips_val *val)
386*a22a5228SGowrishankar Muthukrishnan {
387*a22a5228SGowrishankar Muthukrishnan 	RTE_SET_USED(key);
388*a22a5228SGowrishankar Muthukrishnan 	RTE_SET_USED(src);
389*a22a5228SGowrishankar Muthukrishnan 	RTE_SET_USED(val);
390*a22a5228SGowrishankar Muthukrishnan 
391*a22a5228SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_KEYGEN) {
392*a22a5228SGowrishankar Muthukrishnan 		if (vec.ecdsa.pkey.val) {
393*a22a5228SGowrishankar Muthukrishnan 			rte_free(vec.ecdsa.pkey.val);
394*a22a5228SGowrishankar Muthukrishnan 			vec.ecdsa.pkey.val = NULL;
395*a22a5228SGowrishankar Muthukrishnan 		}
396*a22a5228SGowrishankar Muthukrishnan 
397*a22a5228SGowrishankar Muthukrishnan 		if (vec.ecdsa.k.val) {
398*a22a5228SGowrishankar Muthukrishnan 			rte_free(vec.ecdsa.k.val);
399*a22a5228SGowrishankar Muthukrishnan 			vec.ecdsa.k.val = NULL;
400*a22a5228SGowrishankar Muthukrishnan 		}
401*a22a5228SGowrishankar Muthukrishnan 
402*a22a5228SGowrishankar Muthukrishnan 		if (prepare_vec_ecdsa() < 0)
403*a22a5228SGowrishankar Muthukrishnan 			return -1;
404*a22a5228SGowrishankar Muthukrishnan 
405*a22a5228SGowrishankar Muthukrishnan 		if (prepare_vec_ecdsa_k() < 0)
406*a22a5228SGowrishankar Muthukrishnan 			return -1;
407*a22a5228SGowrishankar Muthukrishnan 
408*a22a5228SGowrishankar Muthukrishnan 		info.interim_info.ecdsa_data.pubkey_gen = 1;
409*a22a5228SGowrishankar Muthukrishnan 	}
410*a22a5228SGowrishankar Muthukrishnan 
411*a22a5228SGowrishankar Muthukrishnan 	return 0;
412*a22a5228SGowrishankar Muthukrishnan }
413*a22a5228SGowrishankar Muthukrishnan 
414*a22a5228SGowrishankar Muthukrishnan static int
415b455d261SGowrishankar Muthukrishnan parse_sigver_randomvalue_str(const char *key, char *src, struct fips_val *val)
416b455d261SGowrishankar Muthukrishnan {
417b455d261SGowrishankar Muthukrishnan 	int ret = 0;
418b455d261SGowrishankar Muthukrishnan 
419b455d261SGowrishankar Muthukrishnan 	parse_uint8_hex_str(key, src, val);
420b455d261SGowrishankar Muthukrishnan 	if (info.interim_info.ecdsa_data.random_msg)
421b455d261SGowrishankar Muthukrishnan 		ret = fips_test_randomize_message(&vec.pt, val);
422b455d261SGowrishankar Muthukrishnan 
423b455d261SGowrishankar Muthukrishnan 	return ret;
424b455d261SGowrishankar Muthukrishnan }
425b455d261SGowrishankar Muthukrishnan 
426b455d261SGowrishankar Muthukrishnan struct fips_test_callback ecdsa_interim_json_vectors[] = {
427b455d261SGowrishankar Muthukrishnan 		{TESTTYPE_JSON_STR, parse_interim_str, NULL},
428b455d261SGowrishankar Muthukrishnan 		{CURVE_JSON_STR, parse_interim_str, NULL},
429b455d261SGowrishankar Muthukrishnan 		{HASH_JSON_STR, parse_interim_str, NULL},
430b455d261SGowrishankar Muthukrishnan 		{CONFORMANCE_JSON_STR, parse_interim_str, NULL},
431b455d261SGowrishankar Muthukrishnan 		{NULL, NULL, NULL} /**< end pointer */
432b455d261SGowrishankar Muthukrishnan };
433b455d261SGowrishankar Muthukrishnan 
434b455d261SGowrishankar Muthukrishnan struct fips_test_callback ecdsa_siggen_json_vectors[] = {
435b455d261SGowrishankar Muthukrishnan 		{MSG_JSON_STR, parse_siggen_message_str, &vec.pt},
436b455d261SGowrishankar Muthukrishnan 		{NULL, NULL, NULL} /**< end pointer */
437b455d261SGowrishankar Muthukrishnan };
438b455d261SGowrishankar Muthukrishnan 
439b455d261SGowrishankar Muthukrishnan struct fips_test_callback ecdsa_sigver_json_vectors[] = {
440b455d261SGowrishankar Muthukrishnan 		{MSG_JSON_STR, parse_uint8_hex_str, &vec.pt},
441b455d261SGowrishankar Muthukrishnan 		{QX_JSON_STR, parse_uint8_hex_str, &vec.ecdsa.qx},
442b455d261SGowrishankar Muthukrishnan 		{QY_JSON_STR, parse_uint8_hex_str, &vec.ecdsa.qy},
443b455d261SGowrishankar Muthukrishnan 		{R_JSON_STR, parse_uint8_hex_str, &vec.ecdsa.r},
444b455d261SGowrishankar Muthukrishnan 		{S_JSON_STR, parse_uint8_hex_str, &vec.ecdsa.s},
445b455d261SGowrishankar Muthukrishnan 		{RV_JSON_STR, parse_sigver_randomvalue_str, &vec.ecdsa.seed},
446b455d261SGowrishankar Muthukrishnan 		{NULL, NULL, NULL} /**< end pointer */
447b455d261SGowrishankar Muthukrishnan };
448b455d261SGowrishankar Muthukrishnan 
449*a22a5228SGowrishankar Muthukrishnan struct fips_test_callback ecdsa_keygen_json_vectors[] = {
450*a22a5228SGowrishankar Muthukrishnan 		{"tcId", parse_keygen_tc_str, &vec.pt},
451*a22a5228SGowrishankar Muthukrishnan 		{NULL, NULL, NULL} /**< end pointer */
452*a22a5228SGowrishankar Muthukrishnan };
453*a22a5228SGowrishankar Muthukrishnan 
454b455d261SGowrishankar Muthukrishnan int
455b455d261SGowrishankar Muthukrishnan parse_test_ecdsa_json_init(void)
456b455d261SGowrishankar Muthukrishnan {
457b455d261SGowrishankar Muthukrishnan 	json_t *mode_obj = json_object_get(json_info.json_vector_set, "mode");
458b455d261SGowrishankar Muthukrishnan 	const char *mode_str = json_string_value(mode_obj);
459b455d261SGowrishankar Muthukrishnan 
460b455d261SGowrishankar Muthukrishnan 	info.callbacks = NULL;
461b455d261SGowrishankar Muthukrishnan 	info.parse_writeback = NULL;
462b455d261SGowrishankar Muthukrishnan 	info.interim_info.ecdsa_data.random_msg = 0;
463b455d261SGowrishankar Muthukrishnan 
464b455d261SGowrishankar Muthukrishnan 	info.interim_callbacks = ecdsa_interim_json_vectors;
465b455d261SGowrishankar Muthukrishnan 	info.post_interim_writeback = post_test_ecdsa_json_interim_writeback;
466b455d261SGowrishankar Muthukrishnan 	info.parse_interim_writeback = parse_test_ecdsa_json_interim_writeback;
467b455d261SGowrishankar Muthukrishnan 	if (strcmp(mode_str, "sigGen") == 0) {
468b455d261SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_SIGGEN;
469b455d261SGowrishankar Muthukrishnan 		info.callbacks = ecdsa_siggen_json_vectors;
470b455d261SGowrishankar Muthukrishnan 	} else if (strcmp(mode_str, "sigVer") == 0) {
471b455d261SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_SIGVER;
472b455d261SGowrishankar Muthukrishnan 		info.callbacks = ecdsa_sigver_json_vectors;
473*a22a5228SGowrishankar Muthukrishnan 	} else if (strcmp(mode_str, "keyGen") == 0) {
474*a22a5228SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_KEYGEN;
475*a22a5228SGowrishankar Muthukrishnan 		info.callbacks = ecdsa_keygen_json_vectors;
476b455d261SGowrishankar Muthukrishnan 	} else {
477b455d261SGowrishankar Muthukrishnan 		return -EINVAL;
478b455d261SGowrishankar Muthukrishnan 	}
479b455d261SGowrishankar Muthukrishnan 
480b455d261SGowrishankar Muthukrishnan 	return 0;
481b455d261SGowrishankar Muthukrishnan }
482b455d261SGowrishankar Muthukrishnan #endif /* USE_JANSSON */
483