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