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