1e0c4386eSCy Schubert /*
2e0c4386eSCy Schubert * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
3e0c4386eSCy Schubert *
4e0c4386eSCy Schubert * Licensed under the Apache License 2.0 (the "License"). You may not use
5e0c4386eSCy Schubert * this file except in compliance with the License. You can obtain a copy
6e0c4386eSCy Schubert * in the file LICENSE in the source distribution or at
7e0c4386eSCy Schubert * https://www.openssl.org/source/license.html
8e0c4386eSCy Schubert */
9e0c4386eSCy Schubert
10e0c4386eSCy Schubert /*
11e0c4386eSCy Schubert * A set of tests demonstrating uses cases for CAVS/ACVP testing.
12e0c4386eSCy Schubert *
13e0c4386eSCy Schubert * For examples of testing KDF's, Digests, KeyAgreement & DRBG's refer to
14e0c4386eSCy Schubert * providers/fips/self_test_kats.c
15e0c4386eSCy Schubert */
16e0c4386eSCy Schubert
17e0c4386eSCy Schubert #include <string.h>
18e0c4386eSCy Schubert #include <openssl/opensslconf.h> /* To see if OPENSSL_NO_EC is defined */
19e0c4386eSCy Schubert #include <openssl/core_names.h>
20e0c4386eSCy Schubert #include <openssl/evp.h>
21e0c4386eSCy Schubert #include <openssl/ec.h>
22e0c4386eSCy Schubert #include <openssl/dh.h>
23e0c4386eSCy Schubert #include <openssl/dsa.h>
24e0c4386eSCy Schubert #include <openssl/rsa.h>
25e0c4386eSCy Schubert #include <openssl/param_build.h>
26e0c4386eSCy Schubert #include <openssl/provider.h>
27e0c4386eSCy Schubert #include <openssl/self_test.h>
28e0c4386eSCy Schubert #include "testutil.h"
29e0c4386eSCy Schubert #include "testutil/output.h"
30e0c4386eSCy Schubert #include "acvp_test.inc"
31e0c4386eSCy Schubert #include "internal/nelem.h"
32e0c4386eSCy Schubert
33e0c4386eSCy Schubert typedef enum OPTION_choice {
34e0c4386eSCy Schubert OPT_ERR = -1,
35e0c4386eSCy Schubert OPT_EOF = 0,
36e0c4386eSCy Schubert OPT_CONFIG_FILE,
37e0c4386eSCy Schubert OPT_TEST_ENUM
38e0c4386eSCy Schubert } OPTION_CHOICE;
39e0c4386eSCy Schubert
40e0c4386eSCy Schubert typedef struct st_args {
41e0c4386eSCy Schubert int enable;
42e0c4386eSCy Schubert int called;
43e0c4386eSCy Schubert } SELF_TEST_ARGS;
44e0c4386eSCy Schubert
45e0c4386eSCy Schubert static OSSL_PROVIDER *prov_null = NULL;
46e0c4386eSCy Schubert static OSSL_LIB_CTX *libctx = NULL;
47e0c4386eSCy Schubert static SELF_TEST_ARGS self_test_args = { 0 };
48e0c4386eSCy Schubert static OSSL_CALLBACK self_test_events;
49e0c4386eSCy Schubert
test_get_options(void)50e0c4386eSCy Schubert const OPTIONS *test_get_options(void)
51e0c4386eSCy Schubert {
52e0c4386eSCy Schubert static const OPTIONS test_options[] = {
53e0c4386eSCy Schubert OPT_TEST_OPTIONS_DEFAULT_USAGE,
54e0c4386eSCy Schubert { "config", OPT_CONFIG_FILE, '<',
55e0c4386eSCy Schubert "The configuration file to use for the libctx" },
56e0c4386eSCy Schubert { NULL }
57e0c4386eSCy Schubert };
58e0c4386eSCy Schubert return test_options;
59e0c4386eSCy Schubert }
60e0c4386eSCy Schubert
pkey_get_bn_bytes(EVP_PKEY * pkey,const char * name,unsigned char ** out,size_t * out_len)61e0c4386eSCy Schubert static int pkey_get_bn_bytes(EVP_PKEY *pkey, const char *name,
62e0c4386eSCy Schubert unsigned char **out, size_t *out_len)
63e0c4386eSCy Schubert {
64e0c4386eSCy Schubert unsigned char *buf = NULL;
65e0c4386eSCy Schubert BIGNUM *bn = NULL;
66e0c4386eSCy Schubert int sz;
67e0c4386eSCy Schubert
68e0c4386eSCy Schubert if (!EVP_PKEY_get_bn_param(pkey, name, &bn))
69e0c4386eSCy Schubert goto err;
70e0c4386eSCy Schubert sz = BN_num_bytes(bn);
71e0c4386eSCy Schubert buf = OPENSSL_zalloc(sz);
72e0c4386eSCy Schubert if (buf == NULL)
73e0c4386eSCy Schubert goto err;
74e0c4386eSCy Schubert if (BN_bn2binpad(bn, buf, sz) <= 0)
75e0c4386eSCy Schubert goto err;
76e0c4386eSCy Schubert
77e0c4386eSCy Schubert *out_len = sz;
78e0c4386eSCy Schubert *out = buf;
79e0c4386eSCy Schubert BN_free(bn);
80e0c4386eSCy Schubert return 1;
81e0c4386eSCy Schubert err:
82e0c4386eSCy Schubert OPENSSL_free(buf);
83e0c4386eSCy Schubert BN_free(bn);
84e0c4386eSCy Schubert return 0;
85e0c4386eSCy Schubert }
86e0c4386eSCy Schubert
sig_gen(EVP_PKEY * pkey,OSSL_PARAM * params,const char * digest_name,const unsigned char * msg,size_t msg_len,unsigned char ** sig_out,size_t * sig_out_len)87e0c4386eSCy Schubert static int sig_gen(EVP_PKEY *pkey, OSSL_PARAM *params, const char *digest_name,
88e0c4386eSCy Schubert const unsigned char *msg, size_t msg_len,
89e0c4386eSCy Schubert unsigned char **sig_out, size_t *sig_out_len)
90e0c4386eSCy Schubert {
91e0c4386eSCy Schubert int ret = 0;
92e0c4386eSCy Schubert EVP_MD_CTX *md_ctx = NULL;
93e0c4386eSCy Schubert unsigned char *sig = NULL;
94e0c4386eSCy Schubert size_t sig_len;
95e0c4386eSCy Schubert size_t sz = EVP_PKEY_get_size(pkey);
96e0c4386eSCy Schubert
97e0c4386eSCy Schubert sig_len = sz;
98e0c4386eSCy Schubert if (!TEST_ptr(sig = OPENSSL_malloc(sz))
99e0c4386eSCy Schubert || !TEST_ptr(md_ctx = EVP_MD_CTX_new())
100e0c4386eSCy Schubert || !TEST_int_eq(EVP_DigestSignInit_ex(md_ctx, NULL, digest_name, libctx,
101e0c4386eSCy Schubert NULL, pkey, NULL), 1)
102e0c4386eSCy Schubert || !TEST_int_gt(EVP_DigestSign(md_ctx, sig, &sig_len, msg, msg_len), 0))
103e0c4386eSCy Schubert goto err;
104e0c4386eSCy Schubert *sig_out = sig;
105e0c4386eSCy Schubert *sig_out_len = sig_len;
106e0c4386eSCy Schubert sig = NULL;
107e0c4386eSCy Schubert ret = 1;
108e0c4386eSCy Schubert err:
109e0c4386eSCy Schubert OPENSSL_free(sig);
110e0c4386eSCy Schubert EVP_MD_CTX_free(md_ctx);
111e0c4386eSCy Schubert return ret;
112e0c4386eSCy Schubert }
113e0c4386eSCy Schubert
114e0c4386eSCy Schubert #ifndef OPENSSL_NO_EC
ecdsa_keygen_test(int id)115e0c4386eSCy Schubert static int ecdsa_keygen_test(int id)
116e0c4386eSCy Schubert {
117e0c4386eSCy Schubert int ret = 0;
118e0c4386eSCy Schubert EVP_PKEY *pkey = NULL;
119e0c4386eSCy Schubert unsigned char *priv = NULL;
120e0c4386eSCy Schubert unsigned char *pubx = NULL, *puby = NULL;
121e0c4386eSCy Schubert size_t priv_len = 0, pubx_len = 0, puby_len = 0;
122e0c4386eSCy Schubert const struct ecdsa_keygen_st *tst = &ecdsa_keygen_data[id];
123e0c4386eSCy Schubert
124e0c4386eSCy Schubert self_test_args.called = 0;
125e0c4386eSCy Schubert self_test_args.enable = 1;
126e0c4386eSCy Schubert if (!TEST_ptr(pkey = EVP_PKEY_Q_keygen(libctx, NULL, "EC", tst->curve_name))
127e0c4386eSCy Schubert || !TEST_int_ge(self_test_args.called, 3)
128e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_PRIV_KEY, &priv,
129e0c4386eSCy Schubert &priv_len))
130e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_EC_PUB_X, &pubx,
131e0c4386eSCy Schubert &pubx_len))
132e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_EC_PUB_Y, &puby,
133e0c4386eSCy Schubert &puby_len)))
134e0c4386eSCy Schubert goto err;
135e0c4386eSCy Schubert
136e0c4386eSCy Schubert test_output_memory("qy", puby, puby_len);
137e0c4386eSCy Schubert test_output_memory("qx", pubx, pubx_len);
138e0c4386eSCy Schubert test_output_memory("d", priv, priv_len);
139e0c4386eSCy Schubert ret = 1;
140e0c4386eSCy Schubert err:
141e0c4386eSCy Schubert self_test_args.enable = 0;
142e0c4386eSCy Schubert self_test_args.called = 0;
143e0c4386eSCy Schubert OPENSSL_clear_free(priv, priv_len);
144e0c4386eSCy Schubert OPENSSL_free(pubx);
145e0c4386eSCy Schubert OPENSSL_free(puby);
146e0c4386eSCy Schubert EVP_PKEY_free(pkey);
147e0c4386eSCy Schubert return ret;
148e0c4386eSCy Schubert }
149e0c4386eSCy Schubert
ecdsa_create_pkey(EVP_PKEY ** pkey,const char * curve_name,const unsigned char * pub,size_t pub_len,int expected)150e0c4386eSCy Schubert static int ecdsa_create_pkey(EVP_PKEY **pkey, const char *curve_name,
151e0c4386eSCy Schubert const unsigned char *pub, size_t pub_len,
152e0c4386eSCy Schubert int expected)
153e0c4386eSCy Schubert {
154e0c4386eSCy Schubert int ret = 0;
155e0c4386eSCy Schubert EVP_PKEY_CTX *ctx = NULL;
156e0c4386eSCy Schubert OSSL_PARAM_BLD *bld = NULL;
157e0c4386eSCy Schubert OSSL_PARAM *params = NULL;
158e0c4386eSCy Schubert
159e0c4386eSCy Schubert if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
160e0c4386eSCy Schubert || (curve_name != NULL
161e0c4386eSCy Schubert && !TEST_true(OSSL_PARAM_BLD_push_utf8_string(
162e0c4386eSCy Schubert bld, OSSL_PKEY_PARAM_GROUP_NAME, curve_name, 0) > 0))
163e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
164e0c4386eSCy Schubert OSSL_PKEY_PARAM_PUB_KEY,
165e0c4386eSCy Schubert pub, pub_len) > 0)
166e0c4386eSCy Schubert || !TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
167e0c4386eSCy Schubert || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "EC", NULL))
168e0c4386eSCy Schubert || !TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
169e0c4386eSCy Schubert || !TEST_int_eq(EVP_PKEY_fromdata(ctx, pkey, EVP_PKEY_PUBLIC_KEY,
170e0c4386eSCy Schubert params), expected))
171e0c4386eSCy Schubert goto err;
172e0c4386eSCy Schubert
173e0c4386eSCy Schubert ret = 1;
174e0c4386eSCy Schubert err:
175e0c4386eSCy Schubert OSSL_PARAM_free(params);
176e0c4386eSCy Schubert OSSL_PARAM_BLD_free(bld);
177e0c4386eSCy Schubert EVP_PKEY_CTX_free(ctx);
178e0c4386eSCy Schubert return ret;
179e0c4386eSCy Schubert }
180e0c4386eSCy Schubert
ecdsa_pub_verify_test(int id)181e0c4386eSCy Schubert static int ecdsa_pub_verify_test(int id)
182e0c4386eSCy Schubert {
183e0c4386eSCy Schubert const struct ecdsa_pub_verify_st *tst = &ecdsa_pv_data[id];
184e0c4386eSCy Schubert
185e0c4386eSCy Schubert int ret = 0;
186e0c4386eSCy Schubert EVP_PKEY_CTX *key_ctx = NULL;
187e0c4386eSCy Schubert EVP_PKEY *pkey = NULL;
188e0c4386eSCy Schubert
189e0c4386eSCy Schubert if (!TEST_true(ecdsa_create_pkey(&pkey, tst->curve_name,
190e0c4386eSCy Schubert tst->pub, tst->pub_len, tst->pass)))
191e0c4386eSCy Schubert goto err;
192e0c4386eSCy Schubert
193e0c4386eSCy Schubert if (tst->pass) {
194e0c4386eSCy Schubert if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, ""))
195e0c4386eSCy Schubert || !TEST_int_eq(EVP_PKEY_public_check(key_ctx), tst->pass))
196e0c4386eSCy Schubert goto err;
197e0c4386eSCy Schubert }
198e0c4386eSCy Schubert ret = 1;
199e0c4386eSCy Schubert err:
200e0c4386eSCy Schubert EVP_PKEY_free(pkey);
201e0c4386eSCy Schubert EVP_PKEY_CTX_free(key_ctx);
202e0c4386eSCy Schubert return ret;
203e0c4386eSCy Schubert }
204e0c4386eSCy Schubert
205e0c4386eSCy Schubert /* Extract r and s from an ecdsa signature */
get_ecdsa_sig_rs_bytes(const unsigned char * sig,size_t sig_len,unsigned char ** r,unsigned char ** s,size_t * rlen,size_t * slen)206e0c4386eSCy Schubert static int get_ecdsa_sig_rs_bytes(const unsigned char *sig, size_t sig_len,
207e0c4386eSCy Schubert unsigned char **r, unsigned char **s,
208e0c4386eSCy Schubert size_t *rlen, size_t *slen)
209e0c4386eSCy Schubert {
210e0c4386eSCy Schubert int ret = 0;
211e0c4386eSCy Schubert unsigned char *rbuf = NULL, *sbuf = NULL;
212e0c4386eSCy Schubert size_t r1_len, s1_len;
213e0c4386eSCy Schubert const BIGNUM *r1, *s1;
214e0c4386eSCy Schubert ECDSA_SIG *sign = d2i_ECDSA_SIG(NULL, &sig, sig_len);
215e0c4386eSCy Schubert
216e0c4386eSCy Schubert if (sign == NULL)
217e0c4386eSCy Schubert return 0;
218e0c4386eSCy Schubert r1 = ECDSA_SIG_get0_r(sign);
219e0c4386eSCy Schubert s1 = ECDSA_SIG_get0_s(sign);
220e0c4386eSCy Schubert if (r1 == NULL || s1 == NULL)
221e0c4386eSCy Schubert goto err;
222e0c4386eSCy Schubert
223e0c4386eSCy Schubert r1_len = BN_num_bytes(r1);
224e0c4386eSCy Schubert s1_len = BN_num_bytes(s1);
225e0c4386eSCy Schubert rbuf = OPENSSL_zalloc(r1_len);
226e0c4386eSCy Schubert sbuf = OPENSSL_zalloc(s1_len);
227e0c4386eSCy Schubert if (rbuf == NULL || sbuf == NULL)
228e0c4386eSCy Schubert goto err;
229e0c4386eSCy Schubert if (BN_bn2binpad(r1, rbuf, r1_len) <= 0)
230e0c4386eSCy Schubert goto err;
231e0c4386eSCy Schubert if (BN_bn2binpad(s1, sbuf, s1_len) <= 0)
232e0c4386eSCy Schubert goto err;
233e0c4386eSCy Schubert *r = rbuf;
234e0c4386eSCy Schubert *s = sbuf;
235e0c4386eSCy Schubert *rlen = r1_len;
236e0c4386eSCy Schubert *slen = s1_len;
237e0c4386eSCy Schubert ret = 1;
238e0c4386eSCy Schubert err:
239e0c4386eSCy Schubert if (ret == 0) {
240e0c4386eSCy Schubert OPENSSL_free(rbuf);
241e0c4386eSCy Schubert OPENSSL_free(sbuf);
242e0c4386eSCy Schubert }
243e0c4386eSCy Schubert ECDSA_SIG_free(sign);
244e0c4386eSCy Schubert return ret;
245e0c4386eSCy Schubert }
246e0c4386eSCy Schubert
ecdsa_siggen_test(int id)247e0c4386eSCy Schubert static int ecdsa_siggen_test(int id)
248e0c4386eSCy Schubert {
249e0c4386eSCy Schubert int ret = 0;
250e0c4386eSCy Schubert EVP_PKEY *pkey = NULL;
251e0c4386eSCy Schubert size_t sig_len = 0, rlen = 0, slen = 0;
252e0c4386eSCy Schubert unsigned char *sig = NULL;
253e0c4386eSCy Schubert unsigned char *r = NULL, *s = NULL;
254e0c4386eSCy Schubert const struct ecdsa_siggen_st *tst = &ecdsa_siggen_data[id];
255e0c4386eSCy Schubert
256e0c4386eSCy Schubert if (!TEST_ptr(pkey = EVP_PKEY_Q_keygen(libctx, NULL, "EC", tst->curve_name)))
257e0c4386eSCy Schubert goto err;
258e0c4386eSCy Schubert
259e0c4386eSCy Schubert if (!TEST_true(sig_gen(pkey, NULL, tst->digest_alg, tst->msg, tst->msg_len,
260e0c4386eSCy Schubert &sig, &sig_len))
261e0c4386eSCy Schubert || !TEST_true(get_ecdsa_sig_rs_bytes(sig, sig_len, &r, &s, &rlen, &slen)))
262e0c4386eSCy Schubert goto err;
263e0c4386eSCy Schubert test_output_memory("r", r, rlen);
264e0c4386eSCy Schubert test_output_memory("s", s, slen);
265e0c4386eSCy Schubert ret = 1;
266e0c4386eSCy Schubert err:
267e0c4386eSCy Schubert OPENSSL_free(r);
268e0c4386eSCy Schubert OPENSSL_free(s);
269e0c4386eSCy Schubert OPENSSL_free(sig);
270e0c4386eSCy Schubert EVP_PKEY_free(pkey);
271e0c4386eSCy Schubert return ret;
272e0c4386eSCy Schubert }
273e0c4386eSCy Schubert
ecdsa_sigver_test(int id)274e0c4386eSCy Schubert static int ecdsa_sigver_test(int id)
275e0c4386eSCy Schubert {
276e0c4386eSCy Schubert int ret = 0;
277e0c4386eSCy Schubert EVP_MD_CTX *md_ctx = NULL;
278e0c4386eSCy Schubert EVP_PKEY *pkey = NULL;
279e0c4386eSCy Schubert ECDSA_SIG *sign = NULL;
280e0c4386eSCy Schubert size_t sig_len;
281e0c4386eSCy Schubert unsigned char *sig = NULL;
282e0c4386eSCy Schubert BIGNUM *rbn = NULL, *sbn = NULL;
283e0c4386eSCy Schubert const struct ecdsa_sigver_st *tst = &ecdsa_sigver_data[id];
284e0c4386eSCy Schubert
285e0c4386eSCy Schubert if (!TEST_true(ecdsa_create_pkey(&pkey, tst->curve_name,
286e0c4386eSCy Schubert tst->pub, tst->pub_len, 1)))
287e0c4386eSCy Schubert goto err;
288e0c4386eSCy Schubert
289e0c4386eSCy Schubert if (!TEST_ptr(sign = ECDSA_SIG_new())
290e0c4386eSCy Schubert || !TEST_ptr(rbn = BN_bin2bn(tst->r, tst->r_len, NULL))
291e0c4386eSCy Schubert || !TEST_ptr(sbn = BN_bin2bn(tst->s, tst->s_len, NULL))
292e0c4386eSCy Schubert || !TEST_true(ECDSA_SIG_set0(sign, rbn, sbn)))
293e0c4386eSCy Schubert goto err;
294e0c4386eSCy Schubert rbn = sbn = NULL;
295e0c4386eSCy Schubert
296e0c4386eSCy Schubert ret = TEST_int_gt((sig_len = i2d_ECDSA_SIG(sign, &sig)), 0)
297e0c4386eSCy Schubert && TEST_ptr(md_ctx = EVP_MD_CTX_new())
298e0c4386eSCy Schubert && TEST_true(EVP_DigestVerifyInit_ex(md_ctx, NULL, tst->digest_alg,
299e0c4386eSCy Schubert libctx, NULL, pkey, NULL)
300e0c4386eSCy Schubert && TEST_int_eq(EVP_DigestVerify(md_ctx, sig, sig_len,
301e0c4386eSCy Schubert tst->msg, tst->msg_len), tst->pass));
302e0c4386eSCy Schubert err:
303e0c4386eSCy Schubert BN_free(rbn);
304e0c4386eSCy Schubert BN_free(sbn);
305e0c4386eSCy Schubert OPENSSL_free(sig);
306e0c4386eSCy Schubert ECDSA_SIG_free(sign);
307e0c4386eSCy Schubert EVP_PKEY_free(pkey);
308e0c4386eSCy Schubert EVP_MD_CTX_free(md_ctx);
309e0c4386eSCy Schubert return ret;
310e0c4386eSCy Schubert
311e0c4386eSCy Schubert }
312e0c4386eSCy Schubert #endif /* OPENSSL_NO_EC */
313e0c4386eSCy Schubert
314e0c4386eSCy Schubert #ifndef OPENSSL_NO_DSA
pkey_get_octet_bytes(EVP_PKEY * pkey,const char * name,unsigned char ** out,size_t * out_len)315e0c4386eSCy Schubert static int pkey_get_octet_bytes(EVP_PKEY *pkey, const char *name,
316e0c4386eSCy Schubert unsigned char **out, size_t *out_len)
317e0c4386eSCy Schubert {
318e0c4386eSCy Schubert size_t len = 0;
319e0c4386eSCy Schubert unsigned char *buf = NULL;
320e0c4386eSCy Schubert
321e0c4386eSCy Schubert if (!EVP_PKEY_get_octet_string_param(pkey, name, NULL, 0, &len))
322e0c4386eSCy Schubert goto err;
323e0c4386eSCy Schubert
324e0c4386eSCy Schubert buf = OPENSSL_zalloc(len);
325e0c4386eSCy Schubert if (buf == NULL)
326e0c4386eSCy Schubert goto err;
327e0c4386eSCy Schubert
328e0c4386eSCy Schubert if (!EVP_PKEY_get_octet_string_param(pkey, name, buf, len, out_len))
329e0c4386eSCy Schubert goto err;
330e0c4386eSCy Schubert *out = buf;
331e0c4386eSCy Schubert return 1;
332e0c4386eSCy Schubert err:
333e0c4386eSCy Schubert OPENSSL_free(buf);
334e0c4386eSCy Schubert return 0;
335e0c4386eSCy Schubert }
336e0c4386eSCy Schubert
dsa_paramgen(int L,int N)337e0c4386eSCy Schubert static EVP_PKEY *dsa_paramgen(int L, int N)
338e0c4386eSCy Schubert {
339e0c4386eSCy Schubert EVP_PKEY_CTX *paramgen_ctx = NULL;
340e0c4386eSCy Schubert EVP_PKEY *param_key = NULL;
341e0c4386eSCy Schubert
342e0c4386eSCy Schubert if (!TEST_ptr(paramgen_ctx = EVP_PKEY_CTX_new_from_name(libctx, "DSA", NULL))
343e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_paramgen_init(paramgen_ctx), 0)
344e0c4386eSCy Schubert || !TEST_true(EVP_PKEY_CTX_set_dsa_paramgen_bits(paramgen_ctx, L))
345e0c4386eSCy Schubert || !TEST_true(EVP_PKEY_CTX_set_dsa_paramgen_q_bits(paramgen_ctx, N))
346e0c4386eSCy Schubert || !TEST_true(EVP_PKEY_paramgen(paramgen_ctx, ¶m_key)))
347e0c4386eSCy Schubert return NULL;
348e0c4386eSCy Schubert EVP_PKEY_CTX_free(paramgen_ctx);
349e0c4386eSCy Schubert return param_key;
350e0c4386eSCy Schubert }
351e0c4386eSCy Schubert
dsa_keygen(int L,int N)352e0c4386eSCy Schubert static EVP_PKEY *dsa_keygen(int L, int N)
353e0c4386eSCy Schubert {
354e0c4386eSCy Schubert EVP_PKEY *param_key = NULL, *key = NULL;
355e0c4386eSCy Schubert EVP_PKEY_CTX *keygen_ctx = NULL;
356e0c4386eSCy Schubert
357e0c4386eSCy Schubert if (!TEST_ptr(param_key = dsa_paramgen(L, N))
358e0c4386eSCy Schubert || !TEST_ptr(keygen_ctx = EVP_PKEY_CTX_new_from_pkey(libctx, param_key,
359e0c4386eSCy Schubert NULL))
360e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_keygen_init(keygen_ctx), 0)
361e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_keygen(keygen_ctx, &key), 0))
362e0c4386eSCy Schubert goto err;
363e0c4386eSCy Schubert err:
364e0c4386eSCy Schubert EVP_PKEY_free(param_key);
365e0c4386eSCy Schubert EVP_PKEY_CTX_free(keygen_ctx);
366e0c4386eSCy Schubert return key;
367e0c4386eSCy Schubert }
368e0c4386eSCy Schubert
dsa_keygen_test(int id)369e0c4386eSCy Schubert static int dsa_keygen_test(int id)
370e0c4386eSCy Schubert {
371e0c4386eSCy Schubert int ret = 0, i;
372e0c4386eSCy Schubert EVP_PKEY_CTX *paramgen_ctx = NULL, *keygen_ctx = NULL;
373e0c4386eSCy Schubert EVP_PKEY *param_key = NULL, *key = NULL;
374e0c4386eSCy Schubert unsigned char *priv = NULL, *pub = NULL;
375e0c4386eSCy Schubert size_t priv_len = 0, pub_len = 0;
376e0c4386eSCy Schubert const struct dsa_paramgen_st *tst = &dsa_keygen_data[id];
377e0c4386eSCy Schubert
378e0c4386eSCy Schubert if (!TEST_ptr(param_key = dsa_paramgen(tst->L, tst->N))
379e0c4386eSCy Schubert || !TEST_ptr(keygen_ctx = EVP_PKEY_CTX_new_from_pkey(libctx, param_key,
380e0c4386eSCy Schubert NULL))
381e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_keygen_init(keygen_ctx), 0))
382e0c4386eSCy Schubert goto err;
383e0c4386eSCy Schubert for (i = 0; i < 2; ++i) {
384e0c4386eSCy Schubert if (!TEST_int_gt(EVP_PKEY_keygen(keygen_ctx, &key), 0)
385e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(key, OSSL_PKEY_PARAM_PRIV_KEY,
386e0c4386eSCy Schubert &priv, &priv_len))
387e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(key, OSSL_PKEY_PARAM_PUB_KEY,
388e0c4386eSCy Schubert &pub, &pub_len)))
389e0c4386eSCy Schubert goto err;
390e0c4386eSCy Schubert test_output_memory("y", pub, pub_len);
391e0c4386eSCy Schubert test_output_memory("x", priv, priv_len);
392e0c4386eSCy Schubert EVP_PKEY_free(key);
393e0c4386eSCy Schubert OPENSSL_clear_free(priv, priv_len);
394e0c4386eSCy Schubert OPENSSL_free(pub);
395e0c4386eSCy Schubert key = NULL;
396e0c4386eSCy Schubert pub = priv = NULL;
397e0c4386eSCy Schubert }
398e0c4386eSCy Schubert ret = 1;
399e0c4386eSCy Schubert err:
400e0c4386eSCy Schubert OPENSSL_clear_free(priv, priv_len);
401e0c4386eSCy Schubert OPENSSL_free(pub);
402e0c4386eSCy Schubert EVP_PKEY_free(param_key);
403e0c4386eSCy Schubert EVP_PKEY_free(key);
404e0c4386eSCy Schubert EVP_PKEY_CTX_free(keygen_ctx);
405e0c4386eSCy Schubert EVP_PKEY_CTX_free(paramgen_ctx);
406e0c4386eSCy Schubert return ret;
407e0c4386eSCy Schubert }
408e0c4386eSCy Schubert
dsa_paramgen_test(int id)409e0c4386eSCy Schubert static int dsa_paramgen_test(int id)
410e0c4386eSCy Schubert {
411e0c4386eSCy Schubert int ret = 0, counter = 0;
412e0c4386eSCy Schubert EVP_PKEY_CTX *paramgen_ctx = NULL;
413e0c4386eSCy Schubert EVP_PKEY *param_key = NULL;
414e0c4386eSCy Schubert unsigned char *p = NULL, *q = NULL, *seed = NULL;
415e0c4386eSCy Schubert size_t plen = 0, qlen = 0, seedlen = 0;
416e0c4386eSCy Schubert const struct dsa_paramgen_st *tst = &dsa_paramgen_data[id];
417e0c4386eSCy Schubert
418e0c4386eSCy Schubert if (!TEST_ptr(paramgen_ctx = EVP_PKEY_CTX_new_from_name(libctx, "DSA", NULL))
419e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_paramgen_init(paramgen_ctx), 0)
420e0c4386eSCy Schubert || !TEST_true(EVP_PKEY_CTX_set_dsa_paramgen_bits(paramgen_ctx, tst->L))
421e0c4386eSCy Schubert || !TEST_true(EVP_PKEY_CTX_set_dsa_paramgen_q_bits(paramgen_ctx, tst->N))
422e0c4386eSCy Schubert || !TEST_true(EVP_PKEY_paramgen(paramgen_ctx, ¶m_key))
423e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(param_key, OSSL_PKEY_PARAM_FFC_P,
424e0c4386eSCy Schubert &p, &plen))
425e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(param_key, OSSL_PKEY_PARAM_FFC_Q,
426e0c4386eSCy Schubert &q, &qlen))
427e0c4386eSCy Schubert || !TEST_true(pkey_get_octet_bytes(param_key, OSSL_PKEY_PARAM_FFC_SEED,
428e0c4386eSCy Schubert &seed, &seedlen))
429e0c4386eSCy Schubert || !TEST_true(EVP_PKEY_get_int_param(param_key,
430e0c4386eSCy Schubert OSSL_PKEY_PARAM_FFC_PCOUNTER,
431e0c4386eSCy Schubert &counter)))
432e0c4386eSCy Schubert goto err;
433e0c4386eSCy Schubert
434e0c4386eSCy Schubert test_output_memory("p", p, plen);
435e0c4386eSCy Schubert test_output_memory("q", q, qlen);
436e0c4386eSCy Schubert test_output_memory("domainSeed", seed, seedlen);
437e0c4386eSCy Schubert test_printf_stderr("%s: %d\n", "counter", counter);
438e0c4386eSCy Schubert ret = 1;
439e0c4386eSCy Schubert err:
440e0c4386eSCy Schubert OPENSSL_free(p);
441e0c4386eSCy Schubert OPENSSL_free(q);
442e0c4386eSCy Schubert OPENSSL_free(seed);
443e0c4386eSCy Schubert EVP_PKEY_free(param_key);
444e0c4386eSCy Schubert EVP_PKEY_CTX_free(paramgen_ctx);
445e0c4386eSCy Schubert return ret;
446e0c4386eSCy Schubert }
447e0c4386eSCy Schubert
dsa_create_pkey(EVP_PKEY ** pkey,const unsigned char * p,size_t p_len,const unsigned char * q,size_t q_len,const unsigned char * g,size_t g_len,const unsigned char * seed,size_t seed_len,int counter,int validate_pq,int validate_g,const unsigned char * pub,size_t pub_len,BN_CTX * bn_ctx)448e0c4386eSCy Schubert static int dsa_create_pkey(EVP_PKEY **pkey,
449e0c4386eSCy Schubert const unsigned char *p, size_t p_len,
450e0c4386eSCy Schubert const unsigned char *q, size_t q_len,
451e0c4386eSCy Schubert const unsigned char *g, size_t g_len,
452e0c4386eSCy Schubert const unsigned char *seed, size_t seed_len,
453e0c4386eSCy Schubert int counter,
454e0c4386eSCy Schubert int validate_pq, int validate_g,
455e0c4386eSCy Schubert const unsigned char *pub, size_t pub_len,
456e0c4386eSCy Schubert BN_CTX *bn_ctx)
457e0c4386eSCy Schubert {
458e0c4386eSCy Schubert int ret = 0;
459e0c4386eSCy Schubert EVP_PKEY_CTX *ctx = NULL;
460e0c4386eSCy Schubert OSSL_PARAM_BLD *bld = NULL;
461e0c4386eSCy Schubert OSSL_PARAM *params = NULL;
462e0c4386eSCy Schubert BIGNUM *p_bn = NULL, *q_bn = NULL, *g_bn = NULL, *pub_bn = NULL;
463e0c4386eSCy Schubert
464e0c4386eSCy Schubert if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
465e0c4386eSCy Schubert || !TEST_ptr(p_bn = BN_CTX_get(bn_ctx))
466e0c4386eSCy Schubert || !TEST_ptr(BN_bin2bn(p, p_len, p_bn))
467e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_int(bld,
468e0c4386eSCy Schubert OSSL_PKEY_PARAM_FFC_VALIDATE_PQ,
469e0c4386eSCy Schubert validate_pq))
470e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_int(bld,
471e0c4386eSCy Schubert OSSL_PKEY_PARAM_FFC_VALIDATE_G,
472e0c4386eSCy Schubert validate_g))
473e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p_bn))
474e0c4386eSCy Schubert || !TEST_ptr(q_bn = BN_CTX_get(bn_ctx))
475e0c4386eSCy Schubert || !TEST_ptr(BN_bin2bn(q, q_len, q_bn))
476e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q_bn)))
477e0c4386eSCy Schubert goto err;
478e0c4386eSCy Schubert
479e0c4386eSCy Schubert if (g != NULL) {
480e0c4386eSCy Schubert if (!TEST_ptr(g_bn = BN_CTX_get(bn_ctx))
481e0c4386eSCy Schubert || !TEST_ptr(BN_bin2bn(g, g_len, g_bn))
482e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld,
483e0c4386eSCy Schubert OSSL_PKEY_PARAM_FFC_G, g_bn)))
484e0c4386eSCy Schubert goto err;
485e0c4386eSCy Schubert }
486e0c4386eSCy Schubert if (seed != NULL) {
487e0c4386eSCy Schubert if (!TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
488e0c4386eSCy Schubert OSSL_PKEY_PARAM_FFC_SEED, seed, seed_len)))
489e0c4386eSCy Schubert goto err;
490e0c4386eSCy Schubert }
491e0c4386eSCy Schubert if (counter != -1) {
492e0c4386eSCy Schubert if (!TEST_true(OSSL_PARAM_BLD_push_int(bld,
493e0c4386eSCy Schubert OSSL_PKEY_PARAM_FFC_PCOUNTER,
494e0c4386eSCy Schubert counter)))
495e0c4386eSCy Schubert goto err;
496e0c4386eSCy Schubert }
497e0c4386eSCy Schubert if (pub != NULL) {
498e0c4386eSCy Schubert if (!TEST_ptr(pub_bn = BN_CTX_get(bn_ctx))
499e0c4386eSCy Schubert || !TEST_ptr(BN_bin2bn(pub, pub_len, pub_bn))
500e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld,
501e0c4386eSCy Schubert OSSL_PKEY_PARAM_PUB_KEY,
502e0c4386eSCy Schubert pub_bn)))
503e0c4386eSCy Schubert goto err;
504e0c4386eSCy Schubert }
505e0c4386eSCy Schubert if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
506e0c4386eSCy Schubert || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "DSA", NULL))
507e0c4386eSCy Schubert || !TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
508e0c4386eSCy Schubert || !TEST_int_eq(EVP_PKEY_fromdata(ctx, pkey, EVP_PKEY_PUBLIC_KEY,
509e0c4386eSCy Schubert params), 1))
510e0c4386eSCy Schubert goto err;
511e0c4386eSCy Schubert
512e0c4386eSCy Schubert ret = 1;
513e0c4386eSCy Schubert err:
514e0c4386eSCy Schubert OSSL_PARAM_free(params);
515e0c4386eSCy Schubert OSSL_PARAM_BLD_free(bld);
516e0c4386eSCy Schubert EVP_PKEY_CTX_free(ctx);
517e0c4386eSCy Schubert return ret;
518e0c4386eSCy Schubert }
519e0c4386eSCy Schubert
dsa_pqver_test(int id)520e0c4386eSCy Schubert static int dsa_pqver_test(int id)
521e0c4386eSCy Schubert {
522e0c4386eSCy Schubert int ret = 0;
523e0c4386eSCy Schubert BN_CTX *bn_ctx = NULL;
524e0c4386eSCy Schubert EVP_PKEY_CTX *key_ctx = NULL;
525e0c4386eSCy Schubert EVP_PKEY *param_key = NULL;
526e0c4386eSCy Schubert const struct dsa_pqver_st *tst = &dsa_pqver_data[id];
527e0c4386eSCy Schubert
528e0c4386eSCy Schubert if (!TEST_ptr(bn_ctx = BN_CTX_new_ex(libctx))
529e0c4386eSCy Schubert || !TEST_true(dsa_create_pkey(¶m_key, tst->p, tst->p_len,
530e0c4386eSCy Schubert tst->q, tst->q_len, NULL, 0,
531e0c4386eSCy Schubert tst->seed, tst->seed_len, tst->counter,
532e0c4386eSCy Schubert 1, 0,
533e0c4386eSCy Schubert NULL, 0,
534e0c4386eSCy Schubert bn_ctx))
535e0c4386eSCy Schubert || !TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(libctx, param_key,
536e0c4386eSCy Schubert NULL))
537e0c4386eSCy Schubert || !TEST_int_eq(EVP_PKEY_param_check(key_ctx), tst->pass))
538e0c4386eSCy Schubert goto err;
539e0c4386eSCy Schubert
540e0c4386eSCy Schubert ret = 1;
541e0c4386eSCy Schubert err:
542e0c4386eSCy Schubert BN_CTX_free(bn_ctx);
543e0c4386eSCy Schubert EVP_PKEY_free(param_key);
544e0c4386eSCy Schubert EVP_PKEY_CTX_free(key_ctx);
545e0c4386eSCy Schubert return ret;
546e0c4386eSCy Schubert }
547e0c4386eSCy Schubert
548e0c4386eSCy Schubert /* Extract r and s from a dsa signature */
get_dsa_sig_rs_bytes(const unsigned char * sig,size_t sig_len,unsigned char ** r,unsigned char ** s,size_t * r_len,size_t * s_len)549e0c4386eSCy Schubert static int get_dsa_sig_rs_bytes(const unsigned char *sig, size_t sig_len,
550e0c4386eSCy Schubert unsigned char **r, unsigned char **s,
551e0c4386eSCy Schubert size_t *r_len, size_t *s_len)
552e0c4386eSCy Schubert {
553e0c4386eSCy Schubert int ret = 0;
554e0c4386eSCy Schubert unsigned char *rbuf = NULL, *sbuf = NULL;
555e0c4386eSCy Schubert size_t r1_len, s1_len;
556e0c4386eSCy Schubert const BIGNUM *r1, *s1;
557e0c4386eSCy Schubert DSA_SIG *sign = d2i_DSA_SIG(NULL, &sig, sig_len);
558e0c4386eSCy Schubert
559e0c4386eSCy Schubert if (sign == NULL)
560e0c4386eSCy Schubert return 0;
561e0c4386eSCy Schubert DSA_SIG_get0(sign, &r1, &s1);
562e0c4386eSCy Schubert if (r1 == NULL || s1 == NULL)
563e0c4386eSCy Schubert goto err;
564e0c4386eSCy Schubert
565e0c4386eSCy Schubert r1_len = BN_num_bytes(r1);
566e0c4386eSCy Schubert s1_len = BN_num_bytes(s1);
567e0c4386eSCy Schubert rbuf = OPENSSL_zalloc(r1_len);
568e0c4386eSCy Schubert sbuf = OPENSSL_zalloc(s1_len);
569e0c4386eSCy Schubert if (rbuf == NULL || sbuf == NULL)
570e0c4386eSCy Schubert goto err;
571e0c4386eSCy Schubert if (BN_bn2binpad(r1, rbuf, r1_len) <= 0)
572e0c4386eSCy Schubert goto err;
573e0c4386eSCy Schubert if (BN_bn2binpad(s1, sbuf, s1_len) <= 0)
574e0c4386eSCy Schubert goto err;
575e0c4386eSCy Schubert *r = rbuf;
576e0c4386eSCy Schubert *s = sbuf;
577e0c4386eSCy Schubert *r_len = r1_len;
578e0c4386eSCy Schubert *s_len = s1_len;
579e0c4386eSCy Schubert ret = 1;
580e0c4386eSCy Schubert err:
581e0c4386eSCy Schubert if (ret == 0) {
582e0c4386eSCy Schubert OPENSSL_free(rbuf);
583e0c4386eSCy Schubert OPENSSL_free(sbuf);
584e0c4386eSCy Schubert }
585e0c4386eSCy Schubert DSA_SIG_free(sign);
586e0c4386eSCy Schubert return ret;
587e0c4386eSCy Schubert }
588e0c4386eSCy Schubert
dsa_siggen_test(int id)589e0c4386eSCy Schubert static int dsa_siggen_test(int id)
590e0c4386eSCy Schubert {
591e0c4386eSCy Schubert int ret = 0;
592e0c4386eSCy Schubert EVP_PKEY *pkey = NULL;
593e0c4386eSCy Schubert unsigned char *sig = NULL, *r = NULL, *s = NULL;
594e0c4386eSCy Schubert size_t sig_len = 0, rlen = 0, slen = 0;
595e0c4386eSCy Schubert const struct dsa_siggen_st *tst = &dsa_siggen_data[id];
596e0c4386eSCy Schubert
597e0c4386eSCy Schubert if (!TEST_ptr(pkey = dsa_keygen(tst->L, tst->N)))
598e0c4386eSCy Schubert goto err;
599e0c4386eSCy Schubert
600e0c4386eSCy Schubert if (!TEST_true(sig_gen(pkey, NULL, tst->digest_alg, tst->msg, tst->msg_len,
601e0c4386eSCy Schubert &sig, &sig_len))
602e0c4386eSCy Schubert || !TEST_true(get_dsa_sig_rs_bytes(sig, sig_len, &r, &s, &rlen, &slen)))
603e0c4386eSCy Schubert goto err;
604e0c4386eSCy Schubert test_output_memory("r", r, rlen);
605e0c4386eSCy Schubert test_output_memory("s", s, slen);
606e0c4386eSCy Schubert ret = 1;
607e0c4386eSCy Schubert err:
608e0c4386eSCy Schubert OPENSSL_free(r);
609e0c4386eSCy Schubert OPENSSL_free(s);
610e0c4386eSCy Schubert OPENSSL_free(sig);
611e0c4386eSCy Schubert EVP_PKEY_free(pkey);
612e0c4386eSCy Schubert return ret;
613e0c4386eSCy Schubert }
614e0c4386eSCy Schubert
dsa_sigver_test(int id)615e0c4386eSCy Schubert static int dsa_sigver_test(int id)
616e0c4386eSCy Schubert {
617e0c4386eSCy Schubert int ret = 0;
618e0c4386eSCy Schubert EVP_PKEY_CTX *ctx = NULL;
619e0c4386eSCy Schubert EVP_PKEY *pkey = NULL;
620e0c4386eSCy Schubert DSA_SIG *sign = NULL;
621e0c4386eSCy Schubert size_t sig_len;
622e0c4386eSCy Schubert unsigned char *sig = NULL;
623e0c4386eSCy Schubert BIGNUM *rbn = NULL, *sbn = NULL;
624e0c4386eSCy Schubert EVP_MD *md = NULL;
625e0c4386eSCy Schubert unsigned char digest[EVP_MAX_MD_SIZE];
626e0c4386eSCy Schubert unsigned int digest_len;
627e0c4386eSCy Schubert BN_CTX *bn_ctx = NULL;
628e0c4386eSCy Schubert const struct dsa_sigver_st *tst = &dsa_sigver_data[id];
629e0c4386eSCy Schubert
630e0c4386eSCy Schubert if (!TEST_ptr(bn_ctx = BN_CTX_new())
631e0c4386eSCy Schubert || !TEST_true(dsa_create_pkey(&pkey, tst->p, tst->p_len,
632e0c4386eSCy Schubert tst->q, tst->q_len, tst->g, tst->g_len,
633e0c4386eSCy Schubert NULL, 0, 0, 0, 0, tst->pub, tst->pub_len,
634e0c4386eSCy Schubert bn_ctx)))
635e0c4386eSCy Schubert goto err;
636e0c4386eSCy Schubert
637e0c4386eSCy Schubert if (!TEST_ptr(sign = DSA_SIG_new())
638e0c4386eSCy Schubert || !TEST_ptr(rbn = BN_bin2bn(tst->r, tst->r_len, NULL))
639e0c4386eSCy Schubert || !TEST_ptr(sbn = BN_bin2bn(tst->s, tst->s_len, NULL))
640e0c4386eSCy Schubert || !TEST_true(DSA_SIG_set0(sign, rbn, sbn)))
641e0c4386eSCy Schubert goto err;
642e0c4386eSCy Schubert rbn = sbn = NULL;
643e0c4386eSCy Schubert
644e0c4386eSCy Schubert if (!TEST_ptr(md = EVP_MD_fetch(libctx, tst->digest_alg, ""))
645e0c4386eSCy Schubert || !TEST_true(EVP_Digest(tst->msg, tst->msg_len,
646e0c4386eSCy Schubert digest, &digest_len, md, NULL)))
647e0c4386eSCy Schubert goto err;
648e0c4386eSCy Schubert
649e0c4386eSCy Schubert if (!TEST_int_gt((sig_len = i2d_DSA_SIG(sign, &sig)), 0)
650e0c4386eSCy Schubert || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, ""))
651e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_verify_init(ctx), 0)
652e0c4386eSCy Schubert || !TEST_int_eq(EVP_PKEY_verify(ctx, sig, sig_len, digest, digest_len),
653e0c4386eSCy Schubert tst->pass))
654e0c4386eSCy Schubert goto err;
655e0c4386eSCy Schubert ret = 1;
656e0c4386eSCy Schubert err:
657e0c4386eSCy Schubert EVP_PKEY_CTX_free(ctx);
658e0c4386eSCy Schubert OPENSSL_free(sig);
659e0c4386eSCy Schubert EVP_MD_free(md);
660e0c4386eSCy Schubert DSA_SIG_free(sign);
661e0c4386eSCy Schubert EVP_PKEY_free(pkey);
662e0c4386eSCy Schubert BN_free(rbn);
663e0c4386eSCy Schubert BN_free(sbn);
664e0c4386eSCy Schubert BN_CTX_free(bn_ctx);
665e0c4386eSCy Schubert return ret;
666e0c4386eSCy Schubert }
667e0c4386eSCy Schubert #endif /* OPENSSL_NO_DSA */
668e0c4386eSCy Schubert
669e0c4386eSCy Schubert
670e0c4386eSCy Schubert /* cipher encrypt/decrypt */
cipher_enc(const char * alg,const unsigned char * pt,size_t pt_len,const unsigned char * key,size_t key_len,const unsigned char * iv,size_t iv_len,const unsigned char * ct,size_t ct_len,int enc)671e0c4386eSCy Schubert static int cipher_enc(const char *alg,
672e0c4386eSCy Schubert const unsigned char *pt, size_t pt_len,
673e0c4386eSCy Schubert const unsigned char *key, size_t key_len,
674e0c4386eSCy Schubert const unsigned char *iv, size_t iv_len,
675e0c4386eSCy Schubert const unsigned char *ct, size_t ct_len,
676e0c4386eSCy Schubert int enc)
677e0c4386eSCy Schubert {
678e0c4386eSCy Schubert int ret = 0, out_len = 0, len = 0;
679e0c4386eSCy Schubert EVP_CIPHER_CTX *ctx = NULL;
680e0c4386eSCy Schubert EVP_CIPHER *cipher = NULL;
681e0c4386eSCy Schubert unsigned char out[256] = { 0 };
682e0c4386eSCy Schubert
683e0c4386eSCy Schubert TEST_note("%s : %s", alg, enc ? "encrypt" : "decrypt");
684e0c4386eSCy Schubert if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())
685e0c4386eSCy Schubert || !TEST_ptr(cipher = EVP_CIPHER_fetch(libctx, alg, ""))
686e0c4386eSCy Schubert || !TEST_true(EVP_CipherInit_ex(ctx, cipher, NULL, key, iv, enc))
687e0c4386eSCy Schubert || !TEST_true(EVP_CIPHER_CTX_set_padding(ctx, 0))
688e0c4386eSCy Schubert || !TEST_true(EVP_CipherUpdate(ctx, out, &len, pt, pt_len))
689e0c4386eSCy Schubert || !TEST_true(EVP_CipherFinal_ex(ctx, out + len, &out_len)))
690e0c4386eSCy Schubert goto err;
691e0c4386eSCy Schubert out_len += len;
692e0c4386eSCy Schubert if (!TEST_mem_eq(out, out_len, ct, ct_len))
693e0c4386eSCy Schubert goto err;
694e0c4386eSCy Schubert ret = 1;
695e0c4386eSCy Schubert err:
696e0c4386eSCy Schubert EVP_CIPHER_free(cipher);
697e0c4386eSCy Schubert EVP_CIPHER_CTX_free(ctx);
698e0c4386eSCy Schubert return ret;
699e0c4386eSCy Schubert }
700e0c4386eSCy Schubert
cipher_enc_dec_test(int id)701e0c4386eSCy Schubert static int cipher_enc_dec_test(int id)
702e0c4386eSCy Schubert {
703e0c4386eSCy Schubert const struct cipher_st *tst = &cipher_enc_data[id];
704e0c4386eSCy Schubert const int enc = 1;
705e0c4386eSCy Schubert
706e0c4386eSCy Schubert return TEST_true(cipher_enc(tst->alg, tst->pt, tst->pt_len,
707e0c4386eSCy Schubert tst->key, tst->key_len,
708e0c4386eSCy Schubert tst->iv, tst->iv_len,
709e0c4386eSCy Schubert tst->ct, tst->ct_len, enc))
710e0c4386eSCy Schubert && TEST_true(cipher_enc(tst->alg, tst->ct, tst->ct_len,
711e0c4386eSCy Schubert tst->key, tst->key_len,
712e0c4386eSCy Schubert tst->iv, tst->iv_len,
713e0c4386eSCy Schubert tst->pt, tst->pt_len, !enc));
714e0c4386eSCy Schubert }
715e0c4386eSCy Schubert
aes_ccm_enc_dec(const char * alg,const unsigned char * pt,size_t pt_len,const unsigned char * key,size_t key_len,const unsigned char * iv,size_t iv_len,const unsigned char * aad,size_t aad_len,const unsigned char * ct,size_t ct_len,const unsigned char * tag,size_t tag_len,int enc,int pass)716e0c4386eSCy Schubert static int aes_ccm_enc_dec(const char *alg,
717e0c4386eSCy Schubert const unsigned char *pt, size_t pt_len,
718e0c4386eSCy Schubert const unsigned char *key, size_t key_len,
719e0c4386eSCy Schubert const unsigned char *iv, size_t iv_len,
720e0c4386eSCy Schubert const unsigned char *aad, size_t aad_len,
721e0c4386eSCy Schubert const unsigned char *ct, size_t ct_len,
722e0c4386eSCy Schubert const unsigned char *tag, size_t tag_len,
723e0c4386eSCy Schubert int enc, int pass)
724e0c4386eSCy Schubert {
725e0c4386eSCy Schubert int ret = 0;
726e0c4386eSCy Schubert EVP_CIPHER_CTX *ctx;
727e0c4386eSCy Schubert EVP_CIPHER *cipher = NULL;
728e0c4386eSCy Schubert int out_len, len;
729e0c4386eSCy Schubert unsigned char out[1024];
730e0c4386eSCy Schubert
731e0c4386eSCy Schubert TEST_note("%s : %s : expected to %s", alg, enc ? "encrypt" : "decrypt",
732e0c4386eSCy Schubert pass ? "pass" : "fail");
733e0c4386eSCy Schubert
734e0c4386eSCy Schubert if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())
735e0c4386eSCy Schubert || !TEST_ptr(cipher = EVP_CIPHER_fetch(libctx, alg, ""))
736e0c4386eSCy Schubert || !TEST_true(EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc))
737e0c4386eSCy Schubert || !TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, iv_len,
738e0c4386eSCy Schubert NULL), 0)
739e0c4386eSCy Schubert || !TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len,
740e0c4386eSCy Schubert enc ? NULL : (void *)tag), 0)
741e0c4386eSCy Schubert || !TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, enc))
742e0c4386eSCy Schubert || !TEST_true(EVP_CIPHER_CTX_set_padding(ctx, 0))
743e0c4386eSCy Schubert || !TEST_true(EVP_CipherUpdate(ctx, NULL, &len, NULL, pt_len))
744e0c4386eSCy Schubert || !TEST_true(EVP_CipherUpdate(ctx, NULL, &len, aad, aad_len))
745e0c4386eSCy Schubert || !TEST_int_eq(EVP_CipherUpdate(ctx, out, &len, pt, pt_len), pass))
746e0c4386eSCy Schubert goto err;
747e0c4386eSCy Schubert
748e0c4386eSCy Schubert if (!pass) {
749e0c4386eSCy Schubert ret = 1;
750e0c4386eSCy Schubert goto err;
751e0c4386eSCy Schubert }
752e0c4386eSCy Schubert if (!TEST_true(EVP_CipherFinal_ex(ctx, out + len, &out_len)))
753e0c4386eSCy Schubert goto err;
754e0c4386eSCy Schubert if (enc) {
755e0c4386eSCy Schubert out_len += len;
756e0c4386eSCy Schubert if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG,
757e0c4386eSCy Schubert tag_len, out + out_len), 0)
758e0c4386eSCy Schubert || !TEST_mem_eq(out, out_len, ct, ct_len)
759e0c4386eSCy Schubert || !TEST_mem_eq(out + out_len, tag_len, tag, tag_len))
760e0c4386eSCy Schubert goto err;
761e0c4386eSCy Schubert } else {
762e0c4386eSCy Schubert if (!TEST_mem_eq(out, out_len + len, ct, ct_len))
763e0c4386eSCy Schubert goto err;
764e0c4386eSCy Schubert }
765e0c4386eSCy Schubert
766e0c4386eSCy Schubert ret = 1;
767e0c4386eSCy Schubert err:
768e0c4386eSCy Schubert EVP_CIPHER_free(cipher);
769e0c4386eSCy Schubert EVP_CIPHER_CTX_free(ctx);
770e0c4386eSCy Schubert return ret;
771e0c4386eSCy Schubert }
772e0c4386eSCy Schubert
aes_ccm_enc_dec_test(int id)773e0c4386eSCy Schubert static int aes_ccm_enc_dec_test(int id)
774e0c4386eSCy Schubert {
775e0c4386eSCy Schubert const struct cipher_ccm_st *tst = &aes_ccm_enc_data[id];
776e0c4386eSCy Schubert
777e0c4386eSCy Schubert /* The tag is on the end of the cipher text */
778e0c4386eSCy Schubert const size_t tag_len = tst->ct_len - tst->pt_len;
779e0c4386eSCy Schubert const size_t ct_len = tst->ct_len - tag_len;
780e0c4386eSCy Schubert const unsigned char *tag = tst->ct + ct_len;
781e0c4386eSCy Schubert const int enc = 1;
782e0c4386eSCy Schubert const int pass = 1;
783e0c4386eSCy Schubert
784e0c4386eSCy Schubert if (ct_len < 1)
785e0c4386eSCy Schubert return 0;
786e0c4386eSCy Schubert
787e0c4386eSCy Schubert return aes_ccm_enc_dec(tst->alg, tst->pt, tst->pt_len,
788e0c4386eSCy Schubert tst->key, tst->key_len,
789e0c4386eSCy Schubert tst->iv, tst->iv_len, tst->aad, tst->aad_len,
790e0c4386eSCy Schubert tst->ct, ct_len, tag, tag_len, enc, pass)
791e0c4386eSCy Schubert && aes_ccm_enc_dec(tst->alg, tst->ct, ct_len,
792e0c4386eSCy Schubert tst->key, tst->key_len,
793e0c4386eSCy Schubert tst->iv, tst->iv_len, tst->aad, tst->aad_len,
794e0c4386eSCy Schubert tst->pt, tst->pt_len, tag, tag_len, !enc, pass)
795e0c4386eSCy Schubert /* test that it fails if the tag is incorrect */
796e0c4386eSCy Schubert && aes_ccm_enc_dec(tst->alg, tst->ct, ct_len,
797e0c4386eSCy Schubert tst->key, tst->key_len,
798e0c4386eSCy Schubert tst->iv, tst->iv_len, tst->aad, tst->aad_len,
799e0c4386eSCy Schubert tst->pt, tst->pt_len,
800e0c4386eSCy Schubert tag - 1, tag_len, !enc, !pass);
801e0c4386eSCy Schubert }
802e0c4386eSCy Schubert
aes_gcm_enc_dec(const char * alg,const unsigned char * pt,size_t pt_len,const unsigned char * key,size_t key_len,const unsigned char * iv,size_t iv_len,const unsigned char * aad,size_t aad_len,const unsigned char * ct,size_t ct_len,const unsigned char * tag,size_t tag_len,int enc,int pass)803e0c4386eSCy Schubert static int aes_gcm_enc_dec(const char *alg,
804e0c4386eSCy Schubert const unsigned char *pt, size_t pt_len,
805e0c4386eSCy Schubert const unsigned char *key, size_t key_len,
806e0c4386eSCy Schubert const unsigned char *iv, size_t iv_len,
807e0c4386eSCy Schubert const unsigned char *aad, size_t aad_len,
808e0c4386eSCy Schubert const unsigned char *ct, size_t ct_len,
809e0c4386eSCy Schubert const unsigned char *tag, size_t tag_len,
810e0c4386eSCy Schubert int enc, int pass)
811e0c4386eSCy Schubert {
812e0c4386eSCy Schubert int ret = 0;
813e0c4386eSCy Schubert EVP_CIPHER_CTX *ctx;
814e0c4386eSCy Schubert EVP_CIPHER *cipher = NULL;
815e0c4386eSCy Schubert int out_len, len;
816e0c4386eSCy Schubert unsigned char out[1024];
817e0c4386eSCy Schubert
818e0c4386eSCy Schubert TEST_note("%s : %s : expected to %s", alg, enc ? "encrypt" : "decrypt",
819e0c4386eSCy Schubert pass ? "pass" : "fail");
820e0c4386eSCy Schubert
821e0c4386eSCy Schubert if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())
822e0c4386eSCy Schubert || !TEST_ptr(cipher = EVP_CIPHER_fetch(libctx, alg, ""))
823e0c4386eSCy Schubert || !TEST_true(EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc))
824e0c4386eSCy Schubert || !TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, iv_len,
825e0c4386eSCy Schubert NULL), 0))
826e0c4386eSCy Schubert goto err;
827e0c4386eSCy Schubert
828e0c4386eSCy Schubert if (!enc) {
829e0c4386eSCy Schubert if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len,
830e0c4386eSCy Schubert (void *)tag), 0))
831e0c4386eSCy Schubert goto err;
832e0c4386eSCy Schubert }
833e0c4386eSCy Schubert /*
834e0c4386eSCy Schubert * For testing purposes the IV it being set here. In a compliant application
835e0c4386eSCy Schubert * the IV would be generated internally. A fake entropy source could also
836e0c4386eSCy Schubert * be used to feed in the random IV bytes (see fake_random.c)
837e0c4386eSCy Schubert */
838e0c4386eSCy Schubert if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, enc))
839e0c4386eSCy Schubert || !TEST_true(EVP_CIPHER_CTX_set_padding(ctx, 0))
840e0c4386eSCy Schubert || !TEST_true(EVP_CipherUpdate(ctx, NULL, &len, aad, aad_len))
841e0c4386eSCy Schubert || !TEST_true(EVP_CipherUpdate(ctx, out, &len, pt, pt_len)))
842e0c4386eSCy Schubert goto err;
843e0c4386eSCy Schubert
844e0c4386eSCy Schubert if (!TEST_int_eq(EVP_CipherFinal_ex(ctx, out + len, &out_len), pass))
845e0c4386eSCy Schubert goto err;
846e0c4386eSCy Schubert if (!pass) {
847e0c4386eSCy Schubert ret = 1;
848e0c4386eSCy Schubert goto err;
849e0c4386eSCy Schubert }
850e0c4386eSCy Schubert out_len += len;
851e0c4386eSCy Schubert if (enc) {
852e0c4386eSCy Schubert if (!TEST_mem_eq(out, out_len, ct, ct_len)
853e0c4386eSCy Schubert || !TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG,
854e0c4386eSCy Schubert tag_len, out + out_len), 0)
855e0c4386eSCy Schubert || !TEST_mem_eq(out + out_len, tag_len, tag, tag_len))
856e0c4386eSCy Schubert goto err;
857e0c4386eSCy Schubert } else {
858e0c4386eSCy Schubert if (!TEST_mem_eq(out, out_len, ct, ct_len))
859e0c4386eSCy Schubert goto err;
860e0c4386eSCy Schubert }
861e0c4386eSCy Schubert
862e0c4386eSCy Schubert ret = 1;
863e0c4386eSCy Schubert err:
864e0c4386eSCy Schubert EVP_CIPHER_free(cipher);
865e0c4386eSCy Schubert EVP_CIPHER_CTX_free(ctx);
866e0c4386eSCy Schubert return ret;
867e0c4386eSCy Schubert }
868e0c4386eSCy Schubert
aes_gcm_enc_dec_test(int id)869e0c4386eSCy Schubert static int aes_gcm_enc_dec_test(int id)
870e0c4386eSCy Schubert {
871e0c4386eSCy Schubert const struct cipher_gcm_st *tst = &aes_gcm_enc_data[id];
872e0c4386eSCy Schubert int enc = 1;
873e0c4386eSCy Schubert int pass = 1;
874e0c4386eSCy Schubert
875e0c4386eSCy Schubert return aes_gcm_enc_dec(tst->alg, tst->pt, tst->pt_len,
876e0c4386eSCy Schubert tst->key, tst->key_len,
877e0c4386eSCy Schubert tst->iv, tst->iv_len, tst->aad, tst->aad_len,
878e0c4386eSCy Schubert tst->ct, tst->ct_len, tst->tag, tst->tag_len,
879e0c4386eSCy Schubert enc, pass)
880e0c4386eSCy Schubert && aes_gcm_enc_dec(tst->alg, tst->ct, tst->ct_len,
881e0c4386eSCy Schubert tst->key, tst->key_len,
882e0c4386eSCy Schubert tst->iv, tst->iv_len, tst->aad, tst->aad_len,
883e0c4386eSCy Schubert tst->pt, tst->pt_len, tst->tag, tst->tag_len,
884e0c4386eSCy Schubert !enc, pass)
885e0c4386eSCy Schubert /* Fail if incorrect tag passed to decrypt */
886e0c4386eSCy Schubert && aes_gcm_enc_dec(tst->alg, tst->ct, tst->ct_len,
887e0c4386eSCy Schubert tst->key, tst->key_len,
888e0c4386eSCy Schubert tst->iv, tst->iv_len, tst->aad, tst->aad_len,
889e0c4386eSCy Schubert tst->pt, tst->pt_len, tst->aad, tst->tag_len,
890e0c4386eSCy Schubert !enc, !pass);
891e0c4386eSCy Schubert }
892e0c4386eSCy Schubert
893e0c4386eSCy Schubert #ifndef OPENSSL_NO_DH
dh_create_pkey(EVP_PKEY ** pkey,const char * group_name,const unsigned char * pub,size_t pub_len,const unsigned char * priv,size_t priv_len,BN_CTX * bn_ctx,int pass)894e0c4386eSCy Schubert static int dh_create_pkey(EVP_PKEY **pkey, const char *group_name,
895e0c4386eSCy Schubert const unsigned char *pub, size_t pub_len,
896e0c4386eSCy Schubert const unsigned char *priv, size_t priv_len,
897e0c4386eSCy Schubert BN_CTX *bn_ctx, int pass)
898e0c4386eSCy Schubert {
899e0c4386eSCy Schubert int ret = 0;
900e0c4386eSCy Schubert EVP_PKEY_CTX *ctx = NULL;
901e0c4386eSCy Schubert OSSL_PARAM_BLD *bld = NULL;
902e0c4386eSCy Schubert OSSL_PARAM *params = NULL;
903e0c4386eSCy Schubert BIGNUM *pub_bn = NULL, *priv_bn = NULL;
904e0c4386eSCy Schubert
905e0c4386eSCy Schubert if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
906e0c4386eSCy Schubert || (group_name != NULL
907e0c4386eSCy Schubert && !TEST_int_gt(OSSL_PARAM_BLD_push_utf8_string(
908e0c4386eSCy Schubert bld, OSSL_PKEY_PARAM_GROUP_NAME,
909e0c4386eSCy Schubert group_name, 0), 0)))
910e0c4386eSCy Schubert goto err;
911e0c4386eSCy Schubert
912e0c4386eSCy Schubert if (pub != NULL) {
913e0c4386eSCy Schubert if (!TEST_ptr(pub_bn = BN_CTX_get(bn_ctx))
914e0c4386eSCy Schubert || !TEST_ptr(BN_bin2bn(pub, pub_len, pub_bn))
915e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
916e0c4386eSCy Schubert pub_bn)))
917e0c4386eSCy Schubert goto err;
918e0c4386eSCy Schubert }
919e0c4386eSCy Schubert if (priv != NULL) {
920e0c4386eSCy Schubert if (!TEST_ptr(priv_bn = BN_CTX_get(bn_ctx))
921e0c4386eSCy Schubert || !TEST_ptr(BN_bin2bn(priv, priv_len, priv_bn))
922e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
923e0c4386eSCy Schubert priv_bn)))
924e0c4386eSCy Schubert goto err;
925e0c4386eSCy Schubert }
926e0c4386eSCy Schubert
927e0c4386eSCy Schubert if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
928e0c4386eSCy Schubert || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "DH", NULL))
929e0c4386eSCy Schubert || !TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
930e0c4386eSCy Schubert || !TEST_int_eq(EVP_PKEY_fromdata(ctx, pkey, EVP_PKEY_KEYPAIR, params),
931e0c4386eSCy Schubert pass))
932e0c4386eSCy Schubert goto err;
933e0c4386eSCy Schubert
934e0c4386eSCy Schubert ret = 1;
935e0c4386eSCy Schubert err:
936e0c4386eSCy Schubert OSSL_PARAM_free(params);
937e0c4386eSCy Schubert OSSL_PARAM_BLD_free(bld);
938e0c4386eSCy Schubert EVP_PKEY_CTX_free(ctx);
939e0c4386eSCy Schubert return ret;
940e0c4386eSCy Schubert }
941e0c4386eSCy Schubert
dh_safe_prime_keygen_test(int id)942e0c4386eSCy Schubert static int dh_safe_prime_keygen_test(int id)
943e0c4386eSCy Schubert {
944e0c4386eSCy Schubert int ret = 0;
945e0c4386eSCy Schubert EVP_PKEY_CTX *ctx = NULL;
946e0c4386eSCy Schubert EVP_PKEY *pkey = NULL;
947e0c4386eSCy Schubert unsigned char *priv = NULL;
948e0c4386eSCy Schubert unsigned char *pub = NULL;
949e0c4386eSCy Schubert size_t priv_len = 0, pub_len = 0;
950e0c4386eSCy Schubert OSSL_PARAM params[2];
951e0c4386eSCy Schubert const struct dh_safe_prime_keygen_st *tst = &dh_safe_prime_keygen_data[id];
952e0c4386eSCy Schubert
953e0c4386eSCy Schubert params[0] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME,
954e0c4386eSCy Schubert (char *)tst->group_name, 0);
955e0c4386eSCy Schubert params[1] = OSSL_PARAM_construct_end();
956e0c4386eSCy Schubert
957e0c4386eSCy Schubert if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "DH", NULL))
958e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
959e0c4386eSCy Schubert || !TEST_true(EVP_PKEY_CTX_set_params(ctx, params))
960e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_keygen(ctx, &pkey), 0)
961e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_PRIV_KEY,
962e0c4386eSCy Schubert &priv, &priv_len))
963e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_PUB_KEY,
964e0c4386eSCy Schubert &pub, &pub_len)))
965e0c4386eSCy Schubert goto err;
966e0c4386eSCy Schubert
967e0c4386eSCy Schubert test_output_memory("x", priv, priv_len);
968e0c4386eSCy Schubert test_output_memory("y", pub, pub_len);
969e0c4386eSCy Schubert ret = 1;
970e0c4386eSCy Schubert err:
971e0c4386eSCy Schubert OPENSSL_clear_free(priv, priv_len);
972e0c4386eSCy Schubert OPENSSL_free(pub);
973e0c4386eSCy Schubert EVP_PKEY_free(pkey);
974e0c4386eSCy Schubert EVP_PKEY_CTX_free(ctx);
975e0c4386eSCy Schubert return ret;
976e0c4386eSCy Schubert }
977e0c4386eSCy Schubert
dh_safe_prime_keyver_test(int id)978e0c4386eSCy Schubert static int dh_safe_prime_keyver_test(int id)
979e0c4386eSCy Schubert {
980e0c4386eSCy Schubert int ret = 0;
981e0c4386eSCy Schubert BN_CTX *bn_ctx = NULL;
982e0c4386eSCy Schubert EVP_PKEY_CTX *key_ctx = NULL;
983e0c4386eSCy Schubert EVP_PKEY *pkey = NULL;
984e0c4386eSCy Schubert const struct dh_safe_prime_keyver_st *tst = &dh_safe_prime_keyver_data[id];
985e0c4386eSCy Schubert
986e0c4386eSCy Schubert if (!TEST_ptr(bn_ctx = BN_CTX_new_ex(libctx))
987e0c4386eSCy Schubert || !TEST_true(dh_create_pkey(&pkey, tst->group_name,
988e0c4386eSCy Schubert tst->pub, tst->pub_len,
989e0c4386eSCy Schubert tst->priv, tst->priv_len, bn_ctx, 1))
990e0c4386eSCy Schubert || !TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, ""))
991e0c4386eSCy Schubert || !TEST_int_eq(EVP_PKEY_check(key_ctx), tst->pass))
992e0c4386eSCy Schubert goto err;
993e0c4386eSCy Schubert
994e0c4386eSCy Schubert ret = 1;
995e0c4386eSCy Schubert err:
996e0c4386eSCy Schubert EVP_PKEY_free(pkey);
997e0c4386eSCy Schubert EVP_PKEY_CTX_free(key_ctx);
998e0c4386eSCy Schubert BN_CTX_free(bn_ctx);
999e0c4386eSCy Schubert return ret;
1000e0c4386eSCy Schubert }
1001e0c4386eSCy Schubert #endif /* OPENSSL_NO_DH */
1002e0c4386eSCy Schubert
1003e0c4386eSCy Schubert
rsa_create_pkey(EVP_PKEY ** pkey,const unsigned char * n,size_t n_len,const unsigned char * e,size_t e_len,const unsigned char * d,size_t d_len,BN_CTX * bn_ctx)1004e0c4386eSCy Schubert static int rsa_create_pkey(EVP_PKEY **pkey,
1005e0c4386eSCy Schubert const unsigned char *n, size_t n_len,
1006e0c4386eSCy Schubert const unsigned char *e, size_t e_len,
1007e0c4386eSCy Schubert const unsigned char *d, size_t d_len,
1008e0c4386eSCy Schubert BN_CTX *bn_ctx)
1009e0c4386eSCy Schubert {
1010e0c4386eSCy Schubert int ret = 0;
1011e0c4386eSCy Schubert EVP_PKEY_CTX *ctx = NULL;
1012e0c4386eSCy Schubert OSSL_PARAM_BLD *bld = NULL;
1013e0c4386eSCy Schubert OSSL_PARAM *params = NULL;
1014e0c4386eSCy Schubert BIGNUM *e_bn = NULL, *d_bn = NULL, *n_bn = NULL;
1015e0c4386eSCy Schubert
1016e0c4386eSCy Schubert if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
1017e0c4386eSCy Schubert || !TEST_ptr(n_bn = BN_CTX_get(bn_ctx))
1018e0c4386eSCy Schubert || !TEST_ptr(BN_bin2bn(n, n_len, n_bn))
1019e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_N, n_bn)))
1020e0c4386eSCy Schubert goto err;
1021e0c4386eSCy Schubert
1022e0c4386eSCy Schubert if (e != NULL) {
1023e0c4386eSCy Schubert if (!TEST_ptr(e_bn = BN_CTX_get(bn_ctx))
1024e0c4386eSCy Schubert || !TEST_ptr(BN_bin2bn(e, e_len, e_bn))
1025e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_E,
1026e0c4386eSCy Schubert e_bn)))
1027e0c4386eSCy Schubert goto err;
1028e0c4386eSCy Schubert }
1029e0c4386eSCy Schubert if (d != NULL) {
1030e0c4386eSCy Schubert if (!TEST_ptr(d_bn = BN_CTX_get(bn_ctx))
1031e0c4386eSCy Schubert || !TEST_ptr(BN_bin2bn(d, d_len, d_bn))
1032e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_D,
1033e0c4386eSCy Schubert d_bn)))
1034e0c4386eSCy Schubert goto err;
1035e0c4386eSCy Schubert }
1036e0c4386eSCy Schubert if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
1037e0c4386eSCy Schubert || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "RSA", NULL))
1038e0c4386eSCy Schubert || !TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
1039e0c4386eSCy Schubert || !TEST_int_eq(EVP_PKEY_fromdata(ctx, pkey, EVP_PKEY_KEYPAIR, params),
1040e0c4386eSCy Schubert 1))
1041e0c4386eSCy Schubert goto err;
1042e0c4386eSCy Schubert
1043e0c4386eSCy Schubert ret = 1;
1044e0c4386eSCy Schubert err:
1045e0c4386eSCy Schubert OSSL_PARAM_free(params);
1046e0c4386eSCy Schubert OSSL_PARAM_BLD_free(bld);
1047e0c4386eSCy Schubert EVP_PKEY_CTX_free(ctx);
1048e0c4386eSCy Schubert return ret;
1049e0c4386eSCy Schubert }
1050e0c4386eSCy Schubert
rsa_keygen_test(int id)1051e0c4386eSCy Schubert static int rsa_keygen_test(int id)
1052e0c4386eSCy Schubert {
1053e0c4386eSCy Schubert int ret = 0;
1054e0c4386eSCy Schubert EVP_PKEY_CTX *ctx = NULL;
1055e0c4386eSCy Schubert EVP_PKEY *pkey = NULL;
1056e0c4386eSCy Schubert BIGNUM *e_bn = NULL;
1057e0c4386eSCy Schubert BIGNUM *xp1_bn = NULL, *xp2_bn = NULL, *xp_bn = NULL;
1058e0c4386eSCy Schubert BIGNUM *xq1_bn = NULL, *xq2_bn = NULL, *xq_bn = NULL;
1059e0c4386eSCy Schubert unsigned char *n = NULL, *d = NULL;
1060e0c4386eSCy Schubert unsigned char *p = NULL, *p1 = NULL, *p2 = NULL;
1061e0c4386eSCy Schubert unsigned char *q = NULL, *q1 = NULL, *q2 = NULL;
1062e0c4386eSCy Schubert size_t n_len = 0, d_len = 0;
1063e0c4386eSCy Schubert size_t p_len = 0, p1_len = 0, p2_len = 0;
1064e0c4386eSCy Schubert size_t q_len = 0, q1_len = 0, q2_len = 0;
1065e0c4386eSCy Schubert OSSL_PARAM_BLD *bld = NULL;
1066e0c4386eSCy Schubert OSSL_PARAM *params = NULL;
1067e0c4386eSCy Schubert const struct rsa_keygen_st *tst = &rsa_keygen_data[id];
1068e0c4386eSCy Schubert
1069e0c4386eSCy Schubert if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
1070e0c4386eSCy Schubert || !TEST_ptr(xp1_bn = BN_bin2bn(tst->xp1, tst->xp1_len, NULL))
1071e0c4386eSCy Schubert || !TEST_ptr(xp2_bn = BN_bin2bn(tst->xp2, tst->xp2_len, NULL))
1072e0c4386eSCy Schubert || !TEST_ptr(xp_bn = BN_bin2bn(tst->xp, tst->xp_len, NULL))
1073e0c4386eSCy Schubert || !TEST_ptr(xq1_bn = BN_bin2bn(tst->xq1, tst->xq1_len, NULL))
1074e0c4386eSCy Schubert || !TEST_ptr(xq2_bn = BN_bin2bn(tst->xq2, tst->xq2_len, NULL))
1075e0c4386eSCy Schubert || !TEST_ptr(xq_bn = BN_bin2bn(tst->xq, tst->xq_len, NULL))
1076e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_TEST_XP1,
1077e0c4386eSCy Schubert xp1_bn))
1078e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_TEST_XP2,
1079e0c4386eSCy Schubert xp2_bn))
1080e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_TEST_XP,
1081e0c4386eSCy Schubert xp_bn))
1082e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_TEST_XQ1,
1083e0c4386eSCy Schubert xq1_bn))
1084e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_TEST_XQ2,
1085e0c4386eSCy Schubert xq2_bn))
1086e0c4386eSCy Schubert || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_TEST_XQ,
1087e0c4386eSCy Schubert xq_bn))
1088e0c4386eSCy Schubert || !TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
1089e0c4386eSCy Schubert goto err;
1090e0c4386eSCy Schubert
1091e0c4386eSCy Schubert if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "RSA", NULL))
1092e0c4386eSCy Schubert || !TEST_ptr(e_bn = BN_bin2bn(tst->e, tst->e_len, NULL))
1093e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
1094e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_CTX_set_params(ctx, params), 0)
1095e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, tst->mod), 0)
1096e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_CTX_set1_rsa_keygen_pubexp(ctx, e_bn), 0)
1097e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_keygen(ctx, &pkey), 0)
1098e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_TEST_P1,
1099e0c4386eSCy Schubert &p1, &p1_len))
1100e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_TEST_P2,
1101e0c4386eSCy Schubert &p2, &p2_len))
1102e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_TEST_Q1,
1103e0c4386eSCy Schubert &q1, &q1_len))
1104e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_TEST_Q2,
1105e0c4386eSCy Schubert &q2, &q2_len))
1106e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_FACTOR1,
1107e0c4386eSCy Schubert &p, &p_len))
1108e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_FACTOR2,
1109e0c4386eSCy Schubert &q, &q_len))
1110e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_N,
1111e0c4386eSCy Schubert &n, &n_len))
1112e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_D,
1113e0c4386eSCy Schubert &d, &d_len)))
1114e0c4386eSCy Schubert goto err;
1115e0c4386eSCy Schubert
1116e0c4386eSCy Schubert if (!TEST_mem_eq(tst->p1, tst->p1_len, p1, p1_len)
1117e0c4386eSCy Schubert || !TEST_mem_eq(tst->p2, tst->p2_len, p2, p2_len)
1118e0c4386eSCy Schubert || !TEST_mem_eq(tst->p, tst->p_len, p, p_len)
1119e0c4386eSCy Schubert || !TEST_mem_eq(tst->q1, tst->q1_len, q1, q1_len)
1120e0c4386eSCy Schubert || !TEST_mem_eq(tst->q2, tst->q2_len, q2, q2_len)
1121e0c4386eSCy Schubert || !TEST_mem_eq(tst->q, tst->q_len, q, q_len)
1122e0c4386eSCy Schubert || !TEST_mem_eq(tst->n, tst->n_len, n, n_len)
1123e0c4386eSCy Schubert || !TEST_mem_eq(tst->d, tst->d_len, d, d_len))
1124e0c4386eSCy Schubert goto err;
1125e0c4386eSCy Schubert
1126e0c4386eSCy Schubert test_output_memory("p1", p1, p1_len);
1127e0c4386eSCy Schubert test_output_memory("p2", p2, p2_len);
1128e0c4386eSCy Schubert test_output_memory("p", p, p_len);
1129e0c4386eSCy Schubert test_output_memory("q1", q1, q1_len);
1130e0c4386eSCy Schubert test_output_memory("q2", q2, q2_len);
1131e0c4386eSCy Schubert test_output_memory("q", q, q_len);
1132e0c4386eSCy Schubert test_output_memory("n", n, n_len);
1133e0c4386eSCy Schubert test_output_memory("d", d, d_len);
1134e0c4386eSCy Schubert ret = 1;
1135e0c4386eSCy Schubert err:
1136e0c4386eSCy Schubert BN_free(xp1_bn);
1137e0c4386eSCy Schubert BN_free(xp2_bn);
1138e0c4386eSCy Schubert BN_free(xp_bn);
1139e0c4386eSCy Schubert BN_free(xq1_bn);
1140e0c4386eSCy Schubert BN_free(xq2_bn);
1141e0c4386eSCy Schubert BN_free(xq_bn);
1142e0c4386eSCy Schubert BN_free(e_bn);
1143e0c4386eSCy Schubert OPENSSL_free(p1);
1144e0c4386eSCy Schubert OPENSSL_free(p2);
1145e0c4386eSCy Schubert OPENSSL_free(q1);
1146e0c4386eSCy Schubert OPENSSL_free(q2);
1147e0c4386eSCy Schubert OPENSSL_free(p);
1148e0c4386eSCy Schubert OPENSSL_free(q);
1149e0c4386eSCy Schubert OPENSSL_free(n);
1150e0c4386eSCy Schubert OPENSSL_free(d);
1151e0c4386eSCy Schubert EVP_PKEY_free(pkey);
1152e0c4386eSCy Schubert EVP_PKEY_CTX_free(ctx);
1153e0c4386eSCy Schubert OSSL_PARAM_free(params);
1154e0c4386eSCy Schubert OSSL_PARAM_BLD_free(bld);
1155e0c4386eSCy Schubert return ret;
1156e0c4386eSCy Schubert }
1157e0c4386eSCy Schubert
rsa_siggen_test(int id)1158e0c4386eSCy Schubert static int rsa_siggen_test(int id)
1159e0c4386eSCy Schubert {
1160e0c4386eSCy Schubert int ret = 0;
1161e0c4386eSCy Schubert EVP_PKEY *pkey = NULL;
1162e0c4386eSCy Schubert unsigned char *sig = NULL, *n = NULL, *e = NULL;
1163e0c4386eSCy Schubert size_t sig_len = 0, n_len = 0, e_len = 0;
1164e0c4386eSCy Schubert OSSL_PARAM params[4], *p;
1165e0c4386eSCy Schubert const struct rsa_siggen_st *tst = &rsa_siggen_data[id];
1166e0c4386eSCy Schubert int salt_len = tst->pss_salt_len;
1167e0c4386eSCy Schubert
1168e0c4386eSCy Schubert TEST_note("RSA %s signature generation", tst->sig_pad_mode);
1169e0c4386eSCy Schubert
1170e0c4386eSCy Schubert p = params;
1171e0c4386eSCy Schubert *p++ = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_PAD_MODE,
1172e0c4386eSCy Schubert (char *)tst->sig_pad_mode, 0);
1173e0c4386eSCy Schubert *p++ = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
1174e0c4386eSCy Schubert (char *)tst->digest_alg, 0);
1175e0c4386eSCy Schubert if (salt_len >= 0)
1176e0c4386eSCy Schubert *p++ = OSSL_PARAM_construct_int(OSSL_SIGNATURE_PARAM_PSS_SALTLEN,
1177e0c4386eSCy Schubert &salt_len);
1178e0c4386eSCy Schubert *p++ = OSSL_PARAM_construct_end();
1179e0c4386eSCy Schubert
1180e0c4386eSCy Schubert if (!TEST_ptr(pkey = EVP_PKEY_Q_keygen(libctx, NULL, "RSA", tst->mod))
1181e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_N, &n, &n_len))
1182e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_E, &e, &e_len))
1183e0c4386eSCy Schubert || !TEST_true(sig_gen(pkey, params, tst->digest_alg,
1184e0c4386eSCy Schubert tst->msg, tst->msg_len,
1185e0c4386eSCy Schubert &sig, &sig_len)))
1186e0c4386eSCy Schubert goto err;
1187e0c4386eSCy Schubert test_output_memory("n", n, n_len);
1188e0c4386eSCy Schubert test_output_memory("e", e, e_len);
1189e0c4386eSCy Schubert test_output_memory("sig", sig, sig_len);
1190e0c4386eSCy Schubert ret = 1;
1191e0c4386eSCy Schubert err:
1192e0c4386eSCy Schubert OPENSSL_free(n);
1193e0c4386eSCy Schubert OPENSSL_free(e);
1194e0c4386eSCy Schubert OPENSSL_free(sig);
1195e0c4386eSCy Schubert EVP_PKEY_free(pkey);
1196e0c4386eSCy Schubert return ret;
1197e0c4386eSCy Schubert }
1198e0c4386eSCy Schubert
rsa_sigver_test(int id)1199e0c4386eSCy Schubert static int rsa_sigver_test(int id)
1200e0c4386eSCy Schubert {
1201e0c4386eSCy Schubert int ret = 0;
1202e0c4386eSCy Schubert EVP_PKEY_CTX *pkey_ctx = NULL;
1203e0c4386eSCy Schubert EVP_PKEY *pkey = NULL;
1204e0c4386eSCy Schubert EVP_MD_CTX *md_ctx = NULL;
1205e0c4386eSCy Schubert BN_CTX *bn_ctx = NULL;
1206e0c4386eSCy Schubert OSSL_PARAM params[4], *p;
1207e0c4386eSCy Schubert const struct rsa_sigver_st *tst = &rsa_sigver_data[id];
1208e0c4386eSCy Schubert int salt_len = tst->pss_salt_len;
1209e0c4386eSCy Schubert
1210e0c4386eSCy Schubert TEST_note("RSA %s Signature Verify : expected to %s ", tst->sig_pad_mode,
1211e0c4386eSCy Schubert tst->pass == PASS ? "pass" : "fail");
1212e0c4386eSCy Schubert
1213e0c4386eSCy Schubert p = params;
1214e0c4386eSCy Schubert *p++ = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_PAD_MODE,
1215e0c4386eSCy Schubert (char *)tst->sig_pad_mode, 0);
1216e0c4386eSCy Schubert *p++ = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
1217e0c4386eSCy Schubert (char *)tst->digest_alg, 0);
1218e0c4386eSCy Schubert if (salt_len >= 0)
1219e0c4386eSCy Schubert *p++ = OSSL_PARAM_construct_int(OSSL_SIGNATURE_PARAM_PSS_SALTLEN,
1220e0c4386eSCy Schubert &salt_len);
1221e0c4386eSCy Schubert *p++ = OSSL_PARAM_construct_end();
1222e0c4386eSCy Schubert
1223e0c4386eSCy Schubert if (!TEST_ptr(bn_ctx = BN_CTX_new())
1224e0c4386eSCy Schubert || !TEST_true(rsa_create_pkey(&pkey, tst->n, tst->n_len,
1225e0c4386eSCy Schubert tst->e, tst->e_len, NULL, 0, bn_ctx))
1226e0c4386eSCy Schubert || !TEST_ptr(md_ctx = EVP_MD_CTX_new())
1227e0c4386eSCy Schubert || !TEST_true(EVP_DigestVerifyInit_ex(md_ctx, &pkey_ctx,
1228e0c4386eSCy Schubert tst->digest_alg, libctx, NULL,
1229e0c4386eSCy Schubert pkey, NULL))
1230e0c4386eSCy Schubert || !TEST_true(EVP_PKEY_CTX_set_params(pkey_ctx, params))
1231e0c4386eSCy Schubert || !TEST_int_eq(EVP_DigestVerify(md_ctx, tst->sig, tst->sig_len,
1232e0c4386eSCy Schubert tst->msg, tst->msg_len), tst->pass))
1233e0c4386eSCy Schubert goto err;
1234e0c4386eSCy Schubert ret = 1;
1235e0c4386eSCy Schubert err:
1236e0c4386eSCy Schubert EVP_PKEY_free(pkey);
1237e0c4386eSCy Schubert BN_CTX_free(bn_ctx);
1238e0c4386eSCy Schubert EVP_MD_CTX_free(md_ctx);
1239e0c4386eSCy Schubert return ret;
1240e0c4386eSCy Schubert }
1241e0c4386eSCy Schubert
rsa_decryption_primitive_test(int id)1242e0c4386eSCy Schubert static int rsa_decryption_primitive_test(int id)
1243e0c4386eSCy Schubert {
1244e0c4386eSCy Schubert int ret = 0;
1245e0c4386eSCy Schubert EVP_PKEY_CTX *ctx = NULL;
1246e0c4386eSCy Schubert EVP_PKEY *pkey = NULL;
1247e0c4386eSCy Schubert unsigned char pt[2048];
1248e0c4386eSCy Schubert size_t pt_len = sizeof(pt);
1249e0c4386eSCy Schubert unsigned char *n = NULL, *e = NULL;
1250e0c4386eSCy Schubert size_t n_len = 0, e_len = 0;
1251e0c4386eSCy Schubert BN_CTX *bn_ctx = NULL;
1252e0c4386eSCy Schubert const struct rsa_decrypt_prim_st *tst = &rsa_decrypt_prim_data[id];
1253e0c4386eSCy Schubert
1254*0d0c8621SEnji Cooper if (!TEST_ptr(pkey = EVP_PKEY_Q_keygen(libctx, NULL, "RSA", (size_t)2048))
1255e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_N, &n, &n_len))
1256e0c4386eSCy Schubert || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_E, &e, &e_len))
1257e0c4386eSCy Schubert || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, ""))
1258e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_decrypt_init(ctx), 0)
1259e0c4386eSCy Schubert || !TEST_int_gt(EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_NO_PADDING), 0))
1260e0c4386eSCy Schubert goto err;
1261e0c4386eSCy Schubert
1262e0c4386eSCy Schubert test_output_memory("n", n, n_len);
1263e0c4386eSCy Schubert test_output_memory("e", e, e_len);
1264e0c4386eSCy Schubert if (EVP_PKEY_decrypt(ctx, pt, &pt_len, tst->ct, tst->ct_len) <= 0)
1265e0c4386eSCy Schubert TEST_note("Decryption Failed");
1266e0c4386eSCy Schubert else
1267e0c4386eSCy Schubert test_output_memory("pt", pt, pt_len);
1268e0c4386eSCy Schubert ret = 1;
1269e0c4386eSCy Schubert err:
1270e0c4386eSCy Schubert OPENSSL_free(n);
1271e0c4386eSCy Schubert OPENSSL_free(e);
1272e0c4386eSCy Schubert EVP_PKEY_CTX_free(ctx);
1273e0c4386eSCy Schubert EVP_PKEY_free(pkey);
1274e0c4386eSCy Schubert BN_CTX_free(bn_ctx);
1275e0c4386eSCy Schubert return ret;
1276e0c4386eSCy Schubert }
1277e0c4386eSCy Schubert
self_test_events(const OSSL_PARAM params[],void * varg)1278e0c4386eSCy Schubert static int self_test_events(const OSSL_PARAM params[], void *varg)
1279e0c4386eSCy Schubert {
1280e0c4386eSCy Schubert SELF_TEST_ARGS *args = varg;
1281e0c4386eSCy Schubert const OSSL_PARAM *p = NULL;
1282e0c4386eSCy Schubert const char *phase = NULL, *type = NULL, *desc = NULL;
1283e0c4386eSCy Schubert int ret = 0;
1284e0c4386eSCy Schubert
1285e0c4386eSCy Schubert if (!args->enable)
1286e0c4386eSCy Schubert return 1;
1287e0c4386eSCy Schubert
1288e0c4386eSCy Schubert args->called++;
1289e0c4386eSCy Schubert p = OSSL_PARAM_locate_const(params, OSSL_PROV_PARAM_SELF_TEST_PHASE);
1290e0c4386eSCy Schubert if (p == NULL || p->data_type != OSSL_PARAM_UTF8_STRING)
1291e0c4386eSCy Schubert goto err;
1292e0c4386eSCy Schubert phase = (const char *)p->data;
1293e0c4386eSCy Schubert
1294e0c4386eSCy Schubert p = OSSL_PARAM_locate_const(params, OSSL_PROV_PARAM_SELF_TEST_DESC);
1295e0c4386eSCy Schubert if (p == NULL || p->data_type != OSSL_PARAM_UTF8_STRING)
1296e0c4386eSCy Schubert goto err;
1297e0c4386eSCy Schubert desc = (const char *)p->data;
1298e0c4386eSCy Schubert
1299e0c4386eSCy Schubert p = OSSL_PARAM_locate_const(params, OSSL_PROV_PARAM_SELF_TEST_TYPE);
1300e0c4386eSCy Schubert if (p == NULL || p->data_type != OSSL_PARAM_UTF8_STRING)
1301e0c4386eSCy Schubert goto err;
1302e0c4386eSCy Schubert type = (const char *)p->data;
1303e0c4386eSCy Schubert
1304e0c4386eSCy Schubert BIO_printf(bio_out, "%s %s %s\n", phase, desc, type);
1305e0c4386eSCy Schubert ret = 1;
1306e0c4386eSCy Schubert err:
1307e0c4386eSCy Schubert return ret;
1308e0c4386eSCy Schubert }
1309e0c4386eSCy Schubert
drbg_test(int id)1310e0c4386eSCy Schubert static int drbg_test(int id)
1311e0c4386eSCy Schubert {
1312e0c4386eSCy Schubert OSSL_PARAM params[3];
1313e0c4386eSCy Schubert EVP_RAND *rand = NULL;
1314e0c4386eSCy Schubert EVP_RAND_CTX *ctx = NULL, *parent = NULL;
1315e0c4386eSCy Schubert unsigned char returned_bits[64];
1316e0c4386eSCy Schubert const size_t returned_bits_len = sizeof(returned_bits);
1317e0c4386eSCy Schubert unsigned int strength = 256;
1318e0c4386eSCy Schubert const struct drbg_st *tst = &drbg_data[id];
1319e0c4386eSCy Schubert int res = 0;
1320e0c4386eSCy Schubert
1321e0c4386eSCy Schubert /* Create the seed source */
1322e0c4386eSCy Schubert if (!TEST_ptr(rand = EVP_RAND_fetch(libctx, "TEST-RAND", "-fips"))
1323e0c4386eSCy Schubert || !TEST_ptr(parent = EVP_RAND_CTX_new(rand, NULL)))
1324e0c4386eSCy Schubert goto err;
1325e0c4386eSCy Schubert EVP_RAND_free(rand);
1326e0c4386eSCy Schubert rand = NULL;
1327e0c4386eSCy Schubert
1328e0c4386eSCy Schubert params[0] = OSSL_PARAM_construct_uint(OSSL_RAND_PARAM_STRENGTH, &strength);
1329e0c4386eSCy Schubert params[1] = OSSL_PARAM_construct_end();
1330e0c4386eSCy Schubert if (!TEST_true(EVP_RAND_CTX_set_params(parent, params)))
1331e0c4386eSCy Schubert goto err;
1332e0c4386eSCy Schubert
1333e0c4386eSCy Schubert /* Get the DRBG */
1334e0c4386eSCy Schubert if (!TEST_ptr(rand = EVP_RAND_fetch(libctx, tst->drbg_name, ""))
1335e0c4386eSCy Schubert || !TEST_ptr(ctx = EVP_RAND_CTX_new(rand, parent)))
1336e0c4386eSCy Schubert goto err;
1337e0c4386eSCy Schubert
1338e0c4386eSCy Schubert /* Set the DRBG up */
1339e0c4386eSCy Schubert params[0] = OSSL_PARAM_construct_int(OSSL_DRBG_PARAM_USE_DF,
1340e0c4386eSCy Schubert (int *)&tst->use_df);
1341e0c4386eSCy Schubert params[1] = OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_CIPHER,
1342e0c4386eSCy Schubert (char *)tst->cipher, 0);
1343e0c4386eSCy Schubert params[2] = OSSL_PARAM_construct_end();
1344e0c4386eSCy Schubert if (!TEST_true(EVP_RAND_CTX_set_params(ctx, params)))
1345e0c4386eSCy Schubert goto err;
1346e0c4386eSCy Schubert
1347e0c4386eSCy Schubert /* Feed in the entropy and nonce */
1348e0c4386eSCy Schubert params[0] = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY,
1349e0c4386eSCy Schubert (void *)tst->entropy_input,
1350e0c4386eSCy Schubert tst->entropy_input_len);
1351e0c4386eSCy Schubert params[1] = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_NONCE,
1352e0c4386eSCy Schubert (void *)tst->nonce,
1353e0c4386eSCy Schubert tst->nonce_len);
1354e0c4386eSCy Schubert params[2] = OSSL_PARAM_construct_end();
1355e0c4386eSCy Schubert if (!TEST_true(EVP_RAND_CTX_set_params(parent, params)))
1356e0c4386eSCy Schubert goto err;
1357e0c4386eSCy Schubert
1358e0c4386eSCy Schubert /*
1359e0c4386eSCy Schubert * Run the test
1360e0c4386eSCy Schubert * A NULL personalisation string defaults to the built in so something
1361e0c4386eSCy Schubert * non-NULL is needed if there is no personalisation string
1362e0c4386eSCy Schubert */
1363e0c4386eSCy Schubert if (!TEST_true(EVP_RAND_instantiate(ctx, 0, 0, (void *)"", 0, NULL))
1364e0c4386eSCy Schubert || !TEST_true(EVP_RAND_generate(ctx, returned_bits, returned_bits_len,
1365e0c4386eSCy Schubert 0, 0, NULL, 0))
1366e0c4386eSCy Schubert || !TEST_true(EVP_RAND_generate(ctx, returned_bits, returned_bits_len,
1367e0c4386eSCy Schubert 0, 0, NULL, 0)))
1368e0c4386eSCy Schubert goto err;
1369e0c4386eSCy Schubert
1370e0c4386eSCy Schubert test_output_memory("returned bits", returned_bits, returned_bits_len);
1371e0c4386eSCy Schubert
1372e0c4386eSCy Schubert /* Clean up */
1373e0c4386eSCy Schubert if (!TEST_true(EVP_RAND_uninstantiate(ctx))
1374e0c4386eSCy Schubert || !TEST_true(EVP_RAND_uninstantiate(parent)))
1375e0c4386eSCy Schubert goto err;
1376e0c4386eSCy Schubert
1377e0c4386eSCy Schubert /* Verify the output */
1378e0c4386eSCy Schubert if (!TEST_mem_eq(returned_bits, returned_bits_len,
1379e0c4386eSCy Schubert tst->returned_bits, tst->returned_bits_len))
1380e0c4386eSCy Schubert goto err;
1381e0c4386eSCy Schubert res = 1;
1382e0c4386eSCy Schubert err:
1383e0c4386eSCy Schubert EVP_RAND_CTX_free(ctx);
1384e0c4386eSCy Schubert EVP_RAND_CTX_free(parent);
1385e0c4386eSCy Schubert EVP_RAND_free(rand);
1386e0c4386eSCy Schubert return res;
1387e0c4386eSCy Schubert }
1388e0c4386eSCy Schubert
aes_cfb1_bits_test(void)1389e0c4386eSCy Schubert static int aes_cfb1_bits_test(void)
1390e0c4386eSCy Schubert {
1391e0c4386eSCy Schubert int ret = 0;
1392e0c4386eSCy Schubert EVP_CIPHER *cipher = NULL;
1393e0c4386eSCy Schubert EVP_CIPHER_CTX *ctx = NULL;
1394e0c4386eSCy Schubert unsigned char out[16] = { 0 };
1395e0c4386eSCy Schubert int outlen;
1396e0c4386eSCy Schubert const OSSL_PARAM *params, *p;
1397e0c4386eSCy Schubert
1398e0c4386eSCy Schubert static const unsigned char key[] = {
1399e0c4386eSCy Schubert 0x12, 0x22, 0x58, 0x2F, 0x1C, 0x1A, 0x8A, 0x88,
1400e0c4386eSCy Schubert 0x30, 0xFC, 0x18, 0xB7, 0x24, 0x89, 0x7F, 0xC0
1401e0c4386eSCy Schubert };
1402e0c4386eSCy Schubert static const unsigned char iv[] = {
1403e0c4386eSCy Schubert 0x05, 0x28, 0xB5, 0x2B, 0x58, 0x27, 0x63, 0x5C,
1404e0c4386eSCy Schubert 0x81, 0x86, 0xD3, 0x63, 0x60, 0xB0, 0xAA, 0x2B
1405e0c4386eSCy Schubert };
1406e0c4386eSCy Schubert static const unsigned char pt[] = {
1407e0c4386eSCy Schubert 0xB4
1408e0c4386eSCy Schubert };
1409e0c4386eSCy Schubert static const unsigned char expected[] = {
1410e0c4386eSCy Schubert 0x6C
1411e0c4386eSCy Schubert };
1412e0c4386eSCy Schubert
1413e0c4386eSCy Schubert if (!TEST_ptr(cipher = EVP_CIPHER_fetch(libctx, "AES-128-CFB1", "fips=yes")))
1414e0c4386eSCy Schubert goto err;
1415e0c4386eSCy Schubert if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new()))
1416e0c4386eSCy Schubert goto err;
1417e0c4386eSCy Schubert if (!TEST_int_gt(EVP_CipherInit_ex(ctx, cipher, NULL, key, iv, 1), 0))
1418e0c4386eSCy Schubert goto err;
1419e0c4386eSCy Schubert if (!TEST_ptr(params = EVP_CIPHER_CTX_settable_params(ctx))
1420e0c4386eSCy Schubert || !TEST_ptr(p = OSSL_PARAM_locate_const(params,
1421e0c4386eSCy Schubert OSSL_CIPHER_PARAM_USE_BITS)))
1422e0c4386eSCy Schubert goto err;
1423e0c4386eSCy Schubert EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPH_FLAG_LENGTH_BITS);
1424e0c4386eSCy Schubert if (!TEST_int_gt(EVP_CipherUpdate(ctx, out, &outlen, pt, 7), 0))
1425e0c4386eSCy Schubert goto err;
1426e0c4386eSCy Schubert if (!TEST_int_eq(outlen, 7))
1427e0c4386eSCy Schubert goto err;
1428e0c4386eSCy Schubert if (!TEST_mem_eq(out, (outlen + 7) / 8, expected, sizeof(expected)))
1429e0c4386eSCy Schubert goto err;
1430e0c4386eSCy Schubert ret = 1;
1431e0c4386eSCy Schubert err:
1432e0c4386eSCy Schubert EVP_CIPHER_free(cipher);
1433e0c4386eSCy Schubert EVP_CIPHER_CTX_free(ctx);
1434e0c4386eSCy Schubert return ret;
1435e0c4386eSCy Schubert }
1436e0c4386eSCy Schubert
setup_tests(void)1437e0c4386eSCy Schubert int setup_tests(void)
1438e0c4386eSCy Schubert {
1439e0c4386eSCy Schubert char *config_file = NULL;
1440e0c4386eSCy Schubert
1441e0c4386eSCy Schubert OPTION_CHOICE o;
1442e0c4386eSCy Schubert
1443e0c4386eSCy Schubert while ((o = opt_next()) != OPT_EOF) {
1444e0c4386eSCy Schubert switch (o) {
1445e0c4386eSCy Schubert case OPT_CONFIG_FILE:
1446e0c4386eSCy Schubert config_file = opt_arg();
1447e0c4386eSCy Schubert break;
1448e0c4386eSCy Schubert case OPT_TEST_CASES:
1449e0c4386eSCy Schubert break;
1450e0c4386eSCy Schubert default:
1451e0c4386eSCy Schubert case OPT_ERR:
1452e0c4386eSCy Schubert return 0;
1453e0c4386eSCy Schubert }
1454e0c4386eSCy Schubert }
1455e0c4386eSCy Schubert
1456e0c4386eSCy Schubert if (!test_get_libctx(&libctx, &prov_null, config_file, NULL, NULL))
1457e0c4386eSCy Schubert return 0;
1458e0c4386eSCy Schubert
1459e0c4386eSCy Schubert OSSL_SELF_TEST_set_callback(libctx, self_test_events, &self_test_args);
1460e0c4386eSCy Schubert
1461e0c4386eSCy Schubert ADD_TEST(aes_cfb1_bits_test);
1462e0c4386eSCy Schubert ADD_ALL_TESTS(cipher_enc_dec_test, OSSL_NELEM(cipher_enc_data));
1463e0c4386eSCy Schubert ADD_ALL_TESTS(aes_ccm_enc_dec_test, OSSL_NELEM(aes_ccm_enc_data));
1464e0c4386eSCy Schubert ADD_ALL_TESTS(aes_gcm_enc_dec_test, OSSL_NELEM(aes_gcm_enc_data));
1465e0c4386eSCy Schubert
1466e0c4386eSCy Schubert ADD_ALL_TESTS(rsa_keygen_test, OSSL_NELEM(rsa_keygen_data));
1467e0c4386eSCy Schubert ADD_ALL_TESTS(rsa_siggen_test, OSSL_NELEM(rsa_siggen_data));
1468e0c4386eSCy Schubert ADD_ALL_TESTS(rsa_sigver_test, OSSL_NELEM(rsa_sigver_data));
1469e0c4386eSCy Schubert ADD_ALL_TESTS(rsa_decryption_primitive_test,
1470e0c4386eSCy Schubert OSSL_NELEM(rsa_decrypt_prim_data));
1471e0c4386eSCy Schubert
1472e0c4386eSCy Schubert #ifndef OPENSSL_NO_DH
1473e0c4386eSCy Schubert ADD_ALL_TESTS(dh_safe_prime_keygen_test,
1474e0c4386eSCy Schubert OSSL_NELEM(dh_safe_prime_keygen_data));
1475e0c4386eSCy Schubert ADD_ALL_TESTS(dh_safe_prime_keyver_test,
1476e0c4386eSCy Schubert OSSL_NELEM(dh_safe_prime_keyver_data));
1477e0c4386eSCy Schubert #endif /* OPENSSL_NO_DH */
1478e0c4386eSCy Schubert
1479e0c4386eSCy Schubert #ifndef OPENSSL_NO_DSA
1480e0c4386eSCy Schubert ADD_ALL_TESTS(dsa_keygen_test, OSSL_NELEM(dsa_keygen_data));
1481e0c4386eSCy Schubert ADD_ALL_TESTS(dsa_paramgen_test, OSSL_NELEM(dsa_paramgen_data));
1482e0c4386eSCy Schubert ADD_ALL_TESTS(dsa_pqver_test, OSSL_NELEM(dsa_pqver_data));
1483e0c4386eSCy Schubert ADD_ALL_TESTS(dsa_siggen_test, OSSL_NELEM(dsa_siggen_data));
1484e0c4386eSCy Schubert ADD_ALL_TESTS(dsa_sigver_test, OSSL_NELEM(dsa_sigver_data));
1485e0c4386eSCy Schubert #endif /* OPENSSL_NO_DSA */
1486e0c4386eSCy Schubert
1487e0c4386eSCy Schubert #ifndef OPENSSL_NO_EC
1488e0c4386eSCy Schubert ADD_ALL_TESTS(ecdsa_keygen_test, OSSL_NELEM(ecdsa_keygen_data));
1489e0c4386eSCy Schubert ADD_ALL_TESTS(ecdsa_pub_verify_test, OSSL_NELEM(ecdsa_pv_data));
1490e0c4386eSCy Schubert ADD_ALL_TESTS(ecdsa_siggen_test, OSSL_NELEM(ecdsa_siggen_data));
1491e0c4386eSCy Schubert ADD_ALL_TESTS(ecdsa_sigver_test, OSSL_NELEM(ecdsa_sigver_data));
1492e0c4386eSCy Schubert #endif /* OPENSSL_NO_EC */
1493e0c4386eSCy Schubert
1494e0c4386eSCy Schubert ADD_ALL_TESTS(drbg_test, OSSL_NELEM(drbg_data));
1495e0c4386eSCy Schubert return 1;
1496e0c4386eSCy Schubert }
1497e0c4386eSCy Schubert
cleanup_tests(void)1498e0c4386eSCy Schubert void cleanup_tests(void)
1499e0c4386eSCy Schubert {
1500e0c4386eSCy Schubert OSSL_PROVIDER_unload(prov_null);
1501e0c4386eSCy Schubert OSSL_LIB_CTX_free(libctx);
1502e0c4386eSCy Schubert }
1503