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