xref: /freebsd/crypto/openssl/test/evp_libctx_test.c (revision 0d0c8621fd181e507f0fb50ffcca606faf66a8c2)
1e0c4386eSCy Schubert /*
2e0c4386eSCy Schubert  * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
3e0c4386eSCy Schubert  *
4e0c4386eSCy Schubert  * Licensed under the Apache License 2.0 (the "License").  You may not use
5e0c4386eSCy Schubert  * this file except in compliance with the License.  You can obtain a copy
6e0c4386eSCy Schubert  * in the file LICENSE in the source distribution or at
7e0c4386eSCy Schubert  * https://www.openssl.org/source/license.html
8e0c4386eSCy Schubert  */
9e0c4386eSCy Schubert 
10e0c4386eSCy Schubert /*
11e0c4386eSCy Schubert 
12e0c4386eSCy Schubert  * These tests are setup to load null into the default library context.
13e0c4386eSCy Schubert  * Any tests are expected to use the created 'libctx' to find algorithms.
14e0c4386eSCy Schubert  * The framework runs the tests twice using the 'default' provider or
15e0c4386eSCy Schubert  * 'fips' provider as inputs.
16e0c4386eSCy Schubert  */
17e0c4386eSCy Schubert 
18e0c4386eSCy Schubert /*
19e0c4386eSCy Schubert  * DSA/DH low level APIs are deprecated for public use, but still ok for
20e0c4386eSCy Schubert  * internal use.
21e0c4386eSCy Schubert  */
22e0c4386eSCy Schubert #include "internal/deprecated.h"
23e0c4386eSCy Schubert #include <assert.h>
24e0c4386eSCy Schubert #include <openssl/evp.h>
25e0c4386eSCy Schubert #include <openssl/provider.h>
26e0c4386eSCy Schubert #include <openssl/dsa.h>
27e0c4386eSCy Schubert #include <openssl/dh.h>
28e0c4386eSCy Schubert #include <openssl/safestack.h>
29e0c4386eSCy Schubert #include <openssl/core_dispatch.h>
30e0c4386eSCy Schubert #include <openssl/core_names.h>
31e0c4386eSCy Schubert #include <openssl/x509.h>
32e0c4386eSCy Schubert #include <openssl/encoder.h>
33e0c4386eSCy Schubert #include "testutil.h"
34e0c4386eSCy Schubert #include "internal/nelem.h"
35e0c4386eSCy Schubert #include "crypto/bn_dh.h"   /* _bignum_ffdhe2048_p */
36e0c4386eSCy Schubert 
37e0c4386eSCy Schubert static OSSL_LIB_CTX *libctx = NULL;
38e0c4386eSCy Schubert static OSSL_PROVIDER *nullprov = NULL;
39e0c4386eSCy Schubert static OSSL_PROVIDER *libprov = NULL;
40e0c4386eSCy Schubert static STACK_OF(OPENSSL_STRING) *cipher_names = NULL;
41e0c4386eSCy Schubert 
42e0c4386eSCy Schubert typedef enum OPTION_choice {
43e0c4386eSCy Schubert     OPT_ERR = -1,
44e0c4386eSCy Schubert     OPT_EOF = 0,
45e0c4386eSCy Schubert     OPT_CONFIG_FILE,
46e0c4386eSCy Schubert     OPT_PROVIDER_NAME,
47e0c4386eSCy Schubert     OPT_TEST_ENUM
48e0c4386eSCy Schubert } OPTION_CHOICE;
49e0c4386eSCy Schubert 
test_get_options(void)50e0c4386eSCy Schubert const OPTIONS *test_get_options(void)
51e0c4386eSCy Schubert {
52e0c4386eSCy Schubert     static const OPTIONS test_options[] = {
53e0c4386eSCy Schubert         OPT_TEST_OPTIONS_DEFAULT_USAGE,
54e0c4386eSCy Schubert         { "config", OPT_CONFIG_FILE, '<',
55e0c4386eSCy Schubert           "The configuration file to use for the libctx" },
56e0c4386eSCy Schubert         { "provider", OPT_PROVIDER_NAME, 's',
57e0c4386eSCy Schubert           "The provider to load (The default value is 'default')" },
58e0c4386eSCy Schubert         { NULL }
59e0c4386eSCy Schubert     };
60e0c4386eSCy Schubert     return test_options;
61e0c4386eSCy Schubert }
62e0c4386eSCy Schubert 
63e0c4386eSCy Schubert #ifndef OPENSSL_NO_DH
getname(int id)64e0c4386eSCy Schubert static const char *getname(int id)
65e0c4386eSCy Schubert {
66e0c4386eSCy Schubert     const char *name[] = {"p", "q", "g" };
67e0c4386eSCy Schubert 
68e0c4386eSCy Schubert     if (id >= 0 && id < 3)
69e0c4386eSCy Schubert         return name[id];
70e0c4386eSCy Schubert     return "?";
71e0c4386eSCy Schubert }
72e0c4386eSCy Schubert #endif
73e0c4386eSCy Schubert 
74e0c4386eSCy Schubert /*
75e0c4386eSCy Schubert  * We're using some DH specific values in this test, so we skip compilation if
76e0c4386eSCy Schubert  * we're in a no-dh build.
77e0c4386eSCy Schubert  */
78e0c4386eSCy Schubert #if !defined(OPENSSL_NO_DSA) && !defined(OPENSSL_NO_DH)
79e0c4386eSCy Schubert 
test_dsa_param_keygen(int tstid)80e0c4386eSCy Schubert static int test_dsa_param_keygen(int tstid)
81e0c4386eSCy Schubert {
82e0c4386eSCy Schubert     int ret = 0;
83e0c4386eSCy Schubert     int expected;
84e0c4386eSCy Schubert     EVP_PKEY_CTX *gen_ctx = NULL;
85e0c4386eSCy Schubert     EVP_PKEY *pkey_parm = NULL;
86e0c4386eSCy Schubert     EVP_PKEY *pkey = NULL, *dup_pk = NULL;
87e0c4386eSCy Schubert     DSA *dsa = NULL;
88e0c4386eSCy Schubert     int pind, qind, gind;
89e0c4386eSCy Schubert     BIGNUM *p = NULL, *q = NULL, *g = NULL;
90e0c4386eSCy Schubert 
91e0c4386eSCy Schubert     /*
92e0c4386eSCy Schubert      * Just grab some fixed dh p, q, g values for testing,
93e0c4386eSCy Schubert      * these 'safe primes' should not be used normally for dsa *.
94e0c4386eSCy Schubert      */
95e0c4386eSCy Schubert     static const BIGNUM *bn[] = {
96e0c4386eSCy Schubert         &ossl_bignum_dh2048_256_p, &ossl_bignum_dh2048_256_q,
97e0c4386eSCy Schubert         &ossl_bignum_dh2048_256_g
98e0c4386eSCy Schubert     };
99e0c4386eSCy Schubert 
100e0c4386eSCy Schubert     /*
101e0c4386eSCy Schubert      * These tests are using bad values for p, q, g by reusing the values.
102e0c4386eSCy Schubert      * A value of 0 uses p, 1 uses q and 2 uses g.
103e0c4386eSCy Schubert      * There are 27 different combinations, with only the 1 valid combination.
104e0c4386eSCy Schubert      */
105e0c4386eSCy Schubert     pind = tstid / 9;
106e0c4386eSCy Schubert     qind = (tstid / 3) % 3;
107e0c4386eSCy Schubert     gind = tstid % 3;
108e0c4386eSCy Schubert     expected  = (pind == 0 && qind == 1 && gind == 2);
109e0c4386eSCy Schubert 
110e0c4386eSCy Schubert     TEST_note("Testing with (p, q, g) = (%s, %s, %s)\n", getname(pind),
111e0c4386eSCy Schubert               getname(qind), getname(gind));
112e0c4386eSCy Schubert 
113e0c4386eSCy Schubert     if (!TEST_ptr(pkey_parm = EVP_PKEY_new())
114e0c4386eSCy Schubert         || !TEST_ptr(dsa = DSA_new())
115e0c4386eSCy Schubert         || !TEST_ptr(p = BN_dup(bn[pind]))
116e0c4386eSCy Schubert         || !TEST_ptr(q = BN_dup(bn[qind]))
117e0c4386eSCy Schubert         || !TEST_ptr(g = BN_dup(bn[gind]))
118e0c4386eSCy Schubert         || !TEST_true(DSA_set0_pqg(dsa, p, q, g)))
119e0c4386eSCy Schubert         goto err;
120e0c4386eSCy Schubert     p = q = g = NULL;
121e0c4386eSCy Schubert 
122e0c4386eSCy Schubert     if (!TEST_true(EVP_PKEY_assign_DSA(pkey_parm, dsa)))
123e0c4386eSCy Schubert         goto err;
124e0c4386eSCy Schubert     dsa = NULL;
125e0c4386eSCy Schubert 
126e0c4386eSCy Schubert     if (!TEST_ptr(gen_ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey_parm, NULL))
127e0c4386eSCy Schubert         || !TEST_int_gt(EVP_PKEY_keygen_init(gen_ctx), 0)
128e0c4386eSCy Schubert         || !TEST_int_eq(EVP_PKEY_keygen(gen_ctx, &pkey), expected))
129e0c4386eSCy Schubert         goto err;
130e0c4386eSCy Schubert 
131e0c4386eSCy Schubert     if (expected) {
132e0c4386eSCy Schubert         if (!TEST_ptr(dup_pk = EVP_PKEY_dup(pkey))
133e0c4386eSCy Schubert             || !TEST_int_eq(EVP_PKEY_eq(pkey, dup_pk), 1))
134e0c4386eSCy Schubert             goto err;
135e0c4386eSCy Schubert     }
136e0c4386eSCy Schubert 
137e0c4386eSCy Schubert     ret = 1;
138e0c4386eSCy Schubert err:
139e0c4386eSCy Schubert     EVP_PKEY_free(pkey);
140e0c4386eSCy Schubert     EVP_PKEY_free(dup_pk);
141e0c4386eSCy Schubert     EVP_PKEY_CTX_free(gen_ctx);
142e0c4386eSCy Schubert     EVP_PKEY_free(pkey_parm);
143e0c4386eSCy Schubert     DSA_free(dsa);
144e0c4386eSCy Schubert     BN_free(g);
145e0c4386eSCy Schubert     BN_free(q);
146e0c4386eSCy Schubert     BN_free(p);
147e0c4386eSCy Schubert     return ret;
148e0c4386eSCy Schubert }
149e0c4386eSCy Schubert #endif /* OPENSSL_NO_DSA */
150e0c4386eSCy Schubert 
151e0c4386eSCy Schubert #ifndef OPENSSL_NO_DH
do_dh_param_keygen(int tstid,const BIGNUM ** bn)152e0c4386eSCy Schubert static int do_dh_param_keygen(int tstid, const BIGNUM **bn)
153e0c4386eSCy Schubert {
154e0c4386eSCy Schubert     int ret = 0;
155e0c4386eSCy Schubert     int expected;
156e0c4386eSCy Schubert     EVP_PKEY_CTX *gen_ctx = NULL;
157e0c4386eSCy Schubert     EVP_PKEY *pkey_parm = NULL;
158e0c4386eSCy Schubert     EVP_PKEY *pkey = NULL, *dup_pk = NULL;
159e0c4386eSCy Schubert     DH *dh = NULL;
160e0c4386eSCy Schubert     int pind, qind, gind;
161e0c4386eSCy Schubert     BIGNUM *p = NULL, *q = NULL, *g = NULL;
162e0c4386eSCy Schubert 
163e0c4386eSCy Schubert     /*
164e0c4386eSCy Schubert      * These tests are using bad values for p, q, g by reusing the values.
165e0c4386eSCy Schubert      * A value of 0 uses p, 1 uses q and 2 uses g.
166e0c4386eSCy Schubert      * There are 27 different combinations, with only the 1 valid combination.
167e0c4386eSCy Schubert      */
168e0c4386eSCy Schubert     pind = tstid / 9;
169e0c4386eSCy Schubert     qind = (tstid / 3) % 3;
170e0c4386eSCy Schubert     gind = tstid % 3;
171e0c4386eSCy Schubert     expected  = (pind == 0 && qind == 1 && gind == 2);
172e0c4386eSCy Schubert 
173e0c4386eSCy Schubert     TEST_note("Testing with (p, q, g) = (%s, %s, %s)", getname(pind),
174e0c4386eSCy Schubert               getname(qind), getname(gind));
175e0c4386eSCy Schubert 
176e0c4386eSCy Schubert     if (!TEST_ptr(pkey_parm = EVP_PKEY_new())
177e0c4386eSCy Schubert         || !TEST_ptr(dh = DH_new())
178e0c4386eSCy Schubert         || !TEST_ptr(p = BN_dup(bn[pind]))
179e0c4386eSCy Schubert         || !TEST_ptr(q = BN_dup(bn[qind]))
180e0c4386eSCy Schubert         || !TEST_ptr(g = BN_dup(bn[gind]))
181e0c4386eSCy Schubert         || !TEST_true(DH_set0_pqg(dh, p, q, g)))
182e0c4386eSCy Schubert         goto err;
183e0c4386eSCy Schubert     p = q = g = NULL;
184e0c4386eSCy Schubert 
185e0c4386eSCy Schubert     if (!TEST_true(EVP_PKEY_assign_DH(pkey_parm, dh)))
186e0c4386eSCy Schubert         goto err;
187e0c4386eSCy Schubert     dh = NULL;
188e0c4386eSCy Schubert 
189e0c4386eSCy Schubert     if (!TEST_ptr(gen_ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey_parm, NULL))
190e0c4386eSCy Schubert         || !TEST_int_gt(EVP_PKEY_keygen_init(gen_ctx), 0)
191e0c4386eSCy Schubert         || !TEST_int_eq(EVP_PKEY_keygen(gen_ctx, &pkey), expected))
192e0c4386eSCy Schubert         goto err;
193e0c4386eSCy Schubert 
194e0c4386eSCy Schubert     if (expected) {
195e0c4386eSCy Schubert         if (!TEST_ptr(dup_pk = EVP_PKEY_dup(pkey))
196e0c4386eSCy Schubert             || !TEST_int_eq(EVP_PKEY_eq(pkey, dup_pk), 1))
197e0c4386eSCy Schubert             goto err;
198e0c4386eSCy Schubert     }
199e0c4386eSCy Schubert 
200e0c4386eSCy Schubert     ret = 1;
201e0c4386eSCy Schubert err:
202e0c4386eSCy Schubert     EVP_PKEY_free(pkey);
203e0c4386eSCy Schubert     EVP_PKEY_free(dup_pk);
204e0c4386eSCy Schubert     EVP_PKEY_CTX_free(gen_ctx);
205e0c4386eSCy Schubert     EVP_PKEY_free(pkey_parm);
206e0c4386eSCy Schubert     DH_free(dh);
207e0c4386eSCy Schubert     BN_free(g);
208e0c4386eSCy Schubert     BN_free(q);
209e0c4386eSCy Schubert     BN_free(p);
210e0c4386eSCy Schubert     return ret;
211e0c4386eSCy Schubert }
212e0c4386eSCy Schubert 
213e0c4386eSCy Schubert /*
214e0c4386eSCy Schubert  * Note that we get the fips186-4 path being run for most of these cases since
215e0c4386eSCy Schubert  * the internal code will detect that the p, q, g does not match a safe prime
216e0c4386eSCy Schubert  * group (Except for when tstid = 5, which sets the correct p, q, g)
217e0c4386eSCy Schubert  */
test_dh_safeprime_param_keygen(int tstid)218e0c4386eSCy Schubert static int test_dh_safeprime_param_keygen(int tstid)
219e0c4386eSCy Schubert {
220e0c4386eSCy Schubert     static const BIGNUM *bn[] = {
221e0c4386eSCy Schubert         &ossl_bignum_ffdhe2048_p,  &ossl_bignum_ffdhe2048_q,
222e0c4386eSCy Schubert         &ossl_bignum_const_2
223e0c4386eSCy Schubert     };
224e0c4386eSCy Schubert     return do_dh_param_keygen(tstid, bn);
225e0c4386eSCy Schubert }
226e0c4386eSCy Schubert 
dhx_cert_load(void)227e0c4386eSCy Schubert static int dhx_cert_load(void)
228e0c4386eSCy Schubert {
229e0c4386eSCy Schubert     int ret = 0;
230e0c4386eSCy Schubert     X509 *cert = NULL;
231e0c4386eSCy Schubert     BIO *bio = NULL;
232e0c4386eSCy Schubert 
233e0c4386eSCy Schubert     static const unsigned char dhx_cert[] = {
234e0c4386eSCy Schubert         0x30,0x82,0x03,0xff,0x30,0x82,0x02,0xe7,0xa0,0x03,0x02,0x01,0x02,0x02,0x09,0x00,
235e0c4386eSCy Schubert         0xdb,0xf5,0x4d,0x22,0xa0,0x7a,0x67,0xa6,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,
236e0c4386eSCy Schubert         0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x44,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,
237e0c4386eSCy Schubert         0x04,0x06,0x13,0x02,0x55,0x4b,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0a,0x0c,
238e0c4386eSCy Schubert         0x0d,0x4f,0x70,0x65,0x6e,0x53,0x53,0x4c,0x20,0x47,0x72,0x6f,0x75,0x70,0x31,0x1d,
239e0c4386eSCy Schubert         0x30,0x1b,0x06,0x03,0x55,0x04,0x03,0x0c,0x14,0x54,0x65,0x73,0x74,0x20,0x53,0x2f,
240e0c4386eSCy Schubert         0x4d,0x49,0x4d,0x45,0x20,0x52,0x53,0x41,0x20,0x52,0x6f,0x6f,0x74,0x30,0x1e,0x17,
241e0c4386eSCy Schubert         0x0d,0x31,0x33,0x30,0x38,0x30,0x32,0x31,0x34,0x34,0x39,0x32,0x39,0x5a,0x17,0x0d,
242e0c4386eSCy Schubert         0x32,0x33,0x30,0x36,0x31,0x31,0x31,0x34,0x34,0x39,0x32,0x39,0x5a,0x30,0x44,0x31,
243e0c4386eSCy Schubert         0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x4b,0x31,0x16,0x30,0x14,
244e0c4386eSCy Schubert         0x06,0x03,0x55,0x04,0x0a,0x0c,0x0d,0x4f,0x70,0x65,0x6e,0x53,0x53,0x4c,0x20,0x47,
245e0c4386eSCy Schubert         0x72,0x6f,0x75,0x70,0x31,0x1d,0x30,0x1b,0x06,0x03,0x55,0x04,0x03,0x0c,0x14,0x54,
246e0c4386eSCy Schubert         0x65,0x73,0x74,0x20,0x53,0x2f,0x4d,0x49,0x4d,0x45,0x20,0x45,0x45,0x20,0x44,0x48,
247e0c4386eSCy Schubert         0x20,0x23,0x31,0x30,0x82,0x01,0xb6,0x30,0x82,0x01,0x2b,0x06,0x07,0x2a,0x86,0x48,
248e0c4386eSCy Schubert         0xce,0x3e,0x02,0x01,0x30,0x82,0x01,0x1e,0x02,0x81,0x81,0x00,0xd4,0x0c,0x4a,0x0c,
249e0c4386eSCy Schubert         0x04,0x72,0x71,0x19,0xdf,0x59,0x19,0xc5,0xaf,0x44,0x7f,0xca,0x8e,0x2b,0xf0,0x09,
250e0c4386eSCy Schubert         0xf5,0xd3,0x25,0xb1,0x73,0x16,0x55,0x89,0xdf,0xfd,0x07,0xaf,0x19,0xd3,0x7f,0xd0,
251e0c4386eSCy Schubert         0x07,0xa2,0xfe,0x3f,0x5a,0xf1,0x01,0xc6,0xf8,0x2b,0xef,0x4e,0x6d,0x03,0x38,0x42,
252e0c4386eSCy Schubert         0xa1,0x37,0xd4,0x14,0xb4,0x00,0x4a,0xb1,0x86,0x5a,0x83,0xce,0xb9,0x08,0x0e,0xc1,
253e0c4386eSCy Schubert         0x99,0x27,0x47,0x8d,0x0b,0x85,0xa8,0x82,0xed,0xcc,0x0d,0xb9,0xb0,0x32,0x7e,0xdf,
254e0c4386eSCy Schubert         0xe8,0xe4,0xf6,0xf6,0xec,0xb3,0xee,0x7a,0x11,0x34,0x65,0x97,0xfc,0x1a,0xb0,0x95,
255e0c4386eSCy Schubert         0x4b,0x19,0xb9,0xa6,0x1c,0xd9,0x01,0x32,0xf7,0x35,0x7c,0x2d,0x5d,0xfe,0xc1,0x85,
256e0c4386eSCy Schubert         0x70,0x49,0xf8,0xcc,0x99,0xd0,0xbe,0xf1,0x5a,0x78,0xc8,0x03,0x02,0x81,0x80,0x69,
257e0c4386eSCy Schubert         0x00,0xfd,0x66,0xf2,0xfc,0x15,0x8b,0x09,0xb8,0xdc,0x4d,0xea,0xaa,0x79,0x55,0xf9,
258e0c4386eSCy Schubert         0xdf,0x46,0xa6,0x2f,0xca,0x2d,0x8f,0x59,0x2a,0xad,0x44,0xa3,0xc6,0x18,0x2f,0x95,
259e0c4386eSCy Schubert         0xb6,0x16,0x20,0xe3,0xd3,0xd1,0x8f,0x03,0xce,0x71,0x7c,0xef,0x3a,0xc7,0x44,0x39,
260e0c4386eSCy Schubert         0x0e,0xe2,0x1f,0xd8,0xd3,0x89,0x2b,0xe7,0x51,0xdc,0x12,0x48,0x4c,0x18,0x4d,0x99,
261e0c4386eSCy Schubert         0x12,0x06,0xe4,0x17,0x02,0x03,0x8c,0x24,0x05,0x8e,0xa6,0x85,0xf2,0x69,0x1b,0xe1,
262e0c4386eSCy Schubert         0x6a,0xdc,0xe2,0x04,0x3a,0x01,0x9d,0x64,0xbe,0xfe,0x45,0xf9,0x44,0x18,0x71,0xbd,
263e0c4386eSCy Schubert         0x2d,0x3e,0x7a,0x6f,0x72,0x7d,0x1a,0x80,0x42,0x57,0xae,0x18,0x6f,0x91,0xd6,0x61,
264e0c4386eSCy Schubert         0x03,0x8a,0x1c,0x89,0x73,0xc7,0x56,0x41,0x03,0xd3,0xf8,0xed,0x65,0xe2,0x85,0x02,
265e0c4386eSCy Schubert         0x15,0x00,0x89,0x94,0xab,0x10,0x67,0x45,0x41,0xad,0x63,0xc6,0x71,0x40,0x8d,0x6b,
266e0c4386eSCy Schubert         0x9e,0x19,0x5b,0xa4,0xc7,0xf5,0x03,0x81,0x84,0x00,0x02,0x81,0x80,0x2f,0x5b,0xde,
267e0c4386eSCy Schubert         0x72,0x02,0x36,0x6b,0x00,0x5e,0x24,0x7f,0x14,0x2c,0x18,0x52,0x42,0x97,0x4b,0xdb,
268e0c4386eSCy Schubert         0x6e,0x15,0x50,0x3c,0x45,0x3e,0x25,0xf3,0xb7,0xc5,0x6e,0xe5,0x52,0xe7,0xc4,0xfb,
269e0c4386eSCy Schubert         0xf4,0xa5,0xf0,0x39,0x12,0x7f,0xbc,0x54,0x1c,0x93,0xb9,0x5e,0xee,0xe9,0x14,0xb0,
270e0c4386eSCy Schubert         0xdf,0xfe,0xfc,0x36,0xe4,0xf2,0xaf,0xfb,0x13,0xc8,0xdf,0x18,0x94,0x1d,0x40,0xb9,
271e0c4386eSCy Schubert         0x71,0xdd,0x4c,0x9c,0xa7,0x03,0x52,0x02,0xb5,0xed,0x71,0x80,0x3e,0x23,0xda,0x28,
272e0c4386eSCy Schubert         0xe5,0xab,0xe7,0x6f,0xf2,0x0a,0x0e,0x00,0x5b,0x7d,0xc6,0x4b,0xd7,0xc7,0xb2,0xc3,
273e0c4386eSCy Schubert         0xba,0x62,0x7f,0x70,0x28,0xa0,0x9d,0x71,0x13,0x70,0xd1,0x9f,0x32,0x2f,0x3e,0xd2,
274e0c4386eSCy Schubert         0xcd,0x1b,0xa4,0xc6,0x72,0xa0,0x74,0x5d,0x71,0xef,0x03,0x43,0x6e,0xa3,0x60,0x30,
275e0c4386eSCy Schubert         0x5e,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x02,0x30,0x00,0x30,
276e0c4386eSCy Schubert         0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x05,0xe0,0x30,
277e0c4386eSCy Schubert         0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x0b,0x5a,0x4d,0x5f,0x7d,0x25,
278e0c4386eSCy Schubert         0xc7,0xf2,0x9d,0xc1,0xaa,0xb7,0x63,0x82,0x2f,0xfa,0x8f,0x32,0xe7,0xc0,0x30,0x1f,
279e0c4386eSCy Schubert         0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0xdf,0x7e,0x5e,0x88,0x05,
280e0c4386eSCy Schubert         0x24,0x33,0x08,0xdd,0x22,0x81,0x02,0x97,0xcc,0x9a,0xb7,0xb1,0x33,0x27,0x30,0x30,
281e0c4386eSCy Schubert         0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x82,
282e0c4386eSCy Schubert         0x01,0x01,0x00,0x5a,0xf2,0x63,0xef,0xd3,0x16,0xd7,0xf5,0xaa,0xdd,0x12,0x00,0x36,
283e0c4386eSCy Schubert         0x00,0x21,0xa2,0x7b,0x08,0xd6,0x3b,0x9f,0x62,0xac,0x53,0x1f,0xed,0x4c,0xd1,0x15,
284e0c4386eSCy Schubert         0x34,0x65,0x71,0xee,0x96,0x07,0xa6,0xef,0xb2,0xde,0xd8,0xbb,0x35,0x6e,0x2c,0xe2,
285e0c4386eSCy Schubert         0xd1,0x26,0xef,0x7e,0x94,0xe2,0x88,0x51,0xa4,0x6c,0xaa,0x27,0x2a,0xd3,0xb6,0xc2,
286e0c4386eSCy Schubert         0xf7,0xea,0xc3,0x0b,0xa9,0xb5,0x28,0x37,0xa2,0x63,0x08,0xe4,0x88,0xc0,0x1b,0x16,
287e0c4386eSCy Schubert         0x1b,0xca,0xfd,0x8a,0x07,0x32,0x29,0xa7,0x53,0xb5,0x2d,0x30,0xe4,0xf5,0x16,0xc3,
288e0c4386eSCy Schubert         0xe3,0xc2,0x4c,0x30,0x5d,0x35,0x80,0x1c,0xa2,0xdb,0xe3,0x4b,0x51,0x0d,0x4c,0x60,
289e0c4386eSCy Schubert         0x5f,0xb9,0x46,0xac,0xa8,0x46,0xa7,0x32,0xa7,0x9c,0x76,0xf8,0xe9,0xb5,0x19,0xe2,
290e0c4386eSCy Schubert         0x0c,0xe1,0x0f,0xc6,0x46,0xe2,0x38,0xa7,0x87,0x72,0x6d,0x6c,0xbc,0x88,0x2f,0x9d,
291e0c4386eSCy Schubert         0x2d,0xe5,0xd0,0x7d,0x1e,0xc7,0x5d,0xf8,0x7e,0xb4,0x0b,0xa6,0xf9,0x6c,0xe3,0x7c,
292e0c4386eSCy Schubert         0xb2,0x70,0x6e,0x75,0x9b,0x1e,0x63,0xe1,0x4d,0xb2,0x81,0xd3,0x55,0x38,0x94,0x1a,
293e0c4386eSCy Schubert         0x7a,0xfa,0xbf,0x01,0x18,0x70,0x2d,0x35,0xd3,0xe3,0x10,0x7a,0x9a,0xa7,0x8f,0xf3,
294e0c4386eSCy Schubert         0xbd,0x56,0x55,0x5e,0xd8,0xbd,0x4e,0x16,0x76,0xd0,0x48,0x4c,0xf9,0x51,0x54,0xdf,
295e0c4386eSCy Schubert         0x2d,0xb0,0xc9,0xaa,0x5e,0x42,0x38,0x50,0xbf,0x0f,0xc0,0xd9,0x84,0x44,0x4b,0x42,
296e0c4386eSCy Schubert         0x24,0xec,0x14,0xa3,0xde,0x11,0xdf,0x58,0x7f,0xc2,0x4d,0xb2,0xd5,0x42,0x78,0x6e,
297e0c4386eSCy Schubert         0x52,0x3e,0xad,0xc3,0x5f,0x04,0xc4,0xe6,0x31,0xaa,0x81,0x06,0x8b,0x13,0x4b,0x3c,
298e0c4386eSCy Schubert         0x0e,0x6a,0xb1
299e0c4386eSCy Schubert     };
300e0c4386eSCy Schubert 
301e0c4386eSCy Schubert     if (!TEST_ptr(bio = BIO_new_mem_buf(dhx_cert, sizeof(dhx_cert)))
302e0c4386eSCy Schubert         || !TEST_ptr(cert = X509_new_ex(libctx, NULL))
303e0c4386eSCy Schubert         || !TEST_ptr(d2i_X509_bio(bio, &cert)))
304e0c4386eSCy Schubert         goto err;
305e0c4386eSCy Schubert     ret = 1;
306e0c4386eSCy Schubert err:
307e0c4386eSCy Schubert     X509_free(cert);
308e0c4386eSCy Schubert     BIO_free(bio);
309e0c4386eSCy Schubert     return ret;
310e0c4386eSCy Schubert }
311e0c4386eSCy Schubert 
312e0c4386eSCy Schubert #endif /* OPENSSL_NO_DH */
313e0c4386eSCy Schubert 
test_cipher_reinit(int test_id)314e0c4386eSCy Schubert static int test_cipher_reinit(int test_id)
315e0c4386eSCy Schubert {
316e0c4386eSCy Schubert     int ret = 0, diff, ccm, siv, no_null_key;
317e0c4386eSCy Schubert     int out1_len = 0, out2_len = 0, out3_len = 0;
318e0c4386eSCy Schubert     EVP_CIPHER *cipher = NULL;
319e0c4386eSCy Schubert     EVP_CIPHER_CTX *ctx = NULL;
320e0c4386eSCy Schubert     unsigned char out1[256];
321e0c4386eSCy Schubert     unsigned char out2[256];
322e0c4386eSCy Schubert     unsigned char out3[256];
323e0c4386eSCy Schubert     unsigned char in[16] = {
324e0c4386eSCy Schubert         0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
325e0c4386eSCy Schubert         0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10
326e0c4386eSCy Schubert     };
327e0c4386eSCy Schubert     unsigned char key[64] = {
328e0c4386eSCy Schubert         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
329e0c4386eSCy Schubert         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
330e0c4386eSCy Schubert         0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
331e0c4386eSCy Schubert         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
332e0c4386eSCy Schubert         0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
333e0c4386eSCy Schubert         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
334e0c4386eSCy Schubert         0x03, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
335e0c4386eSCy Schubert         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
336e0c4386eSCy Schubert     };
337e0c4386eSCy Schubert     unsigned char iv[16] = {
338e0c4386eSCy Schubert         0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08,
339e0c4386eSCy Schubert         0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00
340e0c4386eSCy Schubert     };
341e0c4386eSCy Schubert     const char *name = sk_OPENSSL_STRING_value(cipher_names, test_id);
342e0c4386eSCy Schubert 
343e0c4386eSCy Schubert     if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new()))
344e0c4386eSCy Schubert         goto err;
345e0c4386eSCy Schubert 
346e0c4386eSCy Schubert     TEST_note("Fetching %s\n", name);
347e0c4386eSCy Schubert     if (!TEST_ptr(cipher = EVP_CIPHER_fetch(libctx, name, NULL)))
348e0c4386eSCy Schubert         goto err;
349e0c4386eSCy Schubert 
350e0c4386eSCy Schubert     /* ccm fails on the second update - this matches OpenSSL 1_1_1 behaviour */
351e0c4386eSCy Schubert     ccm = (EVP_CIPHER_get_mode(cipher) == EVP_CIPH_CCM_MODE);
352e0c4386eSCy Schubert 
353e0c4386eSCy Schubert     /* siv cannot be called with NULL key as the iv is irrelevant */
354e0c4386eSCy Schubert     siv = (EVP_CIPHER_get_mode(cipher) == EVP_CIPH_SIV_MODE);
355e0c4386eSCy Schubert 
356e0c4386eSCy Schubert     /*
357e0c4386eSCy Schubert      * Skip init call with a null key for RC4 as the stream cipher does not
358e0c4386eSCy Schubert      * handle reinit (1.1.1 behaviour).
359e0c4386eSCy Schubert      */
360e0c4386eSCy Schubert     no_null_key = EVP_CIPHER_is_a(cipher, "RC4")
361e0c4386eSCy Schubert                   || EVP_CIPHER_is_a(cipher, "RC4-40")
362e0c4386eSCy Schubert                   || EVP_CIPHER_is_a(cipher, "RC4-HMAC-MD5");
363e0c4386eSCy Schubert 
364e0c4386eSCy Schubert     /* DES3-WRAP uses random every update - so it will give a different value */
365e0c4386eSCy Schubert     diff = EVP_CIPHER_is_a(cipher, "DES3-WRAP");
366e0c4386eSCy Schubert 
367e0c4386eSCy Schubert     if (!TEST_true(EVP_EncryptInit_ex(ctx, cipher, NULL, key, iv))
368e0c4386eSCy Schubert         || !TEST_true(EVP_EncryptUpdate(ctx, out1, &out1_len, in, sizeof(in)))
369e0c4386eSCy Schubert         || !TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv))
370e0c4386eSCy Schubert         || !TEST_int_eq(EVP_EncryptUpdate(ctx, out2, &out2_len, in, sizeof(in)),
371e0c4386eSCy Schubert                         ccm ? 0 : 1)
372e0c4386eSCy Schubert         || (!no_null_key
373e0c4386eSCy Schubert         && (!TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, iv))
374e0c4386eSCy Schubert         || !TEST_int_eq(EVP_EncryptUpdate(ctx, out3, &out3_len, in, sizeof(in)),
375e0c4386eSCy Schubert                         ccm || siv ? 0 : 1))))
376e0c4386eSCy Schubert         goto err;
377e0c4386eSCy Schubert 
378e0c4386eSCy Schubert     if (ccm == 0) {
379e0c4386eSCy Schubert         if (diff) {
380e0c4386eSCy Schubert             if (!TEST_mem_ne(out1, out1_len, out2, out2_len)
381e0c4386eSCy Schubert                 || !TEST_mem_ne(out1, out1_len, out3, out3_len)
382e0c4386eSCy Schubert                 || !TEST_mem_ne(out2, out2_len, out3, out3_len))
383e0c4386eSCy Schubert                 goto err;
384e0c4386eSCy Schubert         } else {
385e0c4386eSCy Schubert             if (!TEST_mem_eq(out1, out1_len, out2, out2_len)
386e0c4386eSCy Schubert                 || (!siv && !no_null_key && !TEST_mem_eq(out1, out1_len, out3, out3_len)))
387e0c4386eSCy Schubert                 goto err;
388e0c4386eSCy Schubert         }
389e0c4386eSCy Schubert     }
390e0c4386eSCy Schubert     ret = 1;
391e0c4386eSCy Schubert err:
392e0c4386eSCy Schubert     EVP_CIPHER_free(cipher);
393e0c4386eSCy Schubert     EVP_CIPHER_CTX_free(ctx);
394e0c4386eSCy Schubert     return ret;
395e0c4386eSCy Schubert }
396e0c4386eSCy Schubert 
397e0c4386eSCy Schubert /*
398e0c4386eSCy Schubert  * This test only uses a partial block (half the block size) of input for each
399e0c4386eSCy Schubert  * EVP_EncryptUpdate() in order to test that the second init/update is not using
400e0c4386eSCy Schubert  * a leftover buffer from the first init/update.
401e0c4386eSCy Schubert  * Note: some ciphers don't need a full block to produce output.
402e0c4386eSCy Schubert  */
test_cipher_reinit_partialupdate(int test_id)403e0c4386eSCy Schubert static int test_cipher_reinit_partialupdate(int test_id)
404e0c4386eSCy Schubert {
405e0c4386eSCy Schubert     int ret = 0, in_len;
406e0c4386eSCy Schubert     int out1_len = 0, out2_len = 0, out3_len = 0;
407e0c4386eSCy Schubert     EVP_CIPHER *cipher = NULL;
408e0c4386eSCy Schubert     EVP_CIPHER_CTX *ctx = NULL;
409e0c4386eSCy Schubert     unsigned char out1[256];
410e0c4386eSCy Schubert     unsigned char out2[256];
411e0c4386eSCy Schubert     unsigned char out3[256];
412e0c4386eSCy Schubert     static const unsigned char in[32] = {
413e0c4386eSCy Schubert         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
414e0c4386eSCy Schubert         0xba, 0xbe, 0xba, 0xbe, 0x00, 0x00, 0xba, 0xbe,
415e0c4386eSCy Schubert         0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
416e0c4386eSCy Schubert         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
417e0c4386eSCy Schubert     };
418e0c4386eSCy Schubert     static const unsigned char key[64] = {
419e0c4386eSCy Schubert         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
420e0c4386eSCy Schubert         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
421e0c4386eSCy Schubert         0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
422e0c4386eSCy Schubert         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
423e0c4386eSCy Schubert         0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
424e0c4386eSCy Schubert         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
425e0c4386eSCy Schubert         0x03, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
426e0c4386eSCy Schubert         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
427e0c4386eSCy Schubert     };
428e0c4386eSCy Schubert     static const unsigned char iv[16] = {
429e0c4386eSCy Schubert         0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08,
430e0c4386eSCy Schubert         0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00
431e0c4386eSCy Schubert     };
432e0c4386eSCy Schubert     const char *name = sk_OPENSSL_STRING_value(cipher_names, test_id);
433e0c4386eSCy Schubert 
434e0c4386eSCy Schubert     if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new()))
435e0c4386eSCy Schubert         goto err;
436e0c4386eSCy Schubert 
437e0c4386eSCy Schubert     TEST_note("Fetching %s\n", name);
438e0c4386eSCy Schubert     if (!TEST_ptr(cipher = EVP_CIPHER_fetch(libctx, name, NULL)))
439e0c4386eSCy Schubert         goto err;
440e0c4386eSCy Schubert 
441e0c4386eSCy Schubert     in_len = EVP_CIPHER_get_block_size(cipher) / 2;
442e0c4386eSCy Schubert 
443e0c4386eSCy Schubert     /* skip any ciphers that don't allow partial updates */
444e0c4386eSCy Schubert     if (((EVP_CIPHER_get_flags(cipher)
445e0c4386eSCy Schubert           & (EVP_CIPH_FLAG_CTS | EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK)) != 0)
446e0c4386eSCy Schubert         || EVP_CIPHER_get_mode(cipher) == EVP_CIPH_CCM_MODE
447e0c4386eSCy Schubert         || EVP_CIPHER_get_mode(cipher) == EVP_CIPH_XTS_MODE
448e0c4386eSCy Schubert         || EVP_CIPHER_get_mode(cipher) == EVP_CIPH_WRAP_MODE) {
449e0c4386eSCy Schubert         ret = 1;
450e0c4386eSCy Schubert         goto err;
451e0c4386eSCy Schubert     }
452e0c4386eSCy Schubert 
453e0c4386eSCy Schubert     if (!TEST_true(EVP_EncryptInit_ex(ctx, cipher, NULL, key, iv))
454e0c4386eSCy Schubert         || !TEST_true(EVP_EncryptUpdate(ctx, out1, &out1_len, in, in_len))
455e0c4386eSCy Schubert         || !TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv))
456e0c4386eSCy Schubert         || !TEST_true(EVP_EncryptUpdate(ctx, out2, &out2_len, in, in_len)))
457e0c4386eSCy Schubert         goto err;
458e0c4386eSCy Schubert 
459e0c4386eSCy Schubert     if (!TEST_mem_eq(out1, out1_len, out2, out2_len))
460e0c4386eSCy Schubert         goto err;
461e0c4386eSCy Schubert 
462e0c4386eSCy Schubert     if (EVP_CIPHER_get_mode(cipher) != EVP_CIPH_SIV_MODE) {
463e0c4386eSCy Schubert         if (!TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, iv))
464e0c4386eSCy Schubert             || !TEST_true(EVP_EncryptUpdate(ctx, out3, &out3_len, in, in_len)))
465e0c4386eSCy Schubert             goto err;
466e0c4386eSCy Schubert 
467e0c4386eSCy Schubert         if (!TEST_mem_eq(out1, out1_len, out3, out3_len))
468e0c4386eSCy Schubert             goto err;
469e0c4386eSCy Schubert     }
470e0c4386eSCy Schubert     ret = 1;
471e0c4386eSCy Schubert err:
472e0c4386eSCy Schubert     EVP_CIPHER_free(cipher);
473e0c4386eSCy Schubert     EVP_CIPHER_CTX_free(ctx);
474e0c4386eSCy Schubert     return ret;
475e0c4386eSCy Schubert }
476e0c4386eSCy Schubert 
477e0c4386eSCy Schubert 
name_cmp(const char * const * a,const char * const * b)478e0c4386eSCy Schubert static int name_cmp(const char * const *a, const char * const *b)
479e0c4386eSCy Schubert {
480e0c4386eSCy Schubert     return OPENSSL_strcasecmp(*a, *b);
481e0c4386eSCy Schubert }
482e0c4386eSCy Schubert 
collect_cipher_names(EVP_CIPHER * cipher,void * cipher_names_list)483e0c4386eSCy Schubert static void collect_cipher_names(EVP_CIPHER *cipher, void *cipher_names_list)
484e0c4386eSCy Schubert {
485e0c4386eSCy Schubert     STACK_OF(OPENSSL_STRING) *names = cipher_names_list;
486e0c4386eSCy Schubert     const char *name = EVP_CIPHER_get0_name(cipher);
487e0c4386eSCy Schubert     char *namedup = NULL;
488e0c4386eSCy Schubert 
489e0c4386eSCy Schubert     assert(name != NULL);
490e0c4386eSCy Schubert     /* the cipher will be freed after returning, strdup is needed */
491e0c4386eSCy Schubert     if ((namedup = OPENSSL_strdup(name)) != NULL
492e0c4386eSCy Schubert         && !sk_OPENSSL_STRING_push(names, namedup))
493e0c4386eSCy Schubert         OPENSSL_free(namedup);
494e0c4386eSCy Schubert }
495e0c4386eSCy Schubert 
rsa_keygen(int bits,EVP_PKEY ** pub,EVP_PKEY ** priv)496e0c4386eSCy Schubert static int rsa_keygen(int bits, EVP_PKEY **pub, EVP_PKEY **priv)
497e0c4386eSCy Schubert {
498e0c4386eSCy Schubert     int ret = 0;
499e0c4386eSCy Schubert     unsigned char *pub_der = NULL;
500e0c4386eSCy Schubert     const unsigned char *pp = NULL;
501e0c4386eSCy Schubert     size_t len = 0;
502e0c4386eSCy Schubert     OSSL_ENCODER_CTX *ectx = NULL;
503e0c4386eSCy Schubert 
504*0d0c8621SEnji Cooper     if (!TEST_ptr(*priv = EVP_PKEY_Q_keygen(libctx, NULL, "RSA", (size_t)bits))
505e0c4386eSCy Schubert         || !TEST_ptr(ectx =
506e0c4386eSCy Schubert                      OSSL_ENCODER_CTX_new_for_pkey(*priv,
507e0c4386eSCy Schubert                                                    EVP_PKEY_PUBLIC_KEY,
508e0c4386eSCy Schubert                                                    "DER", "type-specific",
509e0c4386eSCy Schubert                                                    NULL))
510e0c4386eSCy Schubert         || !TEST_true(OSSL_ENCODER_to_data(ectx, &pub_der, &len)))
511e0c4386eSCy Schubert         goto err;
512e0c4386eSCy Schubert     pp = pub_der;
513e0c4386eSCy Schubert     if (!TEST_ptr(d2i_PublicKey(EVP_PKEY_RSA, pub, &pp, len)))
514e0c4386eSCy Schubert         goto err;
515e0c4386eSCy Schubert     ret = 1;
516e0c4386eSCy Schubert err:
517e0c4386eSCy Schubert     OSSL_ENCODER_CTX_free(ectx);
518e0c4386eSCy Schubert     OPENSSL_free(pub_der);
519e0c4386eSCy Schubert     return ret;
520e0c4386eSCy Schubert }
521e0c4386eSCy Schubert 
kem_rsa_gen_recover(void)522e0c4386eSCy Schubert static int kem_rsa_gen_recover(void)
523e0c4386eSCy Schubert {
524e0c4386eSCy Schubert     int ret = 0;
525e0c4386eSCy Schubert     EVP_PKEY *pub = NULL;
526e0c4386eSCy Schubert     EVP_PKEY *priv = NULL;
527e0c4386eSCy Schubert     EVP_PKEY_CTX *sctx = NULL, *rctx = NULL, *dctx = NULL;
528e0c4386eSCy Schubert     unsigned char secret[256] = { 0, };
529e0c4386eSCy Schubert     unsigned char ct[256] = { 0, };
530e0c4386eSCy Schubert     unsigned char unwrap[256] = { 0, };
531e0c4386eSCy Schubert     size_t ctlen = 0, unwraplen = 0, secretlen = 0;
532e0c4386eSCy Schubert     int bits = 2048;
533e0c4386eSCy Schubert 
534e0c4386eSCy Schubert     ret = TEST_true(rsa_keygen(bits, &pub, &priv))
535e0c4386eSCy Schubert           && TEST_ptr(sctx = EVP_PKEY_CTX_new_from_pkey(libctx, pub, NULL))
536e0c4386eSCy Schubert           && TEST_int_eq(EVP_PKEY_encapsulate_init(sctx, NULL), 1)
537e0c4386eSCy Schubert           && TEST_int_eq(EVP_PKEY_CTX_set_kem_op(sctx, "RSASVE"), 1)
538e0c4386eSCy Schubert           && TEST_ptr(dctx = EVP_PKEY_CTX_dup(sctx))
539*0d0c8621SEnji Cooper           /* Test that providing a NULL wrappedlen fails */
540*0d0c8621SEnji Cooper           && TEST_int_eq(EVP_PKEY_encapsulate(dctx, NULL, NULL, NULL, NULL), 0)
541e0c4386eSCy Schubert           && TEST_int_eq(EVP_PKEY_encapsulate(dctx, NULL, &ctlen, NULL,
542e0c4386eSCy Schubert                                               &secretlen), 1)
543e0c4386eSCy Schubert           && TEST_int_eq(ctlen, secretlen)
544e0c4386eSCy Schubert           && TEST_int_eq(ctlen, bits / 8)
545e0c4386eSCy Schubert           && TEST_int_eq(EVP_PKEY_encapsulate(dctx, ct, &ctlen, secret,
546e0c4386eSCy Schubert                                               &secretlen), 1)
547e0c4386eSCy Schubert           && TEST_ptr(rctx = EVP_PKEY_CTX_new_from_pkey(libctx, priv, NULL))
548e0c4386eSCy Schubert           && TEST_int_eq(EVP_PKEY_decapsulate_init(rctx, NULL), 1)
549e0c4386eSCy Schubert           && TEST_int_eq(EVP_PKEY_CTX_set_kem_op(rctx, "RSASVE"), 1)
550*0d0c8621SEnji Cooper           /* Test that providing a NULL unwrappedlen fails */
551*0d0c8621SEnji Cooper           && TEST_int_eq(EVP_PKEY_decapsulate(rctx, NULL, NULL, ct, ctlen), 0)
552e0c4386eSCy Schubert           && TEST_int_eq(EVP_PKEY_decapsulate(rctx, NULL, &unwraplen,
553e0c4386eSCy Schubert                                               ct, ctlen), 1)
554e0c4386eSCy Schubert           && TEST_int_eq(EVP_PKEY_decapsulate(rctx, unwrap, &unwraplen,
555e0c4386eSCy Schubert                                               ct, ctlen), 1)
556e0c4386eSCy Schubert           && TEST_mem_eq(unwrap, unwraplen, secret, secretlen);
557*0d0c8621SEnji Cooper 
558*0d0c8621SEnji Cooper     /* Test that providing a too short unwrapped/ctlen fails */
559*0d0c8621SEnji Cooper     if (fips_provider_version_match(libctx, ">=3.4.0")) {
560*0d0c8621SEnji Cooper         ctlen = 1;
561*0d0c8621SEnji Cooper         if (!TEST_int_eq(EVP_PKEY_encapsulate(dctx, ct, &ctlen, secret,
562*0d0c8621SEnji Cooper                                               &secretlen), 0))
563*0d0c8621SEnji Cooper             ret = 0;
564*0d0c8621SEnji Cooper         unwraplen = 1;
565*0d0c8621SEnji Cooper         if (!TEST_int_eq(EVP_PKEY_decapsulate(rctx, unwrap, &unwraplen, ct,
566*0d0c8621SEnji Cooper                                               ctlen), 0))
567*0d0c8621SEnji Cooper             ret = 0;
568*0d0c8621SEnji Cooper     }
569*0d0c8621SEnji Cooper 
570e0c4386eSCy Schubert     EVP_PKEY_free(pub);
571e0c4386eSCy Schubert     EVP_PKEY_free(priv);
572e0c4386eSCy Schubert     EVP_PKEY_CTX_free(rctx);
573e0c4386eSCy Schubert     EVP_PKEY_CTX_free(dctx);
574e0c4386eSCy Schubert     EVP_PKEY_CTX_free(sctx);
575e0c4386eSCy Schubert     return ret;
576e0c4386eSCy Schubert }
577e0c4386eSCy Schubert 
578e0c4386eSCy Schubert #ifndef OPENSSL_NO_DES
579e0c4386eSCy Schubert /*
580e0c4386eSCy Schubert  * This test makes sure that EVP_CIPHER_CTX_rand_key() works correctly
581e0c4386eSCy Schubert  * For fips mode this code would produce an error if the flag is not set.
582e0c4386eSCy Schubert  */
test_cipher_tdes_randkey(void)583e0c4386eSCy Schubert static int test_cipher_tdes_randkey(void)
584e0c4386eSCy Schubert {
585e0c4386eSCy Schubert     int ret;
586e0c4386eSCy Schubert     EVP_CIPHER_CTX *ctx = NULL;
587e0c4386eSCy Schubert     EVP_CIPHER *tdes_cipher = NULL, *aes_cipher = NULL;
588e0c4386eSCy Schubert     unsigned char key[24] = { 0 };
589e0c4386eSCy Schubert 
590e0c4386eSCy Schubert     ret = TEST_ptr(aes_cipher = EVP_CIPHER_fetch(libctx, "AES-256-CBC", NULL))
591e0c4386eSCy Schubert           && TEST_int_eq(EVP_CIPHER_get_flags(aes_cipher) & EVP_CIPH_RAND_KEY, 0)
592e0c4386eSCy Schubert           && TEST_ptr(tdes_cipher = EVP_CIPHER_fetch(libctx, "DES-EDE3-CBC", NULL))
593e0c4386eSCy Schubert           && TEST_int_ne(EVP_CIPHER_get_flags(tdes_cipher) & EVP_CIPH_RAND_KEY, 0)
594e0c4386eSCy Schubert           && TEST_ptr(ctx = EVP_CIPHER_CTX_new())
595e0c4386eSCy Schubert           && TEST_true(EVP_CipherInit_ex(ctx, tdes_cipher, NULL, NULL, NULL, 1))
596e0c4386eSCy Schubert           && TEST_int_gt(EVP_CIPHER_CTX_rand_key(ctx, key), 0);
597e0c4386eSCy Schubert 
598e0c4386eSCy Schubert     EVP_CIPHER_CTX_free(ctx);
599e0c4386eSCy Schubert     EVP_CIPHER_free(tdes_cipher);
600e0c4386eSCy Schubert     EVP_CIPHER_free(aes_cipher);
601e0c4386eSCy Schubert     return ret;
602e0c4386eSCy Schubert }
603e0c4386eSCy Schubert #endif /* OPENSSL_NO_DES */
604e0c4386eSCy Schubert 
kem_rsa_params(void)605e0c4386eSCy Schubert static int kem_rsa_params(void)
606e0c4386eSCy Schubert {
607e0c4386eSCy Schubert     int ret = 0;
608e0c4386eSCy Schubert     EVP_PKEY *pub = NULL;
609e0c4386eSCy Schubert     EVP_PKEY *priv = NULL;
610e0c4386eSCy Schubert     EVP_PKEY_CTX *pubctx = NULL, *privctx = NULL;
611e0c4386eSCy Schubert     unsigned char secret[256] = { 0, };
612e0c4386eSCy Schubert     unsigned char ct[256] = { 0, };
613e0c4386eSCy Schubert     size_t ctlen = 0, secretlen = 0;
614e0c4386eSCy Schubert 
615e0c4386eSCy Schubert     ret = TEST_true(rsa_keygen(2048, &pub, &priv))
616e0c4386eSCy Schubert         && TEST_ptr(pubctx = EVP_PKEY_CTX_new_from_pkey(libctx, pub, NULL))
617e0c4386eSCy Schubert         && TEST_ptr(privctx = EVP_PKEY_CTX_new_from_pkey(libctx, priv, NULL))
618e0c4386eSCy Schubert         /* Test setting kem op before the init fails */
619e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_CTX_set_kem_op(pubctx, "RSASVE"), -2)
620e0c4386eSCy Schubert         /* Test NULL ctx passed */
621e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate_init(NULL, NULL), 0)
622e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate(NULL, NULL, NULL, NULL, NULL), 0)
623e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_decapsulate_init(NULL, NULL), 0)
624e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_decapsulate(NULL, NULL, NULL, NULL, 0), 0)
625e0c4386eSCy Schubert         /* Test Invalid operation */
626e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate(pubctx, NULL, NULL, NULL, NULL), -1)
627e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_decapsulate(privctx, NULL, NULL, NULL, 0), 0)
628e0c4386eSCy Schubert         /* Wrong key component - no secret should be returned on failure */
629e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_decapsulate_init(pubctx, NULL), 1)
630e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_CTX_set_kem_op(pubctx, "RSASVE"), 1)
631e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_decapsulate(pubctx, secret, &secretlen, ct,
632e0c4386eSCy Schubert                                             sizeof(ct)), 0)
633e0c4386eSCy Schubert         && TEST_uchar_eq(secret[0], 0)
634e0c4386eSCy Schubert         /* Test encapsulate fails if the mode is not set */
635e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate_init(pubctx, NULL), 1)
636e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate(pubctx, ct, &ctlen, secret, &secretlen), -2)
637e0c4386eSCy Schubert         /* Test setting a bad kem ops fail */
638e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_CTX_set_kem_op(pubctx, "RSA"), 0)
639e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_CTX_set_kem_op(pubctx, NULL), 0)
640e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_CTX_set_kem_op(NULL,  "RSASVE"), 0)
641e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_CTX_set_kem_op(NULL,  NULL), 0)
642e0c4386eSCy Schubert         /* Test secretlen is optional */
643e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_CTX_set_kem_op(pubctx, "RSASVE"), 1)
644*0d0c8621SEnji Cooper         && TEST_int_eq(EVP_PKEY_encapsulate(pubctx, NULL, &ctlen, NULL, NULL), 1)
645e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate(pubctx, ct, &ctlen, secret, NULL), 1)
646e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate(pubctx, NULL, &ctlen, NULL, NULL), 1)
647e0c4386eSCy Schubert         /* Test outlen is optional */
648e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate(pubctx, NULL, NULL, NULL, &secretlen), 1)
649e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate(pubctx, ct, NULL, secret, &secretlen), 1)
650e0c4386eSCy Schubert         /* test that either len must be set if out is NULL */
651e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate(pubctx, NULL, NULL, NULL, NULL), 0)
652e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate(pubctx, NULL, &ctlen, NULL, NULL), 1)
653e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate(pubctx, NULL, NULL, NULL, &secretlen), 1)
654e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate(pubctx, NULL, &ctlen, NULL, &secretlen), 1)
655e0c4386eSCy Schubert         /* Secret buffer should be set if there is an output buffer */
656e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate(pubctx, ct, &ctlen, NULL, NULL), 0)
657e0c4386eSCy Schubert         /* Test that lengths are optional if ct is not NULL */
658e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_encapsulate(pubctx, ct, NULL, secret, NULL), 1)
659e0c4386eSCy Schubert         /* Pass if secret or secret length are not NULL */
660e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_decapsulate_init(privctx, NULL), 1)
661e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_CTX_set_kem_op(privctx, "RSASVE"), 1)
662e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_decapsulate(privctx, secret, NULL, ct, sizeof(ct)), 1)
663e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_decapsulate(privctx, NULL, &secretlen, ct, sizeof(ct)), 1)
664e0c4386eSCy Schubert         && TEST_int_eq(secretlen, 256)
665e0c4386eSCy Schubert         /* Fail if passed NULL arguments */
666e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_decapsulate(privctx, NULL, NULL, ct, sizeof(ct)), 0)
667e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_decapsulate(privctx, secret, &secretlen, NULL, 0), 0)
668e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_decapsulate(privctx, secret, &secretlen, NULL, sizeof(ct)), 0)
669e0c4386eSCy Schubert         && TEST_int_eq(EVP_PKEY_decapsulate(privctx, secret, &secretlen, ct, 0), 0);
670e0c4386eSCy Schubert 
671e0c4386eSCy Schubert     EVP_PKEY_free(pub);
672e0c4386eSCy Schubert     EVP_PKEY_free(priv);
673e0c4386eSCy Schubert     EVP_PKEY_CTX_free(pubctx);
674e0c4386eSCy Schubert     EVP_PKEY_CTX_free(privctx);
675e0c4386eSCy Schubert     return ret;
676e0c4386eSCy Schubert }
677e0c4386eSCy Schubert 
678e0c4386eSCy Schubert #ifndef OPENSSL_NO_DH
gen_dh_key(void)679e0c4386eSCy Schubert static EVP_PKEY *gen_dh_key(void)
680e0c4386eSCy Schubert {
681e0c4386eSCy Schubert     EVP_PKEY_CTX *gctx = NULL;
682e0c4386eSCy Schubert     EVP_PKEY *pkey = NULL;
683e0c4386eSCy Schubert     OSSL_PARAM params[2];
684e0c4386eSCy Schubert 
685e0c4386eSCy Schubert     params[0] = OSSL_PARAM_construct_utf8_string("group", "ffdhe2048", 0);
686e0c4386eSCy Schubert     params[1] = OSSL_PARAM_construct_end();
687e0c4386eSCy Schubert 
688e0c4386eSCy Schubert     if (!TEST_ptr(gctx = EVP_PKEY_CTX_new_from_name(libctx, "DH", NULL))
689e0c4386eSCy Schubert         || !TEST_int_gt(EVP_PKEY_keygen_init(gctx), 0)
690e0c4386eSCy Schubert         || !TEST_true(EVP_PKEY_CTX_set_params(gctx, params))
691e0c4386eSCy Schubert         || !TEST_true(EVP_PKEY_keygen(gctx, &pkey)))
692e0c4386eSCy Schubert         goto err;
693e0c4386eSCy Schubert err:
694e0c4386eSCy Schubert     EVP_PKEY_CTX_free(gctx);
695e0c4386eSCy Schubert     return pkey;
696e0c4386eSCy Schubert }
697e0c4386eSCy Schubert 
698e0c4386eSCy Schubert /* Fail if we try to use a dh key */
kem_invalid_keytype(void)699e0c4386eSCy Schubert static int kem_invalid_keytype(void)
700e0c4386eSCy Schubert {
701e0c4386eSCy Schubert     int ret = 0;
702e0c4386eSCy Schubert     EVP_PKEY *key = NULL;
703e0c4386eSCy Schubert     EVP_PKEY_CTX *sctx = NULL;
704e0c4386eSCy Schubert 
705e0c4386eSCy Schubert     if (!TEST_ptr(key = gen_dh_key()))
706e0c4386eSCy Schubert         goto done;
707e0c4386eSCy Schubert 
708e0c4386eSCy Schubert     if (!TEST_ptr(sctx = EVP_PKEY_CTX_new_from_pkey(libctx, key, NULL)))
709e0c4386eSCy Schubert         goto done;
710e0c4386eSCy Schubert     if (!TEST_int_eq(EVP_PKEY_encapsulate_init(sctx, NULL), -2))
711e0c4386eSCy Schubert         goto done;
712e0c4386eSCy Schubert 
713e0c4386eSCy Schubert     ret = 1;
714e0c4386eSCy Schubert done:
715e0c4386eSCy Schubert     EVP_PKEY_free(key);
716e0c4386eSCy Schubert     EVP_PKEY_CTX_free(sctx);
717e0c4386eSCy Schubert     return ret;
718e0c4386eSCy Schubert }
719e0c4386eSCy Schubert #endif /* OPENSSL_NO_DH */
720e0c4386eSCy Schubert 
setup_tests(void)721e0c4386eSCy Schubert int setup_tests(void)
722e0c4386eSCy Schubert {
723e0c4386eSCy Schubert     const char *prov_name = "default";
724e0c4386eSCy Schubert     char *config_file = NULL;
725e0c4386eSCy Schubert     OPTION_CHOICE o;
726e0c4386eSCy Schubert 
727e0c4386eSCy Schubert     while ((o = opt_next()) != OPT_EOF) {
728e0c4386eSCy Schubert         switch (o) {
729e0c4386eSCy Schubert         case OPT_PROVIDER_NAME:
730e0c4386eSCy Schubert             prov_name = opt_arg();
731e0c4386eSCy Schubert             break;
732e0c4386eSCy Schubert         case OPT_CONFIG_FILE:
733e0c4386eSCy Schubert             config_file = opt_arg();
734e0c4386eSCy Schubert             break;
735e0c4386eSCy Schubert         case OPT_TEST_CASES:
736e0c4386eSCy Schubert            break;
737e0c4386eSCy Schubert         default:
738e0c4386eSCy Schubert         case OPT_ERR:
739e0c4386eSCy Schubert             return 0;
740e0c4386eSCy Schubert         }
741e0c4386eSCy Schubert     }
742e0c4386eSCy Schubert 
743e0c4386eSCy Schubert     if (!test_get_libctx(&libctx, &nullprov, config_file, &libprov, prov_name))
744e0c4386eSCy Schubert         return 0;
745e0c4386eSCy Schubert 
746e0c4386eSCy Schubert #if !defined(OPENSSL_NO_DSA) && !defined(OPENSSL_NO_DH)
747e0c4386eSCy Schubert     ADD_ALL_TESTS(test_dsa_param_keygen, 3 * 3 * 3);
748e0c4386eSCy Schubert #endif
749e0c4386eSCy Schubert #ifndef OPENSSL_NO_DH
750e0c4386eSCy Schubert     ADD_ALL_TESTS(test_dh_safeprime_param_keygen, 3 * 3 * 3);
751e0c4386eSCy Schubert     ADD_TEST(dhx_cert_load);
752e0c4386eSCy Schubert #endif
753e0c4386eSCy Schubert 
754e0c4386eSCy Schubert     if (!TEST_ptr(cipher_names = sk_OPENSSL_STRING_new(name_cmp)))
755e0c4386eSCy Schubert         return 0;
756e0c4386eSCy Schubert     EVP_CIPHER_do_all_provided(libctx, collect_cipher_names, cipher_names);
757e0c4386eSCy Schubert 
758e0c4386eSCy Schubert     ADD_ALL_TESTS(test_cipher_reinit, sk_OPENSSL_STRING_num(cipher_names));
759e0c4386eSCy Schubert     ADD_ALL_TESTS(test_cipher_reinit_partialupdate,
760e0c4386eSCy Schubert                   sk_OPENSSL_STRING_num(cipher_names));
761e0c4386eSCy Schubert     ADD_TEST(kem_rsa_gen_recover);
762e0c4386eSCy Schubert     ADD_TEST(kem_rsa_params);
763e0c4386eSCy Schubert #ifndef OPENSSL_NO_DH
764e0c4386eSCy Schubert     ADD_TEST(kem_invalid_keytype);
765e0c4386eSCy Schubert #endif
766e0c4386eSCy Schubert #ifndef OPENSSL_NO_DES
767e0c4386eSCy Schubert     ADD_TEST(test_cipher_tdes_randkey);
768e0c4386eSCy Schubert #endif
769e0c4386eSCy Schubert     return 1;
770e0c4386eSCy Schubert }
771e0c4386eSCy Schubert 
772e0c4386eSCy Schubert /* Because OPENSSL_free is a macro, it can't be passed as a function pointer */
string_free(char * m)773e0c4386eSCy Schubert static void string_free(char *m)
774e0c4386eSCy Schubert {
775e0c4386eSCy Schubert     OPENSSL_free(m);
776e0c4386eSCy Schubert }
777e0c4386eSCy Schubert 
cleanup_tests(void)778e0c4386eSCy Schubert void cleanup_tests(void)
779e0c4386eSCy Schubert {
780e0c4386eSCy Schubert     sk_OPENSSL_STRING_pop_free(cipher_names, string_free);
781e0c4386eSCy Schubert     OSSL_PROVIDER_unload(libprov);
782e0c4386eSCy Schubert     OSSL_LIB_CTX_free(libctx);
783e0c4386eSCy Schubert     OSSL_PROVIDER_unload(nullprov);
784e0c4386eSCy Schubert }
785