xref: /dpdk/examples/fips_validation/fips_validation_rsa.c (revision 36128a67c27ecb83425a793b2eb837e0581692e7)
1*36128a67SGowrishankar Muthukrishnan /* SPDX-License-Identifier: BSD-3-Clause
2*36128a67SGowrishankar Muthukrishnan  * Copyright(C) 2022 Marvell.
3*36128a67SGowrishankar Muthukrishnan  */
4*36128a67SGowrishankar Muthukrishnan 
5*36128a67SGowrishankar Muthukrishnan #include <string.h>
6*36128a67SGowrishankar Muthukrishnan #include <time.h>
7*36128a67SGowrishankar Muthukrishnan #include <stdio.h>
8*36128a67SGowrishankar Muthukrishnan #include <sys/types.h>
9*36128a67SGowrishankar Muthukrishnan #include <unistd.h>
10*36128a67SGowrishankar Muthukrishnan 
11*36128a67SGowrishankar Muthukrishnan #ifdef USE_OPENSSL
12*36128a67SGowrishankar Muthukrishnan #include <openssl/bn.h>
13*36128a67SGowrishankar Muthukrishnan #include <openssl/rand.h>
14*36128a67SGowrishankar Muthukrishnan #endif /* USE_OPENSSL */
15*36128a67SGowrishankar Muthukrishnan 
16*36128a67SGowrishankar Muthukrishnan #include <rte_cryptodev.h>
17*36128a67SGowrishankar Muthukrishnan #include <rte_malloc.h>
18*36128a67SGowrishankar Muthukrishnan 
19*36128a67SGowrishankar Muthukrishnan #include "fips_validation.h"
20*36128a67SGowrishankar Muthukrishnan 
21*36128a67SGowrishankar Muthukrishnan #define TESTTYPE_JSON_STR	"testType"
22*36128a67SGowrishankar Muthukrishnan #define SIGTYPE_JSON_STR "sigType"
23*36128a67SGowrishankar Muthukrishnan #define MOD_JSON_STR	"modulo"
24*36128a67SGowrishankar Muthukrishnan #define HASH_JSON_STR	"hashAlg"
25*36128a67SGowrishankar Muthukrishnan #define SALT_JSON_STR	"saltLen"
26*36128a67SGowrishankar Muthukrishnan #define E_JSON_STR	"e"
27*36128a67SGowrishankar Muthukrishnan #define N_JSON_STR	"n"
28*36128a67SGowrishankar Muthukrishnan 
29*36128a67SGowrishankar Muthukrishnan #define SEED_JSON_STR	"seed"
30*36128a67SGowrishankar Muthukrishnan #define MSG_JSON_STR	"message"
31*36128a67SGowrishankar Muthukrishnan #define SIG_JSON_STR	"signature"
32*36128a67SGowrishankar Muthukrishnan 
33*36128a67SGowrishankar Muthukrishnan #ifdef USE_JANSSON
34*36128a67SGowrishankar Muthukrishnan struct {
35*36128a67SGowrishankar Muthukrishnan 	uint8_t type;
36*36128a67SGowrishankar Muthukrishnan 	const char *desc;
37*36128a67SGowrishankar Muthukrishnan } rsa_test_types[] = {
38*36128a67SGowrishankar Muthukrishnan 		{RSA_AFT, "AFT"},
39*36128a67SGowrishankar Muthukrishnan 		{RSA_GDT, "GDT"},
40*36128a67SGowrishankar Muthukrishnan 		{RSA_KAT, "KAT"},
41*36128a67SGowrishankar Muthukrishnan };
42*36128a67SGowrishankar Muthukrishnan 
43*36128a67SGowrishankar Muthukrishnan struct {
44*36128a67SGowrishankar Muthukrishnan 	enum rte_crypto_auth_algorithm auth;
45*36128a67SGowrishankar Muthukrishnan 	const char *desc;
46*36128a67SGowrishankar Muthukrishnan } rsa_auth_algs[] = {
47*36128a67SGowrishankar Muthukrishnan 		{RTE_CRYPTO_AUTH_SHA1, "SHA-1"},
48*36128a67SGowrishankar Muthukrishnan 		{RTE_CRYPTO_AUTH_SHA224, "SHA2-224"},
49*36128a67SGowrishankar Muthukrishnan 		{RTE_CRYPTO_AUTH_SHA256, "SHA2-256"},
50*36128a67SGowrishankar Muthukrishnan 		{RTE_CRYPTO_AUTH_SHA384, "SHA2-384"},
51*36128a67SGowrishankar Muthukrishnan 		{RTE_CRYPTO_AUTH_SHA512, "SHA2-512"},
52*36128a67SGowrishankar Muthukrishnan };
53*36128a67SGowrishankar Muthukrishnan 
54*36128a67SGowrishankar Muthukrishnan struct {
55*36128a67SGowrishankar Muthukrishnan 	enum rte_crypto_rsa_padding_type padding;
56*36128a67SGowrishankar Muthukrishnan 	const char *desc;
57*36128a67SGowrishankar Muthukrishnan } rsa_padding_types[] = {
58*36128a67SGowrishankar Muthukrishnan 		{RTE_CRYPTO_RSA_PADDING_NONE, "none"},
59*36128a67SGowrishankar Muthukrishnan 		{RTE_CRYPTO_RSA_PADDING_PKCS1_5, "pkcs1v1.5"},
60*36128a67SGowrishankar Muthukrishnan 		{RTE_CRYPTO_RSA_PADDING_OAEP, "oaep"},
61*36128a67SGowrishankar Muthukrishnan 		{RTE_CRYPTO_RSA_PADDING_PSS, "pss"},
62*36128a67SGowrishankar Muthukrishnan };
63*36128a67SGowrishankar Muthukrishnan 
64*36128a67SGowrishankar Muthukrishnan #ifdef USE_OPENSSL
65*36128a67SGowrishankar Muthukrishnan static int
66*36128a67SGowrishankar Muthukrishnan prepare_vec_rsa(void)
67*36128a67SGowrishankar Muthukrishnan {
68*36128a67SGowrishankar Muthukrishnan 	BIGNUM *p = NULL, *q = NULL, *n = NULL, *d = NULL, *e = NULL;
69*36128a67SGowrishankar Muthukrishnan 	BIGNUM *dp = NULL, *dq = NULL, *qinv = NULL;
70*36128a67SGowrishankar Muthukrishnan 	BIGNUM *r0, *r1, *r2, *r3, *r4;
71*36128a67SGowrishankar Muthukrishnan 	BIGNUM *m = NULL, *r = NULL;
72*36128a67SGowrishankar Muthukrishnan 	int bits, ret = -1, i;
73*36128a67SGowrishankar Muthukrishnan 	char modbuf[8], *buf;
74*36128a67SGowrishankar Muthukrishnan 	BN_CTX *ctx = NULL;
75*36128a67SGowrishankar Muthukrishnan 	unsigned long pid;
76*36128a67SGowrishankar Muthukrishnan 
77*36128a67SGowrishankar Muthukrishnan 	/* Seed PRNG */
78*36128a67SGowrishankar Muthukrishnan 	if (vec.rsa.seed.val) {
79*36128a67SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.rsa.seed);
80*36128a67SGowrishankar Muthukrishnan 		RAND_seed((char *)info.one_line_text, strlen(info.one_line_text));
81*36128a67SGowrishankar Muthukrishnan 	} else {
82*36128a67SGowrishankar Muthukrishnan 		pid = getpid();
83*36128a67SGowrishankar Muthukrishnan 		RAND_seed(&pid, sizeof(pid));
84*36128a67SGowrishankar Muthukrishnan 	}
85*36128a67SGowrishankar Muthukrishnan 
86*36128a67SGowrishankar Muthukrishnan 	if (!RAND_status())
87*36128a67SGowrishankar Muthukrishnan 		return -1;
88*36128a67SGowrishankar Muthukrishnan 
89*36128a67SGowrishankar Muthukrishnan 	/* Check if e is known already */
90*36128a67SGowrishankar Muthukrishnan 	if (vec.rsa.e.val) {
91*36128a67SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.rsa.e);
92*36128a67SGowrishankar Muthukrishnan 		ret = BN_hex2bn(&e, info.one_line_text);
93*36128a67SGowrishankar Muthukrishnan 		if ((uint32_t)ret != strlen(info.one_line_text))
94*36128a67SGowrishankar Muthukrishnan 			goto err;
95*36128a67SGowrishankar Muthukrishnan 	}
96*36128a67SGowrishankar Muthukrishnan 
97*36128a67SGowrishankar Muthukrishnan 	/* BN context initialization */
98*36128a67SGowrishankar Muthukrishnan 	ctx = BN_CTX_new();
99*36128a67SGowrishankar Muthukrishnan 	if (!ctx)
100*36128a67SGowrishankar Muthukrishnan 		goto err;
101*36128a67SGowrishankar Muthukrishnan 
102*36128a67SGowrishankar Muthukrishnan 	BN_CTX_start(ctx);
103*36128a67SGowrishankar Muthukrishnan 	r0 = BN_CTX_get(ctx);
104*36128a67SGowrishankar Muthukrishnan 	r1 = BN_CTX_get(ctx);
105*36128a67SGowrishankar Muthukrishnan 	r2 = BN_CTX_get(ctx);
106*36128a67SGowrishankar Muthukrishnan 	r3 = BN_CTX_get(ctx);
107*36128a67SGowrishankar Muthukrishnan 	r4 = BN_CTX_get(ctx);
108*36128a67SGowrishankar Muthukrishnan 	if (!r4)
109*36128a67SGowrishankar Muthukrishnan 		goto err;
110*36128a67SGowrishankar Muthukrishnan 
111*36128a67SGowrishankar Muthukrishnan 	/* Calculate bit length for prime numbers */
112*36128a67SGowrishankar Muthukrishnan 	m = BN_new();
113*36128a67SGowrishankar Muthukrishnan 	if (!m)
114*36128a67SGowrishankar Muthukrishnan 		goto err;
115*36128a67SGowrishankar Muthukrishnan 
116*36128a67SGowrishankar Muthukrishnan 	snprintf(modbuf, sizeof(modbuf), "%d", info.interim_info.rsa_data.modulo);
117*36128a67SGowrishankar Muthukrishnan 	if (!BN_dec2bn(&m, modbuf))
118*36128a67SGowrishankar Muthukrishnan 		goto err;
119*36128a67SGowrishankar Muthukrishnan 
120*36128a67SGowrishankar Muthukrishnan 	r = BN_new();
121*36128a67SGowrishankar Muthukrishnan 	if (!r)
122*36128a67SGowrishankar Muthukrishnan 		goto err;
123*36128a67SGowrishankar Muthukrishnan 
124*36128a67SGowrishankar Muthukrishnan 	if (!BN_rshift1(r, m))
125*36128a67SGowrishankar Muthukrishnan 		goto err;
126*36128a67SGowrishankar Muthukrishnan 
127*36128a67SGowrishankar Muthukrishnan 	buf = BN_bn2dec(r);
128*36128a67SGowrishankar Muthukrishnan 	bits = atoi(buf);
129*36128a67SGowrishankar Muthukrishnan 
130*36128a67SGowrishankar Muthukrishnan 	p = BN_new();
131*36128a67SGowrishankar Muthukrishnan 	if (!p)
132*36128a67SGowrishankar Muthukrishnan 		goto err;
133*36128a67SGowrishankar Muthukrishnan 
134*36128a67SGowrishankar Muthukrishnan 	q = BN_new();
135*36128a67SGowrishankar Muthukrishnan 	if (!q)
136*36128a67SGowrishankar Muthukrishnan 		goto err;
137*36128a67SGowrishankar Muthukrishnan 
138*36128a67SGowrishankar Muthukrishnan 	n = BN_new();
139*36128a67SGowrishankar Muthukrishnan 	if (!n)
140*36128a67SGowrishankar Muthukrishnan 		goto err;
141*36128a67SGowrishankar Muthukrishnan 
142*36128a67SGowrishankar Muthukrishnan 	d = BN_new();
143*36128a67SGowrishankar Muthukrishnan 	if (!d)
144*36128a67SGowrishankar Muthukrishnan 		goto err;
145*36128a67SGowrishankar Muthukrishnan 
146*36128a67SGowrishankar Muthukrishnan 	/* Generate p and q suitably for RSA */
147*36128a67SGowrishankar Muthukrishnan 	for (i = 0; i < 10; i++) {
148*36128a67SGowrishankar Muthukrishnan 		uint8_t j = 0;
149*36128a67SGowrishankar Muthukrishnan 
150*36128a67SGowrishankar Muthukrishnan 		if (!BN_generate_prime_ex(p, bits, 0, NULL, NULL, NULL))
151*36128a67SGowrishankar Muthukrishnan 			goto err;
152*36128a67SGowrishankar Muthukrishnan 
153*36128a67SGowrishankar Muthukrishnan 		do {
154*36128a67SGowrishankar Muthukrishnan 			RAND_add(&j, sizeof(j), 1);
155*36128a67SGowrishankar Muthukrishnan 			if (!BN_generate_prime_ex(q, bits, 0, NULL, NULL, NULL))
156*36128a67SGowrishankar Muthukrishnan 				goto err;
157*36128a67SGowrishankar Muthukrishnan 
158*36128a67SGowrishankar Muthukrishnan 		} while ((BN_cmp(p, q) == 0) && (j++ < 100));
159*36128a67SGowrishankar Muthukrishnan 
160*36128a67SGowrishankar Muthukrishnan 		if (j >= 100) {
161*36128a67SGowrishankar Muthukrishnan 			RTE_LOG(ERR, USER1, "Error: insufficient %d retries to generate q", j);
162*36128a67SGowrishankar Muthukrishnan 			goto err;
163*36128a67SGowrishankar Muthukrishnan 		}
164*36128a67SGowrishankar Muthukrishnan 
165*36128a67SGowrishankar Muthukrishnan 		/* pq */
166*36128a67SGowrishankar Muthukrishnan 		if (!BN_mul(n, p, q, ctx))
167*36128a67SGowrishankar Muthukrishnan 			goto err;
168*36128a67SGowrishankar Muthukrishnan 
169*36128a67SGowrishankar Muthukrishnan 		/* p-1 */
170*36128a67SGowrishankar Muthukrishnan 		if (!BN_sub(r1, p, BN_value_one()))
171*36128a67SGowrishankar Muthukrishnan 			goto err;
172*36128a67SGowrishankar Muthukrishnan 
173*36128a67SGowrishankar Muthukrishnan 		/* q-1 */
174*36128a67SGowrishankar Muthukrishnan 		if (!BN_sub(r2, q, BN_value_one()))
175*36128a67SGowrishankar Muthukrishnan 			goto err;
176*36128a67SGowrishankar Muthukrishnan 
177*36128a67SGowrishankar Muthukrishnan 		/* (p-1 * q-1) */
178*36128a67SGowrishankar Muthukrishnan 		if (!BN_mul(r0, r1, r2, ctx))
179*36128a67SGowrishankar Muthukrishnan 			goto err;
180*36128a67SGowrishankar Muthukrishnan 
181*36128a67SGowrishankar Muthukrishnan 		/* gcd(p-1, q-1)*/
182*36128a67SGowrishankar Muthukrishnan 		if (!BN_gcd(r3, r1, r2, ctx))
183*36128a67SGowrishankar Muthukrishnan 			goto err;
184*36128a67SGowrishankar Muthukrishnan 
185*36128a67SGowrishankar Muthukrishnan 		/* lcm(p-1, q-1) */
186*36128a67SGowrishankar Muthukrishnan 		if (!BN_div(r4, r, r0, r3, ctx))
187*36128a67SGowrishankar Muthukrishnan 			goto err;
188*36128a67SGowrishankar Muthukrishnan 
189*36128a67SGowrishankar Muthukrishnan 		/* check if div and rem are non-zero */
190*36128a67SGowrishankar Muthukrishnan 		if (!r4 || !r)
191*36128a67SGowrishankar Muthukrishnan 			goto err;
192*36128a67SGowrishankar Muthukrishnan 
193*36128a67SGowrishankar Muthukrishnan 		/* 0 < e < lcm */
194*36128a67SGowrishankar Muthukrishnan 		if (!e) {
195*36128a67SGowrishankar Muthukrishnan 			int k = 0;
196*36128a67SGowrishankar Muthukrishnan 
197*36128a67SGowrishankar Muthukrishnan 			e = BN_new();
198*36128a67SGowrishankar Muthukrishnan 			do {
199*36128a67SGowrishankar Muthukrishnan 				RAND_add(&k, sizeof(k), 1);
200*36128a67SGowrishankar Muthukrishnan 				if (!BN_rand(e, 32, 1, 1))
201*36128a67SGowrishankar Muthukrishnan 					goto err;
202*36128a67SGowrishankar Muthukrishnan 
203*36128a67SGowrishankar Muthukrishnan 				if (!BN_gcd(r3, e, r4, ctx))
204*36128a67SGowrishankar Muthukrishnan 					goto err;
205*36128a67SGowrishankar Muthukrishnan 
206*36128a67SGowrishankar Muthukrishnan 				if (BN_is_one(r3))
207*36128a67SGowrishankar Muthukrishnan 					break;
208*36128a67SGowrishankar Muthukrishnan 			} while (k++ < 10);
209*36128a67SGowrishankar Muthukrishnan 
210*36128a67SGowrishankar Muthukrishnan 			if (k >= 10) {
211*36128a67SGowrishankar Muthukrishnan 				RTE_LOG(ERR, USER1, "Error: insufficient %d retries to generate e",
212*36128a67SGowrishankar Muthukrishnan 					k);
213*36128a67SGowrishankar Muthukrishnan 				goto err;
214*36128a67SGowrishankar Muthukrishnan 			}
215*36128a67SGowrishankar Muthukrishnan 		}
216*36128a67SGowrishankar Muthukrishnan 
217*36128a67SGowrishankar Muthukrishnan 		/* (de) mod lcm == 1 */
218*36128a67SGowrishankar Muthukrishnan 		if (!BN_mod_inverse(d, e, r4, ctx))
219*36128a67SGowrishankar Muthukrishnan 			goto err;
220*36128a67SGowrishankar Muthukrishnan 
221*36128a67SGowrishankar Muthukrishnan 		if (!BN_gcd(r3, r1, e, ctx))
222*36128a67SGowrishankar Muthukrishnan 			goto err;
223*36128a67SGowrishankar Muthukrishnan 
224*36128a67SGowrishankar Muthukrishnan 		if (!BN_gcd(r4, r2, e, ctx))
225*36128a67SGowrishankar Muthukrishnan 			goto err;
226*36128a67SGowrishankar Muthukrishnan 
227*36128a67SGowrishankar Muthukrishnan 		/* check if gcd(p-1, e) and gcd(q-1, e) are 1 */
228*36128a67SGowrishankar Muthukrishnan 		if (BN_is_one(r3) && BN_is_one(r4))
229*36128a67SGowrishankar Muthukrishnan 			break;
230*36128a67SGowrishankar Muthukrishnan 	}
231*36128a67SGowrishankar Muthukrishnan 
232*36128a67SGowrishankar Muthukrishnan 	if (i >= 10) {
233*36128a67SGowrishankar Muthukrishnan 		RTE_LOG(ERR, USER1, "Error: insufficient %d retries to generate p and q", i);
234*36128a67SGowrishankar Muthukrishnan 		goto err;
235*36128a67SGowrishankar Muthukrishnan 	}
236*36128a67SGowrishankar Muthukrishnan 
237*36128a67SGowrishankar Muthukrishnan 	/* d mod (p-1) */
238*36128a67SGowrishankar Muthukrishnan 	dp = BN_new();
239*36128a67SGowrishankar Muthukrishnan 	if (!dp)
240*36128a67SGowrishankar Muthukrishnan 		goto err;
241*36128a67SGowrishankar Muthukrishnan 
242*36128a67SGowrishankar Muthukrishnan 	if (!BN_mod(dp, d, r1, ctx))
243*36128a67SGowrishankar Muthukrishnan 		goto err;
244*36128a67SGowrishankar Muthukrishnan 
245*36128a67SGowrishankar Muthukrishnan 	/* d mod (q-1) */
246*36128a67SGowrishankar Muthukrishnan 	dq = BN_new();
247*36128a67SGowrishankar Muthukrishnan 	if (!dq)
248*36128a67SGowrishankar Muthukrishnan 		goto err;
249*36128a67SGowrishankar Muthukrishnan 
250*36128a67SGowrishankar Muthukrishnan 	if (!BN_mod(dq, d, r2, ctx))
251*36128a67SGowrishankar Muthukrishnan 		goto err;
252*36128a67SGowrishankar Muthukrishnan 
253*36128a67SGowrishankar Muthukrishnan 	/* modinv of q and p */
254*36128a67SGowrishankar Muthukrishnan 	qinv = BN_new();
255*36128a67SGowrishankar Muthukrishnan 	if (!qinv)
256*36128a67SGowrishankar Muthukrishnan 		goto err;
257*36128a67SGowrishankar Muthukrishnan 
258*36128a67SGowrishankar Muthukrishnan 	if (!BN_mod_inverse(qinv, q, p, ctx))
259*36128a67SGowrishankar Muthukrishnan 		goto err;
260*36128a67SGowrishankar Muthukrishnan 
261*36128a67SGowrishankar Muthukrishnan 	parse_uint8_hex_str("", BN_bn2hex(e), &vec.rsa.e);
262*36128a67SGowrishankar Muthukrishnan 	parse_uint8_hex_str("", BN_bn2hex(p), &vec.rsa.p);
263*36128a67SGowrishankar Muthukrishnan 	parse_uint8_hex_str("", BN_bn2hex(q), &vec.rsa.q);
264*36128a67SGowrishankar Muthukrishnan 	parse_uint8_hex_str("", BN_bn2hex(n), &vec.rsa.n);
265*36128a67SGowrishankar Muthukrishnan 	parse_uint8_hex_str("", BN_bn2hex(d), &vec.rsa.d);
266*36128a67SGowrishankar Muthukrishnan 	parse_uint8_hex_str("", BN_bn2hex(dp), &vec.rsa.dp);
267*36128a67SGowrishankar Muthukrishnan 	parse_uint8_hex_str("", BN_bn2hex(dq), &vec.rsa.dq);
268*36128a67SGowrishankar Muthukrishnan 	parse_uint8_hex_str("", BN_bn2hex(qinv), &vec.rsa.qinv);
269*36128a67SGowrishankar Muthukrishnan 
270*36128a67SGowrishankar Muthukrishnan 	ret = 0;
271*36128a67SGowrishankar Muthukrishnan err:
272*36128a67SGowrishankar Muthukrishnan 	BN_CTX_end(ctx);
273*36128a67SGowrishankar Muthukrishnan 	BN_CTX_free(ctx);
274*36128a67SGowrishankar Muthukrishnan 	BN_free(m);
275*36128a67SGowrishankar Muthukrishnan 	BN_free(r);
276*36128a67SGowrishankar Muthukrishnan 	BN_free(p);
277*36128a67SGowrishankar Muthukrishnan 	BN_free(q);
278*36128a67SGowrishankar Muthukrishnan 	BN_free(n);
279*36128a67SGowrishankar Muthukrishnan 	BN_free(d);
280*36128a67SGowrishankar Muthukrishnan 	BN_free(e);
281*36128a67SGowrishankar Muthukrishnan 	return ret;
282*36128a67SGowrishankar Muthukrishnan }
283*36128a67SGowrishankar Muthukrishnan #else
284*36128a67SGowrishankar Muthukrishnan static int
285*36128a67SGowrishankar Muthukrishnan prepare_vec_rsa(void)
286*36128a67SGowrishankar Muthukrishnan {
287*36128a67SGowrishankar Muthukrishnan 	/*
288*36128a67SGowrishankar Muthukrishnan 	 * Generate RSA values.
289*36128a67SGowrishankar Muthukrishnan 	 */
290*36128a67SGowrishankar Muthukrishnan 	return -ENOTSUP;
291*36128a67SGowrishankar Muthukrishnan }
292*36128a67SGowrishankar Muthukrishnan #endif /* USE_OPENSSL */
293*36128a67SGowrishankar Muthukrishnan 
294*36128a67SGowrishankar Muthukrishnan static int
295*36128a67SGowrishankar Muthukrishnan parse_test_rsa_json_interim_writeback(struct fips_val *val)
296*36128a67SGowrishankar Muthukrishnan {
297*36128a67SGowrishankar Muthukrishnan 	RTE_SET_USED(val);
298*36128a67SGowrishankar Muthukrishnan 
299*36128a67SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_SIGGEN) {
300*36128a67SGowrishankar Muthukrishnan 		json_t *obj;
301*36128a67SGowrishankar Muthukrishnan 
302*36128a67SGowrishankar Muthukrishnan 		/* For siggen tests, RSA values can be created soon after
303*36128a67SGowrishankar Muthukrishnan 		 * the test group data are parsed.
304*36128a67SGowrishankar Muthukrishnan 		 */
305*36128a67SGowrishankar Muthukrishnan 		if (vec.rsa.e.val) {
306*36128a67SGowrishankar Muthukrishnan 			rte_free(vec.rsa.e.val);
307*36128a67SGowrishankar Muthukrishnan 			vec.rsa.e.val = NULL;
308*36128a67SGowrishankar Muthukrishnan 		}
309*36128a67SGowrishankar Muthukrishnan 
310*36128a67SGowrishankar Muthukrishnan 		if (prepare_vec_rsa() < 0)
311*36128a67SGowrishankar Muthukrishnan 			return -1;
312*36128a67SGowrishankar Muthukrishnan 
313*36128a67SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.rsa.n);
314*36128a67SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
315*36128a67SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_group, "n", obj);
316*36128a67SGowrishankar Muthukrishnan 
317*36128a67SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.rsa.e);
318*36128a67SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
319*36128a67SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_group, "e", obj);
320*36128a67SGowrishankar Muthukrishnan 	}
321*36128a67SGowrishankar Muthukrishnan 
322*36128a67SGowrishankar Muthukrishnan 	return 0;
323*36128a67SGowrishankar Muthukrishnan }
324*36128a67SGowrishankar Muthukrishnan 
325*36128a67SGowrishankar Muthukrishnan static int
326*36128a67SGowrishankar Muthukrishnan parse_test_rsa_json_writeback(struct fips_val *val)
327*36128a67SGowrishankar Muthukrishnan {
328*36128a67SGowrishankar Muthukrishnan 	json_t *tcId;
329*36128a67SGowrishankar Muthukrishnan 
330*36128a67SGowrishankar Muthukrishnan 	RTE_SET_USED(val);
331*36128a67SGowrishankar Muthukrishnan 
332*36128a67SGowrishankar Muthukrishnan 	tcId = json_object_get(json_info.json_test_case, "tcId");
333*36128a67SGowrishankar Muthukrishnan 
334*36128a67SGowrishankar Muthukrishnan 	json_info.json_write_case = json_object();
335*36128a67SGowrishankar Muthukrishnan 	json_object_set(json_info.json_write_case, "tcId", tcId);
336*36128a67SGowrishankar Muthukrishnan 
337*36128a67SGowrishankar Muthukrishnan 	if (info.op == FIPS_TEST_ASYM_KEYGEN) {
338*36128a67SGowrishankar Muthukrishnan 		json_t *obj;
339*36128a67SGowrishankar Muthukrishnan 
340*36128a67SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.rsa.seed);
341*36128a67SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
342*36128a67SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "seed", obj);
343*36128a67SGowrishankar Muthukrishnan 
344*36128a67SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.rsa.n);
345*36128a67SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
346*36128a67SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "n", obj);
347*36128a67SGowrishankar Muthukrishnan 
348*36128a67SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.rsa.e);
349*36128a67SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
350*36128a67SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "e", obj);
351*36128a67SGowrishankar Muthukrishnan 
352*36128a67SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.rsa.p);
353*36128a67SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
354*36128a67SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "p", obj);
355*36128a67SGowrishankar Muthukrishnan 
356*36128a67SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.rsa.q);
357*36128a67SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
358*36128a67SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "q", obj);
359*36128a67SGowrishankar Muthukrishnan 
360*36128a67SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.rsa.d);
361*36128a67SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
362*36128a67SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "d", obj);
363*36128a67SGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGGEN) {
364*36128a67SGowrishankar Muthukrishnan 		json_t *obj;
365*36128a67SGowrishankar Muthukrishnan 
366*36128a67SGowrishankar Muthukrishnan 		writeback_hex_str("", info.one_line_text, &vec.rsa.signature);
367*36128a67SGowrishankar Muthukrishnan 		obj = json_string(info.one_line_text);
368*36128a67SGowrishankar Muthukrishnan 		json_object_set_new(json_info.json_write_case, "signature", obj);
369*36128a67SGowrishankar Muthukrishnan 	} else if (info.op == FIPS_TEST_ASYM_SIGVER) {
370*36128a67SGowrishankar Muthukrishnan 		if (vec.status == RTE_CRYPTO_OP_STATUS_SUCCESS)
371*36128a67SGowrishankar Muthukrishnan 			json_object_set_new(json_info.json_write_case, "testPassed", json_true());
372*36128a67SGowrishankar Muthukrishnan 		else
373*36128a67SGowrishankar Muthukrishnan 			json_object_set_new(json_info.json_write_case, "testPassed", json_false());
374*36128a67SGowrishankar Muthukrishnan 	}
375*36128a67SGowrishankar Muthukrishnan 
376*36128a67SGowrishankar Muthukrishnan 	return 0;
377*36128a67SGowrishankar Muthukrishnan }
378*36128a67SGowrishankar Muthukrishnan 
379*36128a67SGowrishankar Muthukrishnan static int
380*36128a67SGowrishankar Muthukrishnan parse_interim_str(const char *key, char *src, struct fips_val *val)
381*36128a67SGowrishankar Muthukrishnan {
382*36128a67SGowrishankar Muthukrishnan 	uint32_t i;
383*36128a67SGowrishankar Muthukrishnan 
384*36128a67SGowrishankar Muthukrishnan 	RTE_SET_USED(val);
385*36128a67SGowrishankar Muthukrishnan 
386*36128a67SGowrishankar Muthukrishnan 	if (strcmp(key, SIGTYPE_JSON_STR) == 0) {
387*36128a67SGowrishankar Muthukrishnan 		for (i = 0; i < RTE_DIM(rsa_padding_types); i++)
388*36128a67SGowrishankar Muthukrishnan 			if (strstr(src, rsa_padding_types[i].desc)) {
389*36128a67SGowrishankar Muthukrishnan 				info.interim_info.rsa_data.padding = rsa_padding_types[i].padding;
390*36128a67SGowrishankar Muthukrishnan 				break;
391*36128a67SGowrishankar Muthukrishnan 			}
392*36128a67SGowrishankar Muthukrishnan 
393*36128a67SGowrishankar Muthukrishnan 		if (i >= RTE_DIM(rsa_padding_types))
394*36128a67SGowrishankar Muthukrishnan 			return -EINVAL;
395*36128a67SGowrishankar Muthukrishnan 
396*36128a67SGowrishankar Muthukrishnan 	}  else if (strcmp(key, MOD_JSON_STR) == 0) {
397*36128a67SGowrishankar Muthukrishnan 		info.interim_info.rsa_data.modulo = atoi(src);
398*36128a67SGowrishankar Muthukrishnan 	} else if (strcmp(key, HASH_JSON_STR) == 0) {
399*36128a67SGowrishankar Muthukrishnan 		for (i = 0; i < RTE_DIM(rsa_auth_algs); i++)
400*36128a67SGowrishankar Muthukrishnan 			if (strstr(src, rsa_auth_algs[i].desc)) {
401*36128a67SGowrishankar Muthukrishnan 				info.interim_info.rsa_data.auth = rsa_auth_algs[i].auth;
402*36128a67SGowrishankar Muthukrishnan 				break;
403*36128a67SGowrishankar Muthukrishnan 			}
404*36128a67SGowrishankar Muthukrishnan 
405*36128a67SGowrishankar Muthukrishnan 		if (i >= RTE_DIM(rsa_auth_algs))
406*36128a67SGowrishankar Muthukrishnan 			return -EINVAL;
407*36128a67SGowrishankar Muthukrishnan 
408*36128a67SGowrishankar Muthukrishnan 	}  else if (strcmp(key, SALT_JSON_STR) == 0) {
409*36128a67SGowrishankar Muthukrishnan 		info.interim_info.rsa_data.saltlen = atoi(src);
410*36128a67SGowrishankar Muthukrishnan 	} else if (strcmp(key, TESTTYPE_JSON_STR) == 0) {
411*36128a67SGowrishankar Muthukrishnan 		for (i = 0; i < RTE_DIM(rsa_test_types); i++)
412*36128a67SGowrishankar Muthukrishnan 			if (strstr(src, rsa_test_types[i].desc)) {
413*36128a67SGowrishankar Muthukrishnan 				info.parse_writeback = parse_test_rsa_json_writeback;
414*36128a67SGowrishankar Muthukrishnan 				break;
415*36128a67SGowrishankar Muthukrishnan 			}
416*36128a67SGowrishankar Muthukrishnan 
417*36128a67SGowrishankar Muthukrishnan 		if (!info.parse_writeback || i >= RTE_DIM(rsa_test_types))
418*36128a67SGowrishankar Muthukrishnan 			return -EINVAL;
419*36128a67SGowrishankar Muthukrishnan 
420*36128a67SGowrishankar Muthukrishnan 	} else {
421*36128a67SGowrishankar Muthukrishnan 		return -EINVAL;
422*36128a67SGowrishankar Muthukrishnan 	}
423*36128a67SGowrishankar Muthukrishnan 
424*36128a67SGowrishankar Muthukrishnan 	return 0;
425*36128a67SGowrishankar Muthukrishnan }
426*36128a67SGowrishankar Muthukrishnan 
427*36128a67SGowrishankar Muthukrishnan static int
428*36128a67SGowrishankar Muthukrishnan parse_keygen_e_str(const char *key, char *src, struct fips_val *val)
429*36128a67SGowrishankar Muthukrishnan {
430*36128a67SGowrishankar Muthukrishnan 	parse_uint8_hex_str(key, src, val);
431*36128a67SGowrishankar Muthukrishnan 
432*36128a67SGowrishankar Muthukrishnan 	/* For keygen tests, key "e" can be the end of input data
433*36128a67SGowrishankar Muthukrishnan 	 * to generate RSA values.
434*36128a67SGowrishankar Muthukrishnan 	 */
435*36128a67SGowrishankar Muthukrishnan 	return prepare_vec_rsa();
436*36128a67SGowrishankar Muthukrishnan }
437*36128a67SGowrishankar Muthukrishnan 
438*36128a67SGowrishankar Muthukrishnan struct fips_test_callback rsa_keygen_interim_json_vectors[] = {
439*36128a67SGowrishankar Muthukrishnan 		{MOD_JSON_STR, parse_interim_str, NULL},
440*36128a67SGowrishankar Muthukrishnan 		{HASH_JSON_STR, parse_interim_str, NULL},
441*36128a67SGowrishankar Muthukrishnan 		{TESTTYPE_JSON_STR, parse_interim_str, NULL},
442*36128a67SGowrishankar Muthukrishnan 		{NULL, NULL, NULL} /**< end pointer */
443*36128a67SGowrishankar Muthukrishnan };
444*36128a67SGowrishankar Muthukrishnan 
445*36128a67SGowrishankar Muthukrishnan struct fips_test_callback rsa_siggen_interim_json_vectors[] = {
446*36128a67SGowrishankar Muthukrishnan 		{SIGTYPE_JSON_STR, parse_interim_str, NULL},
447*36128a67SGowrishankar Muthukrishnan 		{MOD_JSON_STR, parse_interim_str, NULL},
448*36128a67SGowrishankar Muthukrishnan 		{HASH_JSON_STR, parse_interim_str, NULL},
449*36128a67SGowrishankar Muthukrishnan 		{SALT_JSON_STR, parse_interim_str, NULL},
450*36128a67SGowrishankar Muthukrishnan 		{TESTTYPE_JSON_STR, parse_interim_str, NULL},
451*36128a67SGowrishankar Muthukrishnan 		{NULL, NULL, NULL} /**< end pointer */
452*36128a67SGowrishankar Muthukrishnan };
453*36128a67SGowrishankar Muthukrishnan 
454*36128a67SGowrishankar Muthukrishnan struct fips_test_callback rsa_sigver_interim_json_vectors[] = {
455*36128a67SGowrishankar Muthukrishnan 		{SIGTYPE_JSON_STR, parse_interim_str, NULL},
456*36128a67SGowrishankar Muthukrishnan 		{MOD_JSON_STR, parse_interim_str, NULL},
457*36128a67SGowrishankar Muthukrishnan 		{HASH_JSON_STR, parse_interim_str, NULL},
458*36128a67SGowrishankar Muthukrishnan 		{SALT_JSON_STR, parse_interim_str, NULL},
459*36128a67SGowrishankar Muthukrishnan 		{N_JSON_STR, parse_uint8_hex_str, &vec.rsa.n},
460*36128a67SGowrishankar Muthukrishnan 		{E_JSON_STR, parse_uint8_hex_str, &vec.rsa.e},
461*36128a67SGowrishankar Muthukrishnan 		{TESTTYPE_JSON_STR, parse_interim_str, NULL},
462*36128a67SGowrishankar Muthukrishnan 		{NULL, NULL, NULL} /**< end pointer */
463*36128a67SGowrishankar Muthukrishnan };
464*36128a67SGowrishankar Muthukrishnan 
465*36128a67SGowrishankar Muthukrishnan struct fips_test_callback rsa_keygen_json_vectors[] = {
466*36128a67SGowrishankar Muthukrishnan 		{SEED_JSON_STR, parse_uint8_hex_str, &vec.rsa.seed},
467*36128a67SGowrishankar Muthukrishnan 		{E_JSON_STR, parse_keygen_e_str, &vec.rsa.e},
468*36128a67SGowrishankar Muthukrishnan 		{NULL, NULL, NULL} /**< end pointer */
469*36128a67SGowrishankar Muthukrishnan };
470*36128a67SGowrishankar Muthukrishnan 
471*36128a67SGowrishankar Muthukrishnan struct fips_test_callback rsa_siggen_json_vectors[] = {
472*36128a67SGowrishankar Muthukrishnan 		{MSG_JSON_STR, parse_uint8_hex_str, &vec.pt},
473*36128a67SGowrishankar Muthukrishnan 		{NULL, NULL, NULL} /**< end pointer */
474*36128a67SGowrishankar Muthukrishnan };
475*36128a67SGowrishankar Muthukrishnan 
476*36128a67SGowrishankar Muthukrishnan struct fips_test_callback rsa_sigver_json_vectors[] = {
477*36128a67SGowrishankar Muthukrishnan 		{MSG_JSON_STR, parse_uint8_hex_str, &vec.pt},
478*36128a67SGowrishankar Muthukrishnan 		{SIG_JSON_STR, parse_uint8_hex_str, &vec.rsa.signature},
479*36128a67SGowrishankar Muthukrishnan 		{NULL, NULL, NULL} /**< end pointer */
480*36128a67SGowrishankar Muthukrishnan };
481*36128a67SGowrishankar Muthukrishnan 
482*36128a67SGowrishankar Muthukrishnan int
483*36128a67SGowrishankar Muthukrishnan parse_test_rsa_json_init(void)
484*36128a67SGowrishankar Muthukrishnan {
485*36128a67SGowrishankar Muthukrishnan 	json_t *keyfmt_obj = json_object_get(json_info.json_vector_set, "keyFormat");
486*36128a67SGowrishankar Muthukrishnan 	json_t *mode_obj = json_object_get(json_info.json_vector_set, "mode");
487*36128a67SGowrishankar Muthukrishnan 	const char *keyfmt_str = json_string_value(keyfmt_obj);
488*36128a67SGowrishankar Muthukrishnan 	const char *mode_str = json_string_value(mode_obj);
489*36128a67SGowrishankar Muthukrishnan 
490*36128a67SGowrishankar Muthukrishnan 	info.callbacks = NULL;
491*36128a67SGowrishankar Muthukrishnan 	info.parse_writeback = NULL;
492*36128a67SGowrishankar Muthukrishnan 	info.interim_callbacks = NULL;
493*36128a67SGowrishankar Muthukrishnan 	info.parse_interim_writeback = NULL;
494*36128a67SGowrishankar Muthukrishnan 
495*36128a67SGowrishankar Muthukrishnan 	if (strcmp(mode_str, "keyGen") == 0) {
496*36128a67SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_KEYGEN;
497*36128a67SGowrishankar Muthukrishnan 		info.callbacks = rsa_keygen_json_vectors;
498*36128a67SGowrishankar Muthukrishnan 		info.interim_callbacks = rsa_keygen_interim_json_vectors;
499*36128a67SGowrishankar Muthukrishnan 	} else if (strcmp(mode_str, "sigGen") == 0) {
500*36128a67SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_SIGGEN;
501*36128a67SGowrishankar Muthukrishnan 		info.callbacks = rsa_siggen_json_vectors;
502*36128a67SGowrishankar Muthukrishnan 		info.interim_callbacks = rsa_siggen_interim_json_vectors;
503*36128a67SGowrishankar Muthukrishnan 		info.parse_interim_writeback = parse_test_rsa_json_interim_writeback;
504*36128a67SGowrishankar Muthukrishnan 	} else if (strcmp(mode_str, "sigVer") == 0) {
505*36128a67SGowrishankar Muthukrishnan 		info.op = FIPS_TEST_ASYM_SIGVER;
506*36128a67SGowrishankar Muthukrishnan 		info.callbacks = rsa_sigver_json_vectors;
507*36128a67SGowrishankar Muthukrishnan 		info.interim_callbacks = rsa_sigver_interim_json_vectors;
508*36128a67SGowrishankar Muthukrishnan 	} else {
509*36128a67SGowrishankar Muthukrishnan 		return -EINVAL;
510*36128a67SGowrishankar Muthukrishnan 	}
511*36128a67SGowrishankar Muthukrishnan 
512*36128a67SGowrishankar Muthukrishnan 	info.interim_info.rsa_data.privkey = RTE_RSA_KEY_TYPE_QT;
513*36128a67SGowrishankar Muthukrishnan 	if (keyfmt_str != NULL && strcmp(keyfmt_str, "standard") == 0)
514*36128a67SGowrishankar Muthukrishnan 		info.interim_info.rsa_data.privkey = RTE_RSA_KEY_TYPE_EXP;
515*36128a67SGowrishankar Muthukrishnan 
516*36128a67SGowrishankar Muthukrishnan 	return 0;
517*36128a67SGowrishankar Muthukrishnan }
518*36128a67SGowrishankar Muthukrishnan 
519*36128a67SGowrishankar Muthukrishnan #endif /* USE_JANSSON */
520