DECODER: Allow precise result type for OSSL_DECODER_CTX_new_by_EVP_PKEY()
[openssl.git] / test / endecode_test.c
1 /*
2  * Copyright 2020 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/pem.h"        /* For PVK and "blob" PEM headers */
23 #include "internal/cryptlib.h"   /* ossl_assert */
24
25 #include "testutil.h"
26
27 #ifndef OPENSSL_NO_EC
28 static BN_CTX *bnctx = NULL;
29 static OSSL_PARAM_BLD *bld_prime_nc = NULL;
30 static OSSL_PARAM_BLD *bld_prime = NULL;
31 static OSSL_PARAM *ec_explicit_prime_params_nc = NULL;
32 static OSSL_PARAM *ec_explicit_prime_params_explicit = NULL;
33
34 # ifndef OPENSSL_NO_EC2M
35 static OSSL_PARAM_BLD *bld_tri_nc = NULL;
36 static OSSL_PARAM_BLD *bld_tri = NULL;
37 static OSSL_PARAM *ec_explicit_tri_params_nc = NULL;
38 static OSSL_PARAM *ec_explicit_tri_params_explicit = NULL;
39 # endif
40 #endif
41
42 static EVP_PKEY *make_template(const char *type, OSSL_PARAM *genparams)
43 {
44     EVP_PKEY *pkey = NULL;
45     EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_name(NULL, type, NULL);
46
47     /*
48      * No real need to check the errors other than for the cascade
49      * effect.  |pkey| will simply remain NULL if something goes wrong.
50      */
51     (void)(ctx != NULL
52            && EVP_PKEY_paramgen_init(ctx) > 0
53            && (genparams == NULL
54                || EVP_PKEY_CTX_set_params(ctx, genparams) > 0)
55            && EVP_PKEY_gen(ctx, &pkey) > 0);
56     EVP_PKEY_CTX_free(ctx);
57
58     return pkey;
59 }
60
61 static EVP_PKEY *make_key(const char *type, EVP_PKEY *template,
62                           OSSL_PARAM *genparams)
63 {
64     EVP_PKEY *pkey = NULL;
65     EVP_PKEY_CTX *ctx =
66         template != NULL
67         ? EVP_PKEY_CTX_new(template, NULL)
68         : EVP_PKEY_CTX_new_from_name(NULL, type, NULL);
69
70     /*
71      * No real need to check the errors other than for the cascade
72      * effect.  |pkey| will simply remain NULL if something goes wrong.
73      */
74     (void)(ctx != NULL
75            && EVP_PKEY_keygen_init(ctx) > 0
76            && (genparams == NULL
77                || EVP_PKEY_CTX_set_params(ctx, genparams) > 0)
78            && EVP_PKEY_keygen(ctx, &pkey) > 0);
79     EVP_PKEY_CTX_free(ctx);
80     return pkey;
81 }
82
83 /* Main test driver */
84
85 /*
86  * TODO(3.0) For better error output, changed the callbacks to take __FILE__
87  * and __LINE__ as first two arguments, and have them use the lower case
88  * functions, such as test_strn_eq(), rather than the uppercase macros
89  * (TEST_strn2_eq(), for example).
90  */
91
92 typedef int (encoder)(void **encoded, long *encoded_len, void *object,
93                       const char *output_type, int selection,
94                       const char *pass, const char *pcipher);
95 typedef int (decoder)(void **object, void *encoded, long encoded_len,
96                       const char *pass);
97 typedef int (tester)(const void *data1, size_t data1_len,
98                      const void *data2, size_t data2_len);
99 typedef int (checker)(const char *type, const void *data, size_t data_len);
100 typedef void (dumper)(const char *label, const void *data, size_t data_len);
101
102 static int test_encode_decode(const char *type, EVP_PKEY *pkey,
103                               const char *output_type, int selection,
104                               const char *pass, const char *pcipher,
105                               encoder *encode_cb, decoder *decode_cb,
106                               tester *test_cb, checker *check_cb,
107                               dumper *dump_cb)
108 {
109     void *encoded = NULL;
110     long encoded_len = 0;
111     EVP_PKEY *pkey2 = NULL;
112     void *encoded2 = NULL;
113     long encoded2_len = 0;
114     int ok = 0;
115
116     /*
117      * Encode |pkey|, decode the result into |pkey2|, and finish off by
118      * encoding |pkey2| as well.  That last encoding is for checking and
119      * dumping purposes.
120      */
121     if (!encode_cb(&encoded, &encoded_len, pkey, output_type, selection,
122                    pass, pcipher)
123         || !check_cb(type, encoded, encoded_len)
124         || !decode_cb((void **)&pkey2, encoded, encoded_len, pass)
125         || !encode_cb(&encoded2, &encoded2_len, pkey2, output_type, selection,
126                       pass, pcipher))
127         goto end;
128
129     if (!TEST_int_eq(EVP_PKEY_eq(pkey, pkey2), 1))
130         goto end;
131
132     /*
133      * Double check the encoding, but only for unprotected keys,
134      * as protected keys have a random component, which makes the output
135      * differ.
136      */
137     if ((pass == NULL && pcipher == NULL)
138         && !test_cb(encoded, encoded_len, encoded2, encoded2_len))
139         goto end;
140
141     ok = 1;
142  end:
143     if (!ok) {
144         if (encoded != NULL && encoded_len != 0)
145             dump_cb("|pkey| encoded", encoded, encoded_len);
146         if (encoded2 != NULL && encoded2_len != 0)
147             dump_cb("|pkey2| encoded", encoded2, encoded2_len);
148     }
149
150     OPENSSL_free(encoded);
151     OPENSSL_free(encoded2);
152     EVP_PKEY_free(pkey2);
153     return ok;
154 }
155
156 /* Encoding and desencoding methods */
157
158 static int encode_EVP_PKEY_prov(void **encoded, long *encoded_len,
159                                 void *object,
160                                 const char *output_type, int selection,
161                                 const char *pass, const char *pcipher)
162 {
163     EVP_PKEY *pkey = object;
164     OSSL_ENCODER_CTX *ectx = NULL;
165     BIO *mem_ser = NULL;
166     BUF_MEM *mem_buf = NULL;
167     const unsigned char *upass = (const unsigned char *)pass;
168     int ok = 0;
169
170     if (!TEST_ptr(ectx = OSSL_ENCODER_CTX_new_by_EVP_PKEY(pkey, output_type,
171                                                           selection,
172                                                           NULL, NULL))
173         || (pass != NULL
174             && !TEST_true(OSSL_ENCODER_CTX_set_passphrase(ectx, upass,
175                                                           strlen(pass))))
176         || (pcipher != NULL
177             && !TEST_true(OSSL_ENCODER_CTX_set_cipher(ectx, pcipher, NULL)))
178         || !TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
179         || !TEST_true(OSSL_ENCODER_to_bio(ectx, mem_ser))
180         || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
181         || !TEST_ptr(*encoded = mem_buf->data)
182         || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
183         goto end;
184
185     /* Detach the encoded output */
186     mem_buf->data = NULL;
187     mem_buf->length = 0;
188     ok = 1;
189  end:
190     BIO_free(mem_ser);
191     OSSL_ENCODER_CTX_free(ectx);
192     return ok;
193 }
194
195 static int decode_EVP_PKEY_prov(void **object, void *encoded, long encoded_len,
196                                 const char *pass)
197 {
198     EVP_PKEY *pkey = NULL;
199     OSSL_DECODER_CTX *dctx = NULL;
200     BIO *mem_deser = NULL;
201     const unsigned char *upass = (const unsigned char *)pass;
202     int ok = 0;
203
204     if (!TEST_ptr(dctx = OSSL_DECODER_CTX_new_by_EVP_PKEY(&pkey, NULL, NULL,
205                                                           NULL, NULL))
206         || (pass != NULL
207             && !OSSL_DECODER_CTX_set_passphrase(dctx, upass, strlen(pass)))
208         || !TEST_ptr(mem_deser = BIO_new_mem_buf(encoded, encoded_len))
209         || !TEST_true(OSSL_DECODER_from_bio(dctx, mem_deser)))
210         goto end;
211     ok = 1;
212     *object = pkey;
213  end:
214     BIO_free(mem_deser);
215     OSSL_DECODER_CTX_free(dctx);
216     return ok;
217 }
218
219 static int encode_EVP_PKEY_legacy_PEM(void **encoded, long *encoded_len,
220                                       void *object,
221                                       const char *output_type, int selection,
222                                       const char *pass, const char *pcipher)
223 {
224     EVP_PKEY *pkey = object;
225     EVP_CIPHER *cipher = NULL;
226     BIO *mem_ser = NULL;
227     BUF_MEM *mem_buf = NULL;
228     const unsigned char *upass = (const unsigned char *)pass;
229     size_t passlen = 0;
230     int ok = 0;
231
232     if (pcipher != NULL && pass != NULL) {
233         passlen = strlen(pass);
234         if (!TEST_ptr(cipher = EVP_CIPHER_fetch(NULL, pcipher, NULL)))
235             goto end;
236     }
237     if (!TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
238         || !TEST_true(PEM_write_bio_PrivateKey_traditional(mem_ser, pkey,
239                                                            cipher,
240                                                            upass, passlen,
241                                                            NULL, NULL))
242         || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
243         || !TEST_ptr(*encoded = mem_buf->data)
244         || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
245         goto end;
246
247     /* Detach the encoded output */
248     mem_buf->data = NULL;
249     mem_buf->length = 0;
250     ok = 1;
251  end:
252     BIO_free(mem_ser);
253     EVP_CIPHER_free(cipher);
254     return ok;
255 }
256
257 #ifndef OPENSSL_NO_DSA
258 static int encode_EVP_PKEY_MSBLOB(void **encoded, long *encoded_len,
259                                   void *object,
260                                   ossl_unused const char *output_type,
261                                   ossl_unused int selection,
262                                   ossl_unused const char *pass,
263                                   ossl_unused const char *pcipher)
264 {
265     EVP_PKEY *pkey = object;
266     BIO *mem_ser = NULL;
267     BUF_MEM *mem_buf = NULL;
268     int ok = 0;
269
270     if (!TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
271         || !TEST_int_ge(i2b_PrivateKey_bio(mem_ser, pkey), 0)
272         || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
273         || !TEST_ptr(*encoded = mem_buf->data)
274         || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
275         goto end;
276
277     /* Detach the encoded output */
278     mem_buf->data = NULL;
279     mem_buf->length = 0;
280     ok = 1;
281  end:
282     BIO_free(mem_ser);
283     return ok;
284 }
285
286 static int encode_public_EVP_PKEY_MSBLOB(void **encoded,
287                                          long *encoded_len,
288                                          void *object,
289                                          ossl_unused const char *output_type,
290                                          ossl_unused int selection,
291                                          ossl_unused const char *pass,
292                                          ossl_unused const char *pcipher)
293 {
294     EVP_PKEY *pkey = object;
295     BIO *mem_ser = NULL;
296     BUF_MEM *mem_buf = NULL;
297     int ok = 0;
298
299     if (!TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
300         || !TEST_int_ge(i2b_PublicKey_bio(mem_ser, pkey), 0)
301         || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
302         || !TEST_ptr(*encoded = mem_buf->data)
303         || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
304         goto end;
305
306     /* Detach the encoded output */
307     mem_buf->data = NULL;
308     mem_buf->length = 0;
309     ok = 1;
310  end:
311     BIO_free(mem_ser);
312     return ok;
313 }
314
315 # ifndef OPENSSL_NO_RC4
316 static pem_password_cb pass_pw;
317 static int pass_pw(char *buf, int size, int rwflag, void *userdata)
318 {
319     OPENSSL_strlcpy(buf, userdata, size);
320     return strlen(userdata);
321 }
322
323 static int encode_EVP_PKEY_PVK(void **encoded, long *encoded_len,
324                                void *object,
325                                ossl_unused const char *output_type,
326                                ossl_unused int selection,
327                                const char *pass,
328                                ossl_unused const char *pcipher)
329 {
330     EVP_PKEY *pkey = object;
331     BIO *mem_ser = NULL;
332     BUF_MEM *mem_buf = NULL;
333     int enc = (pass != NULL);
334     int ok = 0;
335
336     if (!TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
337         || !TEST_int_ge(i2b_PVK_bio(mem_ser, pkey, enc,
338                                     pass_pw, (void *)pass), 0)
339         || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
340         || !TEST_ptr(*encoded = mem_buf->data)
341         || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
342         goto end;
343
344     /* Detach the encoded output */
345     mem_buf->data = NULL;
346     mem_buf->length = 0;
347     ok = 1;
348  end:
349     BIO_free(mem_ser);
350     return ok;
351 }
352 # endif
353 #endif
354
355 static int test_text(const void *data1, size_t data1_len,
356                      const void *data2, size_t data2_len)
357 {
358     return TEST_strn2_eq(data1, data1_len, data2, data2_len);
359 }
360
361 static int test_mem(const void *data1, size_t data1_len,
362                     const void *data2, size_t data2_len)
363 {
364     return TEST_mem_eq(data1, data1_len, data2, data2_len);
365 }
366
367 /* Test cases and their dumpers / checkers */
368
369 static void collect_name(const char *name, void *arg)
370 {
371     char **namelist = arg;
372     char *new_namelist;
373     size_t space;
374
375     space = strlen(name);
376     if (*namelist != NULL)
377         space += strlen(*namelist) + 2 /* for comma and space */;
378     space++; /* for terminating null byte */
379
380     new_namelist = OPENSSL_realloc(*namelist, space);
381     if (new_namelist == NULL)
382         return;
383     if (*namelist != NULL) {
384         strcat(new_namelist, ", ");
385         strcat(new_namelist, name);
386     } else {
387         strcpy(new_namelist, name);
388     }
389     *namelist = new_namelist;
390 }
391
392 static void dump_der(const char *label, const void *data, size_t data_len)
393 {
394     test_output_memory(label, data, data_len);
395 }
396
397 static void dump_pem(const char *label, const void *data, size_t data_len)
398 {
399     test_output_string(label, data, data_len - 1);
400 }
401
402 static int check_unprotected_PKCS8_DER(const char *type,
403                                        const void *data, size_t data_len)
404 {
405     const unsigned char *datap = data;
406     PKCS8_PRIV_KEY_INFO *p8inf =
407         d2i_PKCS8_PRIV_KEY_INFO(NULL, &datap, data_len);
408     int ok = 0;
409
410     if (TEST_ptr(p8inf)) {
411         EVP_PKEY *pkey = EVP_PKCS82PKEY(p8inf);
412         char *namelist = NULL;
413
414         if (TEST_ptr(pkey)) {
415             if (!(ok = TEST_true(EVP_PKEY_is_a(pkey, type)))) {
416                 EVP_PKEY_typenames_do_all(pkey, collect_name, &namelist);
417                 if (namelist != NULL)
418                     TEST_note("%s isn't any of %s", type, namelist);
419                 OPENSSL_free(namelist);
420             }
421             EVP_PKEY_free(pkey);
422         }
423     }
424     PKCS8_PRIV_KEY_INFO_free(p8inf);
425     return ok;
426 }
427
428 static int test_unprotected_via_DER(const char *type, EVP_PKEY *key)
429 {
430     return test_encode_decode(type, key,
431                               "DER", OSSL_KEYMGMT_SELECT_KEYPAIR
432                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
433                               NULL, NULL,
434                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
435                               test_mem, check_unprotected_PKCS8_DER,
436                               dump_der);
437 }
438
439 static int check_unprotected_PKCS8_PEM(const char *type,
440                                        const void *data, size_t data_len)
441 {
442     static const char expected_pem_header[] =
443         "-----BEGIN " PEM_STRING_PKCS8INF "-----";
444
445     return TEST_strn_eq(data, expected_pem_header,
446                         sizeof(expected_pem_header) - 1);
447 }
448
449 static int test_unprotected_via_PEM(const char *type, EVP_PKEY *key)
450 {
451     return test_encode_decode(type, key,
452                               "PEM", OSSL_KEYMGMT_SELECT_KEYPAIR
453                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
454                               NULL, NULL,
455                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
456                               test_text, check_unprotected_PKCS8_PEM,
457                               dump_pem);
458 }
459
460 static int check_unprotected_legacy_PEM(const char *type,
461                                         const void *data, size_t data_len)
462 {
463     static char expected_pem_header[80];
464
465     return
466         TEST_int_gt(BIO_snprintf(expected_pem_header,
467                                  sizeof(expected_pem_header),
468                                  "-----BEGIN %s PRIVATE KEY-----", type), 0)
469         && TEST_strn_eq(data, expected_pem_header, strlen(expected_pem_header));
470 }
471
472 static int test_unprotected_via_legacy_PEM(const char *type, EVP_PKEY *key)
473 {
474     return test_encode_decode(type, key,
475                               "PEM", OSSL_KEYMGMT_SELECT_KEYPAIR
476                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
477                               NULL, NULL,
478                               encode_EVP_PKEY_legacy_PEM, decode_EVP_PKEY_prov,
479                               test_text, check_unprotected_legacy_PEM,
480                               dump_pem);
481 }
482
483 #ifndef OPENSSL_NO_DSA
484 static int check_MSBLOB(const char *type, const void *data, size_t data_len)
485 {
486     const unsigned char *datap = data;
487     EVP_PKEY *pkey = b2i_PrivateKey(&datap, data_len);
488     int ok = TEST_ptr(pkey);
489
490     EVP_PKEY_free(pkey);
491     return ok;
492 }
493
494 static int test_unprotected_via_MSBLOB(const char *type, EVP_PKEY *key)
495 {
496     return test_encode_decode(type, key,
497                               "MSBLOB", OSSL_KEYMGMT_SELECT_KEYPAIR
498                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
499                               NULL, NULL,
500                               encode_EVP_PKEY_MSBLOB, decode_EVP_PKEY_prov,
501                               test_mem, check_MSBLOB,
502                               dump_der);
503 }
504
505 # ifndef OPENSSL_NO_RC4
506 static int check_PVK(const char *type, const void *data, size_t data_len)
507 {
508     const unsigned char *in = data;
509     unsigned int saltlen = 0, keylen = 0;
510     int ok = ossl_do_PVK_header(&in, data_len, 0, &saltlen, &keylen);
511
512     return ok;
513 }
514
515 static int test_unprotected_via_PVK(const char *type, EVP_PKEY *key)
516 {
517     return test_encode_decode(type, key,
518                               "PVK", OSSL_KEYMGMT_SELECT_KEYPAIR
519                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
520                               NULL, NULL,
521                               encode_EVP_PKEY_PVK, decode_EVP_PKEY_prov,
522                               test_mem, check_PVK,
523                               dump_der);
524 }
525 # endif
526 #endif
527
528 static const char *pass_cipher = "AES-256-CBC";
529 static const char *pass = "the holy handgrenade of antioch";
530
531 static int check_protected_PKCS8_DER(const char *type,
532                                      const void *data, size_t data_len)
533 {
534     const unsigned char *datap = data;
535     X509_SIG *p8 = d2i_X509_SIG(NULL, &datap, data_len);
536     int ok = TEST_ptr(p8);
537
538     X509_SIG_free(p8);
539     return ok;
540 }
541
542 static int test_protected_via_DER(const char *type, EVP_PKEY *key)
543 {
544     return test_encode_decode(type, key,
545                               "DER", OSSL_KEYMGMT_SELECT_KEYPAIR
546                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
547                               pass, pass_cipher,
548                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
549                               test_mem, check_protected_PKCS8_DER,
550                               dump_der);
551 }
552
553 static int check_protected_PKCS8_PEM(const char *type,
554                                      const void *data, size_t data_len)
555 {
556     static const char expected_pem_header[] =
557         "-----BEGIN " PEM_STRING_PKCS8 "-----";
558
559     return TEST_strn_eq(data, expected_pem_header,
560                         sizeof(expected_pem_header) - 1);
561 }
562
563 static int test_protected_via_PEM(const char *type, EVP_PKEY *key)
564 {
565     return test_encode_decode(type, key,
566                               "PEM", OSSL_KEYMGMT_SELECT_KEYPAIR
567                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
568                               pass, pass_cipher,
569                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
570                               test_text, check_protected_PKCS8_PEM,
571                               dump_pem);
572 }
573
574 static int check_protected_legacy_PEM(const char *type,
575                                       const void *data, size_t data_len)
576 {
577     static char expected_pem_header[80];
578
579     return
580         TEST_int_gt(BIO_snprintf(expected_pem_header,
581                                  sizeof(expected_pem_header),
582                                  "-----BEGIN %s PRIVATE KEY-----", type), 0)
583         && TEST_strn_eq(data, expected_pem_header, strlen(expected_pem_header))
584         && TEST_ptr(strstr(data, "\nDEK-Info: "));
585 }
586
587 static int test_protected_via_legacy_PEM(const char *type, EVP_PKEY *key)
588 {
589     return test_encode_decode(type, key,
590                               "PEM", OSSL_KEYMGMT_SELECT_KEYPAIR
591                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
592                               pass, pass_cipher,
593                               encode_EVP_PKEY_legacy_PEM, decode_EVP_PKEY_prov,
594                               test_text, check_protected_legacy_PEM,
595                               dump_pem);
596 }
597
598 #if !defined(OPENSSL_NO_DSA) && !defined(OPENSSL_NO_RC4)
599 static int test_protected_via_PVK(const char *type, EVP_PKEY *key)
600 {
601     return test_encode_decode(type, key,
602                               "PVK", OSSL_KEYMGMT_SELECT_KEYPAIR
603                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
604                               pass, NULL,
605                               encode_EVP_PKEY_PVK, decode_EVP_PKEY_prov,
606                               test_mem, check_PVK, dump_der);
607 }
608 #endif
609
610 static int check_public_DER(const char *type, const void *data, size_t data_len)
611 {
612     const unsigned char *datap = data;
613     EVP_PKEY *pkey = d2i_PUBKEY(NULL, &datap, data_len);
614     int ok = (TEST_ptr(pkey) && TEST_true(EVP_PKEY_is_a(pkey, type)));
615
616     EVP_PKEY_free(pkey);
617     return ok;
618 }
619
620 static int test_public_via_DER(const char *type, EVP_PKEY *key)
621 {
622     return test_encode_decode(type, key,
623                               "DER", OSSL_KEYMGMT_SELECT_PUBLIC_KEY
624                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
625                               NULL, NULL,
626                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
627                               test_mem, check_public_DER, dump_der);
628 }
629
630 static int check_public_PEM(const char *type, const void *data, size_t data_len)
631 {
632     static const char expected_pem_header[] =
633         "-----BEGIN " PEM_STRING_PUBLIC "-----";
634
635     return
636         TEST_strn_eq(data, expected_pem_header,
637                      sizeof(expected_pem_header) - 1);
638 }
639
640 static int test_public_via_PEM(const char *type, EVP_PKEY *key)
641 {
642     return test_encode_decode(type, key,
643                               "PEM", OSSL_KEYMGMT_SELECT_PUBLIC_KEY
644                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
645                               NULL, NULL,
646                               encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
647                               test_text, check_public_PEM, dump_pem);
648 }
649
650 #ifndef OPENSSL_NO_DSA
651 static int check_public_MSBLOB(const char *type,
652                                const void *data, size_t data_len)
653 {
654     const unsigned char *datap = data;
655     EVP_PKEY *pkey = b2i_PublicKey(&datap, data_len);
656     int ok = TEST_ptr(pkey);
657
658     EVP_PKEY_free(pkey);
659     return ok;
660 }
661
662 static int test_public_via_MSBLOB(const char *type, EVP_PKEY *key)
663 {
664     return test_encode_decode(type, key,
665                               "MSBLOB", OSSL_KEYMGMT_SELECT_PUBLIC_KEY
666                               | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
667                               NULL, NULL,
668                               encode_public_EVP_PKEY_MSBLOB,
669                               decode_EVP_PKEY_prov,
670                               test_mem, check_public_MSBLOB, dump_der);
671 }
672 #endif
673
674 #define KEYS(KEYTYPE)                           \
675     static EVP_PKEY *key_##KEYTYPE = NULL
676 #define MAKE_KEYS(KEYTYPE, KEYTYPEstr, params)                          \
677     ok = ok                                                             \
678         && TEST_ptr(key_##KEYTYPE = make_key(KEYTYPEstr, NULL, params))
679 #define FREE_KEYS(KEYTYPE)                                              \
680     EVP_PKEY_free(key_##KEYTYPE);                                       \
681
682 #define DOMAIN_KEYS(KEYTYPE)                    \
683     static EVP_PKEY *template_##KEYTYPE = NULL; \
684     static EVP_PKEY *key_##KEYTYPE = NULL
685 #define MAKE_DOMAIN_KEYS(KEYTYPE, KEYTYPEstr, params)                   \
686     ok = ok                                                             \
687         && TEST_ptr(template_##KEYTYPE =                                \
688                     make_template(KEYTYPEstr, params))                  \
689         && TEST_ptr(key_##KEYTYPE =                                     \
690                     make_key(KEYTYPEstr, template_##KEYTYPE, NULL))
691 #define FREE_DOMAIN_KEYS(KEYTYPE)                                       \
692     EVP_PKEY_free(template_##KEYTYPE);                                  \
693     EVP_PKEY_free(key_##KEYTYPE)
694
695 #define IMPLEMENT_TEST_SUITE(KEYTYPE, KEYTYPEstr)                       \
696     static int test_unprotected_##KEYTYPE##_via_DER(void)               \
697     {                                                                   \
698         return test_unprotected_via_DER(KEYTYPEstr, key_##KEYTYPE);     \
699     }                                                                   \
700     static int test_unprotected_##KEYTYPE##_via_PEM(void)               \
701     {                                                                   \
702         return test_unprotected_via_PEM(KEYTYPEstr, key_##KEYTYPE);     \
703     }                                                                   \
704     static int test_protected_##KEYTYPE##_via_DER(void)                 \
705     {                                                                   \
706         return test_protected_via_DER(KEYTYPEstr, key_##KEYTYPE);       \
707     }                                                                   \
708     static int test_protected_##KEYTYPE##_via_PEM(void)                 \
709     {                                                                   \
710         return test_protected_via_PEM(KEYTYPEstr, key_##KEYTYPE);       \
711     }                                                                   \
712     static int test_public_##KEYTYPE##_via_DER(void)                    \
713     {                                                                   \
714         return test_public_via_DER(KEYTYPEstr, key_##KEYTYPE);          \
715     }                                                                   \
716     static int test_public_##KEYTYPE##_via_PEM(void)                    \
717     {                                                                   \
718         return test_public_via_PEM(KEYTYPEstr, key_##KEYTYPE);          \
719     }
720
721 #define ADD_TEST_SUITE(KEYTYPE)                                 \
722     ADD_TEST(test_unprotected_##KEYTYPE##_via_DER);             \
723     ADD_TEST(test_unprotected_##KEYTYPE##_via_PEM);             \
724     ADD_TEST(test_protected_##KEYTYPE##_via_DER);               \
725     ADD_TEST(test_protected_##KEYTYPE##_via_PEM);               \
726     ADD_TEST(test_public_##KEYTYPE##_via_DER);                  \
727     ADD_TEST(test_public_##KEYTYPE##_via_PEM)
728
729 #define IMPLEMENT_TEST_SUITE_LEGACY(KEYTYPE, KEYTYPEstr)                \
730     static int test_unprotected_##KEYTYPE##_via_legacy_PEM(void)        \
731     {                                                                   \
732         return                                                          \
733             test_unprotected_via_legacy_PEM(KEYTYPEstr, key_##KEYTYPE); \
734     }                                                                   \
735     static int test_protected_##KEYTYPE##_via_legacy_PEM(void)          \
736     {                                                                   \
737         return                                                          \
738             test_protected_via_legacy_PEM(KEYTYPEstr, key_##KEYTYPE);   \
739     }
740
741 #define ADD_TEST_SUITE_LEGACY(KEYTYPE)                                 \
742     ADD_TEST(test_unprotected_##KEYTYPE##_via_legacy_PEM);             \
743     ADD_TEST(test_protected_##KEYTYPE##_via_legacy_PEM)
744
745 #ifndef OPENSSL_NO_DSA
746 # define IMPLEMENT_TEST_SUITE_MSBLOB(KEYTYPE, KEYTYPEstr)               \
747     static int test_unprotected_##KEYTYPE##_via_MSBLOB(void)            \
748     {                                                                   \
749         return test_unprotected_via_MSBLOB(KEYTYPEstr, key_##KEYTYPE);  \
750     }                                                                   \
751     static int test_public_##KEYTYPE##_via_MSBLOB(void)                 \
752     {                                                                   \
753         return test_public_via_MSBLOB(KEYTYPEstr, key_##KEYTYPE);       \
754     }
755
756 # define ADD_TEST_SUITE_MSBLOB(KEYTYPE)                         \
757     ADD_TEST(test_unprotected_##KEYTYPE##_via_MSBLOB);          \
758     ADD_TEST(test_public_##KEYTYPE##_via_MSBLOB)
759
760 # ifndef OPENSSL_NO_RC4
761 #  define IMPLEMENT_TEST_SUITE_PVK(KEYTYPE, KEYTYPEstr)                 \
762     static int test_unprotected_##KEYTYPE##_via_PVK(void)               \
763     {                                                                   \
764         return test_unprotected_via_PVK(KEYTYPEstr, key_##KEYTYPE);     \
765     }                                                                   \
766     static int test_protected_##KEYTYPE##_via_PVK(void)                 \
767     {                                                                   \
768         return test_protected_via_PVK(KEYTYPEstr, key_##KEYTYPE);       \
769     }
770
771 #  define ADD_TEST_SUITE_PVK(KEYTYPE)                           \
772     ADD_TEST(test_unprotected_##KEYTYPE##_via_PVK);             \
773     ADD_TEST(test_protected_##KEYTYPE##_via_PVK)
774 # endif
775 #endif
776
777 #ifndef OPENSSL_NO_DH
778 DOMAIN_KEYS(DH);
779 IMPLEMENT_TEST_SUITE(DH, "DH")
780 DOMAIN_KEYS(DHX);
781 IMPLEMENT_TEST_SUITE(DHX, "X9.42 DH")
782 /*
783  * DH has no support for PEM_write_bio_PrivateKey_traditional(),
784  * so no legacy tests.
785  */
786 #endif
787 #ifndef OPENSSL_NO_DSA
788 DOMAIN_KEYS(DSA);
789 IMPLEMENT_TEST_SUITE(DSA, "DSA")
790 IMPLEMENT_TEST_SUITE_LEGACY(DSA, "DSA")
791 IMPLEMENT_TEST_SUITE_MSBLOB(DSA, "DSA")
792 # ifndef OPENSSL_NO_RC4
793 IMPLEMENT_TEST_SUITE_PVK(DSA, "DSA")
794 # endif
795 #endif
796 #ifndef OPENSSL_NO_EC
797 DOMAIN_KEYS(EC);
798 IMPLEMENT_TEST_SUITE(EC, "EC")
799 IMPLEMENT_TEST_SUITE_LEGACY(EC, "EC")
800 DOMAIN_KEYS(ECExplicitPrimeNamedCurve);
801 IMPLEMENT_TEST_SUITE(ECExplicitPrimeNamedCurve, "EC")
802 IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitPrimeNamedCurve, "EC")
803 DOMAIN_KEYS(ECExplicitPrime2G);
804 IMPLEMENT_TEST_SUITE(ECExplicitPrime2G, "EC")
805 IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitPrime2G, "EC")
806 # ifndef OPENSSL_NO_EC2M
807 DOMAIN_KEYS(ECExplicitTriNamedCurve);
808 IMPLEMENT_TEST_SUITE(ECExplicitTriNamedCurve, "EC")
809 IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitTriNamedCurve, "EC")
810 DOMAIN_KEYS(ECExplicitTri2G);
811 IMPLEMENT_TEST_SUITE(ECExplicitTri2G, "EC")
812 IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitTri2G, "EC")
813 # endif
814 KEYS(ED25519);
815 IMPLEMENT_TEST_SUITE(ED25519, "ED25519")
816 KEYS(ED448);
817 IMPLEMENT_TEST_SUITE(ED448, "ED448")
818 KEYS(X25519);
819 IMPLEMENT_TEST_SUITE(X25519, "X25519")
820 KEYS(X448);
821 IMPLEMENT_TEST_SUITE(X448, "X448")
822 /*
823  * ED25519, ED448, X25519 and X448 have no support for
824  * PEM_write_bio_PrivateKey_traditional(), so no legacy tests.
825  */
826 #endif
827 KEYS(RSA);
828 IMPLEMENT_TEST_SUITE(RSA, "RSA")
829 IMPLEMENT_TEST_SUITE_LEGACY(RSA, "RSA")
830 KEYS(RSA_PSS);
831 IMPLEMENT_TEST_SUITE(RSA_PSS, "RSA-PSS")
832 /*
833  * RSA-PSS has no support for PEM_write_bio_PrivateKey_traditional(),
834  * so no legacy tests.
835  */
836 #ifndef OPENSSL_NO_DSA
837 IMPLEMENT_TEST_SUITE_MSBLOB(RSA, "RSA")
838 # ifndef OPENSSL_NO_RC4
839 IMPLEMENT_TEST_SUITE_PVK(RSA, "RSA")
840 # endif
841 #endif
842
843 #ifndef OPENSSL_NO_EC
844 /* Explicit parameters that match a named curve */
845 static int do_create_ec_explicit_prime_params(OSSL_PARAM_BLD *bld,
846                                               const unsigned char *gen,
847                                               size_t gen_len)
848 {
849     BIGNUM *a, *b, *prime, *order;
850
851     /* Curve prime256v1 */
852     static const unsigned char prime_data[] = {
853         0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
854         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
855         0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
856         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
857         0xff
858     };
859     static const unsigned char a_data[] = {
860         0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
861         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
862         0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
863         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
864         0xfc
865     };
866     static const unsigned char b_data[] = {
867         0x5a, 0xc6, 0x35, 0xd8, 0xaa, 0x3a, 0x93, 0xe7,
868         0xb3, 0xeb, 0xbd, 0x55, 0x76, 0x98, 0x86, 0xbc,
869         0x65, 0x1d, 0x06, 0xb0, 0xcc, 0x53, 0xb0, 0xf6,
870         0x3b, 0xce, 0x3c, 0x3e, 0x27, 0xd2, 0x60, 0x4b
871     };
872     static const unsigned char seed[] = {
873         0xc4, 0x9d, 0x36, 0x08, 0x86, 0xe7, 0x04, 0x93,
874         0x6a, 0x66, 0x78, 0xe1, 0x13, 0x9d, 0x26, 0xb7,
875         0x81, 0x9f, 0x7e, 0x90
876     };
877     static const unsigned char order_data[] = {
878         0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
879         0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
880         0xff, 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17, 0x9e,
881         0x84, 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x51
882     };
883     return TEST_ptr(a = BN_CTX_get(bnctx))
884            && TEST_ptr(b = BN_CTX_get(bnctx))
885            && TEST_ptr(prime = BN_CTX_get(bnctx))
886            && TEST_ptr(order = BN_CTX_get(bnctx))
887            && TEST_ptr(BN_bin2bn(prime_data, sizeof(prime_data), prime))
888            && TEST_ptr(BN_bin2bn(a_data, sizeof(a_data), a))
889            && TEST_ptr(BN_bin2bn(b_data, sizeof(b_data), b))
890            && TEST_ptr(BN_bin2bn(order_data, sizeof(order_data), order))
891            && TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
892                             OSSL_PKEY_PARAM_EC_FIELD_TYPE, SN_X9_62_prime_field,
893                             0))
894            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_P, prime))
895            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_A, a))
896            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_B, b))
897            && TEST_true(OSSL_PARAM_BLD_push_BN(bld,
898                             OSSL_PKEY_PARAM_EC_ORDER, order))
899            && TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
900                             OSSL_PKEY_PARAM_EC_GENERATOR, gen, gen_len))
901            && TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
902                             OSSL_PKEY_PARAM_EC_SEED, seed, sizeof(seed)))
903            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_COFACTOR,
904                                                BN_value_one()));
905 }
906
907 static int create_ec_explicit_prime_params_namedcurve(OSSL_PARAM_BLD *bld)
908 {
909     static const unsigned char prime256v1_gen[] = {
910         0x04,
911         0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47,
912         0xf8, 0xbc, 0xe6, 0xe5, 0x63, 0xa4, 0x40, 0xf2,
913         0x77, 0x03, 0x7d, 0x81, 0x2d, 0xeb, 0x33, 0xa0,
914         0xf4, 0xa1, 0x39, 0x45, 0xd8, 0x98, 0xc2, 0x96,
915         0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b,
916         0x8e, 0xe7, 0xeb, 0x4a, 0x7c, 0x0f, 0x9e, 0x16,
917         0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, 0x5e, 0xce,
918         0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5
919     };
920     return do_create_ec_explicit_prime_params(bld, prime256v1_gen,
921                                               sizeof(prime256v1_gen));
922 }
923
924 static int create_ec_explicit_prime_params(OSSL_PARAM_BLD *bld)
925 {
926     /* 2G */
927     static const unsigned char prime256v1_gen2[] = {
928         0x04,
929         0xe4, 0x97, 0x08, 0xbe, 0x7d, 0xfa, 0xa2, 0x9a,
930         0xa3, 0x12, 0x6f, 0xe4, 0xe7, 0xd0, 0x25, 0xe3,
931         0x4a, 0xc1, 0x03, 0x15, 0x8c, 0xd9, 0x33, 0xc6,
932         0x97, 0x42, 0xf5, 0xdc, 0x97, 0xb9, 0xd7, 0x31,
933         0xe9, 0x7d, 0x74, 0x3d, 0x67, 0x6a, 0x3b, 0x21,
934         0x08, 0x9c, 0x31, 0x73, 0xf8, 0xc1, 0x27, 0xc9,
935         0xd2, 0xa0, 0xa0, 0x83, 0x66, 0xe0, 0xc9, 0xda,
936         0xa8, 0xc6, 0x56, 0x2b, 0x94, 0xb1, 0xae, 0x55
937     };
938     return do_create_ec_explicit_prime_params(bld, prime256v1_gen2,
939                                               sizeof(prime256v1_gen2));
940 }
941
942 # ifndef OPENSSL_NO_EC2M
943 static int do_create_ec_explicit_trinomial_params(OSSL_PARAM_BLD *bld,
944                                                   const unsigned char *gen,
945                                                   size_t gen_len)
946 {
947     BIGNUM *a, *b, *poly, *order, *cofactor;
948     /* sect233k1 characteristic-two-field tpBasis */
949     static const unsigned char poly_data[] = {
950         0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
951         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
952         0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
953     };
954     static const unsigned char a_data[] = {
955         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
956         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
957         0x00, 0x00, 0x00, 0x00, 0x00, 0x00
958     };
959     static const unsigned char b_data[] = {
960         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
961         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
962         0x00, 0x00, 0x00, 0x00, 0x00, 0x01
963     };
964     static const unsigned char order_data[] = {
965         0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
966         0x00, 0x00, 0x00, 0x06, 0x9D, 0x5B, 0xB9, 0x15, 0xBC, 0xD4, 0x6E, 0xFB,
967         0x1A, 0xD5, 0xF1, 0x73, 0xAB, 0xDF
968     };
969     static const unsigned char cofactor_data[]= {
970         0x4
971     };
972     return TEST_ptr(a = BN_CTX_get(bnctx))
973            && TEST_ptr(b = BN_CTX_get(bnctx))
974            && TEST_ptr(poly = BN_CTX_get(bnctx))
975            && TEST_ptr(order = BN_CTX_get(bnctx))
976            && TEST_ptr(cofactor = BN_CTX_get(bnctx))
977            && TEST_ptr(BN_bin2bn(poly_data, sizeof(poly_data), poly))
978            && TEST_ptr(BN_bin2bn(a_data, sizeof(a_data), a))
979            && TEST_ptr(BN_bin2bn(b_data, sizeof(b_data), b))
980            && TEST_ptr(BN_bin2bn(order_data, sizeof(order_data), order))
981            && TEST_ptr(BN_bin2bn(cofactor_data, sizeof(cofactor_data), cofactor))
982            && TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
983                             OSSL_PKEY_PARAM_EC_FIELD_TYPE,
984                             SN_X9_62_characteristic_two_field, 0))
985            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_P, poly))
986            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_A, a))
987            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_B, b))
988            && TEST_true(OSSL_PARAM_BLD_push_BN(bld,
989                             OSSL_PKEY_PARAM_EC_ORDER, order))
990            && TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
991                             OSSL_PKEY_PARAM_EC_GENERATOR, gen, gen_len))
992            && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_COFACTOR,
993                                                cofactor));
994 }
995
996 static int create_ec_explicit_trinomial_params_namedcurve(OSSL_PARAM_BLD *bld)
997 {
998     static const unsigned char gen[] = {
999         0x04,
1000         0x01, 0x72, 0x32, 0xBA, 0x85, 0x3A, 0x7E, 0x73, 0x1A, 0xF1, 0x29, 0xF2,
1001         0x2F, 0xF4, 0x14, 0x95, 0x63, 0xA4, 0x19, 0xC2, 0x6B, 0xF5, 0x0A, 0x4C,
1002         0x9D, 0x6E, 0xEF, 0xAD, 0x61, 0x26,
1003         0x01, 0xDB, 0x53, 0x7D, 0xEC, 0xE8, 0x19, 0xB7, 0xF7, 0x0F, 0x55, 0x5A,
1004         0x67, 0xC4, 0x27, 0xA8, 0xCD, 0x9B, 0xF1, 0x8A, 0xEB, 0x9B, 0x56, 0xE0,
1005         0xC1, 0x10, 0x56, 0xFA, 0xE6, 0xA3
1006     };
1007     return do_create_ec_explicit_trinomial_params(bld, gen, sizeof(gen));
1008 }
1009
1010 static int create_ec_explicit_trinomial_params(OSSL_PARAM_BLD *bld)
1011 {
1012     static const unsigned char gen2[] = {
1013         0x04,
1014         0x00, 0xd7, 0xba, 0xd0, 0x26, 0x6c, 0x31, 0x6a, 0x78, 0x76, 0x01, 0xd1,
1015         0x32, 0x4b, 0x8f, 0x30, 0x29, 0x2d, 0x78, 0x30, 0xca, 0x43, 0xaa, 0xf0,
1016         0xa2, 0x5a, 0xd4, 0x0f, 0xb3, 0xf4,
1017         0x00, 0x85, 0x4b, 0x1b, 0x8d, 0x50, 0x10, 0xa5, 0x1c, 0x80, 0xf7, 0x86,
1018         0x40, 0x62, 0x4c, 0x87, 0xd1, 0x26, 0x7a, 0x9c, 0x5c, 0xe9, 0x82, 0x29,
1019         0xd1, 0x67, 0x70, 0x41, 0xea, 0xcb
1020     };
1021     return do_create_ec_explicit_trinomial_params(bld, gen2, sizeof(gen2));
1022 }
1023 # endif /* OPENSSL_NO_EC2M */
1024 #endif /* OPENSSL_NO_EC */
1025
1026 int setup_tests(void)
1027 {
1028     int ok = 1;
1029
1030 #ifndef OPENSSL_NO_DSA
1031     static size_t qbits = 160;  /* PVK only tolerates 160 Q bits */
1032     static size_t pbits = 1024; /* With 160 Q bits, we MUST use 1024 P bits */
1033     OSSL_PARAM DSA_params[] = {
1034         OSSL_PARAM_size_t("pbits", &pbits),
1035         OSSL_PARAM_size_t("qbits", &qbits),
1036         OSSL_PARAM_END
1037     };
1038 #endif
1039
1040 #ifndef OPENSSL_NO_EC
1041     static char groupname[] = "prime256v1";
1042     OSSL_PARAM EC_params[] = {
1043         OSSL_PARAM_utf8_string("group", groupname, sizeof(groupname) - 1),
1044         OSSL_PARAM_END
1045     };
1046 #endif
1047
1048     /* 7 is the default magic number */
1049     static unsigned int rsapss_min_saltlen = 7;
1050     OSSL_PARAM RSA_PSS_params[] = {
1051         OSSL_PARAM_uint("saltlen", &rsapss_min_saltlen),
1052         OSSL_PARAM_END
1053     };
1054
1055 #ifndef OPENSSL_NO_EC
1056     if (!TEST_ptr(bnctx = BN_CTX_new_ex(NULL))
1057         || !TEST_ptr(bld_prime_nc = OSSL_PARAM_BLD_new())
1058         || !TEST_ptr(bld_prime = OSSL_PARAM_BLD_new())
1059         || !create_ec_explicit_prime_params_namedcurve(bld_prime_nc)
1060         || !create_ec_explicit_prime_params(bld_prime)
1061         || !TEST_ptr(ec_explicit_prime_params_nc = OSSL_PARAM_BLD_to_param(bld_prime_nc))
1062         || !TEST_ptr(ec_explicit_prime_params_explicit = OSSL_PARAM_BLD_to_param(bld_prime))
1063 # ifndef OPENSSL_NO_EC2M
1064         || !TEST_ptr(bld_tri_nc = OSSL_PARAM_BLD_new())
1065         || !TEST_ptr(bld_tri = OSSL_PARAM_BLD_new())
1066         || !create_ec_explicit_trinomial_params_namedcurve(bld_tri_nc)
1067         || !create_ec_explicit_trinomial_params(bld_tri)
1068         || !TEST_ptr(ec_explicit_tri_params_nc = OSSL_PARAM_BLD_to_param(bld_tri_nc))
1069         || !TEST_ptr(ec_explicit_tri_params_explicit = OSSL_PARAM_BLD_to_param(bld_tri))
1070 # endif
1071         )
1072         return 0;
1073 #endif
1074
1075     TEST_info("Generating keys...");
1076
1077 #ifndef OPENSSL_NO_DH
1078     MAKE_DOMAIN_KEYS(DH, "DH", NULL);
1079     MAKE_DOMAIN_KEYS(DHX, "X9.42 DH", NULL);
1080 #endif
1081 #ifndef OPENSSL_NO_DSA
1082     MAKE_DOMAIN_KEYS(DSA, "DSA", DSA_params);
1083 #endif
1084 #ifndef OPENSSL_NO_EC
1085     MAKE_DOMAIN_KEYS(EC, "EC", EC_params);
1086     MAKE_DOMAIN_KEYS(ECExplicitPrimeNamedCurve, "EC", ec_explicit_prime_params_nc);
1087     MAKE_DOMAIN_KEYS(ECExplicitPrime2G, "EC", ec_explicit_prime_params_explicit);
1088 # ifndef OPENSSL_NO_EC2M
1089     MAKE_DOMAIN_KEYS(ECExplicitTriNamedCurve, "EC", ec_explicit_tri_params_nc);
1090     MAKE_DOMAIN_KEYS(ECExplicitTri2G, "EC", ec_explicit_tri_params_explicit);
1091 # endif
1092     MAKE_KEYS(ED25519, "ED25519", NULL);
1093     MAKE_KEYS(ED448, "ED448", NULL);
1094     MAKE_KEYS(X25519, "X25519", NULL);
1095     MAKE_KEYS(X448, "X448", NULL);
1096 #endif
1097     MAKE_KEYS(RSA, "RSA", NULL);
1098     MAKE_KEYS(RSA_PSS, "RSA-PSS", RSA_PSS_params);
1099     TEST_info("Generating key... done");
1100
1101     if (ok) {
1102 #ifndef OPENSSL_NO_DH
1103         ADD_TEST_SUITE(DH);
1104         ADD_TEST_SUITE(DHX);
1105         /*
1106          * DH has no support for PEM_write_bio_PrivateKey_traditional(),
1107          * so no legacy tests.
1108          */
1109 #endif
1110 #ifndef OPENSSL_NO_DSA
1111         ADD_TEST_SUITE(DSA);
1112         ADD_TEST_SUITE_LEGACY(DSA);
1113         ADD_TEST_SUITE_MSBLOB(DSA);
1114 # ifndef OPENSSL_NO_RC4
1115         ADD_TEST_SUITE_PVK(DSA);
1116 # endif
1117 #endif
1118 #ifndef OPENSSL_NO_EC
1119         ADD_TEST_SUITE(EC);
1120         ADD_TEST_SUITE_LEGACY(EC);
1121         ADD_TEST_SUITE(ECExplicitPrimeNamedCurve);
1122         ADD_TEST_SUITE_LEGACY(ECExplicitPrimeNamedCurve);
1123         ADD_TEST_SUITE(ECExplicitPrime2G);
1124         ADD_TEST_SUITE_LEGACY(ECExplicitPrime2G);
1125 # ifndef OPENSSL_NO_EC2M
1126         ADD_TEST_SUITE(ECExplicitTriNamedCurve);
1127         ADD_TEST_SUITE_LEGACY(ECExplicitTriNamedCurve);
1128         ADD_TEST_SUITE(ECExplicitTri2G);
1129         ADD_TEST_SUITE_LEGACY(ECExplicitTri2G);
1130 # endif
1131         ADD_TEST_SUITE(ED25519);
1132         ADD_TEST_SUITE(ED448);
1133         ADD_TEST_SUITE(X25519);
1134         ADD_TEST_SUITE(X448);
1135         /*
1136          * ED25519, ED448, X25519 and X448 have no support for
1137          * PEM_write_bio_PrivateKey_traditional(), so no legacy tests.
1138          */
1139 #endif
1140         ADD_TEST_SUITE(RSA);
1141         ADD_TEST_SUITE_LEGACY(RSA);
1142         ADD_TEST_SUITE(RSA_PSS);
1143         /*
1144          * RSA-PSS has no support for PEM_write_bio_PrivateKey_traditional(),
1145          * so no legacy tests.
1146          */
1147 #ifndef OPENSSL_NO_DSA
1148         ADD_TEST_SUITE_MSBLOB(RSA);
1149 # ifndef OPENSSL_NO_RC4
1150         ADD_TEST_SUITE_PVK(RSA);
1151 # endif
1152 #endif
1153     }
1154
1155     return 1;
1156 }
1157
1158 void cleanup_tests(void)
1159 {
1160 #ifndef OPENSSL_NO_EC
1161     OSSL_PARAM_BLD_free_params(ec_explicit_prime_params_nc);
1162     OSSL_PARAM_BLD_free_params(ec_explicit_prime_params_explicit);
1163     OSSL_PARAM_BLD_free(bld_prime_nc);
1164     OSSL_PARAM_BLD_free(bld_prime);
1165 # ifndef OPENSSL_NO_EC2M
1166     OSSL_PARAM_BLD_free_params(ec_explicit_tri_params_nc);
1167     OSSL_PARAM_BLD_free_params(ec_explicit_tri_params_explicit);
1168     OSSL_PARAM_BLD_free(bld_tri_nc);
1169     OSSL_PARAM_BLD_free(bld_tri);
1170 # endif
1171     BN_CTX_free(bnctx);
1172 #endif /* OPENSSL_NO_EC */
1173
1174 #ifndef OPENSSL_NO_DH
1175     FREE_DOMAIN_KEYS(DH);
1176     FREE_DOMAIN_KEYS(DHX);
1177 #endif
1178 #ifndef OPENSSL_NO_DSA
1179     FREE_DOMAIN_KEYS(DSA);
1180 #endif
1181 #ifndef OPENSSL_NO_EC
1182     FREE_DOMAIN_KEYS(EC);
1183     FREE_DOMAIN_KEYS(ECExplicitPrimeNamedCurve);
1184     FREE_DOMAIN_KEYS(ECExplicitPrime2G);
1185 # ifndef OPENSSL_NO_EC2M
1186     FREE_DOMAIN_KEYS(ECExplicitTriNamedCurve);
1187     FREE_DOMAIN_KEYS(ECExplicitTri2G);
1188 # endif
1189     FREE_KEYS(ED25519);
1190     FREE_KEYS(ED448);
1191     FREE_KEYS(X25519);
1192     FREE_KEYS(X448);
1193 #endif
1194     FREE_KEYS(RSA);
1195     FREE_KEYS(RSA_PSS);
1196 }