Fix openssl req with -addext subjectAltName=dirName
[openssl.git] / test / endecode_test.c
1 /*
2  * Copyright 2020-2023 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 #include <string.h>
11 #include <openssl/core_dispatch.h>
12 #include <openssl/evp.h>
13 #include <openssl/pem.h>
14 #include <openssl/rsa.h>
15 #include <openssl/x509.h>
16 #include <openssl/core_names.h>
17 #include <openssl/params.h>
18 #include <openssl/param_build.h>
19 #include <openssl/encoder.h>
20 #include <openssl/decoder.h>
21
22 #include "internal/cryptlib.h"   /* ossl_assert */
23 #include "crypto/pem.h"          /* For PVK and "blob" PEM headers */
24 #include "crypto/evp.h"          /* For evp_pkey_is_provided() */
25
26 #include "helpers/predefined_dhparams.h"
27 #include "testutil.h"
28
29 #ifdef STATIC_LEGACY
30 OSSL_provider_init_fn ossl_legacy_provider_init;
31 #endif
32
33 /* Extended test macros to allow passing file & line number */
34 #define TEST_FL_ptr(a)               test_ptr(file, line, #a, a)
35 #define TEST_FL_mem_eq(a, m, b, n)   test_mem_eq(file, line, #a, #b, a, m, b, n)
36 #define TEST_FL_strn_eq(a, b, n)     test_strn_eq(file, line, #a, #b, a, n, b, n)
37 #define TEST_FL_strn2_eq(a, m, b, n) test_strn_eq(file, line, #a, #b, a, m, b, n)
38 #define TEST_FL_int_eq(a, b)         test_int_eq(file, line, #a, #b, a, b)
39 #define TEST_FL_int_ge(a, b)         test_int_ge(file, line, #a, #b, a, b)
40 #define TEST_FL_int_gt(a, b)         test_int_gt(file, line, #a, #b, a, b)
41 #define TEST_FL_long_gt(a, b)        test_long_gt(file, line, #a, #b, a, b)
42 #define TEST_FL_true(a)              test_true(file, line, #a, (a) != 0)
43
44 #if defined(OPENSSL_NO_DH) && defined(OPENSSL_NO_DSA) && defined(OPENSSL_NO_EC)
45 # define OPENSSL_NO_KEYPARAMS
46 #endif
47
48 static int default_libctx = 1;
49 static int is_fips = 0;
50 static int is_fips_3_0_0 = 0;
51
52 static OSSL_LIB_CTX *testctx = NULL;
53 static OSSL_LIB_CTX *keyctx = NULL;
54 static char *testpropq = NULL;
55
56 static OSSL_PROVIDER *nullprov = NULL;
57 static OSSL_PROVIDER *deflprov = NULL;
58 static OSSL_PROVIDER *keyprov = NULL;
59
60 #ifndef OPENSSL_NO_EC
61 static BN_CTX *bnctx = NULL;
62 static OSSL_PARAM_BLD *bld_prime_nc = NULL;
63 static OSSL_PARAM_BLD *bld_prime = NULL;
64 static OSSL_PARAM *ec_explicit_prime_params_nc = NULL;
65 static OSSL_PARAM *ec_explicit_prime_params_explicit = NULL;
66
67 # ifndef OPENSSL_NO_EC2M
68 static OSSL_PARAM_BLD *bld_tri_nc = NULL;
69 static OSSL_PARAM_BLD *bld_tri = NULL;
70 static OSSL_PARAM *ec_explicit_tri_params_nc = NULL;
71 static OSSL_PARAM *ec_explicit_tri_params_explicit = NULL;
72 # endif
73 #endif
74
75 #ifndef OPENSSL_NO_KEYPARAMS
76 static EVP_PKEY *make_template(const char *type, OSSL_PARAM *genparams)
77 {
78     EVP_PKEY *pkey = NULL;
79     EVP_PKEY_CTX *ctx = NULL;
80
81 # ifndef OPENSSL_NO_DH
82     /*
83      * Use 512-bit DH(X) keys with predetermined parameters for efficiency,
84      * for testing only. Use a minimum key size of 2048 for security purposes.
85      */
86     if (strcmp(type, "DH") == 0)
87         return get_dh512(keyctx);
88
89     if (strcmp(type, "X9.42 DH") == 0)
90         return get_dhx512(keyctx);
91 # endif
92
93     /*
94      * No real need to check the errors other than for the cascade
95      * effect.  |pkey| will simply remain NULL if something goes wrong.
96      */
97     (void)((ctx = EVP_PKEY_CTX_new_from_name(keyctx, type, testpropq)) != NULL
98            && EVP_PKEY_paramgen_init(ctx) > 0
99            && (genparams == NULL
100                || EVP_PKEY_CTX_set_params(ctx, genparams) > 0)
101            && EVP_PKEY_generate(ctx, &pkey) > 0);
102     EVP_PKEY_CTX_free(ctx);
103
104     return pkey;
105 }
106 #endif
107
108 #if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC)
109 static EVP_PKEY *make_key(const char *type, EVP_PKEY *template,
110                           OSSL_PARAM *genparams)
111 {
112     EVP_PKEY *pkey = NULL;
113     EVP_PKEY_CTX *ctx =
114         template != NULL
115         ? EVP_PKEY_CTX_new_from_pkey(keyctx, template, testpropq)
116         : EVP_PKEY_CTX_new_from_name(keyctx, type, testpropq);
117
118     /*
119      * No real need to check the errors other than for the cascade
120      * effect.  |pkey| will simply remain NULL if something goes wrong.
121      */
122     (void)(ctx != NULL
123            && EVP_PKEY_keygen_init(ctx) > 0
124            && (genparams == NULL
125                || EVP_PKEY_CTX_set_params(ctx, genparams) > 0)
126            && EVP_PKEY_keygen(ctx, &pkey) > 0);
127     EVP_PKEY_CTX_free(ctx);
128     return pkey;
129 }
130 #endif
131
132 /* Main test driver */
133
134 typedef int (encoder)(const char *file, const int line,
135                       void **encoded, long *encoded_len,
136                       void *object, int selection,
137                       const char *output_type, const char *output_structure,
138                       const char *pass, const char *pcipher);
139 typedef int (decoder)(const char *file, const int line,
140                       void **object, void *encoded, long encoded_len,
141                       const char *input_type, const char *structure_type,
142                       const char *keytype, int selection, const char *pass);
143 typedef int (tester)(const char *file, const int line,
144                      const void *data1, size_t data1_len,
145                      const void *data2, size_t data2_len);
146 typedef int (checker)(const char *file, const int line,
147                       const char *type, const void *data, size_t data_len);
148 typedef void (dumper)(const char *label, const void *data, size_t data_len);
149
150 #define FLAG_DECODE_WITH_TYPE   0x0001
151 #define FLAG_FAIL_IF_FIPS       0x0002
152
153 static int test_encode_decode(const char *file, const int line,
154                               const char *type, EVP_PKEY *pkey,
155                               int selection, const char *output_type,
156                               const char *output_structure,
157                               const char *pass, const char *pcipher,
158                               encoder *encode_cb, decoder *decode_cb,
159                               tester *test_cb, checker *check_cb,
160                               dumper *dump_cb, int flags)
161 {
162     void *encoded = NULL;
163     long encoded_len = 0;
164     EVP_PKEY *pkey2 = NULL;
165     EVP_PKEY *pkey3 = NULL;
166     void *encoded2 = NULL;
167     long encoded2_len = 0;
168     int ok = 0;
169
170     /*
171      * Encode |pkey|, decode the result into |pkey2|, and finish off by
172      * encoding |pkey2| as well.  That last encoding is for checking and
173      * dumping purposes.
174      */
175     if (!TEST_true(encode_cb(file, line, &encoded, &encoded_len, pkey, selection,
176                              output_type, output_structure, pass, pcipher)))
177         goto end;
178
179     if ((flags & FLAG_FAIL_IF_FIPS) != 0 && is_fips && !is_fips_3_0_0) {
180         if (TEST_false(decode_cb(file, line, (void **)&pkey2, encoded,
181                                   encoded_len, output_type, output_structure,
182                                   (flags & FLAG_DECODE_WITH_TYPE ? type : NULL),
183                                   selection, pass)))
184             ok = 1;
185         goto end;
186     }
187
188     if (!TEST_true(check_cb(file, line, type, encoded, encoded_len))
189         || !TEST_true(decode_cb(file, line, (void **)&pkey2, encoded, encoded_len,
190                                 output_type, output_structure,
191                                 (flags & FLAG_DECODE_WITH_TYPE ? type : NULL),
192                                 selection, pass))
193         || ((output_structure == NULL
194              || strcmp(output_structure, "type-specific") != 0)
195             && !TEST_true(decode_cb(file, line, (void **)&pkey3, encoded, encoded_len,
196                                     output_type, output_structure,
197                                     (flags & FLAG_DECODE_WITH_TYPE ? type : NULL),
198                                     0, pass)))
199         || !TEST_true(encode_cb(file, line, &encoded2, &encoded2_len, pkey2, selection,
200                                 output_type, output_structure, pass, pcipher)))
201         goto end;
202
203     if (selection == OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS) {
204         if (!TEST_int_eq(EVP_PKEY_parameters_eq(pkey, pkey2), 1)
205             || (pkey3 != NULL
206                 && !TEST_int_eq(EVP_PKEY_parameters_eq(pkey, pkey3), 1)))
207             goto end;
208     } else {
209         if (!TEST_int_eq(EVP_PKEY_eq(pkey, pkey2), 1)
210             || (pkey3 != NULL
211                 && !TEST_int_eq(EVP_PKEY_eq(pkey, pkey3), 1)))
212             goto end;
213     }
214
215     /*
216      * Double check the encoding, but only for unprotected keys,
217      * as protected keys have a random component, which makes the output
218      * differ.
219      */
220     if ((pass == NULL && pcipher == NULL)
221         && !test_cb(file, line, encoded, encoded_len, encoded2, encoded2_len))
222         goto end;
223
224     ok = 1;
225  end:
226     if (!ok) {
227         if (encoded != NULL && encoded_len != 0)
228             dump_cb("|pkey| encoded", encoded, encoded_len);
229         if (encoded2 != NULL && encoded2_len != 0)
230             dump_cb("|pkey2| encoded", encoded2, encoded2_len);
231     }
232
233     OPENSSL_free(encoded);
234     OPENSSL_free(encoded2);
235     EVP_PKEY_free(pkey2);
236     EVP_PKEY_free(pkey3);
237     return ok;
238 }
239
240 /* Encoding and decoding methods */
241
242 static int encode_EVP_PKEY_prov(const char *file, const int line,
243                                 void **encoded, long *encoded_len,
244                                 void *object, int selection,
245                                 const char *output_type,
246                                 const char *output_structure,
247                                 const char *pass, const char *pcipher)
248 {
249     EVP_PKEY *pkey = object;
250     OSSL_ENCODER_CTX *ectx = NULL;
251     BIO *mem_ser = NULL;
252     BUF_MEM *mem_buf = NULL;
253     const unsigned char *upass = (const unsigned char *)pass;
254     int ok = 0;
255
256     if (!TEST_FL_ptr(ectx = OSSL_ENCODER_CTX_new_for_pkey(pkey, selection,
257                                                        output_type,
258                                                        output_structure,
259                                                        testpropq))
260         || !TEST_FL_int_gt(OSSL_ENCODER_CTX_get_num_encoders(ectx), 0)
261         || (pass != NULL
262             && !TEST_FL_true(OSSL_ENCODER_CTX_set_passphrase(ectx, upass,
263                                                           strlen(pass))))
264         || (pcipher != NULL
265             && !TEST_FL_true(OSSL_ENCODER_CTX_set_cipher(ectx, pcipher, NULL)))
266         || !TEST_FL_ptr(mem_ser = BIO_new(BIO_s_mem()))
267         || !TEST_FL_true(OSSL_ENCODER_to_bio(ectx, mem_ser))
268         || !TEST_FL_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
269         || !TEST_FL_ptr(*encoded = mem_buf->data)
270         || !TEST_FL_long_gt(*encoded_len = mem_buf->length, 0))
271         goto end;
272
273     /* Detach the encoded output */
274     mem_buf->data = NULL;
275     mem_buf->length = 0;
276     ok = 1;
277  end:
278     BIO_free(mem_ser);
279     OSSL_ENCODER_CTX_free(ectx);
280     return ok;
281 }
282
283 static int decode_EVP_PKEY_prov(const char *file, const int line,
284                                 void **object, void *encoded, long encoded_len,
285                                 const char *input_type,
286                                 const char *structure_type,
287                                 const char *keytype, int selection,
288                                 const char *pass)
289 {
290     EVP_PKEY *pkey = NULL, *testpkey = NULL;
291     OSSL_DECODER_CTX *dctx = NULL;
292     BIO *encoded_bio = NULL;
293     const unsigned char *upass = (const unsigned char *)pass;
294     int ok = 0;
295     int i;
296     const char *badtype;
297
298     if (strcmp(input_type, "DER") == 0)
299         badtype = "PEM";
300     else
301         badtype = "DER";
302
303     if (!TEST_FL_ptr(encoded_bio = BIO_new_mem_buf(encoded, encoded_len)))
304         goto end;
305
306     /*
307      * We attempt the decode 3 times. The first time we provide the expected
308      * starting input type. The second time we provide NULL for the starting
309      * type. The third time we provide a bad starting input type.
310      * The bad starting input type should fail. The other two should succeed
311      * and produce the same result.
312      */
313     for (i = 0; i < 3; i++) {
314         const char *testtype = (i == 0) ? input_type
315                                         : ((i == 1) ? NULL : badtype);
316
317         if (!TEST_FL_ptr(dctx = OSSL_DECODER_CTX_new_for_pkey(&testpkey,
318                                                            testtype,
319                                                            structure_type,
320                                                            keytype,
321                                                            selection,
322                                                            testctx, testpropq))
323             || (pass != NULL
324                 && !OSSL_DECODER_CTX_set_passphrase(dctx, upass, strlen(pass)))
325             || !TEST_FL_int_gt(BIO_reset(encoded_bio), 0)
326                /* We expect to fail when using a bad input type */
327             || !TEST_FL_int_eq(OSSL_DECODER_from_bio(dctx, encoded_bio),
328                             (i == 2) ? 0 : 1))
329             goto end;
330         OSSL_DECODER_CTX_free(dctx);
331         dctx = NULL;
332
333         if (i == 0) {
334             pkey = testpkey;
335             testpkey = NULL;
336         } else if (i == 1) {
337             if (selection == OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS) {
338                 if (!TEST_FL_int_eq(EVP_PKEY_parameters_eq(pkey, testpkey), 1))
339                     goto end;
340             } else {
341                 if (!TEST_FL_int_eq(EVP_PKEY_eq(pkey, testpkey), 1))
342                     goto end;
343             }
344         }
345     }
346     ok = 1;
347     *object = pkey;
348     pkey = NULL;
349
350  end:
351     EVP_PKEY_free(pkey);
352     EVP_PKEY_free(testpkey);
353     BIO_free(encoded_bio);
354     OSSL_DECODER_CTX_free(dctx);
355     return ok;
356 }
357
358 static int encode_EVP_PKEY_legacy_PEM(const char *file, const int line,
359                                       void **encoded, long *encoded_len,
360                                       void *object, ossl_unused int selection,
361                                       ossl_unused const char *output_type,
362                                       ossl_unused const char *output_structure,
363                                       const char *pass, const char *pcipher)
364 {
365     EVP_PKEY *pkey = object;
366     EVP_CIPHER *cipher = NULL;
367     BIO *mem_ser = NULL;
368     BUF_MEM *mem_buf = NULL;
369     const unsigned char *upass = (const unsigned char *)pass;
370     size_t passlen = 0;
371     int ok = 0;
372
373     if (pcipher != NULL && pass != NULL) {
374         passlen = strlen(pass);
375         if (!TEST_FL_ptr(cipher = EVP_CIPHER_fetch(testctx, pcipher, testpropq)))
376             goto end;
377     }
378     if (!TEST_FL_ptr(mem_ser = BIO_new(BIO_s_mem()))
379         || !TEST_FL_true(PEM_write_bio_PrivateKey_traditional(mem_ser, pkey,
380                                                            cipher,
381                                                            upass, passlen,
382                                                            NULL, NULL))
383         || !TEST_FL_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
384         || !TEST_FL_ptr(*encoded = mem_buf->data)
385         || !TEST_FL_long_gt(*encoded_len = mem_buf->length, 0))
386         goto end;
387
388     /* Detach the encoded output */
389     mem_buf->data = NULL;
390     mem_buf->length = 0;
391     ok = 1;
392  end:
393     BIO_free(mem_ser);
394     EVP_CIPHER_free(cipher);
395     return ok;
396 }
397
398 static int encode_EVP_PKEY_MSBLOB(const char *file, const int line,
399                                   void **encoded, long *encoded_len,
400                                   void *object, int selection,
401                                   ossl_unused const char *output_type,
402                                   ossl_unused const char *output_structure,
403                                   ossl_unused const char *pass,
404                                   ossl_unused const char *pcipher)
405 {
406     EVP_PKEY *pkey = object;
407     BIO *mem_ser = NULL;
408     BUF_MEM *mem_buf = NULL;
409     int ok = 0;
410
411     if (!TEST_FL_ptr(mem_ser = BIO_new(BIO_s_mem())))
412         goto end;
413
414     if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) {
415         if (!TEST_FL_int_ge(i2b_PrivateKey_bio(mem_ser, pkey), 0))
416             goto end;
417     } else {
418         if (!TEST_FL_int_ge(i2b_PublicKey_bio(mem_ser, pkey), 0))
419             goto end;
420     }
421
422     if (!TEST_FL_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
423         || !TEST_FL_ptr(*encoded = mem_buf->data)
424         || !TEST_FL_long_gt(*encoded_len = mem_buf->length, 0))
425         goto end;
426
427     /* Detach the encoded output */
428     mem_buf->data = NULL;
429     mem_buf->length = 0;
430     ok = 1;
431  end:
432     BIO_free(mem_ser);
433     return ok;
434 }
435
436 static pem_password_cb pass_pw;
437 static int pass_pw(char *buf, int size, int rwflag, void *userdata)
438 {
439     OPENSSL_strlcpy(buf, userdata, size);
440     return strlen(userdata);
441 }
442
443 static int encode_EVP_PKEY_PVK(const char *file, const int line,
444                                void **encoded, long *encoded_len,
445                                void *object, int selection,
446                                ossl_unused const char *output_type,
447                                ossl_unused const char *output_structure,
448                                const char *pass,
449                                ossl_unused const char *pcipher)
450 {
451     EVP_PKEY *pkey = object;
452     BIO *mem_ser = NULL;
453     BUF_MEM *mem_buf = NULL;
454     int enc = (pass != NULL);
455     int ok = 0;
456
457     if (!TEST_FL_true(ossl_assert((selection
458                                 & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0))
459         || !TEST_FL_ptr(mem_ser = BIO_new(BIO_s_mem()))
460         || !TEST_FL_int_ge(i2b_PVK_bio_ex(mem_ser, pkey, enc,
461                                           pass_pw, (void *)pass, testctx, testpropq), 0)
462         || !TEST_FL_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
463         || !TEST_FL_ptr(*encoded = mem_buf->data)
464         || !TEST_FL_long_gt(*encoded_len = mem_buf->length, 0))
465         goto end;
466
467     /* Detach the encoded output */
468     mem_buf->data = NULL;
469     mem_buf->length = 0;
470     ok = 1;
471  end:
472     BIO_free(mem_ser);
473     return ok;
474 }
475
476 static int test_text(const char *file, const int line,
477                      const void *data1, size_t data1_len,
478                      const void *data2, size_t data2_len)
479 {
480     return TEST_FL_strn2_eq(data1, data1_len, data2, data2_len);
481 }
482
483 static int test_mem(const char *file, const int line,
484                     const void *data1, size_t data1_len,
485                     const void *data2, size_t data2_len)
486 {
487     return TEST_FL_mem_eq(data1, data1_len, data2, data2_len);
488 }
489
490 /* Test cases and their dumpers / checkers */
491
492 static void collect_name(const char *name, void *arg)
493 {
494     char **namelist = arg;
495     char *new_namelist;
496     size_t space;
497
498     space = strlen(name);
499     if (*namelist != NULL)
500         space += strlen(*namelist) + 2 /* for comma and space */;
501     space++; /* for terminating null byte */
502
503     new_namelist = OPENSSL_realloc(*namelist, space);
504     if (new_namelist == NULL)
505         return;
506     if (*namelist != NULL) {
507         strcat(new_namelist, ", ");
508         strcat(new_namelist, name);
509     } else {
510         strcpy(new_namelist, name);
511     }
512     *namelist = new_namelist;
513 }
514
515 static void dump_der(const char *label, const void *data, size_t data_len)
516 {
517     test_output_memory(label, data, data_len);
518 }
519
520 static void dump_pem(const char *label, const void *data, size_t data_len)
521 {
522     test_output_string(label, data, data_len - 1);
523 }
524
525 static int check_unprotected_PKCS8_DER(const char *file, const int line,
526                                        const char *type,
527                                        const void *data, size_t data_len)
528 {
529     const unsigned char *datap = data;
530     PKCS8_PRIV_KEY_INFO *p8inf =
531         d2i_PKCS8_PRIV_KEY_INFO(NULL, &datap, data_len);
532     int ok = 0;
533
534     if (TEST_FL_ptr(p8inf)) {
535         EVP_PKEY *pkey = EVP_PKCS82PKEY_ex(p8inf, testctx, testpropq);
536         char *namelist = NULL;
537
538         if (TEST_FL_ptr(pkey)) {
539             if (!(ok = TEST_FL_true(EVP_PKEY_is_a(pkey, type)))) {
540                 EVP_PKEY_type_names_do_all(pkey, collect_name, &namelist);
541                 if (namelist != NULL)
542                     TEST_note("%s isn't any of %s", type, namelist);
543                 OPENSSL_free(namelist);
544             }
545             ok = ok && TEST_FL_true(evp_pkey_is_provided(pkey));
546             EVP_PKEY_free(pkey);
547         }
548     }
549     PKCS8_PRIV_KEY_INFO_free(p8inf);
550     return ok;
551 }
552
553 static int test_unprotected_via_DER(const char *type, EVP_PKEY *key, int fips)
554 {
555     return test_encode_decode(__FILE__, __LINE__, type, key,
556                               OSSL_KEYMGMT_SELECT_KEYPAIR
557                               | OSSL_KEYMGMT_SELECT_ALL_PARAMETERS,
558                               "DER", "PrivateKeyInfo", NULL, NULL,
559                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
560                               test_mem, check_unprotected_PKCS8_DER,
561                               dump_der, fips ? 0 : FLAG_FAIL_IF_FIPS);
562 }
563
564 static int check_unprotected_PKCS8_PEM(const char *file, const int line,
565                                        const char *type,
566                                        const void *data, size_t data_len)
567 {
568     static const char expected_pem_header[] =
569         "-----BEGIN " PEM_STRING_PKCS8INF "-----";
570
571     return TEST_FL_strn_eq(data, expected_pem_header,
572                         sizeof(expected_pem_header) - 1);
573 }
574
575 static int test_unprotected_via_PEM(const char *type, EVP_PKEY *key, int fips)
576 {
577     return test_encode_decode(__FILE__, __LINE__, type, key,
578                               OSSL_KEYMGMT_SELECT_KEYPAIR
579                               | OSSL_KEYMGMT_SELECT_ALL_PARAMETERS,
580                               "PEM", "PrivateKeyInfo", NULL, NULL,
581                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
582                               test_text, check_unprotected_PKCS8_PEM,
583                               dump_pem, fips ? 0 : FLAG_FAIL_IF_FIPS);
584 }
585
586 #ifndef OPENSSL_NO_KEYPARAMS
587 static int check_params_DER(const char *file, const int line,
588                             const char *type, const void *data, size_t data_len)
589 {
590     const unsigned char *datap = data;
591     int ok = 0;
592     int itype = NID_undef;
593     EVP_PKEY *pkey = NULL;
594
595     if (strcmp(type, "DH") == 0)
596         itype = EVP_PKEY_DH;
597     else if (strcmp(type, "X9.42 DH") == 0)
598         itype = EVP_PKEY_DHX;
599     else if (strcmp(type, "DSA") ==  0)
600         itype = EVP_PKEY_DSA;
601     else if (strcmp(type, "EC") ==  0)
602         itype = EVP_PKEY_EC;
603
604     if (itype != NID_undef) {
605         pkey = d2i_KeyParams(itype, NULL, &datap, data_len);
606         ok = (pkey != NULL);
607         EVP_PKEY_free(pkey);
608     }
609
610     return ok;
611 }
612
613 static int check_params_PEM(const char *file, const int line,
614                             const char *type,
615                             const void *data, size_t data_len)
616 {
617     static char expected_pem_header[80];
618
619     return
620         TEST_FL_int_gt(BIO_snprintf(expected_pem_header,
621                                  sizeof(expected_pem_header),
622                                  "-----BEGIN %s PARAMETERS-----", type), 0)
623         && TEST_FL_strn_eq(data, expected_pem_header, strlen(expected_pem_header));
624 }
625
626 static int test_params_via_DER(const char *type, EVP_PKEY *key)
627 {
628     return test_encode_decode(__FILE__, __LINE__, type, key, OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
629                               "DER", "type-specific", NULL, NULL,
630                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
631                               test_mem, check_params_DER,
632                               dump_der, FLAG_DECODE_WITH_TYPE);
633 }
634
635 static int test_params_via_PEM(const char *type, EVP_PKEY *key)
636 {
637     return test_encode_decode(__FILE__, __LINE__, type, key, OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
638                               "PEM", "type-specific", NULL, NULL,
639                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
640                               test_text, check_params_PEM,
641                               dump_pem, 0);
642 }
643 #endif /* !OPENSSL_NO_KEYPARAMS */
644
645 static int check_unprotected_legacy_PEM(const char *file, const int line,
646                                         const char *type,
647                                         const void *data, size_t data_len)
648 {
649     static char expected_pem_header[80];
650
651     return
652         TEST_FL_int_gt(BIO_snprintf(expected_pem_header,
653                                  sizeof(expected_pem_header),
654                                  "-----BEGIN %s PRIVATE KEY-----", type), 0)
655         && TEST_FL_strn_eq(data, expected_pem_header, strlen(expected_pem_header));
656 }
657
658 static int test_unprotected_via_legacy_PEM(const char *type, EVP_PKEY *key)
659 {
660     if (!default_libctx || is_fips)
661         return TEST_skip("Test not available if using a non-default library context or FIPS provider");
662
663     return test_encode_decode(__FILE__, __LINE__, type, key,
664                               OSSL_KEYMGMT_SELECT_KEYPAIR
665                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
666                               "PEM", "type-specific", NULL, NULL,
667                               encode_EVP_PKEY_legacy_PEM, decode_EVP_PKEY_prov,
668                               test_text, check_unprotected_legacy_PEM,
669                               dump_pem, 0);
670 }
671
672 static int check_MSBLOB(const char *file, const int line,
673                         const char *type, const void *data, size_t data_len)
674 {
675     const unsigned char *datap = data;
676     EVP_PKEY *pkey = b2i_PrivateKey(&datap, data_len);
677     int ok = TEST_FL_ptr(pkey);
678
679     EVP_PKEY_free(pkey);
680     return ok;
681 }
682
683 static int test_unprotected_via_MSBLOB(const char *type, EVP_PKEY *key)
684 {
685     return test_encode_decode(__FILE__, __LINE__, type, key,
686                               OSSL_KEYMGMT_SELECT_KEYPAIR
687                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
688                               "MSBLOB", NULL, NULL, NULL,
689                               encode_EVP_PKEY_MSBLOB, decode_EVP_PKEY_prov,
690                               test_mem, check_MSBLOB,
691                               dump_der, 0);
692 }
693
694 static int check_PVK(const char *file, const int line,
695                      const char *type, const void *data, size_t data_len)
696 {
697     const unsigned char *in = data;
698     unsigned int saltlen = 0, keylen = 0;
699     int ok = ossl_do_PVK_header(&in, data_len, 0, &saltlen, &keylen);
700
701     return ok;
702 }
703
704 static int test_unprotected_via_PVK(const char *type, EVP_PKEY *key)
705 {
706     return test_encode_decode(__FILE__, __LINE__, type, key,
707                               OSSL_KEYMGMT_SELECT_KEYPAIR
708                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
709                               "PVK", NULL, NULL, NULL,
710                               encode_EVP_PKEY_PVK, decode_EVP_PKEY_prov,
711                               test_mem, check_PVK,
712                               dump_der, 0);
713 }
714
715 static const char *pass_cipher = "AES-256-CBC";
716 static const char *pass = "the holy handgrenade of antioch";
717
718 static int check_protected_PKCS8_DER(const char *file, const int line,
719                                      const char *type,
720                                      const void *data, size_t data_len)
721 {
722     const unsigned char *datap = data;
723     X509_SIG *p8 = d2i_X509_SIG(NULL, &datap, data_len);
724     int ok = TEST_FL_ptr(p8);
725
726     X509_SIG_free(p8);
727     return ok;
728 }
729
730 static int test_protected_via_DER(const char *type, EVP_PKEY *key, int fips)
731 {
732     return test_encode_decode(__FILE__, __LINE__, type, key,
733                               OSSL_KEYMGMT_SELECT_KEYPAIR
734                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
735                               "DER", "EncryptedPrivateKeyInfo",
736                               pass, pass_cipher,
737                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
738                               test_mem, check_protected_PKCS8_DER,
739                               dump_der, fips ? 0 : FLAG_FAIL_IF_FIPS);
740 }
741
742 static int check_protected_PKCS8_PEM(const char *file, const int line,
743                                      const char *type,
744                                      const void *data, size_t data_len)
745 {
746     static const char expected_pem_header[] =
747         "-----BEGIN " PEM_STRING_PKCS8 "-----";
748
749     return TEST_FL_strn_eq(data, expected_pem_header,
750                         sizeof(expected_pem_header) - 1);
751 }
752
753 static int test_protected_via_PEM(const char *type, EVP_PKEY *key, int fips)
754 {
755     return test_encode_decode(__FILE__, __LINE__, type, key,
756                               OSSL_KEYMGMT_SELECT_KEYPAIR
757                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
758                               "PEM", "EncryptedPrivateKeyInfo",
759                               pass, pass_cipher,
760                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
761                               test_text, check_protected_PKCS8_PEM,
762                               dump_pem, fips ? 0 : FLAG_FAIL_IF_FIPS);
763 }
764
765 static int check_protected_legacy_PEM(const char *file, const int line,
766                                       const char *type,
767                                       const void *data, size_t data_len)
768 {
769     static char expected_pem_header[80];
770
771     return
772         TEST_FL_int_gt(BIO_snprintf(expected_pem_header,
773                                  sizeof(expected_pem_header),
774                                  "-----BEGIN %s PRIVATE KEY-----", type), 0)
775         && TEST_FL_strn_eq(data, expected_pem_header, strlen(expected_pem_header))
776         && TEST_FL_ptr(strstr(data, "\nDEK-Info: "));
777 }
778
779 static int test_protected_via_legacy_PEM(const char *type, EVP_PKEY *key)
780 {
781     if (!default_libctx || is_fips)
782         return TEST_skip("Test not available if using a non-default library context or FIPS provider");
783
784     return test_encode_decode(__FILE__, __LINE__, type, key,
785                               OSSL_KEYMGMT_SELECT_KEYPAIR
786                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
787                               "PEM", "type-specific", pass, pass_cipher,
788                               encode_EVP_PKEY_legacy_PEM, decode_EVP_PKEY_prov,
789                               test_text, check_protected_legacy_PEM,
790                               dump_pem, 0);
791 }
792
793 #ifndef OPENSSL_NO_RC4
794 static int test_protected_via_PVK(const char *type, EVP_PKEY *key)
795 {
796     int ret = 0;
797     OSSL_PROVIDER *lgcyprov = OSSL_PROVIDER_load(testctx, "legacy");
798     if (lgcyprov == NULL)
799         return TEST_skip("Legacy provider not available");
800
801     ret = test_encode_decode(__FILE__, __LINE__, type, key,
802                               OSSL_KEYMGMT_SELECT_KEYPAIR
803                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
804                               "PVK", NULL, pass, NULL,
805                               encode_EVP_PKEY_PVK, decode_EVP_PKEY_prov,
806                               test_mem, check_PVK, dump_der, 0);
807     OSSL_PROVIDER_unload(lgcyprov);
808     return ret;
809 }
810 #endif
811
812 static int check_public_DER(const char *file, const int line,
813                             const char *type, const void *data, size_t data_len)
814 {
815     const unsigned char *datap = data;
816     EVP_PKEY *pkey = d2i_PUBKEY_ex(NULL, &datap, data_len, testctx, testpropq);
817     int ok = (TEST_FL_ptr(pkey) && TEST_FL_true(EVP_PKEY_is_a(pkey, type)));
818
819     EVP_PKEY_free(pkey);
820     return ok;
821 }
822
823 static int test_public_via_DER(const char *type, EVP_PKEY *key, int fips)
824 {
825     return test_encode_decode(__FILE__, __LINE__, type, key,
826                               OSSL_KEYMGMT_SELECT_PUBLIC_KEY
827                               | OSSL_KEYMGMT_SELECT_ALL_PARAMETERS,
828                               "DER", "SubjectPublicKeyInfo", NULL, NULL,
829                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
830                               test_mem, check_public_DER, dump_der,
831                               fips ? 0 : FLAG_FAIL_IF_FIPS);
832 }
833
834 static int check_public_PEM(const char *file, const int line,
835                             const char *type, const void *data, size_t data_len)
836 {
837     static const char expected_pem_header[] =
838         "-----BEGIN " PEM_STRING_PUBLIC "-----";
839
840     return
841         TEST_FL_strn_eq(data, expected_pem_header,
842                      sizeof(expected_pem_header) - 1);
843 }
844
845 static int test_public_via_PEM(const char *type, EVP_PKEY *key, int fips)
846 {
847     return test_encode_decode(__FILE__, __LINE__, type, key,
848                               OSSL_KEYMGMT_SELECT_PUBLIC_KEY
849                               | OSSL_KEYMGMT_SELECT_ALL_PARAMETERS,
850                               "PEM", "SubjectPublicKeyInfo", NULL, NULL,
851                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
852                               test_text, check_public_PEM, dump_pem,
853                               fips ? 0 : FLAG_FAIL_IF_FIPS);
854 }
855
856 static int check_public_MSBLOB(const char *file, const int line,
857                                const char *type,
858                                const void *data, size_t data_len)
859 {
860     const unsigned char *datap = data;
861     EVP_PKEY *pkey = b2i_PublicKey(&datap, data_len);
862     int ok = TEST_FL_ptr(pkey);
863
864     EVP_PKEY_free(pkey);
865     return ok;
866 }
867
868 static int test_public_via_MSBLOB(const char *type, EVP_PKEY *key)
869 {
870     return test_encode_decode(__FILE__, __LINE__, type, key, OSSL_KEYMGMT_SELECT_PUBLIC_KEY
871                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
872                               "MSBLOB", NULL, NULL, NULL,
873                               encode_EVP_PKEY_MSBLOB, decode_EVP_PKEY_prov,
874                               test_mem, check_public_MSBLOB, dump_der, 0);
875 }
876
877 #define KEYS(KEYTYPE)                           \
878     static EVP_PKEY *key_##KEYTYPE = NULL
879 #define MAKE_KEYS(KEYTYPE, KEYTYPEstr, params)                          \
880     ok = ok                                                             \
881         && TEST_ptr(key_##KEYTYPE = make_key(KEYTYPEstr, NULL, params))
882 #define FREE_KEYS(KEYTYPE)                                              \
883     EVP_PKEY_free(key_##KEYTYPE);                                       \
884
885 #define DOMAIN_KEYS(KEYTYPE)                    \
886     static EVP_PKEY *template_##KEYTYPE = NULL; \
887     static EVP_PKEY *key_##KEYTYPE = NULL
888 #define MAKE_DOMAIN_KEYS(KEYTYPE, KEYTYPEstr, params)                   \
889     ok = ok                                                             \
890         && TEST_ptr(template_##KEYTYPE =                                \
891                     make_template(KEYTYPEstr, params))                  \
892         && TEST_ptr(key_##KEYTYPE =                                     \
893                     make_key(KEYTYPEstr, template_##KEYTYPE, NULL))
894 #define FREE_DOMAIN_KEYS(KEYTYPE)                                       \
895     EVP_PKEY_free(template_##KEYTYPE);                                  \
896     EVP_PKEY_free(key_##KEYTYPE)
897
898 #define IMPLEMENT_TEST_SUITE(KEYTYPE, KEYTYPEstr, fips)                 \
899     static int test_unprotected_##KEYTYPE##_via_DER(void)               \
900     {                                                                   \
901         return test_unprotected_via_DER(KEYTYPEstr, key_##KEYTYPE, fips); \
902     }                                                                   \
903     static int test_unprotected_##KEYTYPE##_via_PEM(void)               \
904     {                                                                   \
905         return test_unprotected_via_PEM(KEYTYPEstr, key_##KEYTYPE, fips); \
906     }                                                                   \
907     static int test_protected_##KEYTYPE##_via_DER(void)                 \
908     {                                                                   \
909         return test_protected_via_DER(KEYTYPEstr, key_##KEYTYPE, fips); \
910     }                                                                   \
911     static int test_protected_##KEYTYPE##_via_PEM(void)                 \
912     {                                                                   \
913         return test_protected_via_PEM(KEYTYPEstr, key_##KEYTYPE, fips); \
914     }                                                                   \
915     static int test_public_##KEYTYPE##_via_DER(void)                    \
916     {                                                                   \
917         return test_public_via_DER(KEYTYPEstr, key_##KEYTYPE, fips);    \
918     }                                                                   \
919     static int test_public_##KEYTYPE##_via_PEM(void)                    \
920     {                                                                   \
921         return test_public_via_PEM(KEYTYPEstr, key_##KEYTYPE, fips);    \
922     }
923
924 #define ADD_TEST_SUITE(KEYTYPE)                                 \
925     ADD_TEST(test_unprotected_##KEYTYPE##_via_DER);             \
926     ADD_TEST(test_unprotected_##KEYTYPE##_via_PEM);             \
927     ADD_TEST(test_protected_##KEYTYPE##_via_DER);               \
928     ADD_TEST(test_protected_##KEYTYPE##_via_PEM);               \
929     ADD_TEST(test_public_##KEYTYPE##_via_DER);                  \
930     ADD_TEST(test_public_##KEYTYPE##_via_PEM)
931
932 #define IMPLEMENT_TEST_SUITE_PARAMS(KEYTYPE, KEYTYPEstr)           \
933     static int test_params_##KEYTYPE##_via_DER(void)               \
934     {                                                              \
935         return test_params_via_DER(KEYTYPEstr, key_##KEYTYPE);     \
936     }                                                              \
937     static int test_params_##KEYTYPE##_via_PEM(void)               \
938     {                                                              \
939         return test_params_via_PEM(KEYTYPEstr, key_##KEYTYPE);     \
940     }
941
942 #define ADD_TEST_SUITE_PARAMS(KEYTYPE)                          \
943     ADD_TEST(test_params_##KEYTYPE##_via_DER);                  \
944     ADD_TEST(test_params_##KEYTYPE##_via_PEM)
945
946 #define IMPLEMENT_TEST_SUITE_LEGACY(KEYTYPE, KEYTYPEstr)                \
947     static int test_unprotected_##KEYTYPE##_via_legacy_PEM(void)        \
948     {                                                                   \
949         return                                                          \
950             test_unprotected_via_legacy_PEM(KEYTYPEstr, key_##KEYTYPE); \
951     }                                                                   \
952     static int test_protected_##KEYTYPE##_via_legacy_PEM(void)          \
953     {                                                                   \
954         return                                                          \
955             test_protected_via_legacy_PEM(KEYTYPEstr, key_##KEYTYPE);   \
956     }
957
958 #define ADD_TEST_SUITE_LEGACY(KEYTYPE)                                  \
959     ADD_TEST(test_unprotected_##KEYTYPE##_via_legacy_PEM);              \
960     ADD_TEST(test_protected_##KEYTYPE##_via_legacy_PEM)
961
962 #define IMPLEMENT_TEST_SUITE_MSBLOB(KEYTYPE, KEYTYPEstr)                \
963     static int test_unprotected_##KEYTYPE##_via_MSBLOB(void)            \
964     {                                                                   \
965         return test_unprotected_via_MSBLOB(KEYTYPEstr, key_##KEYTYPE);  \
966     }                                                                   \
967     static int test_public_##KEYTYPE##_via_MSBLOB(void)                 \
968     {                                                                   \
969         return test_public_via_MSBLOB(KEYTYPEstr, key_##KEYTYPE);       \
970     }
971
972 #define ADD_TEST_SUITE_MSBLOB(KEYTYPE)                                  \
973     ADD_TEST(test_unprotected_##KEYTYPE##_via_MSBLOB);                  \
974     ADD_TEST(test_public_##KEYTYPE##_via_MSBLOB)
975
976 #define IMPLEMENT_TEST_SUITE_UNPROTECTED_PVK(KEYTYPE, KEYTYPEstr)       \
977     static int test_unprotected_##KEYTYPE##_via_PVK(void)               \
978     {                                                                   \
979         return test_unprotected_via_PVK(KEYTYPEstr, key_##KEYTYPE);     \
980     }
981 # define ADD_TEST_SUITE_UNPROTECTED_PVK(KEYTYPE)                        \
982     ADD_TEST(test_unprotected_##KEYTYPE##_via_PVK)
983 #ifndef OPENSSL_NO_RC4
984 # define IMPLEMENT_TEST_SUITE_PROTECTED_PVK(KEYTYPE, KEYTYPEstr)        \
985     static int test_protected_##KEYTYPE##_via_PVK(void)                 \
986     {                                                                   \
987         return test_protected_via_PVK(KEYTYPEstr, key_##KEYTYPE);       \
988     }
989 # define ADD_TEST_SUITE_PROTECTED_PVK(KEYTYPE)                          \
990     ADD_TEST(test_protected_##KEYTYPE##_via_PVK)
991 #endif
992
993 #ifndef OPENSSL_NO_DH
994 DOMAIN_KEYS(DH);
995 IMPLEMENT_TEST_SUITE(DH, "DH", 1)
996 IMPLEMENT_TEST_SUITE_PARAMS(DH, "DH")
997 DOMAIN_KEYS(DHX);
998 IMPLEMENT_TEST_SUITE(DHX, "X9.42 DH", 1)
999 IMPLEMENT_TEST_SUITE_PARAMS(DHX, "X9.42 DH")
1000 /*
1001  * DH has no support for PEM_write_bio_PrivateKey_traditional(),
1002  * so no legacy tests.
1003  */
1004 #endif
1005 #ifndef OPENSSL_NO_DSA
1006 DOMAIN_KEYS(DSA);
1007 IMPLEMENT_TEST_SUITE(DSA, "DSA", 1)
1008 IMPLEMENT_TEST_SUITE_PARAMS(DSA, "DSA")
1009 IMPLEMENT_TEST_SUITE_LEGACY(DSA, "DSA")
1010 IMPLEMENT_TEST_SUITE_MSBLOB(DSA, "DSA")
1011 IMPLEMENT_TEST_SUITE_UNPROTECTED_PVK(DSA, "DSA")
1012 # ifndef OPENSSL_NO_RC4
1013 IMPLEMENT_TEST_SUITE_PROTECTED_PVK(DSA, "DSA")
1014 # endif
1015 #endif
1016 #ifndef OPENSSL_NO_EC
1017 DOMAIN_KEYS(EC);
1018 IMPLEMENT_TEST_SUITE(EC, "EC", 1)
1019 IMPLEMENT_TEST_SUITE_PARAMS(EC, "EC")
1020 IMPLEMENT_TEST_SUITE_LEGACY(EC, "EC")
1021 DOMAIN_KEYS(ECExplicitPrimeNamedCurve);
1022 IMPLEMENT_TEST_SUITE(ECExplicitPrimeNamedCurve, "EC", 1)
1023 IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitPrimeNamedCurve, "EC")
1024 DOMAIN_KEYS(ECExplicitPrime2G);
1025 IMPLEMENT_TEST_SUITE(ECExplicitPrime2G, "EC", 0)
1026 IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitPrime2G, "EC")
1027 # ifndef OPENSSL_NO_EC2M
1028 DOMAIN_KEYS(ECExplicitTriNamedCurve);
1029 IMPLEMENT_TEST_SUITE(ECExplicitTriNamedCurve, "EC", 1)
1030 IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitTriNamedCurve, "EC")
1031 DOMAIN_KEYS(ECExplicitTri2G);
1032 IMPLEMENT_TEST_SUITE(ECExplicitTri2G, "EC", 0)
1033 IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitTri2G, "EC")
1034 # endif
1035 KEYS(ED25519);
1036 IMPLEMENT_TEST_SUITE(ED25519, "ED25519", 1)
1037 KEYS(ED448);
1038 IMPLEMENT_TEST_SUITE(ED448, "ED448", 1)
1039 KEYS(X25519);
1040 IMPLEMENT_TEST_SUITE(X25519, "X25519", 1)
1041 KEYS(X448);
1042 IMPLEMENT_TEST_SUITE(X448, "X448", 1)
1043 /*
1044  * ED25519, ED448, X25519 and X448 have no support for
1045  * PEM_write_bio_PrivateKey_traditional(), so no legacy tests.
1046  */
1047 #endif
1048 KEYS(RSA);
1049 IMPLEMENT_TEST_SUITE(RSA, "RSA", 1)
1050 IMPLEMENT_TEST_SUITE_LEGACY(RSA, "RSA")
1051 KEYS(RSA_PSS);
1052 IMPLEMENT_TEST_SUITE(RSA_PSS, "RSA-PSS", 1)
1053 /*
1054  * RSA-PSS has no support for PEM_write_bio_PrivateKey_traditional(),
1055  * so no legacy tests.
1056  */
1057 IMPLEMENT_TEST_SUITE_MSBLOB(RSA, "RSA")
1058 IMPLEMENT_TEST_SUITE_UNPROTECTED_PVK(RSA, "RSA")
1059 #ifndef OPENSSL_NO_RC4
1060 IMPLEMENT_TEST_SUITE_PROTECTED_PVK(RSA, "RSA")
1061 #endif
1062
1063 #ifndef OPENSSL_NO_EC
1064 /* Explicit parameters that match a named curve */
1065 static int do_create_ec_explicit_prime_params(OSSL_PARAM_BLD *bld,
1066                                               const unsigned char *gen,
1067                                               size_t gen_len)
1068 {
1069     BIGNUM *a, *b, *prime, *order;
1070
1071     /* Curve prime256v1 */
1072     static const unsigned char prime_data[] = {
1073         0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
1074         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1075         0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1076         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1077         0xff
1078     };
1079     static const unsigned char a_data[] = {
1080         0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
1081         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1082         0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1083         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1084         0xfc
1085     };
1086     static const unsigned char b_data[] = {
1087         0x5a, 0xc6, 0x35, 0xd8, 0xaa, 0x3a, 0x93, 0xe7,
1088         0xb3, 0xeb, 0xbd, 0x55, 0x76, 0x98, 0x86, 0xbc,
1089         0x65, 0x1d, 0x06, 0xb0, 0xcc, 0x53, 0xb0, 0xf6,
1090         0x3b, 0xce, 0x3c, 0x3e, 0x27, 0xd2, 0x60, 0x4b
1091     };
1092     static const unsigned char seed[] = {
1093         0xc4, 0x9d, 0x36, 0x08, 0x86, 0xe7, 0x04, 0x93,
1094         0x6a, 0x66, 0x78, 0xe1, 0x13, 0x9d, 0x26, 0xb7,
1095         0x81, 0x9f, 0x7e, 0x90
1096     };
1097     static const unsigned char order_data[] = {
1098         0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
1099         0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1100         0xff, 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17, 0x9e,
1101         0x84, 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x51
1102     };
1103     return TEST_ptr(a = BN_CTX_get(bnctx))
1104            && TEST_ptr(b = BN_CTX_get(bnctx))
1105            && TEST_ptr(prime = BN_CTX_get(bnctx))
1106            && TEST_ptr(order = BN_CTX_get(bnctx))
1107            && TEST_ptr(BN_bin2bn(prime_data, sizeof(prime_data), prime))
1108            && TEST_ptr(BN_bin2bn(a_data, sizeof(a_data), a))
1109            && TEST_ptr(BN_bin2bn(b_data, sizeof(b_data), b))
1110            && TEST_ptr(BN_bin2bn(order_data, sizeof(order_data), order))
1111            && TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
1112                             OSSL_PKEY_PARAM_EC_FIELD_TYPE, SN_X9_62_prime_field,
1113                             0))
1114            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_P, prime))
1115            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_A, a))
1116            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_B, b))
1117            && TEST_true(OSSL_PARAM_BLD_push_BN(bld,
1118                             OSSL_PKEY_PARAM_EC_ORDER, order))
1119            && TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
1120                             OSSL_PKEY_PARAM_EC_GENERATOR, gen, gen_len))
1121            && TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
1122                             OSSL_PKEY_PARAM_EC_SEED, seed, sizeof(seed)))
1123            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_COFACTOR,
1124                                                BN_value_one()));
1125 }
1126
1127 static int create_ec_explicit_prime_params_namedcurve(OSSL_PARAM_BLD *bld)
1128 {
1129     static const unsigned char prime256v1_gen[] = {
1130         0x04,
1131         0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47,
1132         0xf8, 0xbc, 0xe6, 0xe5, 0x63, 0xa4, 0x40, 0xf2,
1133         0x77, 0x03, 0x7d, 0x81, 0x2d, 0xeb, 0x33, 0xa0,
1134         0xf4, 0xa1, 0x39, 0x45, 0xd8, 0x98, 0xc2, 0x96,
1135         0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b,
1136         0x8e, 0xe7, 0xeb, 0x4a, 0x7c, 0x0f, 0x9e, 0x16,
1137         0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, 0x5e, 0xce,
1138         0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5
1139     };
1140     return do_create_ec_explicit_prime_params(bld, prime256v1_gen,
1141                                               sizeof(prime256v1_gen));
1142 }
1143
1144 static int create_ec_explicit_prime_params(OSSL_PARAM_BLD *bld)
1145 {
1146     /* 2G */
1147     static const unsigned char prime256v1_gen2[] = {
1148         0x04,
1149         0xe4, 0x97, 0x08, 0xbe, 0x7d, 0xfa, 0xa2, 0x9a,
1150         0xa3, 0x12, 0x6f, 0xe4, 0xe7, 0xd0, 0x25, 0xe3,
1151         0x4a, 0xc1, 0x03, 0x15, 0x8c, 0xd9, 0x33, 0xc6,
1152         0x97, 0x42, 0xf5, 0xdc, 0x97, 0xb9, 0xd7, 0x31,
1153         0xe9, 0x7d, 0x74, 0x3d, 0x67, 0x6a, 0x3b, 0x21,
1154         0x08, 0x9c, 0x31, 0x73, 0xf8, 0xc1, 0x27, 0xc9,
1155         0xd2, 0xa0, 0xa0, 0x83, 0x66, 0xe0, 0xc9, 0xda,
1156         0xa8, 0xc6, 0x56, 0x2b, 0x94, 0xb1, 0xae, 0x55
1157     };
1158     return do_create_ec_explicit_prime_params(bld, prime256v1_gen2,
1159                                               sizeof(prime256v1_gen2));
1160 }
1161
1162 # ifndef OPENSSL_NO_EC2M
1163 static int do_create_ec_explicit_trinomial_params(OSSL_PARAM_BLD *bld,
1164                                                   const unsigned char *gen,
1165                                                   size_t gen_len)
1166 {
1167     BIGNUM *a, *b, *poly, *order, *cofactor;
1168     /* sect233k1 characteristic-two-field tpBasis */
1169     static const unsigned char poly_data[] = {
1170         0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1171         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1172         0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1173     };
1174     static const unsigned char a_data[] = {
1175         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1176         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1177         0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1178     };
1179     static const unsigned char b_data[] = {
1180         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1181         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1182         0x00, 0x00, 0x00, 0x00, 0x00, 0x01
1183     };
1184     static const unsigned char order_data[] = {
1185         0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1186         0x00, 0x00, 0x00, 0x06, 0x9D, 0x5B, 0xB9, 0x15, 0xBC, 0xD4, 0x6E, 0xFB,
1187         0x1A, 0xD5, 0xF1, 0x73, 0xAB, 0xDF
1188     };
1189     static const unsigned char cofactor_data[]= {
1190         0x4
1191     };
1192     return TEST_ptr(a = BN_CTX_get(bnctx))
1193            && TEST_ptr(b = BN_CTX_get(bnctx))
1194            && TEST_ptr(poly = BN_CTX_get(bnctx))
1195            && TEST_ptr(order = BN_CTX_get(bnctx))
1196            && TEST_ptr(cofactor = BN_CTX_get(bnctx))
1197            && TEST_ptr(BN_bin2bn(poly_data, sizeof(poly_data), poly))
1198            && TEST_ptr(BN_bin2bn(a_data, sizeof(a_data), a))
1199            && TEST_ptr(BN_bin2bn(b_data, sizeof(b_data), b))
1200            && TEST_ptr(BN_bin2bn(order_data, sizeof(order_data), order))
1201            && TEST_ptr(BN_bin2bn(cofactor_data, sizeof(cofactor_data), cofactor))
1202            && TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
1203                             OSSL_PKEY_PARAM_EC_FIELD_TYPE,
1204                             SN_X9_62_characteristic_two_field, 0))
1205            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_P, poly))
1206            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_A, a))
1207            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_B, b))
1208            && TEST_true(OSSL_PARAM_BLD_push_BN(bld,
1209                             OSSL_PKEY_PARAM_EC_ORDER, order))
1210            && TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
1211                             OSSL_PKEY_PARAM_EC_GENERATOR, gen, gen_len))
1212            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_COFACTOR,
1213                                                cofactor));
1214 }
1215
1216 static int create_ec_explicit_trinomial_params_namedcurve(OSSL_PARAM_BLD *bld)
1217 {
1218     static const unsigned char gen[] = {
1219         0x04,
1220         0x01, 0x72, 0x32, 0xBA, 0x85, 0x3A, 0x7E, 0x73, 0x1A, 0xF1, 0x29, 0xF2,
1221         0x2F, 0xF4, 0x14, 0x95, 0x63, 0xA4, 0x19, 0xC2, 0x6B, 0xF5, 0x0A, 0x4C,
1222         0x9D, 0x6E, 0xEF, 0xAD, 0x61, 0x26,
1223         0x01, 0xDB, 0x53, 0x7D, 0xEC, 0xE8, 0x19, 0xB7, 0xF7, 0x0F, 0x55, 0x5A,
1224         0x67, 0xC4, 0x27, 0xA8, 0xCD, 0x9B, 0xF1, 0x8A, 0xEB, 0x9B, 0x56, 0xE0,
1225         0xC1, 0x10, 0x56, 0xFA, 0xE6, 0xA3
1226     };
1227     return do_create_ec_explicit_trinomial_params(bld, gen, sizeof(gen));
1228 }
1229
1230 static int create_ec_explicit_trinomial_params(OSSL_PARAM_BLD *bld)
1231 {
1232     static const unsigned char gen2[] = {
1233         0x04,
1234         0x00, 0xd7, 0xba, 0xd0, 0x26, 0x6c, 0x31, 0x6a, 0x78, 0x76, 0x01, 0xd1,
1235         0x32, 0x4b, 0x8f, 0x30, 0x29, 0x2d, 0x78, 0x30, 0xca, 0x43, 0xaa, 0xf0,
1236         0xa2, 0x5a, 0xd4, 0x0f, 0xb3, 0xf4,
1237         0x00, 0x85, 0x4b, 0x1b, 0x8d, 0x50, 0x10, 0xa5, 0x1c, 0x80, 0xf7, 0x86,
1238         0x40, 0x62, 0x4c, 0x87, 0xd1, 0x26, 0x7a, 0x9c, 0x5c, 0xe9, 0x82, 0x29,
1239         0xd1, 0x67, 0x70, 0x41, 0xea, 0xcb
1240     };
1241     return do_create_ec_explicit_trinomial_params(bld, gen2, sizeof(gen2));
1242 }
1243 # endif /* OPENSSL_NO_EC2M */
1244 #endif /* OPENSSL_NO_EC */
1245
1246 typedef enum OPTION_choice {
1247     OPT_ERR = -1,
1248     OPT_EOF = 0,
1249     OPT_CONTEXT,
1250     OPT_RSA_FILE,
1251     OPT_RSA_PSS_FILE,
1252     OPT_CONFIG_FILE,
1253     OPT_PROVIDER_NAME,
1254     OPT_TEST_ENUM
1255 } OPTION_CHOICE;
1256
1257 const OPTIONS *test_get_options(void)
1258 {
1259     static const OPTIONS options[] = {
1260         OPT_TEST_OPTIONS_DEFAULT_USAGE,
1261         { "context", OPT_CONTEXT, '-',
1262           "Explicitly use a non-default library context" },
1263         { "rsa", OPT_RSA_FILE, '<',
1264           "PEM format RSA key file to encode/decode" },
1265         { "pss", OPT_RSA_PSS_FILE, '<',
1266           "PEM format RSA-PSS key file to encode/decode" },
1267         { "config", OPT_CONFIG_FILE, '<',
1268           "The configuration file to use for the library context" },
1269         { "provider", OPT_PROVIDER_NAME, 's',
1270           "The provider to load (The default value is 'default')" },
1271         { NULL }
1272     };
1273     return options;
1274 }
1275
1276 int setup_tests(void)
1277 {
1278     const char *rsa_file = NULL;
1279     const char *rsa_pss_file = NULL;
1280     const char *prov_name = "default";
1281     char *config_file = NULL;
1282     int ok = 1;
1283
1284 #ifndef OPENSSL_NO_DSA
1285     static size_t qbits = 160;  /* PVK only tolerates 160 Q bits */
1286     static size_t pbits = 1024; /* With 160 Q bits, we MUST use 1024 P bits */
1287     OSSL_PARAM DSA_params[] = {
1288         OSSL_PARAM_size_t("pbits", &pbits),
1289         OSSL_PARAM_size_t("qbits", &qbits),
1290         OSSL_PARAM_END
1291     };
1292 #endif
1293
1294 #ifndef OPENSSL_NO_EC
1295     static char groupname[] = "prime256v1";
1296     OSSL_PARAM EC_params[] = {
1297         OSSL_PARAM_utf8_string("group", groupname, sizeof(groupname) - 1),
1298         OSSL_PARAM_END
1299     };
1300 #endif
1301
1302     OPTION_CHOICE o;
1303
1304     while ((o = opt_next()) != OPT_EOF) {
1305         switch (o) {
1306         case OPT_CONTEXT:
1307             default_libctx = 0;
1308             break;
1309         case OPT_PROVIDER_NAME:
1310             prov_name = opt_arg();
1311             break;
1312         case OPT_CONFIG_FILE:
1313             config_file = opt_arg();
1314             break;
1315         case OPT_RSA_FILE:
1316             rsa_file = opt_arg();
1317             break;
1318         case OPT_RSA_PSS_FILE:
1319             rsa_pss_file = opt_arg();
1320             break;
1321         case OPT_TEST_CASES:
1322             break;
1323         default:
1324             return 0;
1325         }
1326     }
1327
1328     if (strcmp(prov_name, "fips") == 0)
1329         is_fips = 1;
1330
1331     if (default_libctx) {
1332         if (!test_get_libctx(NULL, NULL, config_file, &deflprov, prov_name))
1333             return 0;
1334     } else {
1335         if (!test_get_libctx(&testctx, &nullprov, config_file, &deflprov, prov_name))
1336             return 0;
1337     }
1338
1339     /* FIPS(3.0.0): provider imports explicit params but they won't work #17998 */
1340     is_fips_3_0_0 = fips_provider_version_eq(testctx, 3, 0, 0);
1341     if (is_fips_3_0_0 < 0)
1342         return 0;
1343
1344 #ifdef STATIC_LEGACY
1345     /*
1346      * This test is always statically linked against libcrypto. We must not
1347      * attempt to load legacy.so that might be dynamically linked against
1348      * libcrypto. Instead we use a built-in version of the legacy provider.
1349      */
1350     if (!OSSL_PROVIDER_add_builtin(testctx, "legacy", ossl_legacy_provider_init))
1351         return 0;
1352 #endif
1353
1354     /* Separate provider/ctx for generating the test data */
1355     if (!TEST_ptr(keyctx = OSSL_LIB_CTX_new()))
1356         return 0;
1357     if (!TEST_ptr(keyprov = OSSL_PROVIDER_load(keyctx, "default")))
1358         return 0;
1359
1360 #ifndef OPENSSL_NO_EC
1361     if (!TEST_ptr(bnctx = BN_CTX_new_ex(testctx))
1362         || !TEST_ptr(bld_prime_nc = OSSL_PARAM_BLD_new())
1363         || !TEST_ptr(bld_prime = OSSL_PARAM_BLD_new())
1364         || !create_ec_explicit_prime_params_namedcurve(bld_prime_nc)
1365         || !create_ec_explicit_prime_params(bld_prime)
1366         || !TEST_ptr(ec_explicit_prime_params_nc = OSSL_PARAM_BLD_to_param(bld_prime_nc))
1367         || !TEST_ptr(ec_explicit_prime_params_explicit = OSSL_PARAM_BLD_to_param(bld_prime))
1368 # ifndef OPENSSL_NO_EC2M
1369         || !TEST_ptr(bld_tri_nc = OSSL_PARAM_BLD_new())
1370         || !TEST_ptr(bld_tri = OSSL_PARAM_BLD_new())
1371         || !create_ec_explicit_trinomial_params_namedcurve(bld_tri_nc)
1372         || !create_ec_explicit_trinomial_params(bld_tri)
1373         || !TEST_ptr(ec_explicit_tri_params_nc = OSSL_PARAM_BLD_to_param(bld_tri_nc))
1374         || !TEST_ptr(ec_explicit_tri_params_explicit = OSSL_PARAM_BLD_to_param(bld_tri))
1375 # endif
1376         )
1377         return 0;
1378 #endif
1379
1380     TEST_info("Generating keys...");
1381
1382 #ifndef OPENSSL_NO_DH
1383     TEST_info("Generating DH keys...");
1384     MAKE_DOMAIN_KEYS(DH, "DH", NULL);
1385     MAKE_DOMAIN_KEYS(DHX, "X9.42 DH", NULL);
1386 #endif
1387 #ifndef OPENSSL_NO_DSA
1388     TEST_info("Generating DSA keys...");
1389     MAKE_DOMAIN_KEYS(DSA, "DSA", DSA_params);
1390 #endif
1391 #ifndef OPENSSL_NO_EC
1392     TEST_info("Generating EC keys...");
1393     MAKE_DOMAIN_KEYS(EC, "EC", EC_params);
1394     MAKE_DOMAIN_KEYS(ECExplicitPrimeNamedCurve, "EC", ec_explicit_prime_params_nc);
1395     MAKE_DOMAIN_KEYS(ECExplicitPrime2G, "EC", ec_explicit_prime_params_explicit);
1396 # ifndef OPENSSL_NO_EC2M
1397     MAKE_DOMAIN_KEYS(ECExplicitTriNamedCurve, "EC", ec_explicit_tri_params_nc);
1398     MAKE_DOMAIN_KEYS(ECExplicitTri2G, "EC", ec_explicit_tri_params_explicit);
1399 # endif
1400     MAKE_KEYS(ED25519, "ED25519", NULL);
1401     MAKE_KEYS(ED448, "ED448", NULL);
1402     MAKE_KEYS(X25519, "X25519", NULL);
1403     MAKE_KEYS(X448, "X448", NULL);
1404 #endif
1405     TEST_info("Loading RSA key...");
1406     ok = ok && TEST_ptr(key_RSA = load_pkey_pem(rsa_file, keyctx));
1407     TEST_info("Loading RSA_PSS key...");
1408     ok = ok && TEST_ptr(key_RSA_PSS = load_pkey_pem(rsa_pss_file, keyctx));
1409     TEST_info("Generating keys done");
1410
1411     if (ok) {
1412 #ifndef OPENSSL_NO_DH
1413         ADD_TEST_SUITE(DH);
1414         ADD_TEST_SUITE_PARAMS(DH);
1415         ADD_TEST_SUITE(DHX);
1416         ADD_TEST_SUITE_PARAMS(DHX);
1417         /*
1418          * DH has no support for PEM_write_bio_PrivateKey_traditional(),
1419          * so no legacy tests.
1420          */
1421 #endif
1422 #ifndef OPENSSL_NO_DSA
1423         ADD_TEST_SUITE(DSA);
1424         ADD_TEST_SUITE_PARAMS(DSA);
1425         ADD_TEST_SUITE_LEGACY(DSA);
1426         ADD_TEST_SUITE_MSBLOB(DSA);
1427         ADD_TEST_SUITE_UNPROTECTED_PVK(DSA);
1428 # ifndef OPENSSL_NO_RC4
1429         ADD_TEST_SUITE_PROTECTED_PVK(DSA);
1430 # endif
1431 #endif
1432 #ifndef OPENSSL_NO_EC
1433         ADD_TEST_SUITE(EC);
1434         ADD_TEST_SUITE_PARAMS(EC);
1435         ADD_TEST_SUITE_LEGACY(EC);
1436         ADD_TEST_SUITE(ECExplicitPrimeNamedCurve);
1437         ADD_TEST_SUITE_LEGACY(ECExplicitPrimeNamedCurve);
1438         ADD_TEST_SUITE(ECExplicitPrime2G);
1439         ADD_TEST_SUITE_LEGACY(ECExplicitPrime2G);
1440 # ifndef OPENSSL_NO_EC2M
1441         ADD_TEST_SUITE(ECExplicitTriNamedCurve);
1442         ADD_TEST_SUITE_LEGACY(ECExplicitTriNamedCurve);
1443         ADD_TEST_SUITE(ECExplicitTri2G);
1444         ADD_TEST_SUITE_LEGACY(ECExplicitTri2G);
1445 # endif
1446         ADD_TEST_SUITE(ED25519);
1447         ADD_TEST_SUITE(ED448);
1448         ADD_TEST_SUITE(X25519);
1449         ADD_TEST_SUITE(X448);
1450         /*
1451          * ED25519, ED448, X25519 and X448 have no support for
1452          * PEM_write_bio_PrivateKey_traditional(), so no legacy tests.
1453          */
1454 #endif
1455         ADD_TEST_SUITE(RSA);
1456         ADD_TEST_SUITE_LEGACY(RSA);
1457         ADD_TEST_SUITE(RSA_PSS);
1458         /*
1459          * RSA-PSS has no support for PEM_write_bio_PrivateKey_traditional(),
1460          * so no legacy tests.
1461          */
1462         ADD_TEST_SUITE_MSBLOB(RSA);
1463         ADD_TEST_SUITE_UNPROTECTED_PVK(RSA);
1464 # ifndef OPENSSL_NO_RC4
1465         ADD_TEST_SUITE_PROTECTED_PVK(RSA);
1466 # endif
1467     }
1468
1469     return 1;
1470 }
1471
1472 void cleanup_tests(void)
1473 {
1474 #ifndef OPENSSL_NO_EC
1475     OSSL_PARAM_free(ec_explicit_prime_params_nc);
1476     OSSL_PARAM_free(ec_explicit_prime_params_explicit);
1477     OSSL_PARAM_BLD_free(bld_prime_nc);
1478     OSSL_PARAM_BLD_free(bld_prime);
1479 # ifndef OPENSSL_NO_EC2M
1480     OSSL_PARAM_free(ec_explicit_tri_params_nc);
1481     OSSL_PARAM_free(ec_explicit_tri_params_explicit);
1482     OSSL_PARAM_BLD_free(bld_tri_nc);
1483     OSSL_PARAM_BLD_free(bld_tri);
1484 # endif
1485     BN_CTX_free(bnctx);
1486 #endif /* OPENSSL_NO_EC */
1487
1488 #ifndef OPENSSL_NO_DH
1489     FREE_DOMAIN_KEYS(DH);
1490     FREE_DOMAIN_KEYS(DHX);
1491 #endif
1492 #ifndef OPENSSL_NO_DSA
1493     FREE_DOMAIN_KEYS(DSA);
1494 #endif
1495 #ifndef OPENSSL_NO_EC
1496     FREE_DOMAIN_KEYS(EC);
1497     FREE_DOMAIN_KEYS(ECExplicitPrimeNamedCurve);
1498     FREE_DOMAIN_KEYS(ECExplicitPrime2G);
1499 # ifndef OPENSSL_NO_EC2M
1500     FREE_DOMAIN_KEYS(ECExplicitTriNamedCurve);
1501     FREE_DOMAIN_KEYS(ECExplicitTri2G);
1502 # endif
1503     FREE_KEYS(ED25519);
1504     FREE_KEYS(ED448);
1505     FREE_KEYS(X25519);
1506     FREE_KEYS(X448);
1507 #endif
1508     FREE_KEYS(RSA);
1509     FREE_KEYS(RSA_PSS);
1510
1511     OSSL_PROVIDER_unload(nullprov);
1512     OSSL_PROVIDER_unload(deflprov);
1513     OSSL_PROVIDER_unload(keyprov);
1514     OSSL_LIB_CTX_free(testctx);
1515     OSSL_LIB_CTX_free(keyctx);
1516 }